From 1a099ba9768dad04ece265016ca6b4dd0afb6912 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9Cramifarawi=E2=80=9D?= <“rami.farawi@opentrons.com”> Date: Wed, 6 Mar 2024 16:44:20 -0500 Subject: [PATCH 01/19] fix --- protocols/0f7910/0f7910.ot2.apiv2.py | 11 ++++++++--- protocols/0f7910/README.md | 2 +- protocols/0f7910/fields.json | 8 +------- 3 files changed, 10 insertions(+), 11 deletions(-) diff --git a/protocols/0f7910/0f7910.ot2.apiv2.py b/protocols/0f7910/0f7910.ot2.apiv2.py index 85d8d72dd..55692bcd3 100644 --- a/protocols/0f7910/0f7910.ot2.apiv2.py +++ b/protocols/0f7910/0f7910.ot2.apiv2.py @@ -1,5 +1,6 @@ from opentrons import protocol_api + metadata = { 'protocolName': 'Plate Filling with CSV Import', 'author': 'Rami Farawi ', @@ -13,14 +14,12 @@ def run(ctx): [csv_samp, source_format, dest_format, - transfer_vol, starting_tip, p300_mount, p20_mount] = get_values( # noqa: F821 "csv_samp", "source_format", "dest_format", - "transfer_vol", "starting_tip", "p300_mount", "p20_mount") @@ -52,6 +51,7 @@ def run(ctx): else "corning_384_wellplate_112ul_flat", 2 if dest_format == "384" else 1) + transfer_vol = float(csv_lines[0][5]) if transfer_vol > 20: tips300 = [ctx.load_labware('opentrons_96_tiprack_300ul', slot) @@ -78,23 +78,28 @@ def pick_up(pip): pick_up(pip) # protocol + pip = p20 if transfer_vol <= 20 else p300 pip.flow_rate.aspirate = 1 pip.flow_rate.dispense = 2 + if transfer_vol > 20: pip.starting_tip = tips300[0].wells()[starting_tip] else: pip.starting_tip = tips20[0].wells()[starting_tip] + for row in csv_lines: source_plate_slot = int(row[1]) source_well_name = row[2] dest_well_name = row[4] + pip_transfer_vol = float(row[5]) source = ctx.loaded_labwares[source_plate_slot].wells_by_name()[source_well_name] # noqa: E501 dest = dest_plate.wells_by_name()[dest_well_name] pick_up(pip) - pip.transfer(transfer_vol, source.bottom(z=0.2), dest, new_tip='never', + pip.transfer(pip_transfer_vol, source.bottom(z=0.2), dest, + new_tip='never', blow_out=True, blowout_location='destination well') pip.drop_tip() ctx.comment('\n\n') diff --git a/protocols/0f7910/README.md b/protocols/0f7910/README.md index f280cb3ca..1ca124699 100644 --- a/protocols/0f7910/README.md +++ b/protocols/0f7910/README.md @@ -16,7 +16,7 @@ Select the format for the source and destination plates. See diagram below. If a 384 plate is selected for destination plate, it should always be in slot 2. If a 96 plate is selected for destination, it should always be in slot 1. Source plates always start from slot 3 to 9, and tip racks are always the same. You can select which tip the protocol will start on in the fields below. If the global transfer volume is over 20ul, then the P300 will be used. If the transfer volume is 20 or less, the P20 will be used. A value of "8" for the starting position of the tip would mean to start H1 of the tip rack, and a value of 10 would mean to start at B2 of the tip rack, since it iterates down by column. The csv should be formatted as such in the header: ``` -Source plate barcode, Source plate slot (3-9), Source well (A1, B1, etc.), Destination plate barcode, Destination well +Source plate barcode, Source plate slot (3-9), Source well, Dest plate barcode, Dest well, Transfer Vol (ul) ``` diff --git a/protocols/0f7910/fields.json b/protocols/0f7910/fields.json index bd08f6fac..75a832eab 100644 --- a/protocols/0f7910/fields.json +++ b/protocols/0f7910/fields.json @@ -3,7 +3,7 @@ "type": "textFile", "label": ".CSV File", "name": "csv_samp", - "default": "Source plate Barcode,Source plate location,Source well,Destination plate Barcode,Destination well\nDDDD,3,C1,ABCD,A1\nEEEE,3,A1,BBBD,B1" + "default": "Source plate Barcode,Source plate location,Source well,Destination plate Barcode,Destination well\nDDDD,3,C1,ABCD,A1\nEEEE,3,A1,BBBD,B1, 12.4" }, { "type": "dropDown", @@ -23,12 +23,6 @@ {"label": "384", "value": "384"} ] }, - { - "type": "float", - "label": "Transfer Volume (ul)", - "name": "transfer_vol", - "default": 12.0 - }, { "type": "int", "label": "Starting Tip in Tip Rack (1-96, by column)", From 90f4e79603a01733a52b185b153aed7e400c5b5a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9Cramifarawi=E2=80=9D?= <“rami.farawi@opentrons.com”> Date: Wed, 6 Mar 2024 16:45:31 -0500 Subject: [PATCH 02/19] fix --- data/data/fields.csv | 2 +- protoBuilds/0f7910/0f7910.ot2.apiv2.py.json | 10 ++-------- protoBuilds/0f7910/README.json | 4 ++-- protocols/0f7910/fields.json | 2 +- 4 files changed, 6 insertions(+), 12 deletions(-) diff --git a/data/data/fields.csv b/data/data/fields.csv index 3c397a264..e341042fb 100644 --- a/data/data/fields.csv +++ b/data/data/fields.csv @@ -1554,7 +1554,7 @@ transfer2,1 transfer_csv,21 transfer_scheme,2 transfer_to_storage,1 -transfer_vol,10 +transfer_vol,9 transfer_volume,3 transfercsv,2 transfervol,1 diff --git a/protoBuilds/0f7910/0f7910.ot2.apiv2.py.json b/protoBuilds/0f7910/0f7910.ot2.apiv2.py.json index 61dd5ed9e..a528d5e2b 100644 --- a/protoBuilds/0f7910/0f7910.ot2.apiv2.py.json +++ b/protoBuilds/0f7910/0f7910.ot2.apiv2.py.json @@ -1,9 +1,9 @@ { - "content": "from opentrons import protocol_api\n\nmetadata = {\n 'protocolName': 'Plate Filling with CSV Import',\n 'author': 'Rami Farawi ',\n 'source': 'Custom Protocol Request',\n 'apiLevel': '2.11'\n}\n\n\ndef run(ctx):\n\n [csv_samp,\n source_format,\n dest_format,\n transfer_vol,\n starting_tip,\n p300_mount,\n p20_mount] = get_values( # noqa: F821\n \"csv_samp\",\n \"source_format\",\n \"dest_format\",\n \"transfer_vol\",\n \"starting_tip\",\n \"p300_mount\",\n \"p20_mount\")\n\n # mapping\n csv_lines = [[val.strip() for val in line.split(',')]\n for line in csv_samp.splitlines()\n if line.split(',')[0].strip()][1:]\n\n unique_list = []\n for row in csv_lines:\n source_plate_slot = int(row[1])\n if source_plate_slot not in unique_list:\n unique_list.append(source_plate_slot)\n\n starting_tip -= starting_tip\n\n # labware\n source_plates = [ctx.load_labware(\n 'corning_96_wellplate_360ul_flat'\n if source_format == \"96\"\n else \"corning_384_wellplate_112ul_flat\", slot)\n for slot in unique_list]\n source_plates = source_plates\n\n dest_plate = ctx.load_labware(\n 'corning_96_wellplate_360ul_flat'\n if dest_format == \"96\"\n else \"corning_384_wellplate_112ul_flat\", 2\n if dest_format == \"384\"\n else 1)\n\n if transfer_vol > 20:\n tips300 = [ctx.load_labware('opentrons_96_tiprack_300ul', slot)\n for slot in [10]]\n else:\n tips20 = [ctx.load_labware('opentrons_96_tiprack_20ul', slot)\n for slot in [11]]\n\n # pipettes\n if transfer_vol > 20:\n p300 = ctx.load_instrument('p300_single_gen2', p300_mount,\n tip_racks=tips300)\n\n else:\n p20 = ctx.load_instrument('p20_single_gen2', p20_mount,\n tip_racks=tips20)\n\n def pick_up(pip):\n try:\n pip.pick_up_tip()\n except protocol_api.labware.OutOfTipsError:\n ctx.pause(\"Replace empty tip racks.\")\n pip.reset_tipracks()\n pick_up(pip)\n\n # protocol\n pip = p20 if transfer_vol <= 20 else p300\n pip.flow_rate.aspirate = 1\n pip.flow_rate.dispense = 2\n if transfer_vol > 20:\n pip.starting_tip = tips300[0].wells()[starting_tip]\n else:\n pip.starting_tip = tips20[0].wells()[starting_tip]\n for row in csv_lines:\n source_plate_slot = int(row[1])\n source_well_name = row[2]\n dest_well_name = row[4]\n\n source = ctx.loaded_labwares[source_plate_slot].wells_by_name()[source_well_name] # noqa: E501\n dest = dest_plate.wells_by_name()[dest_well_name]\n\n pick_up(pip)\n pip.transfer(transfer_vol, source.bottom(z=0.2), dest, new_tip='never',\n blow_out=True, blowout_location='destination well')\n pip.drop_tip()\n ctx.comment('\\n\\n')\n", + "content": "from opentrons import protocol_api\n\n\nmetadata = {\n 'protocolName': 'Plate Filling with CSV Import',\n 'author': 'Rami Farawi ',\n 'source': 'Custom Protocol Request',\n 'apiLevel': '2.11'\n}\n\n\ndef run(ctx):\n\n [csv_samp,\n source_format,\n dest_format,\n starting_tip,\n p300_mount,\n p20_mount] = get_values( # noqa: F821\n \"csv_samp\",\n \"source_format\",\n \"dest_format\",\n \"starting_tip\",\n \"p300_mount\",\n \"p20_mount\")\n\n # mapping\n csv_lines = [[val.strip() for val in line.split(',')]\n for line in csv_samp.splitlines()\n if line.split(',')[0].strip()][1:]\n\n unique_list = []\n for row in csv_lines:\n source_plate_slot = int(row[1])\n if source_plate_slot not in unique_list:\n unique_list.append(source_plate_slot)\n\n starting_tip -= starting_tip\n\n # labware\n source_plates = [ctx.load_labware(\n 'corning_96_wellplate_360ul_flat'\n if source_format == \"96\"\n else \"corning_384_wellplate_112ul_flat\", slot)\n for slot in unique_list]\n source_plates = source_plates\n\n dest_plate = ctx.load_labware(\n 'corning_96_wellplate_360ul_flat'\n if dest_format == \"96\"\n else \"corning_384_wellplate_112ul_flat\", 2\n if dest_format == \"384\"\n else 1)\n transfer_vol = float(csv_lines[0][5])\n\n if transfer_vol > 20:\n tips300 = [ctx.load_labware('opentrons_96_tiprack_300ul', slot)\n for slot in [10]]\n else:\n tips20 = [ctx.load_labware('opentrons_96_tiprack_20ul', slot)\n for slot in [11]]\n\n # pipettes\n if transfer_vol > 20:\n p300 = ctx.load_instrument('p300_single_gen2', p300_mount,\n tip_racks=tips300)\n\n else:\n p20 = ctx.load_instrument('p20_single_gen2', p20_mount,\n tip_racks=tips20)\n\n def pick_up(pip):\n try:\n pip.pick_up_tip()\n except protocol_api.labware.OutOfTipsError:\n ctx.pause(\"Replace empty tip racks.\")\n pip.reset_tipracks()\n pick_up(pip)\n\n # protocol\n\n pip = p20 if transfer_vol <= 20 else p300\n pip.flow_rate.aspirate = 1\n pip.flow_rate.dispense = 2\n\n if transfer_vol > 20:\n pip.starting_tip = tips300[0].wells()[starting_tip]\n else:\n pip.starting_tip = tips20[0].wells()[starting_tip]\n\n for row in csv_lines:\n source_plate_slot = int(row[1])\n source_well_name = row[2]\n dest_well_name = row[4]\n pip_transfer_vol = float(row[5])\n\n source = ctx.loaded_labwares[source_plate_slot].wells_by_name()[source_well_name] # noqa: E501\n dest = dest_plate.wells_by_name()[dest_well_name]\n\n pick_up(pip)\n pip.transfer(pip_transfer_vol, source.bottom(z=0.2), dest,\n new_tip='never',\n blow_out=True, blowout_location='destination well')\n pip.drop_tip()\n ctx.comment('\\n\\n')\n", "custom_labware_defs": [], "fields": [ { - "default": "Source plate Barcode,Source plate location,Source well,Destination plate Barcode,Destination well\nDDDD,3,C1,ABCD,A1\nEEEE,3,A1,BBBD,B1", + "default": "Source plate Barcode,Source plate location,Source well,Destination plate Barcode,Destination well\nDDDD,3,C1,ABCD,A1,12.4\nEEEE,3,A1,BBBD,B1,12.4", "label": ".CSV File", "name": "csv_samp", "type": "textFile" @@ -38,12 +38,6 @@ ], "type": "dropDown" }, - { - "default": 12, - "label": "Transfer Volume", - "name": "transfer_vol", - "type": "int" - }, { "default": 1, "label": "Starting Tip in Tip Rack (1-96, by column)", diff --git a/protoBuilds/0f7910/README.json b/protoBuilds/0f7910/README.json index 8394c6a4d..260d5cd76 100644 --- a/protoBuilds/0f7910/README.json +++ b/protoBuilds/0f7910/README.json @@ -6,14 +6,14 @@ ] }, "deck-setup": "", - "description": "Select the format for the source and destination plates. See diagram below. If a 384 plate is selected for destination plate, it should always be in slot 2. If a 96 plate is selected for destination, it should always be in slot 1. Source plates always start from slot 3 to 9, and tip racks are always the same. You can select which tip the protocol will start on in the fields below. If the global transfer volume is over 20ul, then the P300 will be used. If the transfer volume is 20 or less, the P20 will be used. A value of \"8\" for the starting position of the tip would mean to start H1 of the tip rack, and a value of 10 would mean to start at B2 of the tip rack, since it iterates down by column. The csv should be formatted as such in the header:\nSource plate barcode, Source plate slot (3-9), Source well (A1, B1, etc.), Destination plate barcode, Destination well", + "description": "Select the format for the source and destination plates. See diagram below. If a 384 plate is selected for destination plate, it should always be in slot 2. If a 96 plate is selected for destination, it should always be in slot 1. Source plates always start from slot 3 to 9, and tip racks are always the same. You can select which tip the protocol will start on in the fields below. If the global transfer volume is over 20ul, then the P300 will be used. If the transfer volume is 20 or less, the P20 will be used. A value of \"8\" for the starting position of the tip would mean to start H1 of the tip rack, and a value of 10 would mean to start at B2 of the tip rack, since it iterates down by column. The csv should be formatted as such in the header:\nSource plate barcode, Source plate slot (3-9), Source well, Dest plate barcode, Dest well, Transfer Vol (ul)", "internal": "0f7910", "labware": "\nCorning 384 Well Plate 112 \u00b5L Flat\nCorning 96 Well Plate 360 \u00b5L\nOpentrons 96 Tip Rack 20 \u00b5L\nOpentrons 96 Tip Rack 300 \u00b5L\n", "markdown": { "author": "[Opentrons](https://opentrons.com/)\n\n\n\n\n", "categories": "* Sample Prep\n\t* Plate Filling\n\n\n", "deck-setup": "![deck](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/0f7910/Screen+Shot+2022-12-20+at+10.41.56+AM.png)\n\n\n", - "description": "Select the format for the source and destination plates. See diagram below. If a 384 plate is selected for destination plate, it should always be in slot 2. If a 96 plate is selected for destination, it should always be in slot 1. Source plates always start from slot 3 to 9, and tip racks are always the same. You can select which tip the protocol will start on in the fields below. If the global transfer volume is over 20ul, then the P300 will be used. If the transfer volume is 20 or less, the P20 will be used. A value of \"8\" for the starting position of the tip would mean to start H1 of the tip rack, and a value of 10 would mean to start at B2 of the tip rack, since it iterates down by column. The csv should be formatted as such in the header:\n\n```\nSource plate barcode, Source plate slot (3-9), Source well (A1, B1, etc.), Destination plate barcode, Destination well\n```\n\n\n", + "description": "Select the format for the source and destination plates. See diagram below. If a 384 plate is selected for destination plate, it should always be in slot 2. If a 96 plate is selected for destination, it should always be in slot 1. Source plates always start from slot 3 to 9, and tip racks are always the same. You can select which tip the protocol will start on in the fields below. If the global transfer volume is over 20ul, then the P300 will be used. If the transfer volume is 20 or less, the P20 will be used. A value of \"8\" for the starting position of the tip would mean to start H1 of the tip rack, and a value of 10 would mean to start at B2 of the tip rack, since it iterates down by column. The csv should be formatted as such in the header:\n\n```\nSource plate barcode, Source plate slot (3-9), Source well, Dest plate barcode, Dest well, Transfer Vol (ul)\n```\n\n\n", "internal": "0f7910\n", "labware": "* Corning 384 Well Plate 112 \u00b5L Flat\n* Corning 96 Well Plate 360 \u00b5L\n* [Opentrons 96 Tip Rack 20 \u00b5L](https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-10ul-tips)\n* [Opentrons 96 Tip Rack 300 \u00b5L](https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-10ul-tips)\n\n\n", "notes": "If you have any questions about this protocol, please contact the Protocol Development Team by filling out the [Troubleshooting Survey](https://protocol-troubleshooting.paperform.co/).\n\n\n", diff --git a/protocols/0f7910/fields.json b/protocols/0f7910/fields.json index 75a832eab..febb6d458 100644 --- a/protocols/0f7910/fields.json +++ b/protocols/0f7910/fields.json @@ -3,7 +3,7 @@ "type": "textFile", "label": ".CSV File", "name": "csv_samp", - "default": "Source plate Barcode,Source plate location,Source well,Destination plate Barcode,Destination well\nDDDD,3,C1,ABCD,A1\nEEEE,3,A1,BBBD,B1, 12.4" + "default": "Source plate Barcode,Source plate location,Source well,Destination plate Barcode,Destination well\nDDDD,3,C1,ABCD,A1,12.4\nEEEE,3,A1,BBBD,B1,12.4" }, { "type": "dropDown", From 4dad96a281386c3a4f1561c7e05fb6a8fda200d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9Cramifarawi=E2=80=9D?= <“rami.farawi@opentrons.com”> Date: Wed, 6 Mar 2024 16:53:00 -0500 Subject: [PATCH 03/19] fix --- protoBuilds/0f7910/0f7910.ot2.apiv2.py.json | 2 +- protocols/0f7910/0f7910.ot2.apiv2.py | 9 ++++++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/protoBuilds/0f7910/0f7910.ot2.apiv2.py.json b/protoBuilds/0f7910/0f7910.ot2.apiv2.py.json index a528d5e2b..ce4c17477 100644 --- a/protoBuilds/0f7910/0f7910.ot2.apiv2.py.json +++ b/protoBuilds/0f7910/0f7910.ot2.apiv2.py.json @@ -1,5 +1,5 @@ { - "content": "from opentrons import protocol_api\n\n\nmetadata = {\n 'protocolName': 'Plate Filling with CSV Import',\n 'author': 'Rami Farawi ',\n 'source': 'Custom Protocol Request',\n 'apiLevel': '2.11'\n}\n\n\ndef run(ctx):\n\n [csv_samp,\n source_format,\n dest_format,\n starting_tip,\n p300_mount,\n p20_mount] = get_values( # noqa: F821\n \"csv_samp\",\n \"source_format\",\n \"dest_format\",\n \"starting_tip\",\n \"p300_mount\",\n \"p20_mount\")\n\n # mapping\n csv_lines = [[val.strip() for val in line.split(',')]\n for line in csv_samp.splitlines()\n if line.split(',')[0].strip()][1:]\n\n unique_list = []\n for row in csv_lines:\n source_plate_slot = int(row[1])\n if source_plate_slot not in unique_list:\n unique_list.append(source_plate_slot)\n\n starting_tip -= starting_tip\n\n # labware\n source_plates = [ctx.load_labware(\n 'corning_96_wellplate_360ul_flat'\n if source_format == \"96\"\n else \"corning_384_wellplate_112ul_flat\", slot)\n for slot in unique_list]\n source_plates = source_plates\n\n dest_plate = ctx.load_labware(\n 'corning_96_wellplate_360ul_flat'\n if dest_format == \"96\"\n else \"corning_384_wellplate_112ul_flat\", 2\n if dest_format == \"384\"\n else 1)\n transfer_vol = float(csv_lines[0][5])\n\n if transfer_vol > 20:\n tips300 = [ctx.load_labware('opentrons_96_tiprack_300ul', slot)\n for slot in [10]]\n else:\n tips20 = [ctx.load_labware('opentrons_96_tiprack_20ul', slot)\n for slot in [11]]\n\n # pipettes\n if transfer_vol > 20:\n p300 = ctx.load_instrument('p300_single_gen2', p300_mount,\n tip_racks=tips300)\n\n else:\n p20 = ctx.load_instrument('p20_single_gen2', p20_mount,\n tip_racks=tips20)\n\n def pick_up(pip):\n try:\n pip.pick_up_tip()\n except protocol_api.labware.OutOfTipsError:\n ctx.pause(\"Replace empty tip racks.\")\n pip.reset_tipracks()\n pick_up(pip)\n\n # protocol\n\n pip = p20 if transfer_vol <= 20 else p300\n pip.flow_rate.aspirate = 1\n pip.flow_rate.dispense = 2\n\n if transfer_vol > 20:\n pip.starting_tip = tips300[0].wells()[starting_tip]\n else:\n pip.starting_tip = tips20[0].wells()[starting_tip]\n\n for row in csv_lines:\n source_plate_slot = int(row[1])\n source_well_name = row[2]\n dest_well_name = row[4]\n pip_transfer_vol = float(row[5])\n\n source = ctx.loaded_labwares[source_plate_slot].wells_by_name()[source_well_name] # noqa: E501\n dest = dest_plate.wells_by_name()[dest_well_name]\n\n pick_up(pip)\n pip.transfer(pip_transfer_vol, source.bottom(z=0.2), dest,\n new_tip='never',\n blow_out=True, blowout_location='destination well')\n pip.drop_tip()\n ctx.comment('\\n\\n')\n", + "content": "from opentrons import protocol_api\n\n\nmetadata = {\n 'protocolName': 'Plate Filling with CSV Import',\n 'author': 'Rami Farawi ',\n 'source': 'Custom Protocol Request',\n 'apiLevel': '2.11'\n}\n\n\ndef run(ctx):\n\n [csv_samp,\n source_format,\n dest_format,\n starting_tip,\n p300_mount,\n p20_mount] = get_values( # noqa: F821\n \"csv_samp\",\n \"source_format\",\n \"dest_format\",\n \"starting_tip\",\n \"p300_mount\",\n \"p20_mount\")\n\n # mapping\n csv_lines = [[val.strip() for val in line.split(',')]\n for line in csv_samp.splitlines()\n if line.split(',')[0].strip()][1:]\n\n unique_list = []\n for row in csv_lines:\n source_plate_slot = int(row[1])\n if source_plate_slot not in unique_list:\n unique_list.append(source_plate_slot)\n\n starting_tip -= starting_tip\n\n # labware\n source_plates = [ctx.load_labware(\n 'corning_96_wellplate_360ul_flat'\n if source_format == \"96\"\n else \"corning_384_wellplate_112ul_flat\", slot)\n for slot in unique_list]\n source_plates = source_plates\n\n dest_plate = ctx.load_labware(\n 'corning_96_wellplate_360ul_flat'\n if dest_format == \"96\"\n else \"corning_384_wellplate_112ul_flat\", 2\n if dest_format == \"384\"\n else 1)\n transfer_vol = float(csv_lines[0][5])\n\n if transfer_vol > 20:\n tips300 = [ctx.load_labware('opentrons_96_tiprack_300ul', slot)\n for slot in [10]]\n else:\n tips20 = [ctx.load_labware('opentrons_96_tiprack_20ul', slot)\n for slot in [11]]\n\n # pipettes\n if transfer_vol > 20:\n p300 = ctx.load_instrument('p300_single_gen2', p300_mount,\n tip_racks=tips300)\n\n else:\n p20 = ctx.load_instrument('p20_single_gen2', p20_mount,\n tip_racks=tips20)\n\n def pick_up(pip):\n try:\n pip.pick_up_tip()\n except protocol_api.labware.OutOfTipsError:\n ctx.pause(\"Replace empty tip racks.\")\n pip.reset_tipracks()\n pick_up(pip)\n\n # protocol\n\n pip = p20 if transfer_vol <= 20 else p300\n pip.flow_rate.aspirate = 1\n pip.flow_rate.dispense = 2\n\n if transfer_vol > 20:\n pip.starting_tip = tips300[0].wells()[starting_tip]\n else:\n pip.starting_tip = tips20[0].wells()[starting_tip]\n\n for row in csv_lines:\n source_plate_slot = int(row[1])\n source_well_name = row[2]\n dest_well_name = row[4]\n pip_transfer_vol = float(row[5])\n\n source = ctx.loaded_labwares[source_plate_slot].wells_by_name()[source_well_name] # noqa: E501\n dest = dest_plate.wells_by_name()[dest_well_name]\n\n pick_up(pip)\n pip.mix(1, pip_transfer_vol, source.bottom(z=0.2))\n pip.aspirate(pip_transfer_vol, source.bottom(z=0.2))\n pip.dispense(pip_transfer_vol, dest)\n pip.move_to(dest.top(z=-3))\n ctx.delay(seconds=1)\n pip.blow_out()\n pip.drop_tip()\n ctx.comment('\\n\\n')\n", "custom_labware_defs": [], "fields": [ { diff --git a/protocols/0f7910/0f7910.ot2.apiv2.py b/protocols/0f7910/0f7910.ot2.apiv2.py index 55692bcd3..7a2086e88 100644 --- a/protocols/0f7910/0f7910.ot2.apiv2.py +++ b/protocols/0f7910/0f7910.ot2.apiv2.py @@ -98,8 +98,11 @@ def pick_up(pip): dest = dest_plate.wells_by_name()[dest_well_name] pick_up(pip) - pip.transfer(pip_transfer_vol, source.bottom(z=0.2), dest, - new_tip='never', - blow_out=True, blowout_location='destination well') + pip.mix(1, pip_transfer_vol, source.bottom(z=0.2)) + pip.aspirate(pip_transfer_vol, source.bottom(z=0.2)) + pip.dispense(pip_transfer_vol, dest) + pip.move_to(dest.top(z=-3)) + ctx.delay(seconds=1) + pip.blow_out() pip.drop_tip() ctx.comment('\n\n') From 206017324db6fc6afd2b0c1e584e692198d267c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9Cramifarawi=E2=80=9D?= <“rami.farawi@opentrons.com”> Date: Wed, 6 Mar 2024 16:55:54 -0500 Subject: [PATCH 04/19] fix --- protoBuilds/0f7910/0f7910.ot2.apiv2.py.json | 2 +- protocols/0f7910/0f7910.ot2.apiv2.py | 7 +++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/protoBuilds/0f7910/0f7910.ot2.apiv2.py.json b/protoBuilds/0f7910/0f7910.ot2.apiv2.py.json index ce4c17477..d4d5af2cb 100644 --- a/protoBuilds/0f7910/0f7910.ot2.apiv2.py.json +++ b/protoBuilds/0f7910/0f7910.ot2.apiv2.py.json @@ -1,5 +1,5 @@ { - "content": "from opentrons import protocol_api\n\n\nmetadata = {\n 'protocolName': 'Plate Filling with CSV Import',\n 'author': 'Rami Farawi ',\n 'source': 'Custom Protocol Request',\n 'apiLevel': '2.11'\n}\n\n\ndef run(ctx):\n\n [csv_samp,\n source_format,\n dest_format,\n starting_tip,\n p300_mount,\n p20_mount] = get_values( # noqa: F821\n \"csv_samp\",\n \"source_format\",\n \"dest_format\",\n \"starting_tip\",\n \"p300_mount\",\n \"p20_mount\")\n\n # mapping\n csv_lines = [[val.strip() for val in line.split(',')]\n for line in csv_samp.splitlines()\n if line.split(',')[0].strip()][1:]\n\n unique_list = []\n for row in csv_lines:\n source_plate_slot = int(row[1])\n if source_plate_slot not in unique_list:\n unique_list.append(source_plate_slot)\n\n starting_tip -= starting_tip\n\n # labware\n source_plates = [ctx.load_labware(\n 'corning_96_wellplate_360ul_flat'\n if source_format == \"96\"\n else \"corning_384_wellplate_112ul_flat\", slot)\n for slot in unique_list]\n source_plates = source_plates\n\n dest_plate = ctx.load_labware(\n 'corning_96_wellplate_360ul_flat'\n if dest_format == \"96\"\n else \"corning_384_wellplate_112ul_flat\", 2\n if dest_format == \"384\"\n else 1)\n transfer_vol = float(csv_lines[0][5])\n\n if transfer_vol > 20:\n tips300 = [ctx.load_labware('opentrons_96_tiprack_300ul', slot)\n for slot in [10]]\n else:\n tips20 = [ctx.load_labware('opentrons_96_tiprack_20ul', slot)\n for slot in [11]]\n\n # pipettes\n if transfer_vol > 20:\n p300 = ctx.load_instrument('p300_single_gen2', p300_mount,\n tip_racks=tips300)\n\n else:\n p20 = ctx.load_instrument('p20_single_gen2', p20_mount,\n tip_racks=tips20)\n\n def pick_up(pip):\n try:\n pip.pick_up_tip()\n except protocol_api.labware.OutOfTipsError:\n ctx.pause(\"Replace empty tip racks.\")\n pip.reset_tipracks()\n pick_up(pip)\n\n # protocol\n\n pip = p20 if transfer_vol <= 20 else p300\n pip.flow_rate.aspirate = 1\n pip.flow_rate.dispense = 2\n\n if transfer_vol > 20:\n pip.starting_tip = tips300[0].wells()[starting_tip]\n else:\n pip.starting_tip = tips20[0].wells()[starting_tip]\n\n for row in csv_lines:\n source_plate_slot = int(row[1])\n source_well_name = row[2]\n dest_well_name = row[4]\n pip_transfer_vol = float(row[5])\n\n source = ctx.loaded_labwares[source_plate_slot].wells_by_name()[source_well_name] # noqa: E501\n dest = dest_plate.wells_by_name()[dest_well_name]\n\n pick_up(pip)\n pip.mix(1, pip_transfer_vol, source.bottom(z=0.2))\n pip.aspirate(pip_transfer_vol, source.bottom(z=0.2))\n pip.dispense(pip_transfer_vol, dest)\n pip.move_to(dest.top(z=-3))\n ctx.delay(seconds=1)\n pip.blow_out()\n pip.drop_tip()\n ctx.comment('\\n\\n')\n", + "content": "from opentrons import protocol_api\n\n\nmetadata = {\n 'protocolName': 'Plate Filling with CSV Import',\n 'author': 'Rami Farawi ',\n 'source': 'Custom Protocol Request',\n 'apiLevel': '2.11'\n}\n\n\ndef run(ctx):\n\n [csv_samp,\n source_format,\n dest_format,\n starting_tip,\n p300_mount,\n p20_mount] = get_values( # noqa: F821\n \"csv_samp\",\n \"source_format\",\n \"dest_format\",\n \"starting_tip\",\n \"p300_mount\",\n \"p20_mount\")\n\n # mapping\n csv_lines = [[val.strip() for val in line.split(',')]\n for line in csv_samp.splitlines()\n if line.split(',')[0].strip()][1:]\n\n unique_list = []\n for row in csv_lines:\n source_plate_slot = int(row[1])\n if source_plate_slot not in unique_list:\n unique_list.append(source_plate_slot)\n\n starting_tip -= starting_tip\n\n # labware\n source_plates = [ctx.load_labware(\n 'corning_96_wellplate_360ul_flat'\n if source_format == \"96\"\n else \"corning_384_wellplate_112ul_flat\", slot)\n for slot in unique_list]\n source_plates = source_plates\n\n dest_plate = ctx.load_labware(\n 'corning_96_wellplate_360ul_flat'\n if dest_format == \"96\"\n else \"corning_384_wellplate_112ul_flat\", 2\n if dest_format == \"384\"\n else 1)\n transfer_vol = float(csv_lines[0][5])\n\n if transfer_vol > 20:\n tips300 = [ctx.load_labware('opentrons_96_tiprack_300ul', slot)\n for slot in [10]]\n else:\n tips20 = [ctx.load_labware('opentrons_96_tiprack_20ul', slot)\n for slot in [11]]\n\n # pipettes\n if transfer_vol > 20:\n p300 = ctx.load_instrument('p300_single_gen2', p300_mount,\n tip_racks=tips300)\n\n else:\n p20 = ctx.load_instrument('p20_single_gen2', p20_mount,\n tip_racks=tips20)\n\n def pick_up(pip):\n try:\n pip.pick_up_tip()\n except protocol_api.labware.OutOfTipsError:\n ctx.pause(\"Replace empty tip racks.\")\n pip.reset_tipracks()\n pick_up(pip)\n\n # protocol\n\n pip = p20 if transfer_vol <= 20 else p300\n pip.flow_rate.aspirate = 1\n pip.flow_rate.dispense = 2\n\n if transfer_vol > 20:\n pip.starting_tip = tips300[0].wells()[starting_tip]\n else:\n pip.starting_tip = tips20[0].wells()[starting_tip]\n\n for row in csv_lines:\n source_plate_slot = int(row[1])\n source_well_name = row[2]\n dest_well_name = row[4]\n\n source = ctx.loaded_labwares[source_plate_slot].wells_by_name()[source_well_name] # noqa: E501\n dest = dest_plate.wells_by_name()[dest_well_name]\n\n pick_up(pip)\n pip.mix(1, transfer_vol, source.bottom(z=0.2))\n pip.aspirate(transfer_vol, source.bottom(z=0.2))\n pip.dispense(transfer_vol, dest)\n pip.move_to(dest.top(z=-3))\n ctx.delay(seconds=1)\n pip.blow_out()\n pip.drop_tip()\n ctx.comment('\\n\\n')\n", "custom_labware_defs": [], "fields": [ { diff --git a/protocols/0f7910/0f7910.ot2.apiv2.py b/protocols/0f7910/0f7910.ot2.apiv2.py index 7a2086e88..cd64bbe2f 100644 --- a/protocols/0f7910/0f7910.ot2.apiv2.py +++ b/protocols/0f7910/0f7910.ot2.apiv2.py @@ -92,15 +92,14 @@ def pick_up(pip): source_plate_slot = int(row[1]) source_well_name = row[2] dest_well_name = row[4] - pip_transfer_vol = float(row[5]) source = ctx.loaded_labwares[source_plate_slot].wells_by_name()[source_well_name] # noqa: E501 dest = dest_plate.wells_by_name()[dest_well_name] pick_up(pip) - pip.mix(1, pip_transfer_vol, source.bottom(z=0.2)) - pip.aspirate(pip_transfer_vol, source.bottom(z=0.2)) - pip.dispense(pip_transfer_vol, dest) + pip.mix(1, transfer_vol, source.bottom(z=0.2)) + pip.aspirate(transfer_vol, source.bottom(z=0.2)) + pip.dispense(transfer_vol, dest) pip.move_to(dest.top(z=-3)) ctx.delay(seconds=1) pip.blow_out() From 7582ae9de9f1cb483001bab7546393c099c8ca5d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9Cramifarawi=E2=80=9D?= <“rami.farawi@opentrons.com”> Date: Tue, 12 Mar 2024 12:21:20 -0400 Subject: [PATCH 05/19] fix --- protocols/04711e/04711e.ot2.apiv2.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/protocols/04711e/04711e.ot2.apiv2.py b/protocols/04711e/04711e.ot2.apiv2.py index 4ff15eab4..eeb8bf19e 100644 --- a/protocols/04711e/04711e.ot2.apiv2.py +++ b/protocols/04711e/04711e.ot2.apiv2.py @@ -56,6 +56,9 @@ def run(ctx): total_vol = num_samp*(primer_vol+mmx_vol) p300.pick_up_tip() p300.transfer(primer_vol*num_samp*1.15, primer, final_mmx, new_tip='never') + for _ in range(20): + p300.aspirate(total_vol if total_vol < 300 else 300, final_mmx) + p300.dispense(total_vol if total_vol < 300 else 300, final_mmx.top(z=-3)) p300.mix(20, total_vol if total_vol < 300 else 300, final_mmx) p300.drop_tip() From 5c1465cd00e2d4fada21566332192e9da156c6f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9Cramifarawi=E2=80=9D?= <“rami.farawi@opentrons.com”> Date: Tue, 12 Mar 2024 12:22:21 -0400 Subject: [PATCH 06/19] fix --- protoBuilds/04711e/04711e.ot2.apiv2.py.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/protoBuilds/04711e/04711e.ot2.apiv2.py.json b/protoBuilds/04711e/04711e.ot2.apiv2.py.json index 0bbd8f420..ff2efac67 100644 --- a/protoBuilds/04711e/04711e.ot2.apiv2.py.json +++ b/protoBuilds/04711e/04711e.ot2.apiv2.py.json @@ -1,5 +1,5 @@ { - "content": "# flake8: noqa\n\nimport math\n\nmetadata = {\n 'protocolName': 'PCR Prep',\n 'author': 'Rami Farawi ',\n 'source': 'Custom Protocol Request',\n 'apiLevel': '2.13'\n}\n\n\ndef run(ctx):\n\n [num_samp,\n p300_mount, m20_mount] = get_values( # noqa: F821\n \"num_samp\", \"p300_mount\", \"m20_mount\")\n\n # num_samp = 16\n # p300_mount = 'left'\n # m20_mount = 'right'\n\n # labware\n tuberack = ctx.load_labware('opentrons_24_tuberack_2000ul', 4)\n\n source_plate = ctx.load_labware('pcrplate_96_wellplate_200ul', 1)\n middle_plate = ctx.load_labware('pcrplate_96_wellplate_200ul', 2)\n final_plate = ctx.load_labware('pcrplate_96_wellplate_200ul', 3)\n\n tip300 = [ctx.load_labware('opentrons_96_tiprack_300ul', slot)\n for slot in [6]]\n tip20 = [ctx.load_labware('opentrons_96_filtertiprack_20ul', slot)\n for slot in [10, 11]]\n\n # pipettes\n p300 = ctx.load_instrument('p300_single_gen2', p300_mount,\n tip_racks=tip300)\n m20 = ctx.load_instrument('p20_multi_gen2', m20_mount,\n tip_racks=tip20)\n\n # mapping\n mmx = tuberack['A1']\n primer = tuberack['A2']\n final_mmx = tuberack['A3']\n num_col = math.ceil(num_samp/8)\n\n # protocol\n ctx.comment('\\n---------------MAKING MASTERMIX----------------\\n\\n')\n mmx_vol = 9.1\n primer_vol = 5.57\n\n p300.pick_up_tip()\n p300.transfer(mmx_vol*num_samp*1.15, mmx, final_mmx, new_tip='never')\n p300.drop_tip()\n\n total_vol = num_samp*(primer_vol+mmx_vol)\n p300.pick_up_tip()\n p300.transfer(primer_vol*num_samp*1.15, primer, final_mmx, new_tip='never')\n p300.mix(20, total_vol if total_vol < 300 else 300, final_mmx)\n p300.drop_tip()\n\n vol_per_col_well = (mmx_vol+primer_vol)*12*1.1\n p300.pick_up_tip()\n for well in middle_plate.columns()[0]:\n p300.aspirate(vol_per_col_well, final_mmx)\n p300.dispense(vol_per_col_well, well)\n p300.drop_tip()\n\n ctx.comment('\\n---------------DISTRIBUTING MASTERMIX----------------\\n\\n')\n m20.pick_up_tip()\n for col in final_plate.rows()[0][:num_col]:\n m20.aspirate(14.7, middle_plate.rows()[0][0])\n m20.dispense(14.7, col)\n m20.drop_tip()\n\n ctx.comment('\\n---------------DISTRIBUTING SAMPLE----------------\\n\\n')\n for s, d in zip(source_plate.rows()[0][:num_col], final_plate.rows()[0]):\n m20.pick_up_tip()\n m20.aspirate(4, s)\n m20.dispense(4, d)\n m20.mix(5, 15, d)\n m20.drop_tip()\n", + "content": "# flake8: noqa\n\nimport math\n\nmetadata = {\n 'protocolName': 'PCR Prep',\n 'author': 'Rami Farawi ',\n 'source': 'Custom Protocol Request',\n 'apiLevel': '2.13'\n}\n\n\ndef run(ctx):\n\n [num_samp,\n p300_mount, m20_mount] = get_values( # noqa: F821\n \"num_samp\", \"p300_mount\", \"m20_mount\")\n\n # num_samp = 16\n # p300_mount = 'left'\n # m20_mount = 'right'\n\n # labware\n tuberack = ctx.load_labware('opentrons_24_tuberack_2000ul', 4)\n\n source_plate = ctx.load_labware('pcrplate_96_wellplate_200ul', 1)\n middle_plate = ctx.load_labware('pcrplate_96_wellplate_200ul', 2)\n final_plate = ctx.load_labware('pcrplate_96_wellplate_200ul', 3)\n\n tip300 = [ctx.load_labware('opentrons_96_tiprack_300ul', slot)\n for slot in [6]]\n tip20 = [ctx.load_labware('opentrons_96_filtertiprack_20ul', slot)\n for slot in [10, 11]]\n\n # pipettes\n p300 = ctx.load_instrument('p300_single_gen2', p300_mount,\n tip_racks=tip300)\n m20 = ctx.load_instrument('p20_multi_gen2', m20_mount,\n tip_racks=tip20)\n\n # mapping\n mmx = tuberack['A1']\n primer = tuberack['A2']\n final_mmx = tuberack['A3']\n num_col = math.ceil(num_samp/8)\n\n # protocol\n ctx.comment('\\n---------------MAKING MASTERMIX----------------\\n\\n')\n mmx_vol = 9.1\n primer_vol = 5.57\n\n p300.pick_up_tip()\n p300.transfer(mmx_vol*num_samp*1.15, mmx, final_mmx, new_tip='never')\n p300.drop_tip()\n\n total_vol = num_samp*(primer_vol+mmx_vol)\n p300.pick_up_tip()\n p300.transfer(primer_vol*num_samp*1.15, primer, final_mmx, new_tip='never')\n for _ in range(20):\n p300.aspirate(total_vol if total_vol < 300 else 300, final_mmx)\n p300.dispense(total_vol if total_vol < 300 else 300, final_mmx.top(z=-3))\n p300.mix(20, total_vol if total_vol < 300 else 300, final_mmx)\n p300.drop_tip()\n\n vol_per_col_well = (mmx_vol+primer_vol)*12*1.1\n p300.pick_up_tip()\n for well in middle_plate.columns()[0]:\n p300.aspirate(vol_per_col_well, final_mmx)\n p300.dispense(vol_per_col_well, well)\n p300.drop_tip()\n\n ctx.comment('\\n---------------DISTRIBUTING MASTERMIX----------------\\n\\n')\n m20.pick_up_tip()\n for col in final_plate.rows()[0][:num_col]:\n m20.aspirate(14.7, middle_plate.rows()[0][0])\n m20.dispense(14.7, col)\n m20.drop_tip()\n\n ctx.comment('\\n---------------DISTRIBUTING SAMPLE----------------\\n\\n')\n for s, d in zip(source_plate.rows()[0][:num_col], final_plate.rows()[0]):\n m20.pick_up_tip()\n m20.aspirate(4, s)\n m20.dispense(4, d)\n m20.mix(5, 15, d)\n m20.drop_tip()\n", "custom_labware_defs": [ { "brand": { From fd8739a03bd268acacb489d8a8bc1c1f166de0ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9Cramifarawi=E2=80=9D?= <“rami.farawi@opentrons.com”> Date: Thu, 14 Mar 2024 10:42:04 -0400 Subject: [PATCH 07/19] fix --- data/data/fields.csv | 2 +- protoBuilds/0451f3/miniprep.ot2.apiv2.py.json | 8 +++++++- protocols/0451f3/fields.json | 6 ++++++ protocols/0451f3/miniprep.ot2.apiv2.py | 6 ++++-- 4 files changed, 18 insertions(+), 4 deletions(-) diff --git a/data/data/fields.csv b/data/data/fields.csv index e341042fb..297dfae2c 100644 --- a/data/data/fields.csv +++ b/data/data/fields.csv @@ -438,7 +438,7 @@ empty_vial_well,3 end_col,1 end_column,1 end_repair,1 -engage_height,19 +engage_height,20 engage_offset,4 engage_time,17 enz_asp_rate,1 diff --git a/protoBuilds/0451f3/miniprep.ot2.apiv2.py.json b/protoBuilds/0451f3/miniprep.ot2.apiv2.py.json index 26569874b..c02ba2a73 100644 --- a/protoBuilds/0451f3/miniprep.ot2.apiv2.py.json +++ b/protoBuilds/0451f3/miniprep.ot2.apiv2.py.json @@ -1,5 +1,5 @@ { - "content": "from opentrons import protocol_api\nfrom opentrons.types import Point\nimport math\n\nmetadata = {\n 'protocolName': 'Zymo Zyppy\u2122-96 Plasmid MagBead Miniprep',\n 'author': 'Opentrons ',\n 'apiLevel': '2.12'\n}\n\nTEST_MODE_BEADS = False\nTEST_MODE_BIND_INCUBATE = False\nTEST_MODE_AIRDRY = False\n\n\ndef run(ctx):\n\n [num_samples, mixreps, time_airdry_minutes, vol_final_elution,\n mount_m300] = get_values( # noqa: F821\n 'num_samples', 'mixreps', 'time_airdry_minutes', 'vol_final_elution',\n 'mount_m300')\n\n if TEST_MODE_BEADS:\n mixreps = 1\n # time_settling_bind_minutes = 5.0\n time_settling_wash_minutes = 2.0\n vol_mix = 180\n z_offset = 3.0\n radial_offset_fraction = 0.6 # fraction of radius\n vol_cleared_lysate = 750.0\n vol_elution = 40\n engage_height = 7.6\n time_incubation_deep_blue_minutes = 5.0\n time_incubation_elution_minutes = 5.0\n\n ctx.max_speeds['X'] = 200\n ctx.max_speeds['Y'] = 200\n\n magdeck = ctx.load_module('magnetic module gen2', '1')\n magdeck.disengage()\n magplate = magdeck.load_labware('nest_96_wellplate_2ml_deep',\n 'deepwell plate')\n collection_plate = ctx.load_labware('nest_96_wellplate_2ml_deep', '2',\n 'collection plate')\n elutionplate = ctx.load_labware('biorad_96_wellplate_200ul_pcr', '3',\n 'elution plate')\n waste = ctx.load_labware('nest_1_reservoir_195ml', '4',\n 'Liquid Waste').wells()[0]\n res1 = ctx.load_labware('nest_12_reservoir_15ml', '5',\n 'reagent reservoir 1')\n res2 = ctx.load_labware('nest_1_reservoir_195ml', '6',\n 'reagent reservoir 2')\n tips300 = [\n ctx.load_labware('opentrons_96_filtertiprack_200ul', slot,\n '200\u00b5l filtertiprack')\n for slot in ['7', '8', '9', '10', '11']]\n\n # load P300M pipette\n m300 = ctx.load_instrument(\n 'p300_multi_gen2', mount_m300, tip_racks=tips300)\n\n \"\"\"\n Here is where you can define the locations of your reagents.\n \"\"\"\n deep_blue_lysis_buffer = res1.rows()[0][:1]\n neutralization_buffer = res1.rows()[0][1:5]\n magclearing_beads = res1.rows()[0][5:6]\n magbinding_beads = res1.rows()[0][6:7]\n endo_wash_buffer = res1.rows()[0][7:9]\n elution_buffer = res1.rows()[0][9:10]\n zyppy_wash_buffer = res2.rows()[0][:1]\n\n num_cols = math.ceil(num_samples/8)\n mag_samples_m = magplate.rows()[0][:num_cols]\n collection_samples = collection_plate.rows()[0][:num_cols]\n elution_samples_m = elutionplate.rows()[0][:num_cols]\n if mag_samples_m[0].width:\n radius = mag_samples_m[0].width/2\n else:\n radius = mag_samples_m[0].diameter/2\n\n def pick_up(pip=m300):\n try:\n pip.pick_up_tip()\n except protocol_api.labware.OutOfTipsError:\n ctx.pause(\"\\n\\n\\n\\nReplace 200ul filtertipracks before resuming.\")\n pip.reset_tipracks()\n pip.pick_up_tip()\n\n def slow_withdraw(well, pip=m300):\n ctx.max_speeds['A'] = 25\n ctx.max_speeds['Z'] = 25\n pip.move_to(well.top())\n del ctx.max_speeds['A']\n del ctx.max_speeds['Z']\n\n def remove_supernatant(vol, destinations, z_asp=z_offset, z_disp=None):\n \"\"\"\n `remove_supernatant` will transfer supernatant from the deepwell\n extraction plate to the liquid waste reservoir.\n :param vol (float): The amount of volume to aspirate from all deepwell\n sample wells and dispense in the liquid waste.\n :param park (boolean): Whether to pick up sample-corresponding tips\n in the 'parking rack' or to pick up new tips.\n \"\"\"\n\n dest_list = [destinations]*num_cols \\\n if type(destinations) != list else destinations\n\n if not z_disp:\n z_disp = dest_list[0].depth\n\n num_transfers = math.ceil(vol/m300.tip_racks[0].wells()[0].max_volume)\n vol_per_transfer = round(vol/num_transfers, 2)\n m300.flow_rate.aspirate /= 10\n for m, dest in zip(mag_samples_m, dest_list):\n pick_up()\n for _ in range(num_transfers):\n m300.aspirate(vol_per_transfer, m.bottom(z_asp))\n slow_withdraw(m)\n m300.dispense(vol_per_transfer, dest.bottom(z_disp))\n m300.blow_out(dest.bottom(z_disp))\n slow_withdraw(dest, m300)\n m300.drop_tip()\n m300.flow_rate.aspirate *= 10\n\n def resuspend(location, reps=mixreps, vol=vol_mix,\n samples=mag_samples_m, x_mix_fraction=radial_offset_fraction,\n z_mix=z_offset, dispense_height_rel=8, delay_seconds=0):\n m300.flow_rate.aspirate *= 4\n m300.flow_rate.dispense *= 4\n side_x = 1 if samples.index(location) % 2 == 0 else -1\n m300.move_to(location.center())\n for r_ind in range(reps):\n side_y = 1 if r_ind % 2 == 0 else -1\n bead_loc = location.bottom().move(\n Point(x=side_x*radius*radial_offset_fraction,\n y=side_y*radius*radial_offset_fraction,\n z=z_mix))\n m300.aspirate(vol, bead_loc)\n m300.dispense(vol, bead_loc.move(Point(z=dispense_height_rel)))\n ctx.delay(seconds=delay_seconds)\n m300.flow_rate.aspirate /= 4\n m300.flow_rate.dispense /= 4\n\n def lyse_bind_wash(vol, reagent, time_incubation=0,\n time_settling=0, premix=False,\n do_discard_supernatant=True, do_resuspend=False,\n vol_supernatant=0, supernatant_locations=None,\n resuspension_delay_seconds=0,\n z_disp_supernatant=None):\n \"\"\"\n `bind` will perform magnetic bead binding on each sample in the\n deepwell plate. Each channel of binding beads will be mixed before\n transfer, and the samples will be mixed with the binding beads after\n the transfer. The magnetic deck activates after the addition to all\n samples, and the supernatant is removed after bead bining.\n :param vol (float): The amount of volume to aspirate from the elution\n buffer source and dispense to each well containing\n beads.\n :param park (boolean): Whether to save sample-corresponding tips\n between adding elution buffer and transferring\n supernatant to the final clean elutions PCR\n plate.\n \"\"\"\n\n columns_per_channel = 12//len(reagent)\n num_transfers = math.ceil(vol/m300.tip_racks[0].wells()[0].max_volume)\n vol_per_transfer = round(vol/num_transfers, 2)\n\n for i, well in enumerate(mag_samples_m):\n source = reagent[i//columns_per_channel]\n pick_up()\n if premix:\n m300.flow_rate.aspirate *= 4\n m300.flow_rate.dispense *= 4\n for _ in range(5):\n m300.aspirate(200, source.bottom(0.5))\n m300.dispense(200, source.bottom(5))\n m300.flow_rate.aspirate /= 4\n m300.flow_rate.dispense /= 4\n for _ in range(num_transfers):\n m300.dispense(m300.current_volume, source.top(-1))\n m300.aspirate(vol_per_transfer, source)\n slow_withdraw(source)\n m300.dispense(vol_per_transfer, well.top(-1))\n m300.blow_out(well.top(-1))\n m300.aspirate(10, well.top(-1)) # avoid droplet\n\n if do_resuspend:\n resuspend(well)\n else:\n if mixreps > 0:\n m300.flow_rate.aspirate *= 4\n m300.flow_rate.dispense *= 4\n m300.mix(mixreps, vol_mix, well.bottom(2))\n m300.flow_rate.aspirate /= 4\n m300.flow_rate.dispense /= 4\n m300.air_gap(20)\n m300.drop_tip()\n\n if not TEST_MODE_BIND_INCUBATE:\n ctx.delay(minutes=time_incubation,\n msg=f'Incubating off MagDeck for \\\n{time_incubation_deep_blue_minutes} minutes.')\n if do_discard_supernatant:\n magdeck.engage(engage_height)\n if not TEST_MODE_BEADS:\n ctx.delay(minutes=time_settling, msg=f'Incubating on \\\nMagDeck for {time_settling} minutes.')\n\n remove_supernatant(vol_supernatant,\n destinations=supernatant_locations)\n magdeck.disengage()\n\n lyse_bind_wash(vol=100, reagent=deep_blue_lysis_buffer,\n time_incubation=time_incubation_deep_blue_minutes,\n do_discard_supernatant=False)\n lyse_bind_wash(vol=450, reagent=neutralization_buffer,\n do_discard_supernatant=False, resuspension_delay_seconds=5)\n lyse_bind_wash(vol=50, reagent=magclearing_beads, premix=True,\n do_discard_supernatant=False, resuspension_delay_seconds=5)\n\n ctx.pause('Centrifuge the extraction plate. Replace on magnetic module \\\nwhen finished.')\n magdeck.engage(engage_height)\n ctx.delay(minutes=10, msg='Incubating on MagDeck for 10 minutes.')\n remove_supernatant(vol_cleared_lysate, collection_samples,\n z_disp=2.0)\n\n ctx.pause('Discard plate on magnetic module. Move collection plate \\\n(slot 2) to the magnetic module (slot 1)')\n\n lyse_bind_wash(30, magbinding_beads, do_resuspend=True, premix=True,\n do_discard_supernatant=True, vol_supernatant=780,\n supernatant_locations=waste)\n lyse_bind_wash(200, endo_wash_buffer, do_resuspend=True,\n time_settling=time_settling_wash_minutes,\n do_discard_supernatant=True, vol_supernatant=200,\n supernatant_locations=waste)\n for _ in range(2):\n lyse_bind_wash(400, zyppy_wash_buffer, do_resuspend=True,\n time_settling=time_settling_wash_minutes,\n do_discard_supernatant=True, vol_supernatant=400,\n supernatant_locations=waste)\n\n ctx.pause('Move the collection plate (slot 1) to a heating block for \\\n30mins 65C to remove the residual ethanol. Replace the plate onto the \\\nmagnetic module when complete.')\n\n lyse_bind_wash(vol_elution, elution_buffer,\n time_incubation=time_incubation_elution_minutes,\n do_resuspend=True, supernatant_locations=elution_samples_m,\n time_settling=5.0, vol_supernatant=vol_elution-5.0,\n z_disp_supernatant=2.0)\n", + "content": "from opentrons import protocol_api\nfrom opentrons.types import Point\nimport math\n\nmetadata = {\n 'protocolName': 'Zymo Zyppy\u2122-96 Plasmid MagBead Miniprep',\n 'author': 'Opentrons ',\n 'apiLevel': '2.12'\n}\n\nTEST_MODE_BEADS = False\nTEST_MODE_BIND_INCUBATE = False\nTEST_MODE_AIRDRY = False\n\n\ndef run(ctx):\n\n [num_samples, mixreps, time_airdry_minutes, vol_final_elution,\n engage_height,\n mount_m300] = get_values( # noqa: F821\n 'num_samples', 'mixreps', 'time_airdry_minutes', 'vol_final_elution',\n 'engage_height',\n 'mount_m300')\n\n if TEST_MODE_BEADS:\n mixreps = 1\n # time_settling_bind_minutes = 5.0\n time_settling_wash_minutes = 2.0\n vol_mix = 180\n z_offset = 3.0\n radial_offset_fraction = 0.6 # fraction of radius\n vol_cleared_lysate = 750.0\n vol_elution = 40\n # engage_height = 4.9\n time_incubation_deep_blue_minutes = 5.0\n time_incubation_elution_minutes = 5.0\n\n ctx.max_speeds['X'] = 200\n ctx.max_speeds['Y'] = 200\n\n magdeck = ctx.load_module('magnetic module gen2', '1')\n magdeck.disengage()\n magplate = magdeck.load_labware('nest_96_wellplate_2ml_deep',\n 'deepwell plate')\n collection_plate = ctx.load_labware('nest_96_wellplate_2ml_deep', '2',\n 'collection plate')\n elutionplate = ctx.load_labware('biorad_96_wellplate_200ul_pcr', '3',\n 'elution plate')\n waste = ctx.load_labware('nest_1_reservoir_195ml', '4',\n 'Liquid Waste').wells()[0]\n res1 = ctx.load_labware('nest_12_reservoir_15ml', '5',\n 'reagent reservoir 1')\n res2 = ctx.load_labware('nest_1_reservoir_195ml', '6',\n 'reagent reservoir 2')\n tips300 = [\n ctx.load_labware('opentrons_96_filtertiprack_200ul', slot,\n '200\u00b5l filtertiprack')\n for slot in ['7', '8', '9', '10', '11']]\n\n # load P300M pipette\n m300 = ctx.load_instrument(\n 'p300_multi_gen2', mount_m300, tip_racks=tips300)\n\n \"\"\"\n Here is where you can define the locations of your reagents.\n \"\"\"\n deep_blue_lysis_buffer = res1.rows()[0][:1]\n neutralization_buffer = res1.rows()[0][1:5]\n magclearing_beads = res1.rows()[0][5:6]\n magbinding_beads = res1.rows()[0][6:7]\n endo_wash_buffer = res1.rows()[0][7:9]\n elution_buffer = res1.rows()[0][9:10]\n zyppy_wash_buffer = res2.rows()[0][:1]\n\n num_cols = math.ceil(num_samples/8)\n mag_samples_m = magplate.rows()[0][:num_cols]\n collection_samples = collection_plate.rows()[0][:num_cols]\n elution_samples_m = elutionplate.rows()[0][:num_cols]\n if mag_samples_m[0].width:\n radius = mag_samples_m[0].width/2\n else:\n radius = mag_samples_m[0].diameter/2\n\n def pick_up(pip=m300):\n try:\n pip.pick_up_tip()\n except protocol_api.labware.OutOfTipsError:\n ctx.pause(\"\\n\\n\\n\\nReplace 200ul filtertipracks before resuming.\")\n pip.reset_tipracks()\n pip.pick_up_tip()\n\n def slow_withdraw(well, pip=m300):\n ctx.max_speeds['A'] = 25\n ctx.max_speeds['Z'] = 25\n pip.move_to(well.top())\n del ctx.max_speeds['A']\n del ctx.max_speeds['Z']\n\n def remove_supernatant(vol, destinations, z_asp=z_offset, z_disp=None):\n \"\"\"\n `remove_supernatant` will transfer supernatant from the deepwell\n extraction plate to the liquid waste reservoir.\n :param vol (float): The amount of volume to aspirate from all deepwell\n sample wells and dispense in the liquid waste.\n :param park (boolean): Whether to pick up sample-corresponding tips\n in the 'parking rack' or to pick up new tips.\n \"\"\"\n\n dest_list = [destinations]*num_cols \\\n if type(destinations) != list else destinations\n\n if not z_disp:\n z_disp = dest_list[0].depth\n\n num_transfers = math.ceil(vol/m300.tip_racks[0].wells()[0].max_volume)\n vol_per_transfer = round(vol/num_transfers, 2)\n m300.flow_rate.aspirate /= 10\n for m, dest in zip(mag_samples_m, dest_list):\n pick_up()\n for _ in range(num_transfers):\n m300.aspirate(vol_per_transfer, m.bottom(z_asp))\n slow_withdraw(m)\n m300.dispense(vol_per_transfer, dest.bottom(z_disp))\n m300.blow_out(dest.bottom(z_disp))\n slow_withdraw(dest, m300)\n m300.drop_tip()\n m300.flow_rate.aspirate *= 10\n\n def resuspend(location, reps=mixreps, vol=vol_mix,\n samples=mag_samples_m, x_mix_fraction=radial_offset_fraction,\n z_mix=z_offset, dispense_height_rel=8, delay_seconds=0):\n m300.flow_rate.aspirate *= 4\n m300.flow_rate.dispense *= 4\n side_x = 1 if samples.index(location) % 2 == 0 else -1\n m300.move_to(location.center())\n for r_ind in range(reps):\n side_y = 1 if r_ind % 2 == 0 else -1\n bead_loc = location.bottom().move(\n Point(x=side_x*radius*radial_offset_fraction,\n y=side_y*radius*radial_offset_fraction,\n z=z_mix))\n m300.aspirate(vol, bead_loc)\n m300.dispense(vol, bead_loc.move(Point(z=dispense_height_rel)))\n ctx.delay(seconds=delay_seconds)\n m300.flow_rate.aspirate /= 4\n m300.flow_rate.dispense /= 4\n\n def lyse_bind_wash(vol, reagent, time_incubation=0,\n time_settling=0, premix=False,\n do_discard_supernatant=True, do_resuspend=False,\n vol_supernatant=0, supernatant_locations=None,\n resuspension_delay_seconds=0,\n z_disp_supernatant=None):\n \"\"\"\n `bind` will perform magnetic bead binding on each sample in the\n deepwell plate. Each channel of binding beads will be mixed before\n transfer, and the samples will be mixed with the binding beads after\n the transfer. The magnetic deck activates after the addition to all\n samples, and the supernatant is removed after bead bining.\n :param vol (float): The amount of volume to aspirate from the elution\n buffer source and dispense to each well containing\n beads.\n :param park (boolean): Whether to save sample-corresponding tips\n between adding elution buffer and transferring\n supernatant to the final clean elutions PCR\n plate.\n \"\"\"\n\n columns_per_channel = 12//len(reagent)\n num_transfers = math.ceil(vol/m300.tip_racks[0].wells()[0].max_volume)\n vol_per_transfer = round(vol/num_transfers, 2)\n\n for i, well in enumerate(mag_samples_m):\n source = reagent[i//columns_per_channel]\n pick_up()\n if premix:\n m300.flow_rate.aspirate *= 4\n m300.flow_rate.dispense *= 4\n for _ in range(5):\n m300.aspirate(200, source.bottom(0.5))\n m300.dispense(200, source.bottom(5))\n m300.flow_rate.aspirate /= 4\n m300.flow_rate.dispense /= 4\n for _ in range(num_transfers):\n m300.dispense(m300.current_volume, source.top(-1))\n m300.aspirate(vol_per_transfer, source)\n slow_withdraw(source)\n m300.dispense(vol_per_transfer, well.top(-1))\n m300.blow_out(well.top(-1))\n m300.aspirate(10, well.top(-1)) # avoid droplet\n\n if do_resuspend:\n resuspend(well)\n else:\n if mixreps > 0:\n m300.flow_rate.aspirate *= 4\n m300.flow_rate.dispense *= 4\n m300.mix(mixreps, vol_mix, well.bottom(2))\n m300.flow_rate.aspirate /= 4\n m300.flow_rate.dispense /= 4\n m300.air_gap(20)\n m300.drop_tip()\n\n if not TEST_MODE_BIND_INCUBATE:\n ctx.delay(minutes=time_incubation,\n msg=f'Incubating off MagDeck for \\\n{time_incubation_deep_blue_minutes} minutes.')\n if do_discard_supernatant:\n magdeck.engage(engage_height)\n if not TEST_MODE_BEADS:\n ctx.delay(minutes=time_settling, msg=f'Incubating on \\\nMagDeck for {time_settling} minutes.')\n\n remove_supernatant(vol_supernatant,\n destinations=supernatant_locations)\n magdeck.disengage()\n\n lyse_bind_wash(vol=100, reagent=deep_blue_lysis_buffer,\n time_incubation=time_incubation_deep_blue_minutes,\n do_discard_supernatant=False)\n lyse_bind_wash(vol=450, reagent=neutralization_buffer,\n do_discard_supernatant=False, resuspension_delay_seconds=5)\n lyse_bind_wash(vol=50, reagent=magclearing_beads, premix=True,\n do_discard_supernatant=False, resuspension_delay_seconds=5)\n\n ctx.pause('Centrifuge the extraction plate. Replace on magnetic module \\\nwhen finished.')\n magdeck.engage(engage_height)\n ctx.delay(minutes=10, msg='Incubating on MagDeck for 10 minutes.')\n remove_supernatant(vol_cleared_lysate, collection_samples,\n z_disp=2.0)\n\n ctx.pause('Discard plate on magnetic module. Move collection plate \\\n(slot 2) to the magnetic module (slot 1)')\n\n lyse_bind_wash(30, magbinding_beads, do_resuspend=True, premix=True,\n do_discard_supernatant=True, vol_supernatant=780,\n supernatant_locations=waste)\n lyse_bind_wash(200, endo_wash_buffer, do_resuspend=True,\n time_settling=time_settling_wash_minutes,\n do_discard_supernatant=True, vol_supernatant=200,\n supernatant_locations=waste)\n for _ in range(2):\n lyse_bind_wash(400, zyppy_wash_buffer, do_resuspend=True,\n time_settling=time_settling_wash_minutes,\n do_discard_supernatant=True, vol_supernatant=400,\n supernatant_locations=waste)\n\n ctx.pause('Move the collection plate (slot 1) to a heating block for \\\n30mins 65C to remove the residual ethanol. Replace the plate onto the \\\nmagnetic module when complete.')\n\n lyse_bind_wash(vol_elution, elution_buffer,\n time_incubation=time_incubation_elution_minutes,\n do_resuspend=True, supernatant_locations=elution_samples_m,\n time_settling=5.0, vol_supernatant=vol_elution-5.0,\n z_disp_supernatant=2.0)\n", "custom_labware_defs": [], "fields": [ { @@ -47,6 +47,12 @@ "name": "vol_final_elution", "type": "float" }, + { + "default": 4.9, + "label": "Engage Height Magnetic Module", + "name": "engage_height", + "type": "float" + }, { "label": "P300 8-channel GEN2 pipette mount", "name": "mount_m300", diff --git a/protocols/0451f3/fields.json b/protocols/0451f3/fields.json index 103cfb1de..ded83a24f 100644 --- a/protocols/0451f3/fields.json +++ b/protocols/0451f3/fields.json @@ -38,6 +38,12 @@ "name": "vol_final_elution", "default": 35.0 }, + { + "type": "float", + "label": "Engage Height Magnetic Module", + "name": "engage_height", + "default": 4.9 + }, { "type": "dropDown", "label": "P300 8-channel GEN2 pipette mount", diff --git a/protocols/0451f3/miniprep.ot2.apiv2.py b/protocols/0451f3/miniprep.ot2.apiv2.py index 2a8dfa7d4..49291728e 100644 --- a/protocols/0451f3/miniprep.ot2.apiv2.py +++ b/protocols/0451f3/miniprep.ot2.apiv2.py @@ -16,8 +16,10 @@ def run(ctx): [num_samples, mixreps, time_airdry_minutes, vol_final_elution, - mount_m300] = get_values( # noqa: F821 + engage_height, + mount_m300] = get_values( # noqa: F821 'num_samples', 'mixreps', 'time_airdry_minutes', 'vol_final_elution', + 'engage_height', 'mount_m300') if TEST_MODE_BEADS: @@ -29,7 +31,7 @@ def run(ctx): radial_offset_fraction = 0.6 # fraction of radius vol_cleared_lysate = 750.0 vol_elution = 40 - engage_height = 7.6 + # engage_height = 4.9 time_incubation_deep_blue_minutes = 5.0 time_incubation_elution_minutes = 5.0 From bd0be84d262afaf731ba4e0a9e5d7e00d0c458cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9Cramifarawi=E2=80=9D?= <“rami.farawi@opentrons.com”> Date: Fri, 15 Mar 2024 14:48:35 -0400 Subject: [PATCH 08/19] fix --- protoBuilds/1464/ELISA_protocol_part1.ot2.apiv2.py.json | 2 +- protocols/1464/ELISA_protocol_part1.ot2.apiv2.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/protoBuilds/1464/ELISA_protocol_part1.ot2.apiv2.py.json b/protoBuilds/1464/ELISA_protocol_part1.ot2.apiv2.py.json index 4500a562b..ec213ecf7 100644 --- a/protoBuilds/1464/ELISA_protocol_part1.ot2.apiv2.py.json +++ b/protoBuilds/1464/ELISA_protocol_part1.ot2.apiv2.py.json @@ -1,5 +1,5 @@ { - "content": "import math\n\nmetadata = {\n 'protocolName': 'ELISA: Dilution',\n 'author': 'Alise ',\n 'source': 'Custom Protocol Request',\n 'apiLevel': '2.14'\n}\n\n\ndef run(ctx):\n [number_of_standards,\n concentration_csv, init_vol_buff] = get_values( # noqa: F821\n 'number_of_standards',\n 'concentration_csv', \"init_vol_buff\")\n\n # labware setup\n tuberack_1 = ctx.load_labware(\n 'opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical', '1')\n tuberack_4 = ctx.load_labware(\n 'opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap', '4')\n deep_plates = [ctx.load_labware('nest_96_wellplate_2ml_deep', slot)\n for slot in ['5', '6']]\n\n tiprack_1000 = ctx.load_labware('opentrons_96_tiprack_1000ul', '2')\n tipracks_300 = [ctx.load_labware('opentrons_96_tiprack_300ul', slot)\n for slot in ['3', '7']]\n\n # instrument setup\n p1000 = ctx.load_instrument(\n 'p1000_single',\n mount='left',\n tip_racks=[tiprack_1000])\n p300 = ctx.load_instrument(\n 'p300_single',\n mount='right',\n tip_racks=tipracks_300)\n\n # reagent setup\n tubes = [well for row in tuberack_4.rows() for well in row]\n samples = tubes[2 + number_of_standards:]\n dilution_buffer = tuberack_1.wells_by_name()['A3']\n\n v_naught_buff = init_vol_buff*1000\n\n radius_sds = dilution_buffer.diameter/2\n\n h_naught_buff = 0.85*v_naught_buff/(math.pi*radius_sds**2)\n\n h_buff = h_naught_buff\n\n def adjust_height(volume_from_loop):\n nonlocal h_buff\n\n radius = radius_sds\n\n dh = (volume_from_loop/(math.pi*radius**2))*1.33\n\n h_buff -= dh\n\n if h_buff < 12:\n h_buff = 1\n\n dil_dests = [row for deep_plate in deep_plates\n for row in deep_plate.rows()]\n\n conc_lists = [[int(cell) for cell in line.split(',') if cell]\n for line in concentration_csv.splitlines() if line]\n\n concs = [5, 10, 25, 50, 100, 500, 1000, 5000, 10000, 25000, 50000, 100000]\n\n diluent_vols = [320, 450, 180, 320, 450, 320, 450, 320, 450, 180, 320, 450]\n\n sample_vols = [80, 50, 120, 80, 50, 80, 50, 80, 50, 120, 80, 50]\n\n concs_init = [1, 1, 10, 10, 10, 100, 100, 1000, 1000, 1000, 10000, 10000]\n dil_formulae = {\n conc: {'diluent_vol': diluent_vol,\n 'sample_vol': sample_vol,\n 'conc_init': conc_init,\n 'col_index': index}\n for conc, diluent_vol, sample_vol, conc_init, index in zip(\n concs, diluent_vols, sample_vols, concs_init, range(12))\n }\n\n dilution_concs = []\n for sample_index, concentrations in enumerate(conc_lists):\n new_concs = []\n factors = [10, 100, 1000, 10000, 100000]\n conc_inspect = max(concentrations)\n\n for factor_index, factor in enumerate(factors):\n if (conc_inspect // factor) > 0 and (conc_inspect // factor) < 10:\n [new_concs.append(factors[:factor_index+1])]\n [concentrations.pop(concentrations.index(num))\n for num in factors[:factor_index+1] if num in concentrations]\n [new_concs.append([conc_inspect])\n if conc_inspect not in new_concs[0] else '']\n [concentrations.pop(concentrations.index(conc_inspect))\n if conc_inspect in concentrations else '']\n [new_concs.append([conc]) for conc in concentrations if concentrations]\n dilution_concs.append(new_concs)\n\n # transfer dilution buffer\n\n for sample_index, (row, concs) in enumerate(\n zip(dil_dests, dilution_concs)):\n volumes = [dil_formulae[conc]['diluent_vol']\n for c_list in concs for conc in c_list]\n dests = [row[dil_formulae[conc]['col_index']]\n for c_list in concs for conc in c_list]\n for volume, dest in zip(volumes, dests):\n p1000.pick_up_tip()\n p1000.transfer(\n volume,\n dilution_buffer.bottom(z=h_buff),\n dest.top(-20),\n new_tip='never')\n\n adjust_height(volume)\n p1000.blow_out(dest.top())\n p1000.drop_tip()\n\n # transfer samples\n for sample_index, (row, concs) in enumerate(\n zip(dil_dests, dilution_concs)):\n for c_list in concs:\n volumes = [dil_formulae[conc]['sample_vol'] for conc in c_list]\n sources = []\n for conc in c_list:\n if dil_formulae[conc]['conc_init'] == 1:\n sources.append(samples[sample_index])\n else:\n source_conc = dil_formulae[conc]['conc_init']\n sources.append(\n row[dil_formulae[source_conc]['col_index']])\n dests = [row[dil_formulae[conc]['col_index']]\n for conc in c_list]\n p300.pick_up_tip()\n for volume, source, dest in zip(volumes, sources, dests):\n p300.transfer(volume, source, dest.bottom(2), new_tip='never')\n p300.mix(3, 200, dest.bottom(2))\n p300.drop_tip()\n", + "content": "import math\n\nmetadata = {\n 'protocolName': 'ELISA: Dilution',\n 'author': 'Alise ',\n 'source': 'Custom Protocol Request',\n 'apiLevel': '2.14'\n}\n\n\ndef run(ctx):\n [number_of_standards,\n concentration_csv, init_vol_buff] = get_values( # noqa: F821\n 'number_of_standards',\n 'concentration_csv', \"init_vol_buff\")\n\n # labware setup\n tuberack_1 = ctx.load_labware(\n 'opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical', '1')\n tuberack_4 = ctx.load_labware(\n 'opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap', '4')\n deep_plates = [ctx.load_labware('nest_96_wellplate_2ml_deep', slot)\n for slot in ['5', '6']]\n\n tiprack_1000 = ctx.load_labware('opentrons_96_tiprack_1000ul', '2')\n tipracks_300 = [ctx.load_labware('opentrons_96_tiprack_300ul', slot)\n for slot in ['3', '7']]\n\n # instrument setup\n p1000 = ctx.load_instrument(\n 'p1000_single',\n mount='left',\n tip_racks=[tiprack_1000])\n p300 = ctx.load_instrument(\n 'p300_single',\n mount='right',\n tip_racks=tipracks_300)\n\n # reagent setup\n tubes = [well for row in tuberack_4.rows() for well in row]\n samples = tubes[2 + number_of_standards:]\n dilution_buffer = tuberack_1.wells_by_name()['A3']\n\n v_naught_buff = init_vol_buff*1000\n\n radius_sds = dilution_buffer.diameter/2\n\n h_naught_buff = 0.85*v_naught_buff/(math.pi*radius_sds**2)\n\n h_buff = h_naught_buff\n\n def adjust_height(volume_from_loop):\n nonlocal h_buff\n\n radius = radius_sds\n\n dh = (volume_from_loop/(math.pi*radius**2))*1.33\n\n h_buff -= dh\n\n if h_buff < 12:\n h_buff = 1\n\n dil_dests = [row for deep_plate in deep_plates\n for row in deep_plate.rows()]\n\n conc_lists = [[int(cell) for cell in line.split(',') if cell]\n for line in concentration_csv.splitlines() if line]\n\n concs = [5, 10, 25, 50, 100, 500, 1000, 5000, 10000, 25000, 50000, 100000]\n\n diluent_vols = [320, 450, 180, 320, 450, 320, 450, 320, 450, 180, 320, 450]\n\n sample_vols = [80, 50, 120, 80, 50, 80, 50, 80, 50, 120, 80, 50]\n\n concs_init = [1, 1, 10, 10, 10, 100, 100, 1000, 1000, 10000, 10000, 10000]\n dil_formulae = {\n conc: {'diluent_vol': diluent_vol,\n 'sample_vol': sample_vol,\n 'conc_init': conc_init,\n 'col_index': index}\n for conc, diluent_vol, sample_vol, conc_init, index in zip(\n concs, diluent_vols, sample_vols, concs_init, range(12))\n }\n\n dilution_concs = []\n for sample_index, concentrations in enumerate(conc_lists):\n new_concs = []\n factors = [10, 100, 1000, 10000, 100000]\n conc_inspect = max(concentrations)\n\n for factor_index, factor in enumerate(factors):\n if (conc_inspect // factor) > 0 and (conc_inspect // factor) < 10:\n [new_concs.append(factors[:factor_index+1])]\n [concentrations.pop(concentrations.index(num))\n for num in factors[:factor_index+1] if num in concentrations]\n [new_concs.append([conc_inspect])\n if conc_inspect not in new_concs[0] else '']\n [concentrations.pop(concentrations.index(conc_inspect))\n if conc_inspect in concentrations else '']\n [new_concs.append([conc]) for conc in concentrations if concentrations]\n dilution_concs.append(new_concs)\n\n # transfer dilution buffer\n\n for sample_index, (row, concs) in enumerate(\n zip(dil_dests, dilution_concs)):\n volumes = [dil_formulae[conc]['diluent_vol']\n for c_list in concs for conc in c_list]\n dests = [row[dil_formulae[conc]['col_index']]\n for c_list in concs for conc in c_list]\n for volume, dest in zip(volumes, dests):\n p1000.pick_up_tip()\n p1000.transfer(\n volume,\n dilution_buffer.bottom(z=h_buff),\n dest.top(-20),\n new_tip='never')\n\n adjust_height(volume)\n p1000.blow_out(dest.top())\n p1000.drop_tip()\n\n # transfer samples\n for sample_index, (row, concs) in enumerate(\n zip(dil_dests, dilution_concs)):\n for c_list in concs:\n volumes = [dil_formulae[conc]['sample_vol'] for conc in c_list]\n sources = []\n for conc in c_list:\n if dil_formulae[conc]['conc_init'] == 1:\n sources.append(samples[sample_index])\n else:\n source_conc = dil_formulae[conc]['conc_init']\n sources.append(\n row[dil_formulae[source_conc]['col_index']])\n dests = [row[dil_formulae[conc]['col_index']]\n for conc in c_list]\n p300.pick_up_tip()\n for volume, source, dest in zip(volumes, sources, dests):\n p300.transfer(volume, source, dest.bottom(2), new_tip='never')\n p300.mix(3, 200, dest.bottom(2))\n p300.drop_tip()\n", "custom_labware_defs": [], "fields": [ { diff --git a/protocols/1464/ELISA_protocol_part1.ot2.apiv2.py b/protocols/1464/ELISA_protocol_part1.ot2.apiv2.py index 5cbbf5138..75d4fda34 100644 --- a/protocols/1464/ELISA_protocol_part1.ot2.apiv2.py +++ b/protocols/1464/ELISA_protocol_part1.ot2.apiv2.py @@ -73,7 +73,7 @@ def adjust_height(volume_from_loop): sample_vols = [80, 50, 120, 80, 50, 80, 50, 80, 50, 120, 80, 50] - concs_init = [1, 1, 10, 10, 10, 100, 100, 1000, 1000, 1000, 10000, 10000] + concs_init = [1, 1, 10, 10, 10, 100, 100, 1000, 1000, 10000, 10000, 10000] dil_formulae = { conc: {'diluent_vol': diluent_vol, 'sample_vol': sample_vol, From 1474982e941a1078b6cd5f805cf6cbbca2fc6fe3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9Cramifarawi=E2=80=9D?= <“rami.farawi@opentrons.com”> Date: Fri, 15 Mar 2024 15:36:22 -0400 Subject: [PATCH 09/19] fix --- protocols/08207f/08207f.ot2.apiv2.py | 155 --- protocols/08207f/README.md | 64 - protocols/08207f/fields.json | 65 - ...Twin.tec 96 Well Plate 150 \302\265L.json" | 1131 ----------------- ...dorftwin.tec96_96_aluminumblock_150ul.json | 1128 ---------------- .../starlab_96_aluminumblock_200ul.json | 1128 ---------------- .../labware/starlab_96_wellplate_200ul.json | 1127 ---------------- 7 files changed, 4798 deletions(-) delete mode 100644 protocols/08207f/08207f.ot2.apiv2.py delete mode 100644 protocols/08207f/README.md delete mode 100644 protocols/08207f/fields.json delete mode 100644 "protocols/08207f/labware/Eppendorf Twin.tec 96 Well Plate 150 \302\265L.json" delete mode 100644 protocols/08207f/labware/eppendorftwin.tec96_96_aluminumblock_150ul.json delete mode 100644 protocols/08207f/labware/starlab_96_aluminumblock_200ul.json delete mode 100644 protocols/08207f/labware/starlab_96_wellplate_200ul.json diff --git a/protocols/08207f/08207f.ot2.apiv2.py b/protocols/08207f/08207f.ot2.apiv2.py deleted file mode 100644 index 4728864ee..000000000 --- a/protocols/08207f/08207f.ot2.apiv2.py +++ /dev/null @@ -1,155 +0,0 @@ -# flake8: noqa -from opentrons import protocol_api -import math - -metadata = { - 'protocolName': 'Normalization Using .csv File', - 'author': 'Parrish Payne ', - 'source': 'Custom Protocol Request', - 'apiLevel': '2.13' -} - -def run(ctx): - - [input_csv, init_vol_buff, labware_pcr_plate, - labware_dna_plate, temp_mod, temperature, - p20_mount, p300_mount] = get_values( # noqa: F821 - "input_csv", "init_vol_buff", "labware_pcr_plate", - "labware_dna_plate", "temp_mod", "temperature", - "p20_mount", "p300_mount") - - if not 4 <= temperature <= 95: - raise Exception( - "Temperature module range is between 4 and 95ºC") - - # modules - temp_mod = None - if temp_mod: - temp_mod = ctx.load_module("temperature module gen2", '3') - - # labware - tiprack20 = [ - ctx.load_labware('opentrons_96_filtertiprack_20ul', slot, - '20ul tiprack') - for slot in ['1', '8']] - tiprack300 = [ - ctx.load_labware( - 'opentrons_96_filtertiprack_200ul', slot, '200ul tiprack') - for slot in ['2', '9']] - - dna_plate = None - if temp_mod == True and labware_dna_plate == "eppendorftwin.tec_96_wellplate_150ul": - dna_plate = temp_mod.load_labware("eppendorftwin.tec96_96_aluminumblock_150ul", 'sample plate') - - elif temp_mod == True and labware_dna_plate == "starlab_96_wellplate_200ul": - dna_plate = temp_mod.load_labware("starlab_96_aluminumblock_200ul", 'sample plate') - - else: - dna_plate = ctx.load_labware(labware_dna_plate, '3', 'sample plate') - - tube_rack = ctx.load_labware( - 'opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical', '5') - dest_plate = ctx.load_labware(labware_pcr_plate, '6', 'end-point-plate') # noqa: E501 - - # pipettes - p20 = ctx.load_instrument( - 'p20_single_gen2', p20_mount, tip_racks=tiprack20) - p300 = ctx.load_instrument( - 'p300_single_gen2', p300_mount, tip_racks=tiprack300) - - # Helper Functions - # liquid height tracking - v_naught_buff = init_vol_buff*1000 - - radius_sds = tube_rack.wells_by_name()['A3'].diameter/2 - - h_naught_buff = 0.85*v_naught_buff/(math.pi*radius_sds**2) - - h_buff = h_naught_buff - - def adjust_height(volume_from_loop): - nonlocal h_buff - - radius = radius_sds - - dh = (volume_from_loop/(math.pi*radius**2))*1.33 - - h_buff -= dh - - if h_buff < 12: - h_buff = 1 - - def slow_withdraw(pip, well, delay_seconds=2.0): - pip.default_speed /= 16 - if delay_seconds > 0: - ctx.delay(seconds=delay_seconds) - pip.move_to(well.top()) - pip.default_speed *= 16 - - # Set temperature module temperature - if temp_mod: - ctx.comment("\n\nSetting temperature module to {} ºC\n". - format(temperature)) - temp_mod.set_temperature(temperature) - - # mapping - buffer = tube_rack.wells_by_name()['A3'] - - # parse - all_rows = [[val.strip() for val in line.split(',')] - for line in input_csv.splitlines() - if line.split(',')[0].strip()][1:] - - # Adding buffer to the wells - for row in all_rows: - well = row[0] - dest_well = dest_plate.wells_by_name()[well] - volume = float(row[7]) - - if volume > 0: - if volume > 20: - if not p300.has_tip: - p300.pick_up_tip() - p300.aspirate(volume, buffer.bottom(h_buff)) - p300.dispense(volume, dest_well) - - else: - if not p20.has_tip: - p20.pick_up_tip() - p20.aspirate(volume, buffer.bottom(h_buff)) - p20.dispense(volume, dest_well) - - adjust_height(volume) - - if p20.has_tip: - p20.drop_tip() - if p300.has_tip: - p300.drop_tip() - - # Adding sample to the wells - for row in all_rows: - - well = row[0] - source_well = dna_plate.wells_by_name()[well] - dest_well = dest_plate.wells_by_name()[well] - - volume = float(row[6]) - mix_reps = 2 - tip_height = 0.5 - - if volume > 0: - if volume > 20: - p300.pick_up_tip() - p300.aspirate(volume, source_well.bottom(tip_height)) - p300.dispense(volume, dest_well) - p300.mix(mix_reps, 20) - p300.blow_out() - p300.drop_tip() - - else: - p20.pick_up_tip() - p20.aspirate(volume, source_well.bottom(tip_height)) - p20.dispense(volume, dest_well) - p20.mix(mix_reps, 10) - p20.blow_out() - p20.drop_tip() diff --git a/protocols/08207f/README.md b/protocols/08207f/README.md deleted file mode 100644 index e6ccf3259..000000000 --- a/protocols/08207f/README.md +++ /dev/null @@ -1,64 +0,0 @@ -# Normalization Using .csv File - - -### Author -[Opentrons](https://opentrons.com/) - - - - -## Categories -* Normalization - * Normalization and Pooling - - -## Description -This is a normalization protocol that transfers diluent buffer from a 50 mL tube into an empty 96-well PCR plate, then transfers sample from a 96-well PCR plate on the temperature module into the plate with the diluent. - - -### Modules -* [Opentrons Temperature Module (GEN2)](https://shop.opentrons.com/temperature-module-gen2/) - - -### Labware -* Eppendorf Twin.tec 96 Well Plate 150 µL #0030129512 -* Eppendorf Twin.Tec 96 on Aluminum Block 150 µL -* Starlab 96-Well PCR Plate, Skirted 200 µL #E1403-5200 -* Starlab 96-Well PCR Plate on Aluminum Block 200 µL -* [Opentrons 96 Filter Tip Rack 20 µL](https://shop.opentrons.com/opentrons-20ul-filter-tips/) -* [Opentrons 96 Filter Tip Rack 200 µL](https://shop.opentrons.com/opentrons-200ul-filter-tips/) -* [Opentrons 10 Tube Rack with Falcon 4x50 mL, 6x15 mL Conical](https://shop.opentrons.com/collections/opentrons-tips/products/tube-rack-set-1) - - -### Pipettes -* [Opentrons P20 Single Channel Electronic Pipette (GEN2)](https://shop.opentrons.com/single-channel-electronic-pipette-p20/) -* [Opentrons P300 Single Channel Electronic Pipette (GEN2)](https://shop.opentrons.com/single-channel-electronic-pipette-p20/) - - -### Deck Setup -![deck](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/08207f/deck.png) - - - -### Protocol Steps -1. Transfer X uL (from .csv file) of buffer from tube rack A3 to X number of wells in 96 well plate (same tips), slot6 (the number of samples will be specified in .csv file); use p300/or p20 single channel. -2. Use single channel p20 to add X uL of sample (data in the .csv file) from A1 (slot3) to A1 well in end-point-plate (slot6) (well A1 to well A1, well B1 to well B1 …). Use 10ul air gap and blow out, new tip each time. -3. Repeat steps 2 across plate - - -### Process -1. Input your protocol parameters above. -2. Download your protocol and unzip if needed. -3. Upload your custom labware to the [OT App](https://opentrons.com/ot-app) by navigating to `More` > `Custom Labware` > `Add Labware`, and selecting your labware files (.json extensions) if needed. -4. Upload your protocol file (.py extension) to the [OT App](https://opentrons.com/ot-app) in the `Protocol` tab. -5. Set up your deck according to the deck map. -6. Calibrate your labware, tiprack and pipette using the OT App. For calibration tips, check out our [support articles](https://support.opentrons.com/en/collections/1559720-guide-for-getting-started-with-the-ot-2). -7. Hit "Run". - - -### Additional Notes -If you have any questions about this protocol, please contact the Protocol Development Team by filling out the [Troubleshooting Survey](https://protocol-troubleshooting.paperform.co/). - - -###### Internal -08207f diff --git a/protocols/08207f/fields.json b/protocols/08207f/fields.json deleted file mode 100644 index 60b67bf11..000000000 --- a/protocols/08207f/fields.json +++ /dev/null @@ -1,65 +0,0 @@ -[ - { - "type": "textFile", - "label": ".CSV File", - "name": "input_csv", - "default": "Library Norm 1 Well,Internal ID,External ID,nM,Norm Amount (nM),Volume Required (µl),Sample Volume (µl),Dilutent Volume (µl)\nA1,PBM00881,PBM00881,16.63,4.00,10.00,2.41,7.59" - }, - { - "type": "int", - "label": "Initial volume of buffer in 50mL tube (in mL)", - "name": "init_vol_buff", - "default": 40 - }, - { - "type": "dropDown", - "label": "Labware for PCR Plate", - "name": "labware_pcr_plate", - "options": [ - { "label": "eppendorftwin.tec_96_wellplate_150ul", "value": "eppendorftwin.tec_96_wellplate_150ul" }, - { "label": "starlab_96_wellplate_200ul", "value": "starlab_96_wellplate_200ul" } - ] - }, - { - "type": "dropDown", - "label": "Labware on the Temperature Module", - "name": "labware_dna_plate", - "options": [ - { "label": "eppendorftwin.tec96_96_aluminumblock_150ul", "value": "eppendorftwin.tec96_96_aluminumblock_150ul" }, - { "label": "starlab_96_aluminumblock_200ul", "value": "starlab_96_aluminumblock_200ul" } - ] - }, - { - "type": "dropDown", - "label": "Use temperature module on slot 3?", - "name": "temp_mod", - "options": [ - { "label": "Use temperature module", "value": true }, - { "label": "Do not use temperature module", "value": false } - ] - }, - { - "type": "int", - "label": "Temperature module temperature (4-95C)", - "name": "temperature", - "default": 4 - }, - { - "type": "dropDown", - "label": "P20 single-channel Mount", - "name": "p20_mount", - "options": [ - {"label": "Right", "value": "right"}, - {"label": "Left", "value": "left"} - ] - }, - { - "type": "dropDown", - "label": "P300 single-channel Mount", - "name": "p300_mount", - "options": [ - {"label": "Left", "value": "left"}, - {"label": "Right", "value": "right"} - ] - } -] diff --git "a/protocols/08207f/labware/Eppendorf Twin.tec 96 Well Plate 150 \302\265L.json" "b/protocols/08207f/labware/Eppendorf Twin.tec 96 Well Plate 150 \302\265L.json" deleted file mode 100644 index be0c17bfa..000000000 --- "a/protocols/08207f/labware/Eppendorf Twin.tec 96 Well Plate 150 \302\265L.json" +++ /dev/null @@ -1,1131 +0,0 @@ -{ - "ordering": [ - [ - "A1", - "B1", - "C1", - "D1", - "E1", - "F1", - "G1", - "H1" - ], - [ - "A2", - "B2", - "C2", - "D2", - "E2", - "F2", - "G2", - "H2" - ], - [ - "A3", - "B3", - "C3", - "D3", - "E3", - "F3", - "G3", - "H3" - ], - [ - "A4", - "B4", - "C4", - "D4", - "E4", - "F4", - "G4", - "H4" - ], - [ - "A5", - "B5", - "C5", - "D5", - "E5", - "F5", - "G5", - "H5" - ], - [ - "A6", - "B6", - "C6", - "D6", - "E6", - "F6", - "G6", - "H6" - ], - [ - "A7", - "B7", - "C7", - "D7", - "E7", - "F7", - "G7", - "H7" - ], - [ - "A8", - "B8", - "C8", - "D8", - "E8", - "F8", - "G8", - "H8" - ], - [ - "A9", - "B9", - "C9", - "D9", - "E9", - "F9", - "G9", - "H9" - ], - [ - "A10", - "B10", - "C10", - "D10", - "E10", - "F10", - "G10", - "H10" - ], - [ - "A11", - "B11", - "C11", - "D11", - "E11", - "F11", - "G11", - "H11" - ], - [ - "A12", - "B12", - "C12", - "D12", - "E12", - "F12", - "G12", - "H12" - ] - ], - "brand": { - "brand": "Eppendorf twin.tec", - "brandId": [] - }, - "metadata": { - "displayName": "Eppendorf Twin.tec 96 Well Plate 150 µL", - "displayCategory": "wellPlate", - "displayVolumeUnits": "µL", - "tags": [] - }, - "dimensions": { - "xDimension": 127.76, - "yDimension": 85.47, - "zDimension": 16.06 - }, - "wells": { - "A1": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 14.38, - "y": 74.23, - "z": 1.46 - }, - "B1": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 14.38, - "y": 65.23, - "z": 1.46 - }, - "C1": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 14.38, - "y": 56.23, - "z": 1.46 - }, - "D1": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 14.38, - "y": 47.23, - "z": 1.46 - }, - "E1": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 14.38, - "y": 38.23, - "z": 1.46 - }, - "F1": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 14.38, - "y": 29.23, - "z": 1.46 - }, - "G1": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 14.38, - "y": 20.23, - "z": 1.46 - }, - "H1": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 14.38, - "y": 11.23, - "z": 1.46 - }, - "A2": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 23.38, - "y": 74.23, - "z": 1.46 - }, - "B2": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 23.38, - "y": 65.23, - "z": 1.46 - }, - "C2": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 23.38, - "y": 56.23, - "z": 1.46 - }, - "D2": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 23.38, - "y": 47.23, - "z": 1.46 - }, - "E2": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 23.38, - "y": 38.23, - "z": 1.46 - }, - "F2": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 23.38, - "y": 29.23, - "z": 1.46 - }, - "G2": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 23.38, - "y": 20.23, - "z": 1.46 - }, - "H2": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 23.38, - "y": 11.23, - "z": 1.46 - }, - "A3": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 32.38, - "y": 74.23, - "z": 1.46 - }, - "B3": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 32.38, - "y": 65.23, - "z": 1.46 - }, - "C3": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 32.38, - "y": 56.23, - "z": 1.46 - }, - "D3": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 32.38, - "y": 47.23, - "z": 1.46 - }, - "E3": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 32.38, - "y": 38.23, - "z": 1.46 - }, - "F3": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 32.38, - "y": 29.23, - "z": 1.46 - }, - "G3": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 32.38, - "y": 20.23, - "z": 1.46 - }, - "H3": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 32.38, - "y": 11.23, - "z": 1.46 - }, - "A4": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 41.38, - "y": 74.23, - "z": 1.46 - }, - "B4": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 41.38, - "y": 65.23, - "z": 1.46 - }, - "C4": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 41.38, - "y": 56.23, - "z": 1.46 - }, - "D4": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 41.38, - "y": 47.23, - "z": 1.46 - }, - "E4": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 41.38, - "y": 38.23, - "z": 1.46 - }, - "F4": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 41.38, - "y": 29.23, - "z": 1.46 - }, - "G4": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 41.38, - "y": 20.23, - "z": 1.46 - }, - "H4": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 41.38, - "y": 11.23, - "z": 1.46 - }, - "A5": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 50.38, - "y": 74.23, - "z": 1.46 - }, - "B5": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 50.38, - "y": 65.23, - "z": 1.46 - }, - "C5": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 50.38, - "y": 56.23, - "z": 1.46 - }, - "D5": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 50.38, - "y": 47.23, - "z": 1.46 - }, - "E5": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 50.38, - "y": 38.23, - "z": 1.46 - }, - "F5": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 50.38, - "y": 29.23, - "z": 1.46 - }, - "G5": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 50.38, - "y": 20.23, - "z": 1.46 - }, - "H5": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 50.38, - "y": 11.23, - "z": 1.46 - }, - "A6": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 59.38, - "y": 74.23, - "z": 1.46 - }, - "B6": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 59.38, - "y": 65.23, - "z": 1.46 - }, - "C6": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 59.38, - "y": 56.23, - "z": 1.46 - }, - "D6": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 59.38, - "y": 47.23, - "z": 1.46 - }, - "E6": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 59.38, - "y": 38.23, - "z": 1.46 - }, - "F6": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 59.38, - "y": 29.23, - "z": 1.46 - }, - "G6": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 59.38, - "y": 20.23, - "z": 1.46 - }, - "H6": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 59.38, - "y": 11.23, - "z": 1.46 - }, - "A7": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 68.38, - "y": 74.23, - "z": 1.46 - }, - "B7": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 68.38, - "y": 65.23, - "z": 1.46 - }, - "C7": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 68.38, - "y": 56.23, - "z": 1.46 - }, - "D7": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 68.38, - "y": 47.23, - "z": 1.46 - }, - "E7": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 68.38, - "y": 38.23, - "z": 1.46 - }, - "F7": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 68.38, - "y": 29.23, - "z": 1.46 - }, - "G7": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 68.38, - "y": 20.23, - "z": 1.46 - }, - "H7": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 68.38, - "y": 11.23, - "z": 1.46 - }, - "A8": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 77.38, - "y": 74.23, - "z": 1.46 - }, - "B8": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 77.38, - "y": 65.23, - "z": 1.46 - }, - "C8": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 77.38, - "y": 56.23, - "z": 1.46 - }, - "D8": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 77.38, - "y": 47.23, - "z": 1.46 - }, - "E8": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 77.38, - "y": 38.23, - "z": 1.46 - }, - "F8": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 77.38, - "y": 29.23, - "z": 1.46 - }, - "G8": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 77.38, - "y": 20.23, - "z": 1.46 - }, - "H8": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 77.38, - "y": 11.23, - "z": 1.46 - }, - "A9": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 86.38, - "y": 74.23, - "z": 1.46 - }, - "B9": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 86.38, - "y": 65.23, - "z": 1.46 - }, - "C9": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 86.38, - "y": 56.23, - "z": 1.46 - }, - "D9": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 86.38, - "y": 47.23, - "z": 1.46 - }, - "E9": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 86.38, - "y": 38.23, - "z": 1.46 - }, - "F9": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 86.38, - "y": 29.23, - "z": 1.46 - }, - "G9": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 86.38, - "y": 20.23, - "z": 1.46 - }, - "H9": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 86.38, - "y": 11.23, - "z": 1.46 - }, - "A10": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 95.38, - "y": 74.23, - "z": 1.46 - }, - "B10": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 95.38, - "y": 65.23, - "z": 1.46 - }, - "C10": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 95.38, - "y": 56.23, - "z": 1.46 - }, - "D10": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 95.38, - "y": 47.23, - "z": 1.46 - }, - "E10": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 95.38, - "y": 38.23, - "z": 1.46 - }, - "F10": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 95.38, - "y": 29.23, - "z": 1.46 - }, - "G10": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 95.38, - "y": 20.23, - "z": 1.46 - }, - "H10": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 95.38, - "y": 11.23, - "z": 1.46 - }, - "A11": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 104.38, - "y": 74.23, - "z": 1.46 - }, - "B11": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 104.38, - "y": 65.23, - "z": 1.46 - }, - "C11": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 104.38, - "y": 56.23, - "z": 1.46 - }, - "D11": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 104.38, - "y": 47.23, - "z": 1.46 - }, - "E11": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 104.38, - "y": 38.23, - "z": 1.46 - }, - "F11": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 104.38, - "y": 29.23, - "z": 1.46 - }, - "G11": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 104.38, - "y": 20.23, - "z": 1.46 - }, - "H11": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 104.38, - "y": 11.23, - "z": 1.46 - }, - "A12": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 113.38, - "y": 74.23, - "z": 1.46 - }, - "B12": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 113.38, - "y": 65.23, - "z": 1.46 - }, - "C12": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 113.38, - "y": 56.23, - "z": 1.46 - }, - "D12": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 113.38, - "y": 47.23, - "z": 1.46 - }, - "E12": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 113.38, - "y": 38.23, - "z": 1.46 - }, - "F12": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 113.38, - "y": 29.23, - "z": 1.46 - }, - "G12": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 113.38, - "y": 20.23, - "z": 1.46 - }, - "H12": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 113.38, - "y": 11.23, - "z": 1.46 - } - }, - "groups": [ - { - "metadata": { - "displayName": "Eppendorf Twin.tec 96 Well Plate 150 µL", - "displayCategory": "wellPlate", - "wellBottomShape": "v" - }, - "brand": { - "brand": "Eppendorf twin.tec", - "brandId": [] - }, - "wells": [ - "A1", - "B1", - "C1", - "D1", - "E1", - "F1", - "G1", - "H1", - "A2", - "B2", - "C2", - "D2", - "E2", - "F2", - "G2", - "H2", - "A3", - "B3", - "C3", - "D3", - "E3", - "F3", - "G3", - "H3", - "A4", - "B4", - "C4", - "D4", - "E4", - "F4", - "G4", - "H4", - "A5", - "B5", - "C5", - "D5", - "E5", - "F5", - "G5", - "H5", - "A6", - "B6", - "C6", - "D6", - "E6", - "F6", - "G6", - "H6", - "A7", - "B7", - "C7", - "D7", - "E7", - "F7", - "G7", - "H7", - "A8", - "B8", - "C8", - "D8", - "E8", - "F8", - "G8", - "H8", - "A9", - "B9", - "C9", - "D9", - "E9", - "F9", - "G9", - "H9", - "A10", - "B10", - "C10", - "D10", - "E10", - "F10", - "G10", - "H10", - "A11", - "B11", - "C11", - "D11", - "E11", - "F11", - "G11", - "H11", - "A12", - "B12", - "C12", - "D12", - "E12", - "F12", - "G12", - "H12" - ] - } - ], - "parameters": { - "format": "irregular", - "quirks": [], - "isTiprack": false, - "isMagneticModuleCompatible": false, - "loadName": "eppendorftwin.tec_96_wellplate_150ul" - }, - "namespace": "custom_beta", - "version": 1, - "schemaVersion": 2, - "cornerOffsetFromSlot": { - "x": 0, - "y": 0, - "z": 0 - } -} \ No newline at end of file diff --git a/protocols/08207f/labware/eppendorftwin.tec96_96_aluminumblock_150ul.json b/protocols/08207f/labware/eppendorftwin.tec96_96_aluminumblock_150ul.json deleted file mode 100644 index 9bae6f0aa..000000000 --- a/protocols/08207f/labware/eppendorftwin.tec96_96_aluminumblock_150ul.json +++ /dev/null @@ -1,1128 +0,0 @@ -{ - "ordering": [ - [ - "A1", - "B1", - "C1", - "D1", - "E1", - "F1", - "G1", - "H1" - ], - [ - "A2", - "B2", - "C2", - "D2", - "E2", - "F2", - "G2", - "H2" - ], - [ - "A3", - "B3", - "C3", - "D3", - "E3", - "F3", - "G3", - "H3" - ], - [ - "A4", - "B4", - "C4", - "D4", - "E4", - "F4", - "G4", - "H4" - ], - [ - "A5", - "B5", - "C5", - "D5", - "E5", - "F5", - "G5", - "H5" - ], - [ - "A6", - "B6", - "C6", - "D6", - "E6", - "F6", - "G6", - "H6" - ], - [ - "A7", - "B7", - "C7", - "D7", - "E7", - "F7", - "G7", - "H7" - ], - [ - "A8", - "B8", - "C8", - "D8", - "E8", - "F8", - "G8", - "H8" - ], - [ - "A9", - "B9", - "C9", - "D9", - "E9", - "F9", - "G9", - "H9" - ], - [ - "A10", - "B10", - "C10", - "D10", - "E10", - "F10", - "G10", - "H10" - ], - [ - "A11", - "B11", - "C11", - "D11", - "E11", - "F11", - "G11", - "H11" - ], - [ - "A12", - "B12", - "C12", - "D12", - "E12", - "F12", - "G12", - "H12" - ] - ], - "brand": { - "brand": "Eppendorf Twin.Tec 96", - "brandId": [ - "0030129512" - ] - }, - "metadata": { - "displayName": "Eppendorf Twin.Tec 96 96 Aluminum Block 150 µL", - "displayCategory": "aluminumBlock", - "displayVolumeUnits": "µL", - "tags": [] - }, - "dimensions": { - "xDimension": 127.75, - "yDimension": 85.5, - "zDimension": 21.9 - }, - "wells": { - "A1": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 14.38, - "y": 74.25, - "z": 7.3 - }, - "B1": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 14.38, - "y": 65.25, - "z": 7.3 - }, - "C1": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 14.38, - "y": 56.25, - "z": 7.3 - }, - "D1": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 14.38, - "y": 47.25, - "z": 7.3 - }, - "E1": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 14.38, - "y": 38.25, - "z": 7.3 - }, - "F1": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 14.38, - "y": 29.25, - "z": 7.3 - }, - "G1": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 14.38, - "y": 20.25, - "z": 7.3 - }, - "H1": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 14.38, - "y": 11.25, - "z": 7.3 - }, - "A2": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 23.38, - "y": 74.25, - "z": 7.3 - }, - "B2": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 23.38, - "y": 65.25, - "z": 7.3 - }, - "C2": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 23.38, - "y": 56.25, - "z": 7.3 - }, - "D2": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 23.38, - "y": 47.25, - "z": 7.3 - }, - "E2": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 23.38, - "y": 38.25, - "z": 7.3 - }, - "F2": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 23.38, - "y": 29.25, - "z": 7.3 - }, - "G2": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 23.38, - "y": 20.25, - "z": 7.3 - }, - "H2": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 23.38, - "y": 11.25, - "z": 7.3 - }, - "A3": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 32.38, - "y": 74.25, - "z": 7.3 - }, - "B3": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 32.38, - "y": 65.25, - "z": 7.3 - }, - "C3": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 32.38, - "y": 56.25, - "z": 7.3 - }, - "D3": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 32.38, - "y": 47.25, - "z": 7.3 - }, - "E3": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 32.38, - "y": 38.25, - "z": 7.3 - }, - "F3": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 32.38, - "y": 29.25, - "z": 7.3 - }, - "G3": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 32.38, - "y": 20.25, - "z": 7.3 - }, - "H3": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 32.38, - "y": 11.25, - "z": 7.3 - }, - "A4": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 41.38, - "y": 74.25, - "z": 7.3 - }, - "B4": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 41.38, - "y": 65.25, - "z": 7.3 - }, - "C4": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 41.38, - "y": 56.25, - "z": 7.3 - }, - "D4": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 41.38, - "y": 47.25, - "z": 7.3 - }, - "E4": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 41.38, - "y": 38.25, - "z": 7.3 - }, - "F4": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 41.38, - "y": 29.25, - "z": 7.3 - }, - "G4": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 41.38, - "y": 20.25, - "z": 7.3 - }, - "H4": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 41.38, - "y": 11.25, - "z": 7.3 - }, - "A5": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 50.38, - "y": 74.25, - "z": 7.3 - }, - "B5": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 50.38, - "y": 65.25, - "z": 7.3 - }, - "C5": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 50.38, - "y": 56.25, - "z": 7.3 - }, - "D5": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 50.38, - "y": 47.25, - "z": 7.3 - }, - "E5": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 50.38, - "y": 38.25, - "z": 7.3 - }, - "F5": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 50.38, - "y": 29.25, - "z": 7.3 - }, - "G5": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 50.38, - "y": 20.25, - "z": 7.3 - }, - "H5": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 50.38, - "y": 11.25, - "z": 7.3 - }, - "A6": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 59.38, - "y": 74.25, - "z": 7.3 - }, - "B6": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 59.38, - "y": 65.25, - "z": 7.3 - }, - "C6": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 59.38, - "y": 56.25, - "z": 7.3 - }, - "D6": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 59.38, - "y": 47.25, - "z": 7.3 - }, - "E6": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 59.38, - "y": 38.25, - "z": 7.3 - }, - "F6": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 59.38, - "y": 29.25, - "z": 7.3 - }, - "G6": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 59.38, - "y": 20.25, - "z": 7.3 - }, - "H6": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 59.38, - "y": 11.25, - "z": 7.3 - }, - "A7": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 68.38, - "y": 74.25, - "z": 7.3 - }, - "B7": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 68.38, - "y": 65.25, - "z": 7.3 - }, - "C7": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 68.38, - "y": 56.25, - "z": 7.3 - }, - "D7": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 68.38, - "y": 47.25, - "z": 7.3 - }, - "E7": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 68.38, - "y": 38.25, - "z": 7.3 - }, - "F7": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 68.38, - "y": 29.25, - "z": 7.3 - }, - "G7": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 68.38, - "y": 20.25, - "z": 7.3 - }, - "H7": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 68.38, - "y": 11.25, - "z": 7.3 - }, - "A8": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 77.38, - "y": 74.25, - "z": 7.3 - }, - "B8": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 77.38, - "y": 65.25, - "z": 7.3 - }, - "C8": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 77.38, - "y": 56.25, - "z": 7.3 - }, - "D8": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 77.38, - "y": 47.25, - "z": 7.3 - }, - "E8": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 77.38, - "y": 38.25, - "z": 7.3 - }, - "F8": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 77.38, - "y": 29.25, - "z": 7.3 - }, - "G8": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 77.38, - "y": 20.25, - "z": 7.3 - }, - "H8": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 77.38, - "y": 11.25, - "z": 7.3 - }, - "A9": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 86.38, - "y": 74.25, - "z": 7.3 - }, - "B9": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 86.38, - "y": 65.25, - "z": 7.3 - }, - "C9": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 86.38, - "y": 56.25, - "z": 7.3 - }, - "D9": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 86.38, - "y": 47.25, - "z": 7.3 - }, - "E9": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 86.38, - "y": 38.25, - "z": 7.3 - }, - "F9": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 86.38, - "y": 29.25, - "z": 7.3 - }, - "G9": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 86.38, - "y": 20.25, - "z": 7.3 - }, - "H9": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 86.38, - "y": 11.25, - "z": 7.3 - }, - "A10": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 95.38, - "y": 74.25, - "z": 7.3 - }, - "B10": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 95.38, - "y": 65.25, - "z": 7.3 - }, - "C10": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 95.38, - "y": 56.25, - "z": 7.3 - }, - "D10": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 95.38, - "y": 47.25, - "z": 7.3 - }, - "E10": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 95.38, - "y": 38.25, - "z": 7.3 - }, - "F10": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 95.38, - "y": 29.25, - "z": 7.3 - }, - "G10": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 95.38, - "y": 20.25, - "z": 7.3 - }, - "H10": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 95.38, - "y": 11.25, - "z": 7.3 - }, - "A11": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 104.38, - "y": 74.25, - "z": 7.3 - }, - "B11": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 104.38, - "y": 65.25, - "z": 7.3 - }, - "C11": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 104.38, - "y": 56.25, - "z": 7.3 - }, - "D11": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 104.38, - "y": 47.25, - "z": 7.3 - }, - "E11": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 104.38, - "y": 38.25, - "z": 7.3 - }, - "F11": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 104.38, - "y": 29.25, - "z": 7.3 - }, - "G11": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 104.38, - "y": 20.25, - "z": 7.3 - }, - "H11": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 104.38, - "y": 11.25, - "z": 7.3 - }, - "A12": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 113.38, - "y": 74.25, - "z": 7.3 - }, - "B12": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 113.38, - "y": 65.25, - "z": 7.3 - }, - "C12": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 113.38, - "y": 56.25, - "z": 7.3 - }, - "D12": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 113.38, - "y": 47.25, - "z": 7.3 - }, - "E12": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 113.38, - "y": 38.25, - "z": 7.3 - }, - "F12": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 113.38, - "y": 29.25, - "z": 7.3 - }, - "G12": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 113.38, - "y": 20.25, - "z": 7.3 - }, - "H12": { - "depth": 14.6, - "totalLiquidVolume": 150, - "shape": "circular", - "diameter": 6.46, - "x": 113.38, - "y": 11.25, - "z": 7.3 - } - }, - "groups": [ - { - "metadata": { - "wellBottomShape": "v", - "displayCategory": "wellPlate" - }, - "wells": [ - "A1", - "B1", - "C1", - "D1", - "E1", - "F1", - "G1", - "H1", - "A2", - "B2", - "C2", - "D2", - "E2", - "F2", - "G2", - "H2", - "A3", - "B3", - "C3", - "D3", - "E3", - "F3", - "G3", - "H3", - "A4", - "B4", - "C4", - "D4", - "E4", - "F4", - "G4", - "H4", - "A5", - "B5", - "C5", - "D5", - "E5", - "F5", - "G5", - "H5", - "A6", - "B6", - "C6", - "D6", - "E6", - "F6", - "G6", - "H6", - "A7", - "B7", - "C7", - "D7", - "E7", - "F7", - "G7", - "H7", - "A8", - "B8", - "C8", - "D8", - "E8", - "F8", - "G8", - "H8", - "A9", - "B9", - "C9", - "D9", - "E9", - "F9", - "G9", - "H9", - "A10", - "B10", - "C10", - "D10", - "E10", - "F10", - "G10", - "H10", - "A11", - "B11", - "C11", - "D11", - "E11", - "F11", - "G11", - "H11", - "A12", - "B12", - "C12", - "D12", - "E12", - "F12", - "G12", - "H12" - ] - } - ], - "parameters": { - "format": "irregular", - "quirks": [], - "isTiprack": false, - "isMagneticModuleCompatible": false, - "loadName": "eppendorftwin.tec96_96_aluminumblock_150ul" - }, - "namespace": "custom_beta", - "version": 1, - "schemaVersion": 2, - "cornerOffsetFromSlot": { - "x": 0, - "y": 0, - "z": 0 - } -} \ No newline at end of file diff --git a/protocols/08207f/labware/starlab_96_aluminumblock_200ul.json b/protocols/08207f/labware/starlab_96_aluminumblock_200ul.json deleted file mode 100644 index 383f90765..000000000 --- a/protocols/08207f/labware/starlab_96_aluminumblock_200ul.json +++ /dev/null @@ -1,1128 +0,0 @@ -{ - "ordering": [ - [ - "A1", - "B1", - "C1", - "D1", - "E1", - "F1", - "G1", - "H1" - ], - [ - "A2", - "B2", - "C2", - "D2", - "E2", - "F2", - "G2", - "H2" - ], - [ - "A3", - "B3", - "C3", - "D3", - "E3", - "F3", - "G3", - "H3" - ], - [ - "A4", - "B4", - "C4", - "D4", - "E4", - "F4", - "G4", - "H4" - ], - [ - "A5", - "B5", - "C5", - "D5", - "E5", - "F5", - "G5", - "H5" - ], - [ - "A6", - "B6", - "C6", - "D6", - "E6", - "F6", - "G6", - "H6" - ], - [ - "A7", - "B7", - "C7", - "D7", - "E7", - "F7", - "G7", - "H7" - ], - [ - "A8", - "B8", - "C8", - "D8", - "E8", - "F8", - "G8", - "H8" - ], - [ - "A9", - "B9", - "C9", - "D9", - "E9", - "F9", - "G9", - "H9" - ], - [ - "A10", - "B10", - "C10", - "D10", - "E10", - "F10", - "G10", - "H10" - ], - [ - "A11", - "B11", - "C11", - "D11", - "E11", - "F11", - "G11", - "H11" - ], - [ - "A12", - "B12", - "C12", - "D12", - "E12", - "F12", - "G12", - "H12" - ] - ], - "brand": { - "brand": "Starlab", - "brandId": [ - "E1403-5200" - ] - }, - "metadata": { - "displayName": "Starlab 96 Aluminum Block 200 µL", - "displayCategory": "aluminumBlock", - "displayVolumeUnits": "µL", - "tags": [] - }, - "dimensions": { - "xDimension": 127.75, - "yDimension": 85.5, - "zDimension": 22.2 - }, - "wells": { - "A1": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 14.38, - "y": 74.25, - "z": 7.2 - }, - "B1": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 14.38, - "y": 65.25, - "z": 7.2 - }, - "C1": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 14.38, - "y": 56.25, - "z": 7.2 - }, - "D1": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 14.38, - "y": 47.25, - "z": 7.2 - }, - "E1": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 14.38, - "y": 38.25, - "z": 7.2 - }, - "F1": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 14.38, - "y": 29.25, - "z": 7.2 - }, - "G1": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 14.38, - "y": 20.25, - "z": 7.2 - }, - "H1": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 14.38, - "y": 11.25, - "z": 7.2 - }, - "A2": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 23.38, - "y": 74.25, - "z": 7.2 - }, - "B2": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 23.38, - "y": 65.25, - "z": 7.2 - }, - "C2": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 23.38, - "y": 56.25, - "z": 7.2 - }, - "D2": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 23.38, - "y": 47.25, - "z": 7.2 - }, - "E2": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 23.38, - "y": 38.25, - "z": 7.2 - }, - "F2": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 23.38, - "y": 29.25, - "z": 7.2 - }, - "G2": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 23.38, - "y": 20.25, - "z": 7.2 - }, - "H2": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 23.38, - "y": 11.25, - "z": 7.2 - }, - "A3": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 32.38, - "y": 74.25, - "z": 7.2 - }, - "B3": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 32.38, - "y": 65.25, - "z": 7.2 - }, - "C3": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 32.38, - "y": 56.25, - "z": 7.2 - }, - "D3": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 32.38, - "y": 47.25, - "z": 7.2 - }, - "E3": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 32.38, - "y": 38.25, - "z": 7.2 - }, - "F3": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 32.38, - "y": 29.25, - "z": 7.2 - }, - "G3": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 32.38, - "y": 20.25, - "z": 7.2 - }, - "H3": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 32.38, - "y": 11.25, - "z": 7.2 - }, - "A4": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 41.38, - "y": 74.25, - "z": 7.2 - }, - "B4": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 41.38, - "y": 65.25, - "z": 7.2 - }, - "C4": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 41.38, - "y": 56.25, - "z": 7.2 - }, - "D4": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 41.38, - "y": 47.25, - "z": 7.2 - }, - "E4": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 41.38, - "y": 38.25, - "z": 7.2 - }, - "F4": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 41.38, - "y": 29.25, - "z": 7.2 - }, - "G4": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 41.38, - "y": 20.25, - "z": 7.2 - }, - "H4": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 41.38, - "y": 11.25, - "z": 7.2 - }, - "A5": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 50.38, - "y": 74.25, - "z": 7.2 - }, - "B5": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 50.38, - "y": 65.25, - "z": 7.2 - }, - "C5": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 50.38, - "y": 56.25, - "z": 7.2 - }, - "D5": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 50.38, - "y": 47.25, - "z": 7.2 - }, - "E5": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 50.38, - "y": 38.25, - "z": 7.2 - }, - "F5": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 50.38, - "y": 29.25, - "z": 7.2 - }, - "G5": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 50.38, - "y": 20.25, - "z": 7.2 - }, - "H5": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 50.38, - "y": 11.25, - "z": 7.2 - }, - "A6": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 59.38, - "y": 74.25, - "z": 7.2 - }, - "B6": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 59.38, - "y": 65.25, - "z": 7.2 - }, - "C6": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 59.38, - "y": 56.25, - "z": 7.2 - }, - "D6": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 59.38, - "y": 47.25, - "z": 7.2 - }, - "E6": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 59.38, - "y": 38.25, - "z": 7.2 - }, - "F6": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 59.38, - "y": 29.25, - "z": 7.2 - }, - "G6": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 59.38, - "y": 20.25, - "z": 7.2 - }, - "H6": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 59.38, - "y": 11.25, - "z": 7.2 - }, - "A7": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 68.38, - "y": 74.25, - "z": 7.2 - }, - "B7": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 68.38, - "y": 65.25, - "z": 7.2 - }, - "C7": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 68.38, - "y": 56.25, - "z": 7.2 - }, - "D7": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 68.38, - "y": 47.25, - "z": 7.2 - }, - "E7": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 68.38, - "y": 38.25, - "z": 7.2 - }, - "F7": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 68.38, - "y": 29.25, - "z": 7.2 - }, - "G7": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 68.38, - "y": 20.25, - "z": 7.2 - }, - "H7": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 68.38, - "y": 11.25, - "z": 7.2 - }, - "A8": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 77.38, - "y": 74.25, - "z": 7.2 - }, - "B8": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 77.38, - "y": 65.25, - "z": 7.2 - }, - "C8": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 77.38, - "y": 56.25, - "z": 7.2 - }, - "D8": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 77.38, - "y": 47.25, - "z": 7.2 - }, - "E8": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 77.38, - "y": 38.25, - "z": 7.2 - }, - "F8": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 77.38, - "y": 29.25, - "z": 7.2 - }, - "G8": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 77.38, - "y": 20.25, - "z": 7.2 - }, - "H8": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 77.38, - "y": 11.25, - "z": 7.2 - }, - "A9": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 86.38, - "y": 74.25, - "z": 7.2 - }, - "B9": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 86.38, - "y": 65.25, - "z": 7.2 - }, - "C9": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 86.38, - "y": 56.25, - "z": 7.2 - }, - "D9": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 86.38, - "y": 47.25, - "z": 7.2 - }, - "E9": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 86.38, - "y": 38.25, - "z": 7.2 - }, - "F9": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 86.38, - "y": 29.25, - "z": 7.2 - }, - "G9": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 86.38, - "y": 20.25, - "z": 7.2 - }, - "H9": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 86.38, - "y": 11.25, - "z": 7.2 - }, - "A10": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 95.38, - "y": 74.25, - "z": 7.2 - }, - "B10": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 95.38, - "y": 65.25, - "z": 7.2 - }, - "C10": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 95.38, - "y": 56.25, - "z": 7.2 - }, - "D10": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 95.38, - "y": 47.25, - "z": 7.2 - }, - "E10": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 95.38, - "y": 38.25, - "z": 7.2 - }, - "F10": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 95.38, - "y": 29.25, - "z": 7.2 - }, - "G10": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 95.38, - "y": 20.25, - "z": 7.2 - }, - "H10": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 95.38, - "y": 11.25, - "z": 7.2 - }, - "A11": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 104.38, - "y": 74.25, - "z": 7.2 - }, - "B11": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 104.38, - "y": 65.25, - "z": 7.2 - }, - "C11": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 104.38, - "y": 56.25, - "z": 7.2 - }, - "D11": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 104.38, - "y": 47.25, - "z": 7.2 - }, - "E11": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 104.38, - "y": 38.25, - "z": 7.2 - }, - "F11": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 104.38, - "y": 29.25, - "z": 7.2 - }, - "G11": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 104.38, - "y": 20.25, - "z": 7.2 - }, - "H11": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 104.38, - "y": 11.25, - "z": 7.2 - }, - "A12": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 113.38, - "y": 74.25, - "z": 7.2 - }, - "B12": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 113.38, - "y": 65.25, - "z": 7.2 - }, - "C12": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 113.38, - "y": 56.25, - "z": 7.2 - }, - "D12": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 113.38, - "y": 47.25, - "z": 7.2 - }, - "E12": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 113.38, - "y": 38.25, - "z": 7.2 - }, - "F12": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 113.38, - "y": 29.25, - "z": 7.2 - }, - "G12": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 113.38, - "y": 20.25, - "z": 7.2 - }, - "H12": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 113.38, - "y": 11.25, - "z": 7.2 - } - }, - "groups": [ - { - "metadata": { - "wellBottomShape": "v", - "displayCategory": "wellPlate" - }, - "wells": [ - "A1", - "B1", - "C1", - "D1", - "E1", - "F1", - "G1", - "H1", - "A2", - "B2", - "C2", - "D2", - "E2", - "F2", - "G2", - "H2", - "A3", - "B3", - "C3", - "D3", - "E3", - "F3", - "G3", - "H3", - "A4", - "B4", - "C4", - "D4", - "E4", - "F4", - "G4", - "H4", - "A5", - "B5", - "C5", - "D5", - "E5", - "F5", - "G5", - "H5", - "A6", - "B6", - "C6", - "D6", - "E6", - "F6", - "G6", - "H6", - "A7", - "B7", - "C7", - "D7", - "E7", - "F7", - "G7", - "H7", - "A8", - "B8", - "C8", - "D8", - "E8", - "F8", - "G8", - "H8", - "A9", - "B9", - "C9", - "D9", - "E9", - "F9", - "G9", - "H9", - "A10", - "B10", - "C10", - "D10", - "E10", - "F10", - "G10", - "H10", - "A11", - "B11", - "C11", - "D11", - "E11", - "F11", - "G11", - "H11", - "A12", - "B12", - "C12", - "D12", - "E12", - "F12", - "G12", - "H12" - ] - } - ], - "parameters": { - "format": "irregular", - "quirks": [], - "isTiprack": false, - "isMagneticModuleCompatible": false, - "loadName": "starlab_96_aluminumblock_200ul" - }, - "namespace": "custom_beta", - "version": 1, - "schemaVersion": 2, - "cornerOffsetFromSlot": { - "x": 0, - "y": 0, - "z": 0 - } -} \ No newline at end of file diff --git a/protocols/08207f/labware/starlab_96_wellplate_200ul.json b/protocols/08207f/labware/starlab_96_wellplate_200ul.json deleted file mode 100644 index b44a8ff90..000000000 --- a/protocols/08207f/labware/starlab_96_wellplate_200ul.json +++ /dev/null @@ -1,1127 +0,0 @@ -{ - "ordering": [ - [ - "A1", - "B1", - "C1", - "D1", - "E1", - "F1", - "G1", - "H1" - ], - [ - "A2", - "B2", - "C2", - "D2", - "E2", - "F2", - "G2", - "H2" - ], - [ - "A3", - "B3", - "C3", - "D3", - "E3", - "F3", - "G3", - "H3" - ], - [ - "A4", - "B4", - "C4", - "D4", - "E4", - "F4", - "G4", - "H4" - ], - [ - "A5", - "B5", - "C5", - "D5", - "E5", - "F5", - "G5", - "H5" - ], - [ - "A6", - "B6", - "C6", - "D6", - "E6", - "F6", - "G6", - "H6" - ], - [ - "A7", - "B7", - "C7", - "D7", - "E7", - "F7", - "G7", - "H7" - ], - [ - "A8", - "B8", - "C8", - "D8", - "E8", - "F8", - "G8", - "H8" - ], - [ - "A9", - "B9", - "C9", - "D9", - "E9", - "F9", - "G9", - "H9" - ], - [ - "A10", - "B10", - "C10", - "D10", - "E10", - "F10", - "G10", - "H10" - ], - [ - "A11", - "B11", - "C11", - "D11", - "E11", - "F11", - "G11", - "H11" - ], - [ - "A12", - "B12", - "C12", - "D12", - "E12", - "F12", - "G12", - "H12" - ] - ], - "brand": { - "brand": "Starlab", - "brandId": [ - "E1403-5200" - ] - }, - "metadata": { - "displayName": "Starlab 96-well PCR Plate 200 µL", - "displayCategory": "wellPlate", - "displayVolumeUnits": "µL", - "tags": [] - }, - "dimensions": { - "xDimension": 127.8, - "yDimension": 85.5, - "zDimension": 15.5 - }, - "wells": { - "A1": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 14.4, - "y": 74.3, - "z": 0.5 - }, - "B1": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 14.4, - "y": 65.3, - "z": 0.5 - }, - "C1": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 14.4, - "y": 56.3, - "z": 0.5 - }, - "D1": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 14.4, - "y": 47.3, - "z": 0.5 - }, - "E1": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 14.4, - "y": 38.3, - "z": 0.5 - }, - "F1": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 14.4, - "y": 29.3, - "z": 0.5 - }, - "G1": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 14.4, - "y": 20.3, - "z": 0.5 - }, - "H1": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 14.4, - "y": 11.3, - "z": 0.5 - }, - "A2": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 23.4, - "y": 74.3, - "z": 0.5 - }, - "B2": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 23.4, - "y": 65.3, - "z": 0.5 - }, - "C2": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 23.4, - "y": 56.3, - "z": 0.5 - }, - "D2": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 23.4, - "y": 47.3, - "z": 0.5 - }, - "E2": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 23.4, - "y": 38.3, - "z": 0.5 - }, - "F2": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 23.4, - "y": 29.3, - "z": 0.5 - }, - "G2": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 23.4, - "y": 20.3, - "z": 0.5 - }, - "H2": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 23.4, - "y": 11.3, - "z": 0.5 - }, - "A3": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 32.4, - "y": 74.3, - "z": 0.5 - }, - "B3": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 32.4, - "y": 65.3, - "z": 0.5 - }, - "C3": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 32.4, - "y": 56.3, - "z": 0.5 - }, - "D3": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 32.4, - "y": 47.3, - "z": 0.5 - }, - "E3": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 32.4, - "y": 38.3, - "z": 0.5 - }, - "F3": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 32.4, - "y": 29.3, - "z": 0.5 - }, - "G3": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 32.4, - "y": 20.3, - "z": 0.5 - }, - "H3": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 32.4, - "y": 11.3, - "z": 0.5 - }, - "A4": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 41.4, - "y": 74.3, - "z": 0.5 - }, - "B4": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 41.4, - "y": 65.3, - "z": 0.5 - }, - "C4": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 41.4, - "y": 56.3, - "z": 0.5 - }, - "D4": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 41.4, - "y": 47.3, - "z": 0.5 - }, - "E4": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 41.4, - "y": 38.3, - "z": 0.5 - }, - "F4": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 41.4, - "y": 29.3, - "z": 0.5 - }, - "G4": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 41.4, - "y": 20.3, - "z": 0.5 - }, - "H4": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 41.4, - "y": 11.3, - "z": 0.5 - }, - "A5": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 50.4, - "y": 74.3, - "z": 0.5 - }, - "B5": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 50.4, - "y": 65.3, - "z": 0.5 - }, - "C5": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 50.4, - "y": 56.3, - "z": 0.5 - }, - "D5": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 50.4, - "y": 47.3, - "z": 0.5 - }, - "E5": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 50.4, - "y": 38.3, - "z": 0.5 - }, - "F5": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 50.4, - "y": 29.3, - "z": 0.5 - }, - "G5": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 50.4, - "y": 20.3, - "z": 0.5 - }, - "H5": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 50.4, - "y": 11.3, - "z": 0.5 - }, - "A6": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 59.4, - "y": 74.3, - "z": 0.5 - }, - "B6": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 59.4, - "y": 65.3, - "z": 0.5 - }, - "C6": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 59.4, - "y": 56.3, - "z": 0.5 - }, - "D6": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 59.4, - "y": 47.3, - "z": 0.5 - }, - "E6": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 59.4, - "y": 38.3, - "z": 0.5 - }, - "F6": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 59.4, - "y": 29.3, - "z": 0.5 - }, - "G6": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 59.4, - "y": 20.3, - "z": 0.5 - }, - "H6": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 59.4, - "y": 11.3, - "z": 0.5 - }, - "A7": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 68.4, - "y": 74.3, - "z": 0.5 - }, - "B7": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 68.4, - "y": 65.3, - "z": 0.5 - }, - "C7": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 68.4, - "y": 56.3, - "z": 0.5 - }, - "D7": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 68.4, - "y": 47.3, - "z": 0.5 - }, - "E7": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 68.4, - "y": 38.3, - "z": 0.5 - }, - "F7": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 68.4, - "y": 29.3, - "z": 0.5 - }, - "G7": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 68.4, - "y": 20.3, - "z": 0.5 - }, - "H7": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 68.4, - "y": 11.3, - "z": 0.5 - }, - "A8": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 77.4, - "y": 74.3, - "z": 0.5 - }, - "B8": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 77.4, - "y": 65.3, - "z": 0.5 - }, - "C8": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 77.4, - "y": 56.3, - "z": 0.5 - }, - "D8": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 77.4, - "y": 47.3, - "z": 0.5 - }, - "E8": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 77.4, - "y": 38.3, - "z": 0.5 - }, - "F8": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 77.4, - "y": 29.3, - "z": 0.5 - }, - "G8": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 77.4, - "y": 20.3, - "z": 0.5 - }, - "H8": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 77.4, - "y": 11.3, - "z": 0.5 - }, - "A9": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 86.4, - "y": 74.3, - "z": 0.5 - }, - "B9": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 86.4, - "y": 65.3, - "z": 0.5 - }, - "C9": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 86.4, - "y": 56.3, - "z": 0.5 - }, - "D9": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 86.4, - "y": 47.3, - "z": 0.5 - }, - "E9": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 86.4, - "y": 38.3, - "z": 0.5 - }, - "F9": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 86.4, - "y": 29.3, - "z": 0.5 - }, - "G9": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 86.4, - "y": 20.3, - "z": 0.5 - }, - "H9": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 86.4, - "y": 11.3, - "z": 0.5 - }, - "A10": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 95.4, - "y": 74.3, - "z": 0.5 - }, - "B10": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 95.4, - "y": 65.3, - "z": 0.5 - }, - "C10": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 95.4, - "y": 56.3, - "z": 0.5 - }, - "D10": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 95.4, - "y": 47.3, - "z": 0.5 - }, - "E10": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 95.4, - "y": 38.3, - "z": 0.5 - }, - "F10": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 95.4, - "y": 29.3, - "z": 0.5 - }, - "G10": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 95.4, - "y": 20.3, - "z": 0.5 - }, - "H10": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 95.4, - "y": 11.3, - "z": 0.5 - }, - "A11": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 104.4, - "y": 74.3, - "z": 0.5 - }, - "B11": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 104.4, - "y": 65.3, - "z": 0.5 - }, - "C11": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 104.4, - "y": 56.3, - "z": 0.5 - }, - "D11": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 104.4, - "y": 47.3, - "z": 0.5 - }, - "E11": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 104.4, - "y": 38.3, - "z": 0.5 - }, - "F11": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 104.4, - "y": 29.3, - "z": 0.5 - }, - "G11": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 104.4, - "y": 20.3, - "z": 0.5 - }, - "H11": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 104.4, - "y": 11.3, - "z": 0.5 - }, - "A12": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 113.4, - "y": 74.3, - "z": 0.5 - }, - "B12": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 113.4, - "y": 65.3, - "z": 0.5 - }, - "C12": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 113.4, - "y": 56.3, - "z": 0.5 - }, - "D12": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 113.4, - "y": 47.3, - "z": 0.5 - }, - "E12": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 113.4, - "y": 38.3, - "z": 0.5 - }, - "F12": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 113.4, - "y": 29.3, - "z": 0.5 - }, - "G12": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 113.4, - "y": 20.3, - "z": 0.5 - }, - "H12": { - "depth": 15, - "totalLiquidVolume": 200, - "shape": "circular", - "diameter": 5.7, - "x": 113.4, - "y": 11.3, - "z": 0.5 - } - }, - "groups": [ - { - "metadata": { - "wellBottomShape": "v" - }, - "wells": [ - "A1", - "B1", - "C1", - "D1", - "E1", - "F1", - "G1", - "H1", - "A2", - "B2", - "C2", - "D2", - "E2", - "F2", - "G2", - "H2", - "A3", - "B3", - "C3", - "D3", - "E3", - "F3", - "G3", - "H3", - "A4", - "B4", - "C4", - "D4", - "E4", - "F4", - "G4", - "H4", - "A5", - "B5", - "C5", - "D5", - "E5", - "F5", - "G5", - "H5", - "A6", - "B6", - "C6", - "D6", - "E6", - "F6", - "G6", - "H6", - "A7", - "B7", - "C7", - "D7", - "E7", - "F7", - "G7", - "H7", - "A8", - "B8", - "C8", - "D8", - "E8", - "F8", - "G8", - "H8", - "A9", - "B9", - "C9", - "D9", - "E9", - "F9", - "G9", - "H9", - "A10", - "B10", - "C10", - "D10", - "E10", - "F10", - "G10", - "H10", - "A11", - "B11", - "C11", - "D11", - "E11", - "F11", - "G11", - "H11", - "A12", - "B12", - "C12", - "D12", - "E12", - "F12", - "G12", - "H12" - ] - } - ], - "parameters": { - "format": "irregular", - "quirks": [], - "isTiprack": false, - "isMagneticModuleCompatible": false, - "loadName": "starlab_96_wellplate_200ul" - }, - "namespace": "custom_beta", - "version": 1, - "schemaVersion": 2, - "cornerOffsetFromSlot": { - "x": 0, - "y": 0, - "z": 0 - } -} \ No newline at end of file From 6c7988d24e1a8bc0a8bd0a703810967840856d88 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9Cramifarawi=E2=80=9D?= <“rami.farawi@opentrons.com”> Date: Fri, 15 Mar 2024 15:39:23 -0400 Subject: [PATCH 10/19] fix --- protoBuilds/08207f/08207f.ot2.apiv2.py.json | 4681 ------------------- protoBuilds/08207f/README.json | 34 - protoBuilds/08207f/metadata.json | 20 - 3 files changed, 4735 deletions(-) delete mode 100644 protoBuilds/08207f/08207f.ot2.apiv2.py.json delete mode 100644 protoBuilds/08207f/README.json delete mode 100644 protoBuilds/08207f/metadata.json diff --git a/protoBuilds/08207f/08207f.ot2.apiv2.py.json b/protoBuilds/08207f/08207f.ot2.apiv2.py.json deleted file mode 100644 index e4aa5399c..000000000 --- a/protoBuilds/08207f/08207f.ot2.apiv2.py.json +++ /dev/null @@ -1,4681 +0,0 @@ -{ - "content": "# flake8: noqa\nfrom opentrons import protocol_api\nimport math\n\nmetadata = {\n 'protocolName': 'Normalization Using .csv File',\n 'author': 'Parrish Payne ',\n 'source': 'Custom Protocol Request',\n 'apiLevel': '2.13'\n}\n\ndef run(ctx):\n\n [input_csv, init_vol_buff, labware_pcr_plate,\n labware_dna_plate, temp_mod, temperature,\n p20_mount, p300_mount] = get_values( # noqa: F821\n \"input_csv\", \"init_vol_buff\", \"labware_pcr_plate\",\n \"labware_dna_plate\", \"temp_mod\", \"temperature\",\n \"p20_mount\", \"p300_mount\")\n\n if not 4 <= temperature <= 95:\n raise Exception(\n \"Temperature module range is between 4 and 95\u00baC\")\n\n # modules\n temp_mod = None\n if temp_mod:\n temp_mod = ctx.load_module(\"temperature module gen2\", '3')\n\n # labware\n tiprack20 = [\n ctx.load_labware('opentrons_96_filtertiprack_20ul', slot,\n '20ul tiprack')\n for slot in ['1', '8']]\n tiprack300 = [\n ctx.load_labware(\n 'opentrons_96_filtertiprack_200ul', slot, '200ul tiprack')\n for slot in ['2', '9']]\n\n dna_plate = None\n if temp_mod == True and labware_dna_plate == \"eppendorftwin.tec_96_wellplate_150ul\":\n dna_plate = temp_mod.load_labware(\"eppendorftwin.tec96_96_aluminumblock_150ul\", 'sample plate')\n\n elif temp_mod == True and labware_dna_plate == \"starlab_96_wellplate_200ul\":\n dna_plate = temp_mod.load_labware(\"starlab_96_aluminumblock_200ul\", 'sample plate')\n\n else:\n dna_plate = ctx.load_labware(labware_dna_plate, '3', 'sample plate')\n\n tube_rack = ctx.load_labware(\n 'opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical', '5')\n dest_plate = ctx.load_labware(labware_pcr_plate, '6', 'end-point-plate') # noqa: E501\n\n # pipettes\n p20 = ctx.load_instrument(\n 'p20_single_gen2', p20_mount, tip_racks=tiprack20)\n p300 = ctx.load_instrument(\n 'p300_single_gen2', p300_mount, tip_racks=tiprack300)\n\n # Helper Functions\n # liquid height tracking\n v_naught_buff = init_vol_buff*1000\n\n radius_sds = tube_rack.wells_by_name()['A3'].diameter/2\n\n h_naught_buff = 0.85*v_naught_buff/(math.pi*radius_sds**2)\n\n h_buff = h_naught_buff\n\n def adjust_height(volume_from_loop):\n nonlocal h_buff\n\n radius = radius_sds\n\n dh = (volume_from_loop/(math.pi*radius**2))*1.33\n\n h_buff -= dh\n\n if h_buff < 12:\n h_buff = 1\n\n def slow_withdraw(pip, well, delay_seconds=2.0):\n pip.default_speed /= 16\n if delay_seconds > 0:\n ctx.delay(seconds=delay_seconds)\n pip.move_to(well.top())\n pip.default_speed *= 16\n\n # Set temperature module temperature\n if temp_mod:\n ctx.comment(\"\\n\\nSetting temperature module to {} \u00baC\\n\".\n format(temperature))\n temp_mod.set_temperature(temperature)\n\n # mapping\n buffer = tube_rack.wells_by_name()['A3']\n\n # parse\n all_rows = [[val.strip() for val in line.split(',')]\n for line in input_csv.splitlines()\n if line.split(',')[0].strip()][1:]\n\n # Adding buffer to the wells\n for row in all_rows:\n well = row[0]\n dest_well = dest_plate.wells_by_name()[well]\n volume = float(row[7])\n\n if volume > 0:\n if volume > 20:\n if not p300.has_tip:\n p300.pick_up_tip()\n p300.aspirate(volume, buffer.bottom(h_buff))\n p300.dispense(volume, dest_well)\n\n else:\n if not p20.has_tip:\n p20.pick_up_tip()\n p20.aspirate(volume, buffer.bottom(h_buff))\n p20.dispense(volume, dest_well)\n\n adjust_height(volume)\n\n if p20.has_tip:\n p20.drop_tip()\n if p300.has_tip:\n p300.drop_tip()\n\n # Adding sample to the wells\n for row in all_rows:\n\n well = row[0]\n source_well = dna_plate.wells_by_name()[well]\n dest_well = dest_plate.wells_by_name()[well]\n\n volume = float(row[6])\n mix_reps = 2\n tip_height = 0.5\n\n if volume > 0:\n if volume > 20:\n p300.pick_up_tip()\n p300.aspirate(volume, source_well.bottom(tip_height))\n p300.dispense(volume, dest_well)\n p300.mix(mix_reps, 20)\n p300.blow_out()\n p300.drop_tip()\n\n else:\n p20.pick_up_tip()\n p20.aspirate(volume, source_well.bottom(tip_height))\n p20.dispense(volume, dest_well)\n p20.mix(mix_reps, 10)\n p20.blow_out()\n p20.drop_tip()\n", - "custom_labware_defs": [ - { - "brand": { - "brand": "Eppendorf Twin.Tec 96", - "brandId": [ - "0030129512" - ] - }, - "cornerOffsetFromSlot": { - "x": 0, - "y": 0, - "z": 0 - }, - "dimensions": { - "xDimension": 127.75, - "yDimension": 85.5, - "zDimension": 21.9 - }, - "groups": [ - { - "metadata": { - "displayCategory": "wellPlate", - "wellBottomShape": "v" - }, - "wells": [ - "A1", - "B1", - "C1", - "D1", - "E1", - "F1", - "G1", - "H1", - "A2", - "B2", - "C2", - "D2", - "E2", - "F2", - "G2", - "H2", - "A3", - "B3", - "C3", - "D3", - "E3", - "F3", - "G3", - "H3", - "A4", - "B4", - "C4", - "D4", - "E4", - "F4", - "G4", - "H4", - "A5", - "B5", - "C5", - "D5", - "E5", - "F5", - "G5", - "H5", - "A6", - "B6", - "C6", - "D6", - "E6", - "F6", - "G6", - "H6", - "A7", - "B7", - "C7", - "D7", - "E7", - "F7", - "G7", - "H7", - "A8", - "B8", - "C8", - "D8", - "E8", - "F8", - "G8", - "H8", - "A9", - "B9", - "C9", - "D9", - "E9", - "F9", - "G9", - "H9", - "A10", - "B10", - "C10", - "D10", - "E10", - "F10", - "G10", - "H10", - "A11", - "B11", - "C11", - "D11", - "E11", - "F11", - "G11", - "H11", - "A12", - "B12", - "C12", - "D12", - "E12", - "F12", - "G12", - "H12" - ] - } - ], - "metadata": { - "displayCategory": "aluminumBlock", - "displayName": "Eppendorf Twin.Tec 96 96 Aluminum Block 150 \u00b5L", - "displayVolumeUnits": "\u00b5L", - "tags": [] - }, - "namespace": "custom_beta", - "ordering": [ - [ - "A1", - "B1", - "C1", - "D1", - "E1", - "F1", - "G1", - "H1" - ], - [ - "A2", - "B2", - "C2", - "D2", - "E2", - "F2", - "G2", - "H2" - ], - [ - "A3", - "B3", - "C3", - "D3", - "E3", - "F3", - "G3", - "H3" - ], - [ - "A4", - "B4", - "C4", - "D4", - "E4", - "F4", - "G4", - "H4" - ], - [ - "A5", - "B5", - "C5", - "D5", - "E5", - "F5", - "G5", - "H5" - ], - [ - "A6", - "B6", - "C6", - "D6", - "E6", - "F6", - "G6", - "H6" - ], - [ - "A7", - "B7", - "C7", - "D7", - "E7", - "F7", - "G7", - "H7" - ], - [ - "A8", - "B8", - "C8", - "D8", - "E8", - "F8", - "G8", - "H8" - ], - [ - "A9", - "B9", - "C9", - "D9", - "E9", - "F9", - "G9", - "H9" - ], - [ - "A10", - "B10", - "C10", - "D10", - "E10", - "F10", - "G10", - "H10" - ], - [ - "A11", - "B11", - "C11", - "D11", - "E11", - "F11", - "G11", - "H11" - ], - [ - "A12", - "B12", - "C12", - "D12", - "E12", - "F12", - "G12", - "H12" - ] - ], - "parameters": { - "format": "irregular", - "isMagneticModuleCompatible": false, - "isTiprack": false, - "loadName": "eppendorftwin.tec96_96_aluminumblock_150ul", - "quirks": [] - }, - "schemaVersion": 2, - "version": 1, - "wells": { - "A1": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 14.38, - "y": 74.25, - "z": 7.3 - }, - "A10": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 95.38, - "y": 74.25, - "z": 7.3 - }, - "A11": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 104.38, - "y": 74.25, - "z": 7.3 - }, - "A12": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 113.38, - "y": 74.25, - "z": 7.3 - }, - "A2": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 23.38, - "y": 74.25, - "z": 7.3 - }, - "A3": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 32.38, - "y": 74.25, - "z": 7.3 - }, - "A4": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 41.38, - "y": 74.25, - "z": 7.3 - }, - "A5": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 50.38, - "y": 74.25, - "z": 7.3 - }, - "A6": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 59.38, - "y": 74.25, - "z": 7.3 - }, - "A7": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 68.38, - "y": 74.25, - "z": 7.3 - }, - "A8": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 77.38, - "y": 74.25, - "z": 7.3 - }, - "A9": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 86.38, - "y": 74.25, - "z": 7.3 - }, - "B1": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 14.38, - "y": 65.25, - "z": 7.3 - }, - "B10": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 95.38, - "y": 65.25, - "z": 7.3 - }, - "B11": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 104.38, - "y": 65.25, - "z": 7.3 - }, - "B12": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 113.38, - "y": 65.25, - "z": 7.3 - }, - "B2": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 23.38, - "y": 65.25, - "z": 7.3 - }, - "B3": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 32.38, - "y": 65.25, - "z": 7.3 - }, - "B4": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 41.38, - "y": 65.25, - "z": 7.3 - }, - "B5": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 50.38, - "y": 65.25, - "z": 7.3 - }, - "B6": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 59.38, - "y": 65.25, - "z": 7.3 - }, - "B7": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 68.38, - "y": 65.25, - "z": 7.3 - }, - "B8": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 77.38, - "y": 65.25, - "z": 7.3 - }, - "B9": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 86.38, - "y": 65.25, - "z": 7.3 - }, - "C1": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 14.38, - "y": 56.25, - "z": 7.3 - }, - "C10": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 95.38, - "y": 56.25, - "z": 7.3 - }, - "C11": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 104.38, - "y": 56.25, - "z": 7.3 - }, - "C12": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 113.38, - "y": 56.25, - "z": 7.3 - }, - "C2": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 23.38, - "y": 56.25, - "z": 7.3 - }, - "C3": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 32.38, - "y": 56.25, - "z": 7.3 - }, - "C4": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 41.38, - "y": 56.25, - "z": 7.3 - }, - "C5": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 50.38, - "y": 56.25, - "z": 7.3 - }, - "C6": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 59.38, - "y": 56.25, - "z": 7.3 - }, - "C7": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 68.38, - "y": 56.25, - "z": 7.3 - }, - "C8": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 77.38, - "y": 56.25, - "z": 7.3 - }, - "C9": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 86.38, - "y": 56.25, - "z": 7.3 - }, - "D1": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 14.38, - "y": 47.25, - "z": 7.3 - }, - "D10": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 95.38, - "y": 47.25, - "z": 7.3 - }, - "D11": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 104.38, - "y": 47.25, - "z": 7.3 - }, - "D12": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 113.38, - "y": 47.25, - "z": 7.3 - }, - "D2": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 23.38, - "y": 47.25, - "z": 7.3 - }, - "D3": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 32.38, - "y": 47.25, - "z": 7.3 - }, - "D4": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 41.38, - "y": 47.25, - "z": 7.3 - }, - "D5": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 50.38, - "y": 47.25, - "z": 7.3 - }, - "D6": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 59.38, - "y": 47.25, - "z": 7.3 - }, - "D7": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 68.38, - "y": 47.25, - "z": 7.3 - }, - "D8": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 77.38, - "y": 47.25, - "z": 7.3 - }, - "D9": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 86.38, - "y": 47.25, - "z": 7.3 - }, - "E1": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 14.38, - "y": 38.25, - "z": 7.3 - }, - "E10": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 95.38, - "y": 38.25, - "z": 7.3 - }, - "E11": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 104.38, - "y": 38.25, - "z": 7.3 - }, - "E12": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 113.38, - "y": 38.25, - "z": 7.3 - }, - "E2": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 23.38, - "y": 38.25, - "z": 7.3 - }, - "E3": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 32.38, - "y": 38.25, - "z": 7.3 - }, - "E4": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 41.38, - "y": 38.25, - "z": 7.3 - }, - "E5": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 50.38, - "y": 38.25, - "z": 7.3 - }, - "E6": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 59.38, - "y": 38.25, - "z": 7.3 - }, - "E7": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 68.38, - "y": 38.25, - "z": 7.3 - }, - "E8": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 77.38, - "y": 38.25, - "z": 7.3 - }, - "E9": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 86.38, - "y": 38.25, - "z": 7.3 - }, - "F1": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 14.38, - "y": 29.25, - "z": 7.3 - }, - "F10": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 95.38, - "y": 29.25, - "z": 7.3 - }, - "F11": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 104.38, - "y": 29.25, - "z": 7.3 - }, - "F12": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 113.38, - "y": 29.25, - "z": 7.3 - }, - "F2": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 23.38, - "y": 29.25, - "z": 7.3 - }, - "F3": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 32.38, - "y": 29.25, - "z": 7.3 - }, - "F4": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 41.38, - "y": 29.25, - "z": 7.3 - }, - "F5": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 50.38, - "y": 29.25, - "z": 7.3 - }, - "F6": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 59.38, - "y": 29.25, - "z": 7.3 - }, - "F7": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 68.38, - "y": 29.25, - "z": 7.3 - }, - "F8": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 77.38, - "y": 29.25, - "z": 7.3 - }, - "F9": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 86.38, - "y": 29.25, - "z": 7.3 - }, - "G1": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 14.38, - "y": 20.25, - "z": 7.3 - }, - "G10": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 95.38, - "y": 20.25, - "z": 7.3 - }, - "G11": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 104.38, - "y": 20.25, - "z": 7.3 - }, - "G12": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 113.38, - "y": 20.25, - "z": 7.3 - }, - "G2": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 23.38, - "y": 20.25, - "z": 7.3 - }, - "G3": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 32.38, - "y": 20.25, - "z": 7.3 - }, - "G4": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 41.38, - "y": 20.25, - "z": 7.3 - }, - "G5": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 50.38, - "y": 20.25, - "z": 7.3 - }, - "G6": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 59.38, - "y": 20.25, - "z": 7.3 - }, - "G7": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 68.38, - "y": 20.25, - "z": 7.3 - }, - "G8": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 77.38, - "y": 20.25, - "z": 7.3 - }, - "G9": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 86.38, - "y": 20.25, - "z": 7.3 - }, - "H1": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 14.38, - "y": 11.25, - "z": 7.3 - }, - "H10": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 95.38, - "y": 11.25, - "z": 7.3 - }, - "H11": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 104.38, - "y": 11.25, - "z": 7.3 - }, - "H12": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 113.38, - "y": 11.25, - "z": 7.3 - }, - "H2": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 23.38, - "y": 11.25, - "z": 7.3 - }, - "H3": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 32.38, - "y": 11.25, - "z": 7.3 - }, - "H4": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 41.38, - "y": 11.25, - "z": 7.3 - }, - "H5": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 50.38, - "y": 11.25, - "z": 7.3 - }, - "H6": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 59.38, - "y": 11.25, - "z": 7.3 - }, - "H7": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 68.38, - "y": 11.25, - "z": 7.3 - }, - "H8": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 77.38, - "y": 11.25, - "z": 7.3 - }, - "H9": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 86.38, - "y": 11.25, - "z": 7.3 - } - } - }, - { - "brand": { - "brand": "Starlab", - "brandId": [ - "E1403-5200" - ] - }, - "cornerOffsetFromSlot": { - "x": 0, - "y": 0, - "z": 0 - }, - "dimensions": { - "xDimension": 127.8, - "yDimension": 85.5, - "zDimension": 15.5 - }, - "groups": [ - { - "metadata": { - "wellBottomShape": "v" - }, - "wells": [ - "A1", - "B1", - "C1", - "D1", - "E1", - "F1", - "G1", - "H1", - "A2", - "B2", - "C2", - "D2", - "E2", - "F2", - "G2", - "H2", - "A3", - "B3", - "C3", - "D3", - "E3", - "F3", - "G3", - "H3", - "A4", - "B4", - "C4", - "D4", - "E4", - "F4", - "G4", - "H4", - "A5", - "B5", - "C5", - "D5", - "E5", - "F5", - "G5", - "H5", - "A6", - "B6", - "C6", - "D6", - "E6", - "F6", - "G6", - "H6", - "A7", - "B7", - "C7", - "D7", - "E7", - "F7", - "G7", - "H7", - "A8", - "B8", - "C8", - "D8", - "E8", - "F8", - "G8", - "H8", - "A9", - "B9", - "C9", - "D9", - "E9", - "F9", - "G9", - "H9", - "A10", - "B10", - "C10", - "D10", - "E10", - "F10", - "G10", - "H10", - "A11", - "B11", - "C11", - "D11", - "E11", - "F11", - "G11", - "H11", - "A12", - "B12", - "C12", - "D12", - "E12", - "F12", - "G12", - "H12" - ] - } - ], - "metadata": { - "displayCategory": "wellPlate", - "displayName": "Starlab 96-well PCR Plate 200 \u00b5L", - "displayVolumeUnits": "\u00b5L", - "tags": [] - }, - "namespace": "custom_beta", - "ordering": [ - [ - "A1", - "B1", - "C1", - "D1", - "E1", - "F1", - "G1", - "H1" - ], - [ - "A2", - "B2", - "C2", - "D2", - "E2", - "F2", - "G2", - "H2" - ], - [ - "A3", - "B3", - "C3", - "D3", - "E3", - "F3", - "G3", - "H3" - ], - [ - "A4", - "B4", - "C4", - "D4", - "E4", - "F4", - "G4", - "H4" - ], - [ - "A5", - "B5", - "C5", - "D5", - "E5", - "F5", - "G5", - "H5" - ], - [ - "A6", - "B6", - "C6", - "D6", - "E6", - "F6", - "G6", - "H6" - ], - [ - "A7", - "B7", - "C7", - "D7", - "E7", - "F7", - "G7", - "H7" - ], - [ - "A8", - "B8", - "C8", - "D8", - "E8", - "F8", - "G8", - "H8" - ], - [ - "A9", - "B9", - "C9", - "D9", - "E9", - "F9", - "G9", - "H9" - ], - [ - "A10", - "B10", - "C10", - "D10", - "E10", - "F10", - "G10", - "H10" - ], - [ - "A11", - "B11", - "C11", - "D11", - "E11", - "F11", - "G11", - "H11" - ], - [ - "A12", - "B12", - "C12", - "D12", - "E12", - "F12", - "G12", - "H12" - ] - ], - "parameters": { - "format": "irregular", - "isMagneticModuleCompatible": false, - "isTiprack": false, - "loadName": "starlab_96_wellplate_200ul", - "quirks": [] - }, - "schemaVersion": 2, - "version": 1, - "wells": { - "A1": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 14.4, - "y": 74.3, - "z": 0.5 - }, - "A10": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 95.4, - "y": 74.3, - "z": 0.5 - }, - "A11": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 104.4, - "y": 74.3, - "z": 0.5 - }, - "A12": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 113.4, - "y": 74.3, - "z": 0.5 - }, - "A2": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 23.4, - "y": 74.3, - "z": 0.5 - }, - "A3": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 32.4, - "y": 74.3, - "z": 0.5 - }, - "A4": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 41.4, - "y": 74.3, - "z": 0.5 - }, - "A5": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 50.4, - "y": 74.3, - "z": 0.5 - }, - "A6": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 59.4, - "y": 74.3, - "z": 0.5 - }, - "A7": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 68.4, - "y": 74.3, - "z": 0.5 - }, - "A8": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 77.4, - "y": 74.3, - "z": 0.5 - }, - "A9": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 86.4, - "y": 74.3, - "z": 0.5 - }, - "B1": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 14.4, - "y": 65.3, - "z": 0.5 - }, - "B10": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 95.4, - "y": 65.3, - "z": 0.5 - }, - "B11": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 104.4, - "y": 65.3, - "z": 0.5 - }, - "B12": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 113.4, - "y": 65.3, - "z": 0.5 - }, - "B2": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 23.4, - "y": 65.3, - "z": 0.5 - }, - "B3": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 32.4, - "y": 65.3, - "z": 0.5 - }, - "B4": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 41.4, - "y": 65.3, - "z": 0.5 - }, - "B5": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 50.4, - "y": 65.3, - "z": 0.5 - }, - "B6": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 59.4, - "y": 65.3, - "z": 0.5 - }, - "B7": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 68.4, - "y": 65.3, - "z": 0.5 - }, - "B8": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 77.4, - "y": 65.3, - "z": 0.5 - }, - "B9": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 86.4, - "y": 65.3, - "z": 0.5 - }, - "C1": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 14.4, - "y": 56.3, - "z": 0.5 - }, - "C10": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 95.4, - "y": 56.3, - "z": 0.5 - }, - "C11": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 104.4, - "y": 56.3, - "z": 0.5 - }, - "C12": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 113.4, - "y": 56.3, - "z": 0.5 - }, - "C2": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 23.4, - "y": 56.3, - "z": 0.5 - }, - "C3": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 32.4, - "y": 56.3, - "z": 0.5 - }, - "C4": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 41.4, - "y": 56.3, - "z": 0.5 - }, - "C5": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 50.4, - "y": 56.3, - "z": 0.5 - }, - "C6": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 59.4, - "y": 56.3, - "z": 0.5 - }, - "C7": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 68.4, - "y": 56.3, - "z": 0.5 - }, - "C8": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 77.4, - "y": 56.3, - "z": 0.5 - }, - "C9": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 86.4, - "y": 56.3, - "z": 0.5 - }, - "D1": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 14.4, - "y": 47.3, - "z": 0.5 - }, - "D10": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 95.4, - "y": 47.3, - "z": 0.5 - }, - "D11": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 104.4, - "y": 47.3, - "z": 0.5 - }, - "D12": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 113.4, - "y": 47.3, - "z": 0.5 - }, - "D2": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 23.4, - "y": 47.3, - "z": 0.5 - }, - "D3": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 32.4, - "y": 47.3, - "z": 0.5 - }, - "D4": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 41.4, - "y": 47.3, - "z": 0.5 - }, - "D5": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 50.4, - "y": 47.3, - "z": 0.5 - }, - "D6": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 59.4, - "y": 47.3, - "z": 0.5 - }, - "D7": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 68.4, - "y": 47.3, - "z": 0.5 - }, - "D8": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 77.4, - "y": 47.3, - "z": 0.5 - }, - "D9": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 86.4, - "y": 47.3, - "z": 0.5 - }, - "E1": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 14.4, - "y": 38.3, - "z": 0.5 - }, - "E10": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 95.4, - "y": 38.3, - "z": 0.5 - }, - "E11": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 104.4, - "y": 38.3, - "z": 0.5 - }, - "E12": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 113.4, - "y": 38.3, - "z": 0.5 - }, - "E2": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 23.4, - "y": 38.3, - "z": 0.5 - }, - "E3": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 32.4, - "y": 38.3, - "z": 0.5 - }, - "E4": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 41.4, - "y": 38.3, - "z": 0.5 - }, - "E5": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 50.4, - "y": 38.3, - "z": 0.5 - }, - "E6": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 59.4, - "y": 38.3, - "z": 0.5 - }, - "E7": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 68.4, - "y": 38.3, - "z": 0.5 - }, - "E8": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 77.4, - "y": 38.3, - "z": 0.5 - }, - "E9": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 86.4, - "y": 38.3, - "z": 0.5 - }, - "F1": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 14.4, - "y": 29.3, - "z": 0.5 - }, - "F10": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 95.4, - "y": 29.3, - "z": 0.5 - }, - "F11": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 104.4, - "y": 29.3, - "z": 0.5 - }, - "F12": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 113.4, - "y": 29.3, - "z": 0.5 - }, - "F2": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 23.4, - "y": 29.3, - "z": 0.5 - }, - "F3": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 32.4, - "y": 29.3, - "z": 0.5 - }, - "F4": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 41.4, - "y": 29.3, - "z": 0.5 - }, - "F5": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 50.4, - "y": 29.3, - "z": 0.5 - }, - "F6": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 59.4, - "y": 29.3, - "z": 0.5 - }, - "F7": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 68.4, - "y": 29.3, - "z": 0.5 - }, - "F8": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 77.4, - "y": 29.3, - "z": 0.5 - }, - "F9": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 86.4, - "y": 29.3, - "z": 0.5 - }, - "G1": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 14.4, - "y": 20.3, - "z": 0.5 - }, - "G10": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 95.4, - "y": 20.3, - "z": 0.5 - }, - "G11": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 104.4, - "y": 20.3, - "z": 0.5 - }, - "G12": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 113.4, - "y": 20.3, - "z": 0.5 - }, - "G2": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 23.4, - "y": 20.3, - "z": 0.5 - }, - "G3": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 32.4, - "y": 20.3, - "z": 0.5 - }, - "G4": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 41.4, - "y": 20.3, - "z": 0.5 - }, - "G5": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 50.4, - "y": 20.3, - "z": 0.5 - }, - "G6": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 59.4, - "y": 20.3, - "z": 0.5 - }, - "G7": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 68.4, - "y": 20.3, - "z": 0.5 - }, - "G8": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 77.4, - "y": 20.3, - "z": 0.5 - }, - "G9": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 86.4, - "y": 20.3, - "z": 0.5 - }, - "H1": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 14.4, - "y": 11.3, - "z": 0.5 - }, - "H10": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 95.4, - "y": 11.3, - "z": 0.5 - }, - "H11": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 104.4, - "y": 11.3, - "z": 0.5 - }, - "H12": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 113.4, - "y": 11.3, - "z": 0.5 - }, - "H2": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 23.4, - "y": 11.3, - "z": 0.5 - }, - "H3": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 32.4, - "y": 11.3, - "z": 0.5 - }, - "H4": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 41.4, - "y": 11.3, - "z": 0.5 - }, - "H5": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 50.4, - "y": 11.3, - "z": 0.5 - }, - "H6": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 59.4, - "y": 11.3, - "z": 0.5 - }, - "H7": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 68.4, - "y": 11.3, - "z": 0.5 - }, - "H8": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 77.4, - "y": 11.3, - "z": 0.5 - }, - "H9": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 86.4, - "y": 11.3, - "z": 0.5 - } - } - }, - { - "brand": { - "brand": "Starlab", - "brandId": [ - "E1403-5200" - ] - }, - "cornerOffsetFromSlot": { - "x": 0, - "y": 0, - "z": 0 - }, - "dimensions": { - "xDimension": 127.75, - "yDimension": 85.5, - "zDimension": 22.2 - }, - "groups": [ - { - "metadata": { - "displayCategory": "wellPlate", - "wellBottomShape": "v" - }, - "wells": [ - "A1", - "B1", - "C1", - "D1", - "E1", - "F1", - "G1", - "H1", - "A2", - "B2", - "C2", - "D2", - "E2", - "F2", - "G2", - "H2", - "A3", - "B3", - "C3", - "D3", - "E3", - "F3", - "G3", - "H3", - "A4", - "B4", - "C4", - "D4", - "E4", - "F4", - "G4", - "H4", - "A5", - "B5", - "C5", - "D5", - "E5", - "F5", - "G5", - "H5", - "A6", - "B6", - "C6", - "D6", - "E6", - "F6", - "G6", - "H6", - "A7", - "B7", - "C7", - "D7", - "E7", - "F7", - "G7", - "H7", - "A8", - "B8", - "C8", - "D8", - "E8", - "F8", - "G8", - "H8", - "A9", - "B9", - "C9", - "D9", - "E9", - "F9", - "G9", - "H9", - "A10", - "B10", - "C10", - "D10", - "E10", - "F10", - "G10", - "H10", - "A11", - "B11", - "C11", - "D11", - "E11", - "F11", - "G11", - "H11", - "A12", - "B12", - "C12", - "D12", - "E12", - "F12", - "G12", - "H12" - ] - } - ], - "metadata": { - "displayCategory": "aluminumBlock", - "displayName": "Starlab 96 Aluminum Block 200 \u00b5L", - "displayVolumeUnits": "\u00b5L", - "tags": [] - }, - "namespace": "custom_beta", - "ordering": [ - [ - "A1", - "B1", - "C1", - "D1", - "E1", - "F1", - "G1", - "H1" - ], - [ - "A2", - "B2", - "C2", - "D2", - "E2", - "F2", - "G2", - "H2" - ], - [ - "A3", - "B3", - "C3", - "D3", - "E3", - "F3", - "G3", - "H3" - ], - [ - "A4", - "B4", - "C4", - "D4", - "E4", - "F4", - "G4", - "H4" - ], - [ - "A5", - "B5", - "C5", - "D5", - "E5", - "F5", - "G5", - "H5" - ], - [ - "A6", - "B6", - "C6", - "D6", - "E6", - "F6", - "G6", - "H6" - ], - [ - "A7", - "B7", - "C7", - "D7", - "E7", - "F7", - "G7", - "H7" - ], - [ - "A8", - "B8", - "C8", - "D8", - "E8", - "F8", - "G8", - "H8" - ], - [ - "A9", - "B9", - "C9", - "D9", - "E9", - "F9", - "G9", - "H9" - ], - [ - "A10", - "B10", - "C10", - "D10", - "E10", - "F10", - "G10", - "H10" - ], - [ - "A11", - "B11", - "C11", - "D11", - "E11", - "F11", - "G11", - "H11" - ], - [ - "A12", - "B12", - "C12", - "D12", - "E12", - "F12", - "G12", - "H12" - ] - ], - "parameters": { - "format": "irregular", - "isMagneticModuleCompatible": false, - "isTiprack": false, - "loadName": "starlab_96_aluminumblock_200ul", - "quirks": [] - }, - "schemaVersion": 2, - "version": 1, - "wells": { - "A1": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 14.38, - "y": 74.25, - "z": 7.2 - }, - "A10": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 95.38, - "y": 74.25, - "z": 7.2 - }, - "A11": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 104.38, - "y": 74.25, - "z": 7.2 - }, - "A12": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 113.38, - "y": 74.25, - "z": 7.2 - }, - "A2": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 23.38, - "y": 74.25, - "z": 7.2 - }, - "A3": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 32.38, - "y": 74.25, - "z": 7.2 - }, - "A4": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 41.38, - "y": 74.25, - "z": 7.2 - }, - "A5": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 50.38, - "y": 74.25, - "z": 7.2 - }, - "A6": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 59.38, - "y": 74.25, - "z": 7.2 - }, - "A7": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 68.38, - "y": 74.25, - "z": 7.2 - }, - "A8": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 77.38, - "y": 74.25, - "z": 7.2 - }, - "A9": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 86.38, - "y": 74.25, - "z": 7.2 - }, - "B1": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 14.38, - "y": 65.25, - "z": 7.2 - }, - "B10": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 95.38, - "y": 65.25, - "z": 7.2 - }, - "B11": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 104.38, - "y": 65.25, - "z": 7.2 - }, - "B12": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 113.38, - "y": 65.25, - "z": 7.2 - }, - "B2": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 23.38, - "y": 65.25, - "z": 7.2 - }, - "B3": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 32.38, - "y": 65.25, - "z": 7.2 - }, - "B4": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 41.38, - "y": 65.25, - "z": 7.2 - }, - "B5": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 50.38, - "y": 65.25, - "z": 7.2 - }, - "B6": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 59.38, - "y": 65.25, - "z": 7.2 - }, - "B7": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 68.38, - "y": 65.25, - "z": 7.2 - }, - "B8": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 77.38, - "y": 65.25, - "z": 7.2 - }, - "B9": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 86.38, - "y": 65.25, - "z": 7.2 - }, - "C1": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 14.38, - "y": 56.25, - "z": 7.2 - }, - "C10": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 95.38, - "y": 56.25, - "z": 7.2 - }, - "C11": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 104.38, - "y": 56.25, - "z": 7.2 - }, - "C12": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 113.38, - "y": 56.25, - "z": 7.2 - }, - "C2": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 23.38, - "y": 56.25, - "z": 7.2 - }, - "C3": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 32.38, - "y": 56.25, - "z": 7.2 - }, - "C4": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 41.38, - "y": 56.25, - "z": 7.2 - }, - "C5": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 50.38, - "y": 56.25, - "z": 7.2 - }, - "C6": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 59.38, - "y": 56.25, - "z": 7.2 - }, - "C7": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 68.38, - "y": 56.25, - "z": 7.2 - }, - "C8": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 77.38, - "y": 56.25, - "z": 7.2 - }, - "C9": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 86.38, - "y": 56.25, - "z": 7.2 - }, - "D1": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 14.38, - "y": 47.25, - "z": 7.2 - }, - "D10": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 95.38, - "y": 47.25, - "z": 7.2 - }, - "D11": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 104.38, - "y": 47.25, - "z": 7.2 - }, - "D12": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 113.38, - "y": 47.25, - "z": 7.2 - }, - "D2": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 23.38, - "y": 47.25, - "z": 7.2 - }, - "D3": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 32.38, - "y": 47.25, - "z": 7.2 - }, - "D4": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 41.38, - "y": 47.25, - "z": 7.2 - }, - "D5": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 50.38, - "y": 47.25, - "z": 7.2 - }, - "D6": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 59.38, - "y": 47.25, - "z": 7.2 - }, - "D7": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 68.38, - "y": 47.25, - "z": 7.2 - }, - "D8": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 77.38, - "y": 47.25, - "z": 7.2 - }, - "D9": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 86.38, - "y": 47.25, - "z": 7.2 - }, - "E1": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 14.38, - "y": 38.25, - "z": 7.2 - }, - "E10": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 95.38, - "y": 38.25, - "z": 7.2 - }, - "E11": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 104.38, - "y": 38.25, - "z": 7.2 - }, - "E12": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 113.38, - "y": 38.25, - "z": 7.2 - }, - "E2": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 23.38, - "y": 38.25, - "z": 7.2 - }, - "E3": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 32.38, - "y": 38.25, - "z": 7.2 - }, - "E4": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 41.38, - "y": 38.25, - "z": 7.2 - }, - "E5": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 50.38, - "y": 38.25, - "z": 7.2 - }, - "E6": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 59.38, - "y": 38.25, - "z": 7.2 - }, - "E7": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 68.38, - "y": 38.25, - "z": 7.2 - }, - "E8": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 77.38, - "y": 38.25, - "z": 7.2 - }, - "E9": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 86.38, - "y": 38.25, - "z": 7.2 - }, - "F1": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 14.38, - "y": 29.25, - "z": 7.2 - }, - "F10": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 95.38, - "y": 29.25, - "z": 7.2 - }, - "F11": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 104.38, - "y": 29.25, - "z": 7.2 - }, - "F12": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 113.38, - "y": 29.25, - "z": 7.2 - }, - "F2": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 23.38, - "y": 29.25, - "z": 7.2 - }, - "F3": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 32.38, - "y": 29.25, - "z": 7.2 - }, - "F4": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 41.38, - "y": 29.25, - "z": 7.2 - }, - "F5": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 50.38, - "y": 29.25, - "z": 7.2 - }, - "F6": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 59.38, - "y": 29.25, - "z": 7.2 - }, - "F7": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 68.38, - "y": 29.25, - "z": 7.2 - }, - "F8": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 77.38, - "y": 29.25, - "z": 7.2 - }, - "F9": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 86.38, - "y": 29.25, - "z": 7.2 - }, - "G1": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 14.38, - "y": 20.25, - "z": 7.2 - }, - "G10": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 95.38, - "y": 20.25, - "z": 7.2 - }, - "G11": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 104.38, - "y": 20.25, - "z": 7.2 - }, - "G12": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 113.38, - "y": 20.25, - "z": 7.2 - }, - "G2": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 23.38, - "y": 20.25, - "z": 7.2 - }, - "G3": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 32.38, - "y": 20.25, - "z": 7.2 - }, - "G4": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 41.38, - "y": 20.25, - "z": 7.2 - }, - "G5": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 50.38, - "y": 20.25, - "z": 7.2 - }, - "G6": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 59.38, - "y": 20.25, - "z": 7.2 - }, - "G7": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 68.38, - "y": 20.25, - "z": 7.2 - }, - "G8": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 77.38, - "y": 20.25, - "z": 7.2 - }, - "G9": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 86.38, - "y": 20.25, - "z": 7.2 - }, - "H1": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 14.38, - "y": 11.25, - "z": 7.2 - }, - "H10": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 95.38, - "y": 11.25, - "z": 7.2 - }, - "H11": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 104.38, - "y": 11.25, - "z": 7.2 - }, - "H12": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 113.38, - "y": 11.25, - "z": 7.2 - }, - "H2": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 23.38, - "y": 11.25, - "z": 7.2 - }, - "H3": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 32.38, - "y": 11.25, - "z": 7.2 - }, - "H4": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 41.38, - "y": 11.25, - "z": 7.2 - }, - "H5": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 50.38, - "y": 11.25, - "z": 7.2 - }, - "H6": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 59.38, - "y": 11.25, - "z": 7.2 - }, - "H7": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 68.38, - "y": 11.25, - "z": 7.2 - }, - "H8": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 77.38, - "y": 11.25, - "z": 7.2 - }, - "H9": { - "depth": 15, - "diameter": 5.7, - "shape": "circular", - "totalLiquidVolume": 200, - "x": 86.38, - "y": 11.25, - "z": 7.2 - } - } - }, - { - "brand": { - "brand": "Eppendorf twin.tec", - "brandId": [] - }, - "cornerOffsetFromSlot": { - "x": 0, - "y": 0, - "z": 0 - }, - "dimensions": { - "xDimension": 127.76, - "yDimension": 85.47, - "zDimension": 16.06 - }, - "groups": [ - { - "brand": { - "brand": "Eppendorf twin.tec", - "brandId": [] - }, - "metadata": { - "displayCategory": "wellPlate", - "displayName": "Eppendorf Twin.tec 96 Well Plate 150 \u00b5L", - "wellBottomShape": "v" - }, - "wells": [ - "A1", - "B1", - "C1", - "D1", - "E1", - "F1", - "G1", - "H1", - "A2", - "B2", - "C2", - "D2", - "E2", - "F2", - "G2", - "H2", - "A3", - "B3", - "C3", - "D3", - "E3", - "F3", - "G3", - "H3", - "A4", - "B4", - "C4", - "D4", - "E4", - "F4", - "G4", - "H4", - "A5", - "B5", - "C5", - "D5", - "E5", - "F5", - "G5", - "H5", - "A6", - "B6", - "C6", - "D6", - "E6", - "F6", - "G6", - "H6", - "A7", - "B7", - "C7", - "D7", - "E7", - "F7", - "G7", - "H7", - "A8", - "B8", - "C8", - "D8", - "E8", - "F8", - "G8", - "H8", - "A9", - "B9", - "C9", - "D9", - "E9", - "F9", - "G9", - "H9", - "A10", - "B10", - "C10", - "D10", - "E10", - "F10", - "G10", - "H10", - "A11", - "B11", - "C11", - "D11", - "E11", - "F11", - "G11", - "H11", - "A12", - "B12", - "C12", - "D12", - "E12", - "F12", - "G12", - "H12" - ] - } - ], - "metadata": { - "displayCategory": "wellPlate", - "displayName": "Eppendorf Twin.tec 96 Well Plate 150 \u00b5L", - "displayVolumeUnits": "\u00b5L", - "tags": [] - }, - "namespace": "custom_beta", - "ordering": [ - [ - "A1", - "B1", - "C1", - "D1", - "E1", - "F1", - "G1", - "H1" - ], - [ - "A2", - "B2", - "C2", - "D2", - "E2", - "F2", - "G2", - "H2" - ], - [ - "A3", - "B3", - "C3", - "D3", - "E3", - "F3", - "G3", - "H3" - ], - [ - "A4", - "B4", - "C4", - "D4", - "E4", - "F4", - "G4", - "H4" - ], - [ - "A5", - "B5", - "C5", - "D5", - "E5", - "F5", - "G5", - "H5" - ], - [ - "A6", - "B6", - "C6", - "D6", - "E6", - "F6", - "G6", - "H6" - ], - [ - "A7", - "B7", - "C7", - "D7", - "E7", - "F7", - "G7", - "H7" - ], - [ - "A8", - "B8", - "C8", - "D8", - "E8", - "F8", - "G8", - "H8" - ], - [ - "A9", - "B9", - "C9", - "D9", - "E9", - "F9", - "G9", - "H9" - ], - [ - "A10", - "B10", - "C10", - "D10", - "E10", - "F10", - "G10", - "H10" - ], - [ - "A11", - "B11", - "C11", - "D11", - "E11", - "F11", - "G11", - "H11" - ], - [ - "A12", - "B12", - "C12", - "D12", - "E12", - "F12", - "G12", - "H12" - ] - ], - "parameters": { - "format": "irregular", - "isMagneticModuleCompatible": false, - "isTiprack": false, - "loadName": "eppendorftwin.tec_96_wellplate_150ul", - "quirks": [] - }, - "schemaVersion": 2, - "version": 1, - "wells": { - "A1": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 14.38, - "y": 74.23, - "z": 1.46 - }, - "A10": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 95.38, - "y": 74.23, - "z": 1.46 - }, - "A11": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 104.38, - "y": 74.23, - "z": 1.46 - }, - "A12": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 113.38, - "y": 74.23, - "z": 1.46 - }, - "A2": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 23.38, - "y": 74.23, - "z": 1.46 - }, - "A3": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 32.38, - "y": 74.23, - "z": 1.46 - }, - "A4": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 41.38, - "y": 74.23, - "z": 1.46 - }, - "A5": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 50.38, - "y": 74.23, - "z": 1.46 - }, - "A6": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 59.38, - "y": 74.23, - "z": 1.46 - }, - "A7": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 68.38, - "y": 74.23, - "z": 1.46 - }, - "A8": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 77.38, - "y": 74.23, - "z": 1.46 - }, - "A9": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 86.38, - "y": 74.23, - "z": 1.46 - }, - "B1": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 14.38, - "y": 65.23, - "z": 1.46 - }, - "B10": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 95.38, - "y": 65.23, - "z": 1.46 - }, - "B11": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 104.38, - "y": 65.23, - "z": 1.46 - }, - "B12": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 113.38, - "y": 65.23, - "z": 1.46 - }, - "B2": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 23.38, - "y": 65.23, - "z": 1.46 - }, - "B3": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 32.38, - "y": 65.23, - "z": 1.46 - }, - "B4": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 41.38, - "y": 65.23, - "z": 1.46 - }, - "B5": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 50.38, - "y": 65.23, - "z": 1.46 - }, - "B6": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 59.38, - "y": 65.23, - "z": 1.46 - }, - "B7": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 68.38, - "y": 65.23, - "z": 1.46 - }, - "B8": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 77.38, - "y": 65.23, - "z": 1.46 - }, - "B9": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 86.38, - "y": 65.23, - "z": 1.46 - }, - "C1": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 14.38, - "y": 56.23, - "z": 1.46 - }, - "C10": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 95.38, - "y": 56.23, - "z": 1.46 - }, - "C11": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 104.38, - "y": 56.23, - "z": 1.46 - }, - "C12": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 113.38, - "y": 56.23, - "z": 1.46 - }, - "C2": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 23.38, - "y": 56.23, - "z": 1.46 - }, - "C3": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 32.38, - "y": 56.23, - "z": 1.46 - }, - "C4": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 41.38, - "y": 56.23, - "z": 1.46 - }, - "C5": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 50.38, - "y": 56.23, - "z": 1.46 - }, - "C6": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 59.38, - "y": 56.23, - "z": 1.46 - }, - "C7": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 68.38, - "y": 56.23, - "z": 1.46 - }, - "C8": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 77.38, - "y": 56.23, - "z": 1.46 - }, - "C9": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 86.38, - "y": 56.23, - "z": 1.46 - }, - "D1": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 14.38, - "y": 47.23, - "z": 1.46 - }, - "D10": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 95.38, - "y": 47.23, - "z": 1.46 - }, - "D11": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 104.38, - "y": 47.23, - "z": 1.46 - }, - "D12": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 113.38, - "y": 47.23, - "z": 1.46 - }, - "D2": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 23.38, - "y": 47.23, - "z": 1.46 - }, - "D3": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 32.38, - "y": 47.23, - "z": 1.46 - }, - "D4": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 41.38, - "y": 47.23, - "z": 1.46 - }, - "D5": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 50.38, - "y": 47.23, - "z": 1.46 - }, - "D6": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 59.38, - "y": 47.23, - "z": 1.46 - }, - "D7": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 68.38, - "y": 47.23, - "z": 1.46 - }, - "D8": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 77.38, - "y": 47.23, - "z": 1.46 - }, - "D9": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 86.38, - "y": 47.23, - "z": 1.46 - }, - "E1": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 14.38, - "y": 38.23, - "z": 1.46 - }, - "E10": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 95.38, - "y": 38.23, - "z": 1.46 - }, - "E11": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 104.38, - "y": 38.23, - "z": 1.46 - }, - "E12": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 113.38, - "y": 38.23, - "z": 1.46 - }, - "E2": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 23.38, - "y": 38.23, - "z": 1.46 - }, - "E3": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 32.38, - "y": 38.23, - "z": 1.46 - }, - "E4": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 41.38, - "y": 38.23, - "z": 1.46 - }, - "E5": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 50.38, - "y": 38.23, - "z": 1.46 - }, - "E6": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 59.38, - "y": 38.23, - "z": 1.46 - }, - "E7": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 68.38, - "y": 38.23, - "z": 1.46 - }, - "E8": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 77.38, - "y": 38.23, - "z": 1.46 - }, - "E9": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 86.38, - "y": 38.23, - "z": 1.46 - }, - "F1": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 14.38, - "y": 29.23, - "z": 1.46 - }, - "F10": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 95.38, - "y": 29.23, - "z": 1.46 - }, - "F11": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 104.38, - "y": 29.23, - "z": 1.46 - }, - "F12": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 113.38, - "y": 29.23, - "z": 1.46 - }, - "F2": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 23.38, - "y": 29.23, - "z": 1.46 - }, - "F3": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 32.38, - "y": 29.23, - "z": 1.46 - }, - "F4": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 41.38, - "y": 29.23, - "z": 1.46 - }, - "F5": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 50.38, - "y": 29.23, - "z": 1.46 - }, - "F6": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 59.38, - "y": 29.23, - "z": 1.46 - }, - "F7": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 68.38, - "y": 29.23, - "z": 1.46 - }, - "F8": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 77.38, - "y": 29.23, - "z": 1.46 - }, - "F9": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 86.38, - "y": 29.23, - "z": 1.46 - }, - "G1": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 14.38, - "y": 20.23, - "z": 1.46 - }, - "G10": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 95.38, - "y": 20.23, - "z": 1.46 - }, - "G11": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 104.38, - "y": 20.23, - "z": 1.46 - }, - "G12": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 113.38, - "y": 20.23, - "z": 1.46 - }, - "G2": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 23.38, - "y": 20.23, - "z": 1.46 - }, - "G3": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 32.38, - "y": 20.23, - "z": 1.46 - }, - "G4": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 41.38, - "y": 20.23, - "z": 1.46 - }, - "G5": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 50.38, - "y": 20.23, - "z": 1.46 - }, - "G6": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 59.38, - "y": 20.23, - "z": 1.46 - }, - "G7": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 68.38, - "y": 20.23, - "z": 1.46 - }, - "G8": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 77.38, - "y": 20.23, - "z": 1.46 - }, - "G9": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 86.38, - "y": 20.23, - "z": 1.46 - }, - "H1": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 14.38, - "y": 11.23, - "z": 1.46 - }, - "H10": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 95.38, - "y": 11.23, - "z": 1.46 - }, - "H11": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 104.38, - "y": 11.23, - "z": 1.46 - }, - "H12": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 113.38, - "y": 11.23, - "z": 1.46 - }, - "H2": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 23.38, - "y": 11.23, - "z": 1.46 - }, - "H3": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 32.38, - "y": 11.23, - "z": 1.46 - }, - "H4": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 41.38, - "y": 11.23, - "z": 1.46 - }, - "H5": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 50.38, - "y": 11.23, - "z": 1.46 - }, - "H6": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 59.38, - "y": 11.23, - "z": 1.46 - }, - "H7": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 68.38, - "y": 11.23, - "z": 1.46 - }, - "H8": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 77.38, - "y": 11.23, - "z": 1.46 - }, - "H9": { - "depth": 14.6, - "diameter": 6.46, - "shape": "circular", - "totalLiquidVolume": 150, - "x": 86.38, - "y": 11.23, - "z": 1.46 - } - } - } - ], - "fields": [ - { - "default": "Library Norm 1 Well,Internal ID,External ID,nM,Norm Amount (nM),Volume Required (\u00b5l),Sample Volume (\u00b5l),Dilutent Volume (\u00b5l)\nA1,PBM00881,PBM00881,16.63,4.00,10.00,2.41,7.59", - "label": ".CSV File", - "name": "input_csv", - "type": "textFile" - }, - { - "default": 40, - "label": "Initial volume of buffer in 50mL tube (in mL)", - "name": "init_vol_buff", - "type": "int" - }, - { - "label": "Labware for PCR Plate", - "name": "labware_pcr_plate", - "options": [ - { - "label": "eppendorftwin.tec_96_wellplate_150ul", - "value": "eppendorftwin.tec_96_wellplate_150ul" - }, - { - "label": "starlab_96_wellplate_200ul", - "value": "starlab_96_wellplate_200ul" - } - ], - "type": "dropDown" - }, - { - "label": "Labware on the Temperature Module", - "name": "labware_dna_plate", - "options": [ - { - "label": "eppendorftwin.tec96_96_aluminumblock_150ul", - "value": "eppendorftwin.tec96_96_aluminumblock_150ul" - }, - { - "label": "starlab_96_aluminumblock_200ul", - "value": "starlab_96_aluminumblock_200ul" - } - ], - "type": "dropDown" - }, - { - "label": "Use temperature module on slot 3?", - "name": "temp_mod", - "options": [ - { - "label": "Use temperature module", - "value": true - }, - { - "label": "Do not use temperature module", - "value": false - } - ], - "type": "dropDown" - }, - { - "default": 4, - "label": "Temperature module temperature (4-95C)", - "name": "temperature", - "type": "int" - }, - { - "label": "P20 single-channel Mount", - "name": "p20_mount", - "options": [ - { - "label": "Right", - "value": "right" - }, - { - "label": "Left", - "value": "left" - } - ], - "type": "dropDown" - }, - { - "label": "P300 single-channel Mount", - "name": "p300_mount", - "options": [ - { - "label": "Left", - "value": "left" - }, - { - "label": "Right", - "value": "right" - } - ], - "type": "dropDown" - } - ], - "instruments": [ - { - "mount": "left", - "name": "p300_single_gen2" - }, - { - "mount": "right", - "name": "p20_single_gen2" - } - ], - "labware": [ - { - "name": "20ul tiprack on 1", - "share": false, - "slot": "1", - "type": "opentrons_96_filtertiprack_20ul" - }, - { - "name": "200ul tiprack on 2", - "share": false, - "slot": "2", - "type": "opentrons_96_filtertiprack_200ul" - }, - { - "name": "sample plate on 3", - "share": false, - "slot": "3", - "type": "eppendorftwin.tec96_96_aluminumblock_150ul" - }, - { - "name": "Opentrons 10 Tube Rack with Falcon 4x50 mL, 6x15 mL Conical on 5", - "share": false, - "slot": "5", - "type": "opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical" - }, - { - "name": "end-point-plate on 6", - "share": false, - "slot": "6", - "type": "eppendorftwin.tec_96_wellplate_150ul" - }, - { - "name": "20ul tiprack on 8", - "share": false, - "slot": "8", - "type": "opentrons_96_filtertiprack_20ul" - }, - { - "name": "200ul tiprack on 9", - "share": false, - "slot": "9", - "type": "opentrons_96_filtertiprack_200ul" - }, - { - "name": "Opentrons Fixed Trash on 12", - "share": false, - "slot": "12", - "type": "opentrons_1_trash_1100ml_fixed" - } - ], - "metadata": { - "apiLevel": "2.13", - "author": "Parrish Payne ", - "protocolName": "Normalization Using .csv File", - "source": "Custom Protocol Request" - }, - "modules": [] -} \ No newline at end of file diff --git a/protoBuilds/08207f/README.json b/protoBuilds/08207f/README.json deleted file mode 100644 index f5af04efc..000000000 --- a/protoBuilds/08207f/README.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "author": "Opentrons", - "categories": { - "Normalization": [ - "Normalization and Pooling" - ] - }, - "deck-setup": "", - "description": "This is a normalization protocol that transfers diluent buffer from a 50 mL tube into an empty 96-well PCR plate, then transfers sample from a 96-well PCR plate on the temperature module into the plate with the diluent.", - "internal": "08207f", - "labware": "\nEppendorf Twin.tec 96 Well Plate 150 \u00b5L #0030129512\nEppendorf Twin.Tec 96 on Aluminum Block 150 \u00b5L\nStarlab 96-Well PCR Plate, Skirted 200 \u00b5L #E1403-5200\nStarlab 96-Well PCR Plate on Aluminum Block 200 \u00b5L\nOpentrons 96 Filter Tip Rack 20 \u00b5L\nOpentrons 96 Filter Tip Rack 200 \u00b5L\nOpentrons 10 Tube Rack with Falcon 4x50 mL, 6x15 mL Conical\n", - "markdown": { - "author": "[Opentrons](https://opentrons.com/)\n\n\n\n\n", - "categories": "* Normalization\n\t* Normalization and Pooling\n\n\n", - "deck-setup": "![deck](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/08207f/deck.png)\n\n\n\n", - "description": "This is a normalization protocol that transfers diluent buffer from a 50 mL tube into an empty 96-well PCR plate, then transfers sample from a 96-well PCR plate on the temperature module into the plate with the diluent.\n\n\n", - "internal": "08207f\n", - "labware": "* Eppendorf Twin.tec 96 Well Plate 150 \u00b5L #0030129512\n* Eppendorf Twin.Tec 96 on Aluminum Block 150 \u00b5L\n* Starlab 96-Well PCR Plate, Skirted 200 \u00b5L #E1403-5200\n* Starlab 96-Well PCR Plate on Aluminum Block 200 \u00b5L\n* [Opentrons 96 Filter Tip Rack 20 \u00b5L](https://shop.opentrons.com/opentrons-20ul-filter-tips/)\n* [Opentrons 96 Filter Tip Rack 200 \u00b5L](https://shop.opentrons.com/opentrons-200ul-filter-tips/)\n* [Opentrons 10 Tube Rack with Falcon 4x50 mL, 6x15 mL Conical](https://shop.opentrons.com/collections/opentrons-tips/products/tube-rack-set-1)\n\n\n", - "modules": "* [Opentrons Temperature Module (GEN2)](https://shop.opentrons.com/temperature-module-gen2/)\n\n\n", - "notes": "If you have any questions about this protocol, please contact the Protocol Development Team by filling out the [Troubleshooting Survey](https://protocol-troubleshooting.paperform.co/).\n\n\n", - "pipettes": "* [Opentrons P20 Single Channel Electronic Pipette (GEN2)](https://shop.opentrons.com/single-channel-electronic-pipette-p20/)\n* [Opentrons P300 Single Channel Electronic Pipette (GEN2)](https://shop.opentrons.com/single-channel-electronic-pipette-p20/)\n\n\n", - "process": "1. Input your protocol parameters above.\n2. Download your protocol and unzip if needed.\n3. Upload your custom labware to the [OT App](https://opentrons.com/ot-app) by navigating to `More` > `Custom Labware` > `Add Labware`, and selecting your labware files (.json extensions) if needed.\n4. Upload your protocol file (.py extension) to the [OT App](https://opentrons.com/ot-app) in the `Protocol` tab.\n5. Set up your deck according to the deck map.\n6. Calibrate your labware, tiprack and pipette using the OT App. For calibration tips, check out our [support articles](https://support.opentrons.com/en/collections/1559720-guide-for-getting-started-with-the-ot-2).\n7. Hit \"Run\".\n\n\n", - "protocol-steps": "1. Transfer X uL (from .csv file) of buffer from tube rack A3 to X number of wells in 96 well plate (same tips), slot6 (the number of samples will be specified in .csv file); use p300/or p20 single channel.\n2. Use single channel p20 to add X uL of sample (data in the .csv file) from A1 (slot3) to A1 well in end-point-plate (slot6) (well A1 to well A1, well B1 to well B1 \u2026). Use 10ul air gap and blow out, new tip each time.\n3. Repeat steps 2 across plate\n\n\n", - "title": "Normalization Using .csv File" - }, - "modules": [ - "Opentrons Temperature Module (GEN2)" - ], - "notes": "If you have any questions about this protocol, please contact the Protocol Development Team by filling out the Troubleshooting Survey.", - "pipettes": "\nOpentrons P20 Single Channel Electronic Pipette (GEN2)\nOpentrons P300 Single Channel Electronic Pipette (GEN2)\n", - "process": "\nInput your protocol parameters above.\nDownload your protocol and unzip if needed.\nUpload your custom labware to the OT App by navigating to More > Custom Labware > Add Labware, and selecting your labware files (.json extensions) if needed.\nUpload your protocol file (.py extension) to the OT App in the Protocol tab.\nSet up your deck according to the deck map.\nCalibrate your labware, tiprack and pipette using the OT App. For calibration tips, check out our support articles.\nHit \"Run\".\n", - "protocol-steps": "\nTransfer X uL (from .csv file) of buffer from tube rack A3 to X number of wells in 96 well plate (same tips), slot6 (the number of samples will be specified in .csv file); use p300/or p20 single channel.\nUse single channel p20 to add X uL of sample (data in the .csv file) from A1 (slot3) to A1 well in end-point-plate (slot6) (well A1 to well A1, well B1 to well B1 \u2026). Use 10ul air gap and blow out, new tip each time.\nRepeat steps 2 across plate\n", - "title": "Normalization Using .csv File" -} \ No newline at end of file diff --git a/protoBuilds/08207f/metadata.json b/protoBuilds/08207f/metadata.json deleted file mode 100644 index 634aa168e..000000000 --- a/protoBuilds/08207f/metadata.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "files": { - "OT 1 protocol": [], - "OT 2 protocol": [ - "08207f.ot2.apiv2.py" - ], - "description": [ - "README.md" - ] - }, - "flags": { - "embedded-app": false, - "feature": false, - "hide-from-search": false, - "skip-tests": false - }, - "path": "protocols/08207f", - "slug": "08207f", - "status": "ok" -} \ No newline at end of file From e394a31484d4015d51a9cf5872193e64ed16c6c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9Cramifarawi=E2=80=9D?= <“rami.farawi@opentrons.com”> Date: Tue, 19 Mar 2024 10:52:24 -0400 Subject: [PATCH 11/19] fix --- data/data/fields.csv | 15 +++++++-------- protoBuilds/6d901d-2/6d901d-2.ot2.apiv2.py.json | 2 +- protoBuilds/6d901d/6d901d.ot2.apiv2.py.json | 2 +- protocols/6d901d-2/6d901d-2.ot2.apiv2.py | 8 ++++---- protocols/6d901d/6d901d.ot2.apiv2.py | 12 ++++++------ 5 files changed, 19 insertions(+), 20 deletions(-) diff --git a/data/data/fields.csv b/data/data/fields.csv index 297dfae2c..ff09040cd 100644 --- a/data/data/fields.csv +++ b/data/data/fields.csv @@ -575,7 +575,7 @@ init_vol,3 init_vol_50,1 init_vol_bca,1 init_vol_bsa,1 -init_vol_buff,2 +init_vol_buff,1 init_vol_buff1,1 init_vol_buff2,1 init_vol_buff3,1 @@ -586,7 +586,7 @@ init_vol_standard,1 init_vols_csv,1 initial_denaturation_cycles,1 initial_vol,1 -input_csv,23 +input_csv,22 input_file,10 input_file2,6 input_labware,1 @@ -643,7 +643,6 @@ labware_collect_plate,1 labware_cultureplate,1 labware_deep_well,1 labware_dest,2 -labware_dna_plate,1 labware_dna_sample_plate,1 labware_elisa_plate,3 labware_firstrna,1 @@ -655,7 +654,7 @@ labware_p300_tips,1 labware_parent,2 labware_patient_samples,1 labware_pcr,1 -labware_pcr_plate,11 +labware_pcr_plate,10 labware_plate,1 labware_plates,9 labware_pool,1 @@ -991,7 +990,7 @@ p1kmnt,1 p1n,1 p1num,1 p20_blowout_height,1 -p20_mount,137 +p20_mount,136 p20_multi_mount,3 p20_rate,2 p20_reservoir_height,1 @@ -1008,7 +1007,7 @@ p2num,1 p300_gen,1 p300_mixing_height,1 p300_mnt,3 -p300_mount,160 +p300_mount,159 p300_mount_1,1 p300_multi_mount,7 p300_rate,1 @@ -1450,7 +1449,7 @@ te_well,2 temp,2 temp_gen,1 temp_lysate,1 -temp_mod,3 +temp_mod,2 temp_mod_lname,2 temp_mod_on,2 temp_mod_s1_lname,1 @@ -1471,7 +1470,7 @@ tempblock,1 tempdeck_gen,1 tempdeck_name,1 tempdeck_slot,1 -temperature,13 +temperature,12 temperature1,1 temperature2,1 tempgen,1 diff --git a/protoBuilds/6d901d-2/6d901d-2.ot2.apiv2.py.json b/protoBuilds/6d901d-2/6d901d-2.ot2.apiv2.py.json index fd3b265be..8cd276540 100644 --- a/protoBuilds/6d901d-2/6d901d-2.ot2.apiv2.py.json +++ b/protoBuilds/6d901d-2/6d901d-2.ot2.apiv2.py.json @@ -1,5 +1,5 @@ { - "content": "from opentrons import protocol_api\nfrom opentrons.protocol_api.labware import OutOfTipsError\nfrom opentrons.types import Mount\n\n\nmetadata = {\n 'protocolName':\n ('Cherrypicking with multi-channel pipette substituting for a single '\n 'channel pipette'),\n 'author': 'Nick & Eskil ',\n 'source': 'Custom Protocol Request',\n 'apiLevel': '2.12'\n}\n\n\ndef run(ctx: protocol_api.ProtocolContext):\n\n [transfer_csv,\n lw_source_plate,\n lw_source_plate_open,\n lw_dest_plate,\n lw_dest_plate_open,\n res_type,\n pipette_type,\n pipette_mount,\n tip_type,\n tip_reuse,\n starting_tiprack_slot,\n starting_tip_well] = get_values( # noqa: F821\n \"transfer_csv\",\n \"lw_source_plate\",\n \"lw_source_plate_open\",\n \"lw_dest_plate\",\n \"lw_dest_plate_open\",\n \"res_type\",\n \"pipette_type\",\n \"pipette_mount\",\n \"tip_type\",\n \"tip_reuse\",\n \"starting_tiprack_slot\",\n \"starting_tip_well\")\n\n tiprack_map = {\n 'p20_multi_gen2': {\n 'standard': 'opentrons_96_tiprack_20ul',\n 'filter': 'opentrons_96_filtertiprack_20ul'\n },\n 'p300_multi_gen2': {\n 'standard': 'opentrons_96_tiprack_300ul',\n 'filter': 'opentrons_96_filtertiprack_200ul'\n }\n }\n\n # Parse csv\n # Format: Source Well, Source Aspiration Height Above Bottom (in mm),\n # Dest Well, Vol (in ul)\n transfer_info = [[val.strip().lower() for val in line.split(',')]\n for line in transfer_csv.splitlines()\n if line.split(',')[0].strip()][1:]\n\n if lw_source_plate_open.strip():\n lw_source_plate_name = lw_source_plate_open\n else:\n lw_source_plate_name = lw_source_plate\n if lw_dest_plate_open.strip():\n lw_dest_plate_name = lw_dest_plate_open\n else:\n lw_dest_plate_name = lw_dest_plate\n\n # Load labware\n # Plate to cherrypick from\n source_plate = ctx.load_labware(lw_source_plate_name, '7')\n dest_plate = ctx.load_labware(lw_dest_plate_name, '8')\n # This reservoir is unused, but present\n if res_type != \"none\":\n ctx.load_labware(res_type, '9')\n\n # Load tipracks\n tip_name = tiprack_map[pipette_type][tip_type]\n tiprack_slots = ['4', '5', '10', '11']\n tipracks = [ctx.load_labware(tip_name, slot)\n for slot in tiprack_slots]\n\n # load pipette\n pip = ctx.load_instrument(pipette_type, pipette_mount, tip_racks=tipracks)\n\n if not ctx.is_simulating():\n pick_up_current = 0.1 # 100 mA for single tip\n # Uncomment the next two lines if using Opentrons Robot Software version 7.1.x. # noqa: E501\n # Comment them if NOT using 7.1.x\n\n ctx._hw_manager.hardware.get_pipette(Mount.string_to_mount(pip.mount)).update_config_item( # noqa: E501\n {'pick_up_current': {8: pick_up_current}})\n\n # Uncomment the next two lines if using Opentrons Robot Software version 7.2.x # noqa: E501\n # Comment them if NOT using 7.2.x\n\n # ctx._hw_manager.hardware.get_pipette(Mount.string_to_mount(pip.mount)).update_config_item(\n # {'pick_up_current': pick_up_current})\n\n # Tip_map has the columns reversed, pipette always picks up the\n # bottom-most tip in a given column until the column is depleted, and then\n # moves to the next column (from left to right).\n tip_map = []\n for rack in tipracks:\n tip_map.append(\n [[col for col in reversed(column)] for column in rack.columns()])\n # Flag at the end of each rack that is true if there are tips left\n for rack in tip_map:\n rack.append(True)\n # Flag used tipracks based on the protocol input parameter.\n # Check that the input parameter is an existing tiprack slot\n if starting_tiprack_slot not in tiprack_slots:\n raise Exception(\n f\"The Starting Tiprack Slot ({starting_tiprack_slot}) is invalid \"\n f\"The valid tiprack slots are {tiprack_slots}\"\n )\n start_rack_index = tiprack_slots.index(starting_tiprack_slot)\n for i in range(start_rack_index):\n tip_map[i][-1] = False\n\n # Flag used tips in the first available tiprack\n for column in tip_map[start_rack_index]:\n is_break = False\n for well in column:\n if well.well_name != starting_tip_well:\n well.has_tip = False\n else:\n is_break = True\n break\n if is_break:\n break\n\n def pick_up(pipette):\n \"\"\"`pick_up()` will pause the ctx when all tip boxes are out of\n tips, prompting the user to replace all tip racks. Once tipracks are\n reset, the ctx will start picking up tips from the first tip\n box as defined in the slot order when assigning the labware definition\n for that tip box. `pick_up()` will track tips for both pipettes if\n applicable.\n\n :param pipette: The pipette desired to pick up tip\n as definited earlier in the ctx (e.g. p300, m20).\n \"\"\"\n for i, rack in enumerate(tip_map):\n # Check the flag to see if the rack is empty, then we don't loop\n # through that rack so that the algorithm executes faster.\n if rack[-1] is False:\n if i == len(tip_map) - 1: # All tips are used, time to reset\n ctx.pause(\"Replace empty tip racks\")\n # print(\"Replace empty tip racks\")\n pipette.reset_tipracks()\n for rack in tip_map:\n rack[-1] = True\n # Raise an exception so that we can retry the pick up\n raise OutOfTipsError(\n \"Tipracks were out of tips and were reset\")\n else:\n continue\n for column in rack[:-1]: # skip [-1] index because it's the flag\n for well in column:\n if well.has_tip:\n pipette.pick_up_tip(well)\n if well.well_name == 'A12': # last tip in the rack\n rack[-1] = False\n return\n\n def parse_well(well):\n letter = well[0]\n number = well[1:]\n return letter.upper() + str(int(number))\n\n # import pdb; pdb.set_trace()\n if tip_reuse == 'always':\n try:\n pick_up(pip)\n except OutOfTipsError:\n # Try again after tipracks are reset\n pick_up(pip)\n for line in transfer_info:\n s_well, h, d_well, vol = line[:4]\n source_locn = \\\n source_plate.wells_by_name()[parse_well(s_well)].bottom(float(h))\n dest_locn = \\\n dest_plate.wells_by_name()[parse_well(d_well)]\n if tip_reuse == 'never':\n try:\n pick_up(pip)\n except OutOfTipsError:\n # Try again after tipracks are reset\n pick_up(pip)\n # pip.transfer(float(vol), source_locn, dest_locn, new_tip='never')\n pip.aspirate(float(vol), source_locn)\n pip.dispense(float(vol), dest_locn)\n if tip_reuse == 'never':\n pip.drop_tip()\n if pip.has_tip:\n pip.drop_tip()\n", + "content": "from opentrons import protocol_api\nfrom opentrons.protocol_api.labware import OutOfTipsError\nfrom opentrons.types import Mount\n\n\nmetadata = {\n 'protocolName':\n ('Cherrypicking with multi-channel pipette substituting for a single '\n 'channel pipette'),\n 'author': 'Nick & Eskil ',\n 'source': 'Custom Protocol Request',\n 'apiLevel': '2.12'\n}\n\n\ndef run(ctx: protocol_api.ProtocolContext):\n\n [transfer_csv,\n lw_source_plate,\n lw_source_plate_open,\n lw_dest_plate,\n lw_dest_plate_open,\n res_type,\n pipette_type,\n pipette_mount,\n tip_type,\n tip_reuse,\n starting_tiprack_slot,\n starting_tip_well] = get_values( # noqa: F821\n \"transfer_csv\",\n \"lw_source_plate\",\n \"lw_source_plate_open\",\n \"lw_dest_plate\",\n \"lw_dest_plate_open\",\n \"res_type\",\n \"pipette_type\",\n \"pipette_mount\",\n \"tip_type\",\n \"tip_reuse\",\n \"starting_tiprack_slot\",\n \"starting_tip_well\")\n\n tiprack_map = {\n 'p20_multi_gen2': {\n 'standard': 'opentrons_96_tiprack_20ul',\n 'filter': 'opentrons_96_filtertiprack_20ul'\n },\n 'p300_multi_gen2': {\n 'standard': 'opentrons_96_tiprack_300ul',\n 'filter': 'opentrons_96_filtertiprack_200ul'\n }\n }\n\n # Parse csv\n # Format: Source Well, Source Aspiration Height Above Bottom (in mm),\n # Dest Well, Vol (in ul)\n transfer_info = [[val.strip().lower() for val in line.split(',')]\n for line in transfer_csv.splitlines()\n if line.split(',')[0].strip()][1:]\n\n if lw_source_plate_open.strip():\n lw_source_plate_name = lw_source_plate_open\n else:\n lw_source_plate_name = lw_source_plate\n if lw_dest_plate_open.strip():\n lw_dest_plate_name = lw_dest_plate_open\n else:\n lw_dest_plate_name = lw_dest_plate\n\n # Load labware\n # Plate to cherrypick from\n source_plate = ctx.load_labware(lw_source_plate_name, '7')\n dest_plate = ctx.load_labware(lw_dest_plate_name, '8')\n # This reservoir is unused, but present\n if res_type != \"none\":\n ctx.load_labware(res_type, '9')\n\n # Load tipracks\n tip_name = tiprack_map[pipette_type][tip_type]\n tiprack_slots = ['4', '5', '10', '11']\n tipracks = [ctx.load_labware(tip_name, slot)\n for slot in tiprack_slots]\n\n # load pipette\n pip = ctx.load_instrument(pipette_type, pipette_mount, tip_racks=tipracks)\n\n if not ctx.is_simulating():\n pick_up_current = 0.1 # 100 mA for single tip\n # Uncomment the next two lines if using Opentrons Robot Software version 7.1.x. # noqa: E501\n # Comment them if NOT using 7.1.x\n\n # ctx._hw_manager.hardware.get_pipette(Mount.string_to_mount(pip.mount)).update_config_item( # noqa: E501\n # {'pick_up_current': {8: pick_up_current}})\n\n # Uncomment the next two lines if using Opentrons Robot Software version 7.2.x # noqa: E501\n # Comment them if NOT using 7.2.x\n\n ctx._hw_manager.hardware.get_pipette(Mount.string_to_mount(pip.mount)).update_config_item(\n {'pick_up_current': pick_up_current})\n\n # Tip_map has the columns reversed, pipette always picks up the\n # bottom-most tip in a given column until the column is depleted, and then\n # moves to the next column (from left to right).\n tip_map = []\n for rack in tipracks:\n tip_map.append(\n [[col for col in reversed(column)] for column in rack.columns()])\n # Flag at the end of each rack that is true if there are tips left\n for rack in tip_map:\n rack.append(True)\n # Flag used tipracks based on the protocol input parameter.\n # Check that the input parameter is an existing tiprack slot\n if starting_tiprack_slot not in tiprack_slots:\n raise Exception(\n f\"The Starting Tiprack Slot ({starting_tiprack_slot}) is invalid \"\n f\"The valid tiprack slots are {tiprack_slots}\"\n )\n start_rack_index = tiprack_slots.index(starting_tiprack_slot)\n for i in range(start_rack_index):\n tip_map[i][-1] = False\n\n # Flag used tips in the first available tiprack\n for column in tip_map[start_rack_index]:\n is_break = False\n for well in column:\n if well.well_name != starting_tip_well:\n well.has_tip = False\n else:\n is_break = True\n break\n if is_break:\n break\n\n def pick_up(pipette):\n \"\"\"`pick_up()` will pause the ctx when all tip boxes are out of\n tips, prompting the user to replace all tip racks. Once tipracks are\n reset, the ctx will start picking up tips from the first tip\n box as defined in the slot order when assigning the labware definition\n for that tip box. `pick_up()` will track tips for both pipettes if\n applicable.\n\n :param pipette: The pipette desired to pick up tip\n as definited earlier in the ctx (e.g. p300, m20).\n \"\"\"\n for i, rack in enumerate(tip_map):\n # Check the flag to see if the rack is empty, then we don't loop\n # through that rack so that the algorithm executes faster.\n if rack[-1] is False:\n if i == len(tip_map) - 1: # All tips are used, time to reset\n ctx.pause(\"Replace empty tip racks\")\n # print(\"Replace empty tip racks\")\n pipette.reset_tipracks()\n for rack in tip_map:\n rack[-1] = True\n # Raise an exception so that we can retry the pick up\n raise OutOfTipsError(\n \"Tipracks were out of tips and were reset\")\n else:\n continue\n for column in rack[:-1]: # skip [-1] index because it's the flag\n for well in column:\n if well.has_tip:\n pipette.pick_up_tip(well)\n if well.well_name == 'A12': # last tip in the rack\n rack[-1] = False\n return\n\n def parse_well(well):\n letter = well[0]\n number = well[1:]\n return letter.upper() + str(int(number))\n\n # import pdb; pdb.set_trace()\n if tip_reuse == 'always':\n try:\n pick_up(pip)\n except OutOfTipsError:\n # Try again after tipracks are reset\n pick_up(pip)\n for line in transfer_info:\n s_well, h, d_well, vol = line[:4]\n source_locn = \\\n source_plate.wells_by_name()[parse_well(s_well)].bottom(float(h))\n dest_locn = \\\n dest_plate.wells_by_name()[parse_well(d_well)]\n if tip_reuse == 'never':\n try:\n pick_up(pip)\n except OutOfTipsError:\n # Try again after tipracks are reset\n pick_up(pip)\n # pip.transfer(float(vol), source_locn, dest_locn, new_tip='never')\n pip.aspirate(float(vol), source_locn)\n pip.dispense(float(vol), dest_locn)\n if tip_reuse == 'never':\n pip.drop_tip()\n if pip.has_tip:\n pip.drop_tip()\n", "custom_labware_defs": [ { "brand": { diff --git a/protoBuilds/6d901d/6d901d.ot2.apiv2.py.json b/protoBuilds/6d901d/6d901d.ot2.apiv2.py.json index e67fb0c9d..dea49b256 100644 --- a/protoBuilds/6d901d/6d901d.ot2.apiv2.py.json +++ b/protoBuilds/6d901d/6d901d.ot2.apiv2.py.json @@ -1,5 +1,5 @@ { - "content": "from opentrons import protocol_api\nfrom opentrons.types import Mount\n\nmetadata = {\n 'protocolName': 'Normalization with a multi-channel pipette \\\n used as a single-channel pipette',\n 'author': 'Opentrons ',\n 'source': 'Protocol Library',\n 'apiLevel': '2.12'\n }\n\n\ndef transpose_matrix(m):\n return [[r[i] for r in reversed(m)] for i in range(len(m[0]))]\n\n\ndef flatten_matrix(m):\n \"\"\" Converts a matrix to a 1D array, e.g. [[1,2],[3,4]] -> [1,2,3,4]\n \"\"\"\n return [cell for row in m for cell in row]\n\n\ndef well_csv_to_list(csv_string):\n \"\"\"\n Takes a csv string and flattens to a list, re-ordering to match\n Opentrons well order convention (A1, B1, C1, ..., A2, B2, B2, ...)\n \"\"\"\n data = [\n line.split(',')\n for line in reversed(csv_string.split('\\n')) if line.strip()\n if line\n ]\n if len(data[0]) > len(data):\n # row length > column length ==> \"landscape\", so transpose\n return flatten_matrix(transpose_matrix(data))\n # \"portrait\"\n return flatten_matrix(data)\n\n\ndef run(ctx: protocol_api.ProtocolContext):\n [volumes_csv,\n p300_mount,\n p20_mount,\n plate_type,\n res_type,\n filter_tip,\n tip_reuse] = get_values( # noqa: F821\n \"volumes_csv\",\n \"p300_mount\",\n \"p20_mount\",\n \"plate_type\",\n \"res_type\",\n \"filter_tip\",\n \"tip_reuse\")\n\n # create labware\n source_plate = ctx.load_labware(plate_type, '7')\n # There could be a destination plate in slot 8 for cherry picking\n # Load something tall so the pipette doesn't hit it\n ctx.load_labware('usascientific_96_wellplate_2.4ml_deep', '8')\n reservoir = ctx.load_labware(res_type, '9')\n source = reservoir.wells()[0]\n if filter_tip:\n tips300 = ctx.load_labware('opentrons_96_filtertiprack_200ul', '10')\n tips20 = ctx.load_labware('opentrons_96_filtertiprack_20ul', '11')\n else:\n tips300 = ctx.load_labware('opentrons_96_tiprack_300ul', '10')\n tips20 = ctx.load_labware('opentrons_96_tiprack_20ul', '11')\n\n m300 = ctx.load_instrument('p300_multi_gen2', p300_mount)\n m20 = ctx.load_instrument('p20_multi_gen2', p20_mount)\n\n if not ctx.is_simulating():\n pick_up_current = 0.1 # 100 mA for single tip\n # Uncomment the next two lines if using Opentrons Robot Software version 7.1.x. # noqa:E501\n # Comment them if NOT using 7.1.x\n for pipette in [m20, m300]:\n ctx._hw_manager.hardware.get_pipette(Mount.string_to_mount(pipette.mount)).update_config_item( # noqa:E501\n {'pick_up_current': {8: pick_up_current}})\n\n # Uncomment the next two lines if using Opentrons Robot Software version 7.2.x # noqa:E501\n # Comment them if NOT using 7.2.x\n # for pipette in [m20, m300]:\n # ctx._hw_manager.hardware.get_pipette(Mount.string_to_mount(pipette.mount)).update_config_item(\n # {'pick_up_current': pick_up_current})\n\n tip300ctr = 95\n tip20ctr = 95\n\n def pick_up(pip):\n \"\"\"`pick_up()` will pause the ctx when all tip boxes are out of\n tips, prompting the user to replace all tip racks. Once tipracks are\n reset, the ctx will start picking up tips from the first tip\n box as defined in the slot order when assigning the labware definition\n for that tip box. `pick_up()` will track tips for both pipettes if\n applicable.\n\n :param pipette: The pipette desired to pick up tip\n as definited earlier in the ctx (e.g. p300, m20).\n \"\"\"\n nonlocal tip300ctr\n nonlocal tip20ctr\n\n if pip == m300:\n if tip300ctr < 0:\n ctx.home()\n ctx.pause('Please replace tips for P300 in slot 10.')\n tip300ctr = 95\n m300.pick_up_tip(tips300.wells()[tip300ctr])\n tip300ctr -= 1\n else:\n if tip20ctr < 0:\n ctx.home()\n ctx.pause('Please replace tips for P20 in slot 11.')\n tip20ctr = 95\n m20.pick_up_tip(tips20.wells()[tip20ctr])\n tip20ctr -= 1\n\n # create volumes list\n volumes = [float(cell) for cell in well_csv_to_list(volumes_csv)]\n\n is_warning = False\n\n for vol in volumes:\n if vol < 1:\n ctx.comment(\n 'WARNING: volume {} is below pipette\\'s minimum volume.'\n .format(vol))\n is_warning = True\n\n if is_warning:\n ctx.comment(\"\\n\")\n ctx.pause(\n \"One or more minimum volume warnings were detected \"\n \"Do you wish to continue?\\n\")\n\n for i, vol in enumerate(volumes):\n pipette = m20 if vol <= 20 else m300\n if not pipette.has_tip:\n pick_up(pipette)\n if vol != 0:\n pipette.aspirate(vol, source)\n pipette.dispense(vol, source_plate.wells()[i])\n if tip_reuse == 'never':\n pipette.drop_tip()\n", + "content": "from opentrons import protocol_api\nfrom opentrons.types import Mount\n\nmetadata = {\n 'protocolName': 'Normalization with a multi-channel pipette \\\n used as a single-channel pipette',\n 'author': 'Opentrons ',\n 'source': 'Protocol Library',\n 'apiLevel': '2.12'\n }\n\n\ndef transpose_matrix(m):\n return [[r[i] for r in reversed(m)] for i in range(len(m[0]))]\n\n\ndef flatten_matrix(m):\n \"\"\" Converts a matrix to a 1D array, e.g. [[1,2],[3,4]] -> [1,2,3,4]\n \"\"\"\n return [cell for row in m for cell in row]\n\n\ndef well_csv_to_list(csv_string):\n \"\"\"\n Takes a csv string and flattens to a list, re-ordering to match\n Opentrons well order convention (A1, B1, C1, ..., A2, B2, B2, ...)\n \"\"\"\n data = [\n line.split(',')\n for line in reversed(csv_string.split('\\n')) if line.strip()\n if line\n ]\n if len(data[0]) > len(data):\n # row length > column length ==> \"landscape\", so transpose\n return flatten_matrix(transpose_matrix(data))\n # \"portrait\"\n return flatten_matrix(data)\n\n\ndef run(ctx: protocol_api.ProtocolContext):\n [volumes_csv,\n p300_mount,\n p20_mount,\n plate_type,\n res_type,\n filter_tip,\n tip_reuse] = get_values( # noqa: F821\n \"volumes_csv\",\n \"p300_mount\",\n \"p20_mount\",\n \"plate_type\",\n \"res_type\",\n \"filter_tip\",\n \"tip_reuse\")\n\n # create labware\n source_plate = ctx.load_labware(plate_type, '7')\n # There could be a destination plate in slot 8 for cherry picking\n # Load something tall so the pipette doesn't hit it\n ctx.load_labware('usascientific_96_wellplate_2.4ml_deep', '8')\n reservoir = ctx.load_labware(res_type, '9')\n source = reservoir.wells()[0]\n if filter_tip:\n tips300 = ctx.load_labware('opentrons_96_filtertiprack_200ul', '10')\n tips20 = ctx.load_labware('opentrons_96_filtertiprack_20ul', '11')\n else:\n tips300 = ctx.load_labware('opentrons_96_tiprack_300ul', '10')\n tips20 = ctx.load_labware('opentrons_96_tiprack_20ul', '11')\n\n m300 = ctx.load_instrument('p300_multi_gen2', p300_mount)\n m20 = ctx.load_instrument('p20_multi_gen2', p20_mount)\n\n if not ctx.is_simulating():\n pick_up_current = 0.1 # 100 mA for single tip\n # Uncomment the next two lines if using Opentrons Robot Software version 7.1.x. # noqa:E501\n # Comment them if NOT using 7.1.x\n # for pipette in [m20, m300]:\n # ctx._hw_manager.hardware.get_pipette(Mount.string_to_mount(pipette.mount)).update_config_item( # noqa:E501\n # {'pick_up_current': {8: pick_up_current}})\n\n # Uncomment the next two lines if using Opentrons Robot Software version 7.2.x # noqa:E501\n # Comment them if NOT using 7.2.x\n for pipette in [m20, m300]:\n ctx._hw_manager.hardware.get_pipette(Mount.string_to_mount(pipette.mount)).update_config_item(\n {'pick_up_current': pick_up_current})\n\n tip300ctr = 95\n tip20ctr = 95\n\n def pick_up(pip):\n \"\"\"`pick_up()` will pause the ctx when all tip boxes are out of\n tips, prompting the user to replace all tip racks. Once tipracks are\n reset, the ctx will start picking up tips from the first tip\n box as defined in the slot order when assigning the labware definition\n for that tip box. `pick_up()` will track tips for both pipettes if\n applicable.\n\n :param pipette: The pipette desired to pick up tip\n as definited earlier in the ctx (e.g. p300, m20).\n \"\"\"\n nonlocal tip300ctr\n nonlocal tip20ctr\n\n if pip == m300:\n if tip300ctr < 0:\n ctx.home()\n ctx.pause('Please replace tips for P300 in slot 10.')\n tip300ctr = 95\n m300.pick_up_tip(tips300.wells()[tip300ctr])\n tip300ctr -= 1\n else:\n if tip20ctr < 0:\n ctx.home()\n ctx.pause('Please replace tips for P20 in slot 11.')\n tip20ctr = 95\n m20.pick_up_tip(tips20.wells()[tip20ctr])\n tip20ctr -= 1\n\n # create volumes list\n volumes = [float(cell) for cell in well_csv_to_list(volumes_csv)]\n\n is_warning = False\n\n for vol in volumes:\n if vol < 1:\n ctx.comment(\n 'WARNING: volume {} is below pipette\\'s minimum volume.'\n .format(vol))\n is_warning = True\n\n if is_warning:\n ctx.comment(\"\\n\")\n ctx.pause(\n \"One or more minimum volume warnings were detected \"\n \"Do you wish to continue?\\n\")\n\n for i, vol in enumerate(volumes):\n pipette = m20 if vol <= 20 else m300\n if not pipette.has_tip:\n pick_up(pipette)\n if vol != 0:\n pipette.aspirate(vol, source)\n pipette.dispense(vol, source_plate.wells()[i])\n if tip_reuse == 'never':\n pipette.drop_tip()\n", "custom_labware_defs": [ { "brand": { diff --git a/protocols/6d901d-2/6d901d-2.ot2.apiv2.py b/protocols/6d901d-2/6d901d-2.ot2.apiv2.py index 6833d86ca..cae86c795 100644 --- a/protocols/6d901d-2/6d901d-2.ot2.apiv2.py +++ b/protocols/6d901d-2/6d901d-2.ot2.apiv2.py @@ -89,14 +89,14 @@ def run(ctx: protocol_api.ProtocolContext): # Uncomment the next two lines if using Opentrons Robot Software version 7.1.x. # noqa: E501 # Comment them if NOT using 7.1.x - ctx._hw_manager.hardware.get_pipette(Mount.string_to_mount(pip.mount)).update_config_item( # noqa: E501 - {'pick_up_current': {8: pick_up_current}}) + # ctx._hw_manager.hardware.get_pipette(Mount.string_to_mount(pip.mount)).update_config_item( # noqa: E501 + # {'pick_up_current': {8: pick_up_current}}) # Uncomment the next two lines if using Opentrons Robot Software version 7.2.x # noqa: E501 # Comment them if NOT using 7.2.x - # ctx._hw_manager.hardware.get_pipette(Mount.string_to_mount(pip.mount)).update_config_item( - # {'pick_up_current': pick_up_current}) + ctx._hw_manager.hardware.get_pipette(Mount.string_to_mount(pip.mount)).update_config_item( + {'pick_up_current': pick_up_current}) # Tip_map has the columns reversed, pipette always picks up the # bottom-most tip in a given column until the column is depleted, and then diff --git a/protocols/6d901d/6d901d.ot2.apiv2.py b/protocols/6d901d/6d901d.ot2.apiv2.py index a2fc2507b..973869a3e 100644 --- a/protocols/6d901d/6d901d.ot2.apiv2.py +++ b/protocols/6d901d/6d901d.ot2.apiv2.py @@ -74,15 +74,15 @@ def run(ctx: protocol_api.ProtocolContext): pick_up_current = 0.1 # 100 mA for single tip # Uncomment the next two lines if using Opentrons Robot Software version 7.1.x. # noqa:E501 # Comment them if NOT using 7.1.x - for pipette in [m20, m300]: - ctx._hw_manager.hardware.get_pipette(Mount.string_to_mount(pipette.mount)).update_config_item( # noqa:E501 - {'pick_up_current': {8: pick_up_current}}) + # for pipette in [m20, m300]: + # ctx._hw_manager.hardware.get_pipette(Mount.string_to_mount(pipette.mount)).update_config_item( # noqa:E501 + # {'pick_up_current': {8: pick_up_current}}) # Uncomment the next two lines if using Opentrons Robot Software version 7.2.x # noqa:E501 # Comment them if NOT using 7.2.x - # for pipette in [m20, m300]: - # ctx._hw_manager.hardware.get_pipette(Mount.string_to_mount(pipette.mount)).update_config_item( - # {'pick_up_current': pick_up_current}) + for pipette in [m20, m300]: + ctx._hw_manager.hardware.get_pipette(Mount.string_to_mount(pipette.mount)).update_config_item( + {'pick_up_current': pick_up_current}) tip300ctr = 95 tip20ctr = 95 From faaa754076a10f03aa089732696d08f4292e8d1a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9Cramifarawi=E2=80=9D?= <“rami.farawi@opentrons.com”> Date: Tue, 19 Mar 2024 11:20:21 -0400 Subject: [PATCH 12/19] fix --- protocols/6d901d-2/6d901d-2.ot2.apiv2.py | 2 +- protocols/6d901d/6d901d.ot2.apiv2.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/protocols/6d901d-2/6d901d-2.ot2.apiv2.py b/protocols/6d901d-2/6d901d-2.ot2.apiv2.py index cae86c795..7cc44f2bc 100644 --- a/protocols/6d901d-2/6d901d-2.ot2.apiv2.py +++ b/protocols/6d901d-2/6d901d-2.ot2.apiv2.py @@ -95,7 +95,7 @@ def run(ctx: protocol_api.ProtocolContext): # Uncomment the next two lines if using Opentrons Robot Software version 7.2.x # noqa: E501 # Comment them if NOT using 7.2.x - ctx._hw_manager.hardware.get_pipette(Mount.string_to_mount(pip.mount)).update_config_item( + ctx._hw_manager.hardware.get_pipette(Mount.string_to_mount(pip.mount)).update_config_item( # noqa: E501 {'pick_up_current': pick_up_current}) # Tip_map has the columns reversed, pipette always picks up the diff --git a/protocols/6d901d/6d901d.ot2.apiv2.py b/protocols/6d901d/6d901d.ot2.apiv2.py index 973869a3e..f51c36bba 100644 --- a/protocols/6d901d/6d901d.ot2.apiv2.py +++ b/protocols/6d901d/6d901d.ot2.apiv2.py @@ -1,3 +1,4 @@ +# flake8: noqa from opentrons import protocol_api from opentrons.types import Mount @@ -13,7 +14,6 @@ def transpose_matrix(m): return [[r[i] for r in reversed(m)] for i in range(len(m[0]))] - def flatten_matrix(m): """ Converts a matrix to a 1D array, e.g. [[1,2],[3,4]] -> [1,2,3,4] """ From 2ff92badcd465cc3a43a51c6f546d0fd1bd45f3e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9Cramifarawi=E2=80=9D?= <“rami.farawi@opentrons.com”> Date: Tue, 19 Mar 2024 11:20:56 -0400 Subject: [PATCH 13/19] fix --- protoBuilds/6d901d-2/6d901d-2.ot2.apiv2.py.json | 2 +- protoBuilds/6d901d/6d901d.ot2.apiv2.py.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/protoBuilds/6d901d-2/6d901d-2.ot2.apiv2.py.json b/protoBuilds/6d901d-2/6d901d-2.ot2.apiv2.py.json index 8cd276540..eedaeed64 100644 --- a/protoBuilds/6d901d-2/6d901d-2.ot2.apiv2.py.json +++ b/protoBuilds/6d901d-2/6d901d-2.ot2.apiv2.py.json @@ -1,5 +1,5 @@ { - "content": "from opentrons import protocol_api\nfrom opentrons.protocol_api.labware import OutOfTipsError\nfrom opentrons.types import Mount\n\n\nmetadata = {\n 'protocolName':\n ('Cherrypicking with multi-channel pipette substituting for a single '\n 'channel pipette'),\n 'author': 'Nick & Eskil ',\n 'source': 'Custom Protocol Request',\n 'apiLevel': '2.12'\n}\n\n\ndef run(ctx: protocol_api.ProtocolContext):\n\n [transfer_csv,\n lw_source_plate,\n lw_source_plate_open,\n lw_dest_plate,\n lw_dest_plate_open,\n res_type,\n pipette_type,\n pipette_mount,\n tip_type,\n tip_reuse,\n starting_tiprack_slot,\n starting_tip_well] = get_values( # noqa: F821\n \"transfer_csv\",\n \"lw_source_plate\",\n \"lw_source_plate_open\",\n \"lw_dest_plate\",\n \"lw_dest_plate_open\",\n \"res_type\",\n \"pipette_type\",\n \"pipette_mount\",\n \"tip_type\",\n \"tip_reuse\",\n \"starting_tiprack_slot\",\n \"starting_tip_well\")\n\n tiprack_map = {\n 'p20_multi_gen2': {\n 'standard': 'opentrons_96_tiprack_20ul',\n 'filter': 'opentrons_96_filtertiprack_20ul'\n },\n 'p300_multi_gen2': {\n 'standard': 'opentrons_96_tiprack_300ul',\n 'filter': 'opentrons_96_filtertiprack_200ul'\n }\n }\n\n # Parse csv\n # Format: Source Well, Source Aspiration Height Above Bottom (in mm),\n # Dest Well, Vol (in ul)\n transfer_info = [[val.strip().lower() for val in line.split(',')]\n for line in transfer_csv.splitlines()\n if line.split(',')[0].strip()][1:]\n\n if lw_source_plate_open.strip():\n lw_source_plate_name = lw_source_plate_open\n else:\n lw_source_plate_name = lw_source_plate\n if lw_dest_plate_open.strip():\n lw_dest_plate_name = lw_dest_plate_open\n else:\n lw_dest_plate_name = lw_dest_plate\n\n # Load labware\n # Plate to cherrypick from\n source_plate = ctx.load_labware(lw_source_plate_name, '7')\n dest_plate = ctx.load_labware(lw_dest_plate_name, '8')\n # This reservoir is unused, but present\n if res_type != \"none\":\n ctx.load_labware(res_type, '9')\n\n # Load tipracks\n tip_name = tiprack_map[pipette_type][tip_type]\n tiprack_slots = ['4', '5', '10', '11']\n tipracks = [ctx.load_labware(tip_name, slot)\n for slot in tiprack_slots]\n\n # load pipette\n pip = ctx.load_instrument(pipette_type, pipette_mount, tip_racks=tipracks)\n\n if not ctx.is_simulating():\n pick_up_current = 0.1 # 100 mA for single tip\n # Uncomment the next two lines if using Opentrons Robot Software version 7.1.x. # noqa: E501\n # Comment them if NOT using 7.1.x\n\n # ctx._hw_manager.hardware.get_pipette(Mount.string_to_mount(pip.mount)).update_config_item( # noqa: E501\n # {'pick_up_current': {8: pick_up_current}})\n\n # Uncomment the next two lines if using Opentrons Robot Software version 7.2.x # noqa: E501\n # Comment them if NOT using 7.2.x\n\n ctx._hw_manager.hardware.get_pipette(Mount.string_to_mount(pip.mount)).update_config_item(\n {'pick_up_current': pick_up_current})\n\n # Tip_map has the columns reversed, pipette always picks up the\n # bottom-most tip in a given column until the column is depleted, and then\n # moves to the next column (from left to right).\n tip_map = []\n for rack in tipracks:\n tip_map.append(\n [[col for col in reversed(column)] for column in rack.columns()])\n # Flag at the end of each rack that is true if there are tips left\n for rack in tip_map:\n rack.append(True)\n # Flag used tipracks based on the protocol input parameter.\n # Check that the input parameter is an existing tiprack slot\n if starting_tiprack_slot not in tiprack_slots:\n raise Exception(\n f\"The Starting Tiprack Slot ({starting_tiprack_slot}) is invalid \"\n f\"The valid tiprack slots are {tiprack_slots}\"\n )\n start_rack_index = tiprack_slots.index(starting_tiprack_slot)\n for i in range(start_rack_index):\n tip_map[i][-1] = False\n\n # Flag used tips in the first available tiprack\n for column in tip_map[start_rack_index]:\n is_break = False\n for well in column:\n if well.well_name != starting_tip_well:\n well.has_tip = False\n else:\n is_break = True\n break\n if is_break:\n break\n\n def pick_up(pipette):\n \"\"\"`pick_up()` will pause the ctx when all tip boxes are out of\n tips, prompting the user to replace all tip racks. Once tipracks are\n reset, the ctx will start picking up tips from the first tip\n box as defined in the slot order when assigning the labware definition\n for that tip box. `pick_up()` will track tips for both pipettes if\n applicable.\n\n :param pipette: The pipette desired to pick up tip\n as definited earlier in the ctx (e.g. p300, m20).\n \"\"\"\n for i, rack in enumerate(tip_map):\n # Check the flag to see if the rack is empty, then we don't loop\n # through that rack so that the algorithm executes faster.\n if rack[-1] is False:\n if i == len(tip_map) - 1: # All tips are used, time to reset\n ctx.pause(\"Replace empty tip racks\")\n # print(\"Replace empty tip racks\")\n pipette.reset_tipracks()\n for rack in tip_map:\n rack[-1] = True\n # Raise an exception so that we can retry the pick up\n raise OutOfTipsError(\n \"Tipracks were out of tips and were reset\")\n else:\n continue\n for column in rack[:-1]: # skip [-1] index because it's the flag\n for well in column:\n if well.has_tip:\n pipette.pick_up_tip(well)\n if well.well_name == 'A12': # last tip in the rack\n rack[-1] = False\n return\n\n def parse_well(well):\n letter = well[0]\n number = well[1:]\n return letter.upper() + str(int(number))\n\n # import pdb; pdb.set_trace()\n if tip_reuse == 'always':\n try:\n pick_up(pip)\n except OutOfTipsError:\n # Try again after tipracks are reset\n pick_up(pip)\n for line in transfer_info:\n s_well, h, d_well, vol = line[:4]\n source_locn = \\\n source_plate.wells_by_name()[parse_well(s_well)].bottom(float(h))\n dest_locn = \\\n dest_plate.wells_by_name()[parse_well(d_well)]\n if tip_reuse == 'never':\n try:\n pick_up(pip)\n except OutOfTipsError:\n # Try again after tipracks are reset\n pick_up(pip)\n # pip.transfer(float(vol), source_locn, dest_locn, new_tip='never')\n pip.aspirate(float(vol), source_locn)\n pip.dispense(float(vol), dest_locn)\n if tip_reuse == 'never':\n pip.drop_tip()\n if pip.has_tip:\n pip.drop_tip()\n", + "content": "from opentrons import protocol_api\nfrom opentrons.protocol_api.labware import OutOfTipsError\nfrom opentrons.types import Mount\n\n\nmetadata = {\n 'protocolName':\n ('Cherrypicking with multi-channel pipette substituting for a single '\n 'channel pipette'),\n 'author': 'Nick & Eskil ',\n 'source': 'Custom Protocol Request',\n 'apiLevel': '2.12'\n}\n\n\ndef run(ctx: protocol_api.ProtocolContext):\n\n [transfer_csv,\n lw_source_plate,\n lw_source_plate_open,\n lw_dest_plate,\n lw_dest_plate_open,\n res_type,\n pipette_type,\n pipette_mount,\n tip_type,\n tip_reuse,\n starting_tiprack_slot,\n starting_tip_well] = get_values( # noqa: F821\n \"transfer_csv\",\n \"lw_source_plate\",\n \"lw_source_plate_open\",\n \"lw_dest_plate\",\n \"lw_dest_plate_open\",\n \"res_type\",\n \"pipette_type\",\n \"pipette_mount\",\n \"tip_type\",\n \"tip_reuse\",\n \"starting_tiprack_slot\",\n \"starting_tip_well\")\n\n tiprack_map = {\n 'p20_multi_gen2': {\n 'standard': 'opentrons_96_tiprack_20ul',\n 'filter': 'opentrons_96_filtertiprack_20ul'\n },\n 'p300_multi_gen2': {\n 'standard': 'opentrons_96_tiprack_300ul',\n 'filter': 'opentrons_96_filtertiprack_200ul'\n }\n }\n\n # Parse csv\n # Format: Source Well, Source Aspiration Height Above Bottom (in mm),\n # Dest Well, Vol (in ul)\n transfer_info = [[val.strip().lower() for val in line.split(',')]\n for line in transfer_csv.splitlines()\n if line.split(',')[0].strip()][1:]\n\n if lw_source_plate_open.strip():\n lw_source_plate_name = lw_source_plate_open\n else:\n lw_source_plate_name = lw_source_plate\n if lw_dest_plate_open.strip():\n lw_dest_plate_name = lw_dest_plate_open\n else:\n lw_dest_plate_name = lw_dest_plate\n\n # Load labware\n # Plate to cherrypick from\n source_plate = ctx.load_labware(lw_source_plate_name, '7')\n dest_plate = ctx.load_labware(lw_dest_plate_name, '8')\n # This reservoir is unused, but present\n if res_type != \"none\":\n ctx.load_labware(res_type, '9')\n\n # Load tipracks\n tip_name = tiprack_map[pipette_type][tip_type]\n tiprack_slots = ['4', '5', '10', '11']\n tipracks = [ctx.load_labware(tip_name, slot)\n for slot in tiprack_slots]\n\n # load pipette\n pip = ctx.load_instrument(pipette_type, pipette_mount, tip_racks=tipracks)\n\n if not ctx.is_simulating():\n pick_up_current = 0.1 # 100 mA for single tip\n # Uncomment the next two lines if using Opentrons Robot Software version 7.1.x. # noqa: E501\n # Comment them if NOT using 7.1.x\n\n # ctx._hw_manager.hardware.get_pipette(Mount.string_to_mount(pip.mount)).update_config_item( # noqa: E501\n # {'pick_up_current': {8: pick_up_current}})\n\n # Uncomment the next two lines if using Opentrons Robot Software version 7.2.x # noqa: E501\n # Comment them if NOT using 7.2.x\n\n ctx._hw_manager.hardware.get_pipette(Mount.string_to_mount(pip.mount)).update_config_item( # noqa: E501\n {'pick_up_current': pick_up_current})\n\n # Tip_map has the columns reversed, pipette always picks up the\n # bottom-most tip in a given column until the column is depleted, and then\n # moves to the next column (from left to right).\n tip_map = []\n for rack in tipracks:\n tip_map.append(\n [[col for col in reversed(column)] for column in rack.columns()])\n # Flag at the end of each rack that is true if there are tips left\n for rack in tip_map:\n rack.append(True)\n # Flag used tipracks based on the protocol input parameter.\n # Check that the input parameter is an existing tiprack slot\n if starting_tiprack_slot not in tiprack_slots:\n raise Exception(\n f\"The Starting Tiprack Slot ({starting_tiprack_slot}) is invalid \"\n f\"The valid tiprack slots are {tiprack_slots}\"\n )\n start_rack_index = tiprack_slots.index(starting_tiprack_slot)\n for i in range(start_rack_index):\n tip_map[i][-1] = False\n\n # Flag used tips in the first available tiprack\n for column in tip_map[start_rack_index]:\n is_break = False\n for well in column:\n if well.well_name != starting_tip_well:\n well.has_tip = False\n else:\n is_break = True\n break\n if is_break:\n break\n\n def pick_up(pipette):\n \"\"\"`pick_up()` will pause the ctx when all tip boxes are out of\n tips, prompting the user to replace all tip racks. Once tipracks are\n reset, the ctx will start picking up tips from the first tip\n box as defined in the slot order when assigning the labware definition\n for that tip box. `pick_up()` will track tips for both pipettes if\n applicable.\n\n :param pipette: The pipette desired to pick up tip\n as definited earlier in the ctx (e.g. p300, m20).\n \"\"\"\n for i, rack in enumerate(tip_map):\n # Check the flag to see if the rack is empty, then we don't loop\n # through that rack so that the algorithm executes faster.\n if rack[-1] is False:\n if i == len(tip_map) - 1: # All tips are used, time to reset\n ctx.pause(\"Replace empty tip racks\")\n # print(\"Replace empty tip racks\")\n pipette.reset_tipracks()\n for rack in tip_map:\n rack[-1] = True\n # Raise an exception so that we can retry the pick up\n raise OutOfTipsError(\n \"Tipracks were out of tips and were reset\")\n else:\n continue\n for column in rack[:-1]: # skip [-1] index because it's the flag\n for well in column:\n if well.has_tip:\n pipette.pick_up_tip(well)\n if well.well_name == 'A12': # last tip in the rack\n rack[-1] = False\n return\n\n def parse_well(well):\n letter = well[0]\n number = well[1:]\n return letter.upper() + str(int(number))\n\n # import pdb; pdb.set_trace()\n if tip_reuse == 'always':\n try:\n pick_up(pip)\n except OutOfTipsError:\n # Try again after tipracks are reset\n pick_up(pip)\n for line in transfer_info:\n s_well, h, d_well, vol = line[:4]\n source_locn = \\\n source_plate.wells_by_name()[parse_well(s_well)].bottom(float(h))\n dest_locn = \\\n dest_plate.wells_by_name()[parse_well(d_well)]\n if tip_reuse == 'never':\n try:\n pick_up(pip)\n except OutOfTipsError:\n # Try again after tipracks are reset\n pick_up(pip)\n # pip.transfer(float(vol), source_locn, dest_locn, new_tip='never')\n pip.aspirate(float(vol), source_locn)\n pip.dispense(float(vol), dest_locn)\n if tip_reuse == 'never':\n pip.drop_tip()\n if pip.has_tip:\n pip.drop_tip()\n", "custom_labware_defs": [ { "brand": { diff --git a/protoBuilds/6d901d/6d901d.ot2.apiv2.py.json b/protoBuilds/6d901d/6d901d.ot2.apiv2.py.json index dea49b256..dd91c7000 100644 --- a/protoBuilds/6d901d/6d901d.ot2.apiv2.py.json +++ b/protoBuilds/6d901d/6d901d.ot2.apiv2.py.json @@ -1,5 +1,5 @@ { - "content": "from opentrons import protocol_api\nfrom opentrons.types import Mount\n\nmetadata = {\n 'protocolName': 'Normalization with a multi-channel pipette \\\n used as a single-channel pipette',\n 'author': 'Opentrons ',\n 'source': 'Protocol Library',\n 'apiLevel': '2.12'\n }\n\n\ndef transpose_matrix(m):\n return [[r[i] for r in reversed(m)] for i in range(len(m[0]))]\n\n\ndef flatten_matrix(m):\n \"\"\" Converts a matrix to a 1D array, e.g. [[1,2],[3,4]] -> [1,2,3,4]\n \"\"\"\n return [cell for row in m for cell in row]\n\n\ndef well_csv_to_list(csv_string):\n \"\"\"\n Takes a csv string and flattens to a list, re-ordering to match\n Opentrons well order convention (A1, B1, C1, ..., A2, B2, B2, ...)\n \"\"\"\n data = [\n line.split(',')\n for line in reversed(csv_string.split('\\n')) if line.strip()\n if line\n ]\n if len(data[0]) > len(data):\n # row length > column length ==> \"landscape\", so transpose\n return flatten_matrix(transpose_matrix(data))\n # \"portrait\"\n return flatten_matrix(data)\n\n\ndef run(ctx: protocol_api.ProtocolContext):\n [volumes_csv,\n p300_mount,\n p20_mount,\n plate_type,\n res_type,\n filter_tip,\n tip_reuse] = get_values( # noqa: F821\n \"volumes_csv\",\n \"p300_mount\",\n \"p20_mount\",\n \"plate_type\",\n \"res_type\",\n \"filter_tip\",\n \"tip_reuse\")\n\n # create labware\n source_plate = ctx.load_labware(plate_type, '7')\n # There could be a destination plate in slot 8 for cherry picking\n # Load something tall so the pipette doesn't hit it\n ctx.load_labware('usascientific_96_wellplate_2.4ml_deep', '8')\n reservoir = ctx.load_labware(res_type, '9')\n source = reservoir.wells()[0]\n if filter_tip:\n tips300 = ctx.load_labware('opentrons_96_filtertiprack_200ul', '10')\n tips20 = ctx.load_labware('opentrons_96_filtertiprack_20ul', '11')\n else:\n tips300 = ctx.load_labware('opentrons_96_tiprack_300ul', '10')\n tips20 = ctx.load_labware('opentrons_96_tiprack_20ul', '11')\n\n m300 = ctx.load_instrument('p300_multi_gen2', p300_mount)\n m20 = ctx.load_instrument('p20_multi_gen2', p20_mount)\n\n if not ctx.is_simulating():\n pick_up_current = 0.1 # 100 mA for single tip\n # Uncomment the next two lines if using Opentrons Robot Software version 7.1.x. # noqa:E501\n # Comment them if NOT using 7.1.x\n # for pipette in [m20, m300]:\n # ctx._hw_manager.hardware.get_pipette(Mount.string_to_mount(pipette.mount)).update_config_item( # noqa:E501\n # {'pick_up_current': {8: pick_up_current}})\n\n # Uncomment the next two lines if using Opentrons Robot Software version 7.2.x # noqa:E501\n # Comment them if NOT using 7.2.x\n for pipette in [m20, m300]:\n ctx._hw_manager.hardware.get_pipette(Mount.string_to_mount(pipette.mount)).update_config_item(\n {'pick_up_current': pick_up_current})\n\n tip300ctr = 95\n tip20ctr = 95\n\n def pick_up(pip):\n \"\"\"`pick_up()` will pause the ctx when all tip boxes are out of\n tips, prompting the user to replace all tip racks. Once tipracks are\n reset, the ctx will start picking up tips from the first tip\n box as defined in the slot order when assigning the labware definition\n for that tip box. `pick_up()` will track tips for both pipettes if\n applicable.\n\n :param pipette: The pipette desired to pick up tip\n as definited earlier in the ctx (e.g. p300, m20).\n \"\"\"\n nonlocal tip300ctr\n nonlocal tip20ctr\n\n if pip == m300:\n if tip300ctr < 0:\n ctx.home()\n ctx.pause('Please replace tips for P300 in slot 10.')\n tip300ctr = 95\n m300.pick_up_tip(tips300.wells()[tip300ctr])\n tip300ctr -= 1\n else:\n if tip20ctr < 0:\n ctx.home()\n ctx.pause('Please replace tips for P20 in slot 11.')\n tip20ctr = 95\n m20.pick_up_tip(tips20.wells()[tip20ctr])\n tip20ctr -= 1\n\n # create volumes list\n volumes = [float(cell) for cell in well_csv_to_list(volumes_csv)]\n\n is_warning = False\n\n for vol in volumes:\n if vol < 1:\n ctx.comment(\n 'WARNING: volume {} is below pipette\\'s minimum volume.'\n .format(vol))\n is_warning = True\n\n if is_warning:\n ctx.comment(\"\\n\")\n ctx.pause(\n \"One or more minimum volume warnings were detected \"\n \"Do you wish to continue?\\n\")\n\n for i, vol in enumerate(volumes):\n pipette = m20 if vol <= 20 else m300\n if not pipette.has_tip:\n pick_up(pipette)\n if vol != 0:\n pipette.aspirate(vol, source)\n pipette.dispense(vol, source_plate.wells()[i])\n if tip_reuse == 'never':\n pipette.drop_tip()\n", + "content": "# flake8: noqa\nfrom opentrons import protocol_api\nfrom opentrons.types import Mount\n\nmetadata = {\n 'protocolName': 'Normalization with a multi-channel pipette \\\n used as a single-channel pipette',\n 'author': 'Opentrons ',\n 'source': 'Protocol Library',\n 'apiLevel': '2.12'\n }\n\n\ndef transpose_matrix(m):\n return [[r[i] for r in reversed(m)] for i in range(len(m[0]))]\n\ndef flatten_matrix(m):\n \"\"\" Converts a matrix to a 1D array, e.g. [[1,2],[3,4]] -> [1,2,3,4]\n \"\"\"\n return [cell for row in m for cell in row]\n\n\ndef well_csv_to_list(csv_string):\n \"\"\"\n Takes a csv string and flattens to a list, re-ordering to match\n Opentrons well order convention (A1, B1, C1, ..., A2, B2, B2, ...)\n \"\"\"\n data = [\n line.split(',')\n for line in reversed(csv_string.split('\\n')) if line.strip()\n if line\n ]\n if len(data[0]) > len(data):\n # row length > column length ==> \"landscape\", so transpose\n return flatten_matrix(transpose_matrix(data))\n # \"portrait\"\n return flatten_matrix(data)\n\n\ndef run(ctx: protocol_api.ProtocolContext):\n [volumes_csv,\n p300_mount,\n p20_mount,\n plate_type,\n res_type,\n filter_tip,\n tip_reuse] = get_values( # noqa: F821\n \"volumes_csv\",\n \"p300_mount\",\n \"p20_mount\",\n \"plate_type\",\n \"res_type\",\n \"filter_tip\",\n \"tip_reuse\")\n\n # create labware\n source_plate = ctx.load_labware(plate_type, '7')\n # There could be a destination plate in slot 8 for cherry picking\n # Load something tall so the pipette doesn't hit it\n ctx.load_labware('usascientific_96_wellplate_2.4ml_deep', '8')\n reservoir = ctx.load_labware(res_type, '9')\n source = reservoir.wells()[0]\n if filter_tip:\n tips300 = ctx.load_labware('opentrons_96_filtertiprack_200ul', '10')\n tips20 = ctx.load_labware('opentrons_96_filtertiprack_20ul', '11')\n else:\n tips300 = ctx.load_labware('opentrons_96_tiprack_300ul', '10')\n tips20 = ctx.load_labware('opentrons_96_tiprack_20ul', '11')\n\n m300 = ctx.load_instrument('p300_multi_gen2', p300_mount)\n m20 = ctx.load_instrument('p20_multi_gen2', p20_mount)\n\n if not ctx.is_simulating():\n pick_up_current = 0.1 # 100 mA for single tip\n # Uncomment the next two lines if using Opentrons Robot Software version 7.1.x. # noqa:E501\n # Comment them if NOT using 7.1.x\n # for pipette in [m20, m300]:\n # ctx._hw_manager.hardware.get_pipette(Mount.string_to_mount(pipette.mount)).update_config_item( # noqa:E501\n # {'pick_up_current': {8: pick_up_current}})\n\n # Uncomment the next two lines if using Opentrons Robot Software version 7.2.x # noqa:E501\n # Comment them if NOT using 7.2.x\n for pipette in [m20, m300]:\n ctx._hw_manager.hardware.get_pipette(Mount.string_to_mount(pipette.mount)).update_config_item(\n {'pick_up_current': pick_up_current})\n\n tip300ctr = 95\n tip20ctr = 95\n\n def pick_up(pip):\n \"\"\"`pick_up()` will pause the ctx when all tip boxes are out of\n tips, prompting the user to replace all tip racks. Once tipracks are\n reset, the ctx will start picking up tips from the first tip\n box as defined in the slot order when assigning the labware definition\n for that tip box. `pick_up()` will track tips for both pipettes if\n applicable.\n\n :param pipette: The pipette desired to pick up tip\n as definited earlier in the ctx (e.g. p300, m20).\n \"\"\"\n nonlocal tip300ctr\n nonlocal tip20ctr\n\n if pip == m300:\n if tip300ctr < 0:\n ctx.home()\n ctx.pause('Please replace tips for P300 in slot 10.')\n tip300ctr = 95\n m300.pick_up_tip(tips300.wells()[tip300ctr])\n tip300ctr -= 1\n else:\n if tip20ctr < 0:\n ctx.home()\n ctx.pause('Please replace tips for P20 in slot 11.')\n tip20ctr = 95\n m20.pick_up_tip(tips20.wells()[tip20ctr])\n tip20ctr -= 1\n\n # create volumes list\n volumes = [float(cell) for cell in well_csv_to_list(volumes_csv)]\n\n is_warning = False\n\n for vol in volumes:\n if vol < 1:\n ctx.comment(\n 'WARNING: volume {} is below pipette\\'s minimum volume.'\n .format(vol))\n is_warning = True\n\n if is_warning:\n ctx.comment(\"\\n\")\n ctx.pause(\n \"One or more minimum volume warnings were detected \"\n \"Do you wish to continue?\\n\")\n\n for i, vol in enumerate(volumes):\n pipette = m20 if vol <= 20 else m300\n if not pipette.has_tip:\n pick_up(pipette)\n if vol != 0:\n pipette.aspirate(vol, source)\n pipette.dispense(vol, source_plate.wells()[i])\n if tip_reuse == 'never':\n pipette.drop_tip()\n", "custom_labware_defs": [ { "brand": { From 79ac1723d1ac4a203e7820263194b9d7c62cb776 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9Cramifarawi=E2=80=9D?= <“rami.farawi@opentrons.com”> Date: Mon, 1 Apr 2024 12:07:12 -0400 Subject: [PATCH 14/19] fix --- data/data/fields.csv | 1 + protoBuilds/3e0bef/3e0b3f.ot2.apiv2.py.json | 4 +- protoBuilds/spotsee/spotsee.ot2.apiv2.py.json | 14 +- protocols/3e0bef/3e0b3f.ot2.apiv2.py | 925 +++++++++--------- protocols/spotsee/fields.json | 8 +- protocols/spotsee/spotsee.ot2.apiv2.py | 56 +- 6 files changed, 512 insertions(+), 496 deletions(-) diff --git a/data/data/fields.csv b/data/data/fields.csv index ff09040cd..3adf671c7 100644 --- a/data/data/fields.csv +++ b/data/data/fields.csv @@ -890,6 +890,7 @@ num_col,10 num_cols,3 num_columns,1 num_curves,1 +num_cycles,1 num_daughter_plates,1 num_drug_plates,1 num_extracts,1 diff --git a/protoBuilds/3e0bef/3e0b3f.ot2.apiv2.py.json b/protoBuilds/3e0bef/3e0b3f.ot2.apiv2.py.json index 128e0c687..9758a2deb 100644 --- a/protoBuilds/3e0bef/3e0b3f.ot2.apiv2.py.json +++ b/protoBuilds/3e0bef/3e0b3f.ot2.apiv2.py.json @@ -1,5 +1,5 @@ { - "content": "from opentrons import protocol_api\nfrom opentrons import types\nfrom opentrons.protocol_api.labware import Well\nimport math\nfrom types import MethodType\nimport subprocess\nfrom opentrons.protocols.api_support.types import APIVersion\n\nmetadata = {\n 'protocolName': 'Omega Bio-Tek Mag-Bind Plant DNA DS Kit',\n 'author': 'Opentrons ',\n 'source': 'Custom Protocol Request',\n 'apiLevel': '2.13'\n}\n\nAUDIO_FILE_PATH = '/etc/audio/speaker-test.mp3'\n\n\ndef run_quiet_process(command):\n subprocess.check_output('{} &> /dev/null'.format(command), shell=True)\n\n\ndef test_speaker(song=AUDIO_FILE_PATH):\n print('Speaker')\n print('Next\t--> CTRL-C')\n try:\n run_quiet_process('mpg123 {}'.format(song))\n except KeyboardInterrupt:\n pass\n print()\n\n\ndef run(ctx: protocol_api.ProtocolContext):\n [\n _m300_mount,\n _num_samps,\n _inc_time,\n _mag_time,\n _air_dry,\n _add_water,\n _samp_labware,\n _asp_ht,\n _fin_wash,\n _elution_vol,\n _off_deck,\n _music\n ] = get_values( # noqa: F821 (<--- DO NOT REMOVE!)\n '_m300_mount',\n '_num_samps',\n '_inc_time',\n '_mag_time',\n '_air_dry',\n '_add_water',\n '_samp_labware',\n '_asp_ht',\n '_fin_wash',\n '_elution_vol',\n '_off_deck',\n '_music')\n\n if not 1 <= _num_samps <= 96:\n raise Exception('The Number of Samples should be between 1 and 96')\n\n # define all custom variables above here with descriptions\n\n m300_mount = _m300_mount # mount for 8-channel p300 pipette\n num_cols = math.ceil(_num_samps/8) # number of sample columns\n samp_labware = _samp_labware # labware containing sample\n elution_vol = _elution_vol # volume of elution buffer\n inc_time = _inc_time # time for binding step\n mag_time = _mag_time # time on magnetic module\n air_dry = _air_dry # time for air drying\n fin_wash = _fin_wash # volume for final wash removal\n asp_ht = _asp_ht # height from the top of the labware to aspirate from\n add_water = _add_water # True/False for adding water prior to air dry\n off_deck = _off_deck # True/False perform resuspension off-deck\n music = _music # play custom music (only in Oregon)\n\n mag_deck = ctx.load_module('magnetic module gen2', 7)\n\n # load labware\n rsvr_12 = [ctx.load_labware('nest_12_reservoir_15ml', s) for s in [2, 3]]\n rsvr_1 = ctx.load_labware('nest_1_reservoir_195ml', 10)\n pcr_plate = ctx.load_labware('nest_96_wellplate_100ul_pcr_full_skirt', 1)\n samp_plate = ctx.load_labware(samp_labware, 4)\n mag_plate = mag_deck.load_labware('nest_96_wellplate_2ml_deep')\n\n # load tipracks\n tips = [\n ctx.load_labware(\n 'opentrons_96_filtertiprack_200ul', s) for s in [5, 6, 8, 9, 11]\n ]\n all_tips = [t for rack in tips for t in rack.rows()[0]]\n t_start = 0\n t_end = int(num_cols)\n\n # load instrument\n m300 = ctx.load_instrument('p300_multi_gen2', m300_mount, tip_racks=tips)\n\n # extend well objects for improved liquid handling\n class WellH(Well):\n def __init__(self, well, min_height=0.5, comp_coeff=1.1,\n current_volume=0):\n super().__init__(well.parent, well._core, APIVersion(2, 13))\n self.well = well\n # specified minimum well bottom clearance\n self.min_height = min_height\n self.comp_coeff = comp_coeff\n # specified starting volume in ul\n self.current_volume = current_volume\n # cross sectional area\n if self.diameter is not None:\n self.radius = self.diameter/2\n cse = math.pi*(self.radius**2)\n elif self.length is not None:\n cse = self.length*self.width\n else:\n cse = None\n self.cse = cse\n # initial liquid level in mm from start vol\n if cse:\n self.height = (current_volume/cse)\n else:\n raise Exception('Labware definition must \\nsupply well radius or well length and width.')\n if self.height < min_height:\n self.height = min_height\n elif self.height > well.parent.highest_z:\n raise Exception('Specified liquid volume \\ncan not exceed the height of the labware.')\n\n def height_dec(self, vol, ppt, bottom=False):\n # decrement height (mm)\n dh = (vol/self.cse)*self.comp_coeff\n # tip immersion (mm) as fraction of tip length\n mm_immersed = 0.05*ppt._tip_racks[0].wells()[0].depth\n # decrement til target reaches specified min clearance\n self.height = self.height - dh if (\n (self.height - dh - mm_immersed) > self.min_height\n ) else self.min_height + mm_immersed\n self.current_volume = self.current_volume - vol if (\n self.current_volume - vol > 0) else 0\n tip_ht = self.height - mm_immersed if bottom is False else bottom\n return self.well.bottom(tip_ht)\n\n def height_inc(self, vol, top=False):\n # increment height (mm)\n ih = (vol/self.cse)*self.comp_coeff\n # keep calculated liquid ht between min clearance and well depth\n self.height = self.min_height if (\n self.height < self.min_height) else self.height\n self.height = (self.height + ih) if (\n (self.height + ih) < self.depth) else self.depth\n # increment\n self.current_volume += vol\n if top is False:\n tip_ht = self.height\n return self.well.bottom(tip_ht)\n else:\n return self.well.top()\n\n # pipette functions # INCLUDE ANY BINDING TO CLASS\n def aspirate_h(self, vol, source, rate=1, bottom=False):\n self.aspirate(\n vol, source.height_dec(vol, self, bottom=bottom), rate=rate)\n\n def dispense_h(self, vol, dest, rate=1, top=False):\n self.dispense(vol, dest.height_inc(vol, top=top), rate=rate)\n\n def slow_tip_withdrawal(\n self, speed_limit, well_location, to_surface=False):\n if self.mount == 'right':\n axis = 'A'\n else:\n axis = 'Z'\n previous_limit = None\n if axis in ctx.max_speeds.keys():\n for key, value in ctx.max_speeds.items():\n if key == axis:\n previous_limit = value\n ctx.max_speeds[axis] = speed_limit\n if to_surface is False:\n self.move_to(well_location.top())\n else:\n if isinstance(well_location, WellH):\n self.move_to(well_location.bottom().move(types.Point(\n x=0, y=0, z=well_location.height+(\n 20*(self._tip_racks[0].wells()[0].depth / 88)))))\n else:\n self.move_to(well_location.center())\n ctx.max_speeds[axis] = previous_limit\n\n def custom_pick_up(self, loc=None):\n nonlocal t_start\n nonlocal t_end\n # `custom_pick_up` will pause the protocol when all tip boxes are out\n # of tips, prompting the user to replace all tip racks. Once tipracks\n # reset, the protocol will start picking up tips from the first tip\n # box as defined in the slot order when assigning the labware def\n # for that tip box. `pick_up()` will track tips for both pipettes if\n # applicable.\n\n # :param loc: User can manually specify location for tip pick up\n\n if loc:\n self.pick_up_tip(loc)\n else:\n try:\n self.pick_up_tip()\n except protocol_api.labware.OutOfTipsError:\n flash_lights()\n ctx.pause('Replace empty tip racks')\n self.reset_tipracks()\n t_start = 0\n t_end = int(num_cols)\n ctx.set_rail_lights(True)\n self.pick_up_tip()\n\n # bind additional methods to pipettes\n for met in [aspirate_h, dispense_h, slow_tip_withdrawal, custom_pick_up]:\n setattr(\n m300, met.__name__,\n MethodType(met, m300))\n\n # reagents\n liquid_waste = rsvr_1.wells()[0].top()\n # cspl = [WellH(well) for well in rsvr_12[0].wells()[:6]]\n # for idx in range(num_cols):\n # cspl[idx//2].height_inc(720*8*1.1)\n\n # helper functions\n def flash_lights():\n for _ in range(19):\n ctx.set_rail_lights(not ctx.rail_lights_on)\n ctx.delay(seconds=0.25)\n\n def flow_rate(asp=92.86, disp=92.86, blow=92.86):\n # This function can be used to quickly modify the flow rates of the\n # m300. If no parameters are entered, the flow rates will be\n # reset.\n\n # :param asp: Aspiration flow rate, in uL/sec\n # :param disp: Dispense flow rate, in uL/sec\n\n m300.flow_rate.aspirate = asp\n m300.flow_rate.dispense = disp\n m300.flow_rate.blow_out = blow\n\n def remove_supernatant(vol, src):\n w = int(str(src).split(' ')[0][1:])\n if src.width is not None:\n radi = float(src.width)/4\n else:\n radi = float(src.diameter)/4\n x0 = radi if w % 2 == 0 else -radi\n while vol > 180:\n m300.aspirate(180, src.bottom().move(types.Point(x=x0, y=0, z=1)))\n m300.dispense(200, liquid_waste)\n m300.blow_out()\n m300.aspirate(20, liquid_waste)\n vol -= 180\n m300.aspirate(vol, src.bottom().move(types.Point(x=x0, y=0, z=0.7)))\n m300.dispense(vol+20, liquid_waste)\n m300.blow_out()\n m300.aspirate(10, liquid_waste)\n\n def wash(srcs, msg, sup=600):\n nonlocal t_start\n nonlocal t_end\n\n if mag_deck.status == 'engaged':\n mag_deck.disengage()\n ctx.comment(f'Performing wash step: {msg}')\n flow_rate()\n for idx, (col, src) in enumerate(zip(mag_samps_h, srcs)):\n m300.custom_pick_up()\n # src = srcs[idx//3]\n for i in range(2):\n flow_rate(asp=150, disp=150)\n if i == 1:\n m300.dispense(20, src.top(-1))\n m300.dispense(20, src)\n m300.mix(1, 200, src)\n flow_rate()\n m300.aspirate(200, src)\n m300.slow_tip_withdrawal(10, src, to_surface=True)\n m300.dispense(180, col.top(-2))\n flow_rate(asp=10)\n m300.aspirate(20, col.top())\n m300.dispense(20, src.top())\n flow_rate()\n m300.mix(1, 140, src)\n m300.aspirate(140, src)\n m300.slow_tip_withdrawal(10, src, to_surface=True)\n m300.dispense(140, col)\n if not off_deck:\n m300.mix(10, 100, col)\n ctx.delay(seconds=5)\n m300.slow_tip_withdrawal(10, col, to_surface=True)\n m300.blow_out()\n m300.touch_tip(speed=40)\n m300.aspirate(10, col.top())\n m300.drop_tip()\n\n if off_deck:\n flash_lights()\n ctx.pause('Please remove plate for manual resuspension')\n\n mag_deck.engage()\n mag_msg = f'Incubating on Mag Deck for {mag_time} minutes'\n ctx.delay(minutes=mag_time, msg=mag_msg)\n\n # Discard Supernatant\n ctx.comment(f'Removing supernatant for wash: {msg}')\n t_start += num_cols\n t_end += num_cols\n for src, t_d in zip(mag_samps_h, all_tips[t_start:t_end]):\n m300.custom_pick_up()\n remove_supernatant(sup, src)\n m300.drop_tip(t_d)\n\n # plate, tube rack maps\n init_samps = samp_plate.rows()[0][:num_cols]\n mag_samps = mag_plate.rows()[0][:num_cols]\n mag_samps_h = [WellH(well) for well in mag_samps]\n pcr_samps = pcr_plate.rows()[0][:num_cols]\n\n # protocol\n ctx.set_rail_lights(True)\n # # Transfer 700µL CSPL Buffer + 20µL Prot K\n # ctx.comment('Transferring 720uL of CSPL Buffer + Proteinase K')\n #\n # m300.custom_pick_up()\n # for idx, col in enumerate(init_samps):\n # src = cspl[idx//2]\n # for _ in range(4):\n # m300.aspirate_h(180, src)\n # m300.slow_tip_withdrawal(10, src, to_surface=True)\n # m300.dispense(180, col.top(-2))\n # m300.drop_tip()\n #\n # flash_lights()\n # ctx.pause('Please remove samples and incubate at 56C for 30 minutes, \\n # then centrifuge at 4000g for 10 minutes. Once complete, please replace \\n # samples on the deck and place ensure 12-well reservoirs are filled with \\n # necessary reagents in deck slots 2 and 3. When ready, click RESUME.')\n # ctx.set_rail_lights(True)\n # Creating reagent variables for second part of protocol\n rbb = [WellH(well, current_volume=0) for well in rsvr_12[0].wells()[:4]]\n cspw1 = [WellH(well) for well in rsvr_12[0].wells()[4:8]]\n cspw2 = [WellH(well) for well in rsvr_12[0].wells()[8:]]\n spm = [WellH(well) for well in rsvr_12[1].wells()[:8]]\n h2o = rsvr_12[1]['A9']\n elution_buffer = [WellH(well) for well in rsvr_12[1].wells()[10:]]\n\n cspw1_wells = []\n cspw2_wells = []\n spm1_wells = []\n spm2_wells = []\n elution_wells = []\n\n for idx in range(num_cols):\n rbb[idx//3].height_inc(525*8)\n cspw1[idx//3].height_inc(500*8)\n cspw2[idx//3].height_inc(500*8)\n elution_buffer[idx//6].height_inc(elution_vol*8)\n cspw1_wells.append(cspw1[idx//3])\n cspw2_wells.append(cspw2[idx//3])\n elution_wells.append(elution_buffer[idx//6])\n\n for idx in range(num_cols*2):\n spm[idx//3].height_inc(500*8)\n if idx % 2 == 0:\n spm1_wells.append(spm[idx//3])\n else:\n spm2_wells.append(spm[idx//3])\n\n reagent_keys = {\n 'RBB + RNase + Mag-Bind Beads': rbb,\n 'CSPW 1 Buffer': cspw1,\n 'CSPW 2 Buffer': cspw2,\n 'Elution Buffer': elution_buffer,\n 'SPM': spm,\n }\n for key in reagent_keys:\n for x in reagent_keys[key]:\n ctx.comment(f'load {x.current_volume} of {key} in {x}')\n # for x in rbb:\n # ctx.comment(f'load {x.current_volume} in {x}')\n\n if samp_labware == 'qiagen_96_tuberack_1200ul':\n ctx.comment('Transferring 500uL of sample to plate on MagDeck')\n\n flow_rate(asp=20)\n for src, dest in zip(init_samps, mag_samps_h):\n src_asp = src.top(-asp_ht)\n m300.custom_pick_up()\n for i in range(2):\n m300.aspirate(20, src.top())\n m300.aspirate(180, src_asp)\n m300.slow_tip_withdrawal(10, src)\n m300.dispense_h(180, dest)\n m300.slow_tip_withdrawal(10, dest, to_surface=True)\n m300.dispense(20, dest.bottom(5))\n m300.aspirate(20, src.top())\n m300.aspirate(140, src_asp)\n m300.dispense_h(140, dest)\n m300.slow_tip_withdrawal(10, dest, to_surface=True)\n m300.dispense(20, dest.bottom(5))\n m300.drop_tip()\n flow_rate()\n else:\n flash_lights()\n ctx.pause('Please make sure samples are loaded on MagDeck')\n\n # Transfer 5uL RNAse + 500uL RBB buffer + 20uL Mag-Bind Beads\n ctx.comment('Transferring 5uL RNAse + 500uL RBB buffer + \\n20uL Mag-Bind Beads')\n\n m300.custom_pick_up()\n flow_rate(blow=10)\n for idx, dest in enumerate(mag_samps):\n src = rbb[idx//3]\n for _ in range(3):\n flow_rate(asp=20, disp=20)\n m300.mix(1, 100, src)\n m300.aspirate(175, src)\n m300.slow_tip_withdrawal(10, src, to_surface=True)\n flow_rate(disp=10)\n m300.dispense(75, dest.top(-1))\n flow_rate(disp=5)\n m300.dispense(50, dest.top(-1))\n ctx.delay(seconds=3)\n m300.dispense(30, dest.top(-1))\n ctx.delay(seconds=3)\n flow_rate(disp=2)\n m300.dispense(20, dest.top(-1))\n m300.blow_out()\n m300.touch_tip(speed=40)\n m300.drop_tip()\n flow_rate()\n\n if off_deck:\n flash_lights()\n ctx.pause('Please incubate samples for 10 minutes post resuspension.')\n else:\n incubate_msg = f'Incubating at room temperature for {inc_time} \\nminutes plus mixing'\n ctx.comment(incubate_msg)\n\n if num_cols > 1:\n num_mixes = math.ceil(2*inc_time/num_cols)\n else:\n num_mixes = 10\n for _ in range(num_mixes):\n for col, t_d in zip(mag_samps, all_tips[t_start:t_end]):\n if _ == 0:\n m300.custom_pick_up()\n if not m300.has_tip:\n m300.custom_pick_up(t_d)\n m300.mix(8, 150, col)\n ctx.delay(seconds=1)\n m300.blow_out(col.top(-2))\n m300.touch_tip()\n if len(mag_samps) > 1:\n m300.drop_tip(t_d)\n else:\n ctx.delay(seconds=30)\n if m300.has_tip:\n m300.drop_tip(t_d)\n\n t_start += num_cols\n t_end += num_cols\n mag_deck.engage()\n mag_msg = f'Incubating on Mag Deck for {mag_time} minutes'\n ctx.delay(minutes=mag_time, msg=mag_msg)\n\n # Discard Supernatant\n ctx.comment('Removing supernatant')\n flow_rate(asp=40, disp=40)\n for src, t_d in zip(mag_samps_h, all_tips[t_start:t_end]):\n m300.custom_pick_up()\n remove_supernatant(540, src)\n m300.drop_tip()\n m300.custom_pick_up()\n remove_supernatant(540, src)\n m300.drop_tip(t_d)\n\n flow_rate()\n\n # Wash with 500uL CSPW1 Buffer\n wash(cspw1_wells, 'CSPW1')\n\n # Wash with 500uL CSPW2 Buffer\n wash(cspw2_wells, 'CSPW2')\n\n # Wash with SPM Buffer (1)\n wash(spm1_wells, 'SPM (first wash)')\n\n # Wash with SPM Buffer (2)\n wash(spm2_wells, 'SPM (second wash)', fin_wash)\n\n # Air dry for 10 minutes\n mag_deck.engage()\n if add_water:\n for src in mag_samps_h:\n m300.custom_pick_up()\n m300.aspirate(100, h2o)\n flow_rate(asp=30, disp=30)\n m300.dispense(80, src)\n ctx.delay(seconds=0.5)\n m300.aspirate(100, src)\n flow_rate()\n m300.dispense(120, liquid_waste)\n m300.blow_out()\n m300.drop_tip()\n\n ctx.home()\n air_dry_msg = f'Air drying the beads for {air_dry} minutes. \\nPlease add elution buffer at 65C to 12-well reservoir.'\n ctx.delay(minutes=air_dry, msg=air_dry_msg)\n flash_lights()\n if not ctx.is_simulating():\n if music:\n test_speaker('/var/lib/jupyter/notebooks/mr-blue-sky-ot2.mp3')\n else:\n test_speaker()\n ctx.pause('Please check the Well Plate')\n\n mag_deck.disengage()\n # Add Elution Buffer\n ctx.comment(f'Adding {elution_vol}uL Elution Buffer to samples')\n\n for idx, (col, src) in enumerate(zip(mag_samps_h, elution_wells)):\n m300.custom_pick_up()\n m300.aspirate(elution_vol, src)\n m300.slow_tip_withdrawal(10, src, to_surface=True)\n m300.dispense_h(elution_vol, col)\n if not off_deck:\n m300.mix(10, 50, col)\n m300.slow_tip_withdrawal(10, col, to_surface=True)\n m300.blow_out(col.bottom(6))\n for _ in range(2):\n m300.move_to(col.bottom(5))\n m300.move_to(col.bottom(6))\n m300.drop_tip()\n\n flash_lights()\n ctx.home()\n if not ctx.is_simulating():\n if music:\n test_speaker('/var/lib/jupyter/notebooks/all-i-want-ot2.mp3')\n else:\n test_speaker()\n ctx.pause('Please remove samples and incubate at 65C for 5 minutes.\\nWhen complete, replace samples and click RESUME')\n ctx.set_rail_lights(True)\n\n # Transfer elution to PCR plate\n if not off_deck:\n for col in mag_samps_h:\n m300.custom_pick_up()\n m300.mix(10, 50, col)\n m300.slow_tip_withdrawal(10, col, to_surface=True)\n m300.blow_out(col.bottom(6))\n for _ in range(2):\n m300.move_to(col.bottom(5))\n m300.move_to(col.bottom(6))\n m300.drop_tip(home_after=False)\n else:\n ctx.comment('Please perform manual resupsension off deck.')\n\n mag_deck.engage()\n mag_msg = 'Incubating on Mag Deck for 3 minutes'\n ctx.delay(minutes=3, msg=mag_msg)\n\n ctx.comment(f'Transferring {elution_vol}uL to final PCR plate')\n t_start += num_cols\n if t_start >= 60:\n t_start -= 60\n\n flow_rate(asp=20)\n for src, dest, tip in zip(mag_samps, pcr_samps, all_tips[t_start:]):\n w = int(str(src).split(' ')[0][1:])\n if src.width is not None:\n radi = float(src.width)/4\n else:\n radi = float(src.diameter)/4\n x0 = radi if w % 2 == 0 else -radi\n m300.custom_pick_up()\n m300.aspirate(\n elution_vol, src.bottom().move(types.Point(x=x0, y=0, z=1)))\n m300.dispense(elution_vol, dest)\n m300.drop_tip(tip)\n\n mag_deck.disengage()\n ctx.comment('Protocol complete! Please store samples at -20C or \\ncontinue processing')\n", + "content": "# flake8: noqa\nfrom opentrons import protocol_api\nfrom opentrons import types\nfrom opentrons.protocol_api.labware import Well\nimport math\nfrom types import MethodType\nimport subprocess\nfrom opentrons.protocols.api_support.types import APIVersion\n\nmetadata = {\n 'protocolName': 'Omega Bio-Tek Mag-Bind Plant DNA DS Kit',\n 'author': 'Opentrons ',\n 'source': 'Custom Protocol Request',\n 'apiLevel': '2.13'\n}\n\nAUDIO_FILE_PATH = '/etc/audio/speaker-test.mp3'\n\n\ndef run_quiet_process(command):\n subprocess.check_output('{} &> /dev/null'.format(command), shell=True)\n\n\ndef test_speaker(song=AUDIO_FILE_PATH):\n print('Speaker')\n print('Next\\t--> CTRL-C')\n try:\n run_quiet_process('mpg123 {}'.format(song))\n except KeyboardInterrupt:\n pass\n print()\n\n\ndef run(ctx: protocol_api.ProtocolContext):\n [\n _m300_mount,\n _num_samps,\n _inc_time,\n _mag_time,\n _air_dry,\n _add_water,\n _samp_labware,\n _asp_ht,\n _fin_wash,\n _elution_vol,\n _off_deck,\n _music\n ] = get_values( # noqa: F821 (<--- DO NOT REMOVE!)\n '_m300_mount',\n '_num_samps',\n '_inc_time',\n '_mag_time',\n '_air_dry',\n '_add_water',\n '_samp_labware',\n '_asp_ht',\n '_fin_wash',\n '_elution_vol',\n '_off_deck',\n '_music')\n\n if not 1 <= _num_samps <= 96:\n raise Exception('The Number of Samples should be between 1 and 96')\n\n # define all custom variables above here with descriptions\n\n m300_mount = _m300_mount # mount for 8-channel p300 pipette\n num_cols = math.ceil(_num_samps/8) # number of sample columns\n samp_labware = _samp_labware # labware containing sample\n elution_vol = _elution_vol # volume of elution buffer\n inc_time = _inc_time # time for binding step\n mag_time = _mag_time # time on magnetic module\n air_dry = _air_dry # time for air drying\n fin_wash = _fin_wash # volume for final wash removal\n asp_ht = _asp_ht # height from the top of the labware to aspirate from\n add_water = _add_water # True/False for adding water prior to air dry\n off_deck = _off_deck # True/False perform resuspension off-deck\n music = _music # play custom music (only in Oregon)\n\n mag_deck = ctx.load_module('magnetic module gen2', 7)\n\n # load labware\n rsvr_12 = [ctx.load_labware('nest_12_reservoir_15ml', s) for s in [2, 3]]\n rsvr_1 = ctx.load_labware('nest_1_reservoir_195ml', 10)\n pcr_plate = ctx.load_labware('nest_96_wellplate_100ul_pcr_full_skirt', 1)\n samp_plate = ctx.load_labware(samp_labware, 4)\n mag_plate = mag_deck.load_labware('nest_96_wellplate_2ml_deep')\n\n # load tipracks\n tips = [\n ctx.load_labware(\n 'opentrons_96_filtertiprack_200ul', s) for s in [5, 6, 8, 9, 11]\n ]\n all_tips = [t for rack in tips for t in rack.rows()[0]]\n t_start = 0\n t_end = int(num_cols)\n\n # load instrument\n m300 = ctx.load_instrument('p300_multi_gen2', m300_mount, tip_racks=tips)\n\n if not ctx.is_simulating:\n\n # extend well objects for improved liquid handling\n class WellH(Well):\n def __init__(self, well, min_height=0.5, comp_coeff=1.1,\n current_volume=0):\n super().__init__(well.parent, well._core, APIVersion(2, 13))\n self.well = well\n # specified minimum well bottom clearance\n self.min_height = min_height\n self.comp_coeff = comp_coeff\n # specified starting volume in ul\n self.current_volume = current_volume\n # cross sectional area\n if self.diameter is not None:\n self.radius = self.diameter/2\n cse = math.pi*(self.radius**2)\n elif self.length is not None:\n cse = self.length*self.width\n else:\n cse = None\n self.cse = cse\n # initial liquid level in mm from start vol\n if cse:\n self.height = (current_volume/cse)\n else:\n raise Exception('Labware definition must \\\n supply well radius or well length and width.')\n if self.height < min_height:\n self.height = min_height\n elif self.height > well.parent.highest_z:\n raise Exception('Specified liquid volume \\\n can not exceed the height of the labware.')\n\n def height_dec(self, vol, ppt, bottom=False):\n # decrement height (mm)\n dh = (vol/self.cse)*self.comp_coeff\n # tip immersion (mm) as fraction of tip length\n mm_immersed = 0.05*ppt._tip_racks[0].wells()[0].depth\n # decrement til target reaches specified min clearance\n self.height = self.height - dh if (\n (self.height - dh - mm_immersed) > self.min_height\n ) else self.min_height + mm_immersed\n self.current_volume = self.current_volume - vol if (\n self.current_volume - vol > 0) else 0\n tip_ht = self.height - mm_immersed if bottom is False else bottom\n return self.well.bottom(tip_ht)\n\n def height_inc(self, vol, top=False):\n # increment height (mm)\n ih = (vol/self.cse)*self.comp_coeff\n # keep calculated liquid ht between min clearance and well depth\n self.height = self.min_height if (\n self.height < self.min_height) else self.height\n self.height = (self.height + ih) if (\n (self.height + ih) < self.depth) else self.depth\n # increment\n self.current_volume += vol\n if top is False:\n tip_ht = self.height\n return self.well.bottom(tip_ht)\n else:\n return self.well.top()\n\n # pipette functions # INCLUDE ANY BINDING TO CLASS\n def aspirate_h(self, vol, source, rate=1, bottom=False):\n self.aspirate(\n vol, source.height_dec(vol, self, bottom=bottom), rate=rate)\n\n def dispense_h(self, vol, dest, rate=1, top=False):\n self.dispense(vol, dest.height_inc(vol, top=top), rate=rate)\n\n def slow_tip_withdrawal(\n self, speed_limit, well_location, to_surface=False):\n if self.mount == 'right':\n axis = 'A'\n else:\n axis = 'Z'\n previous_limit = None\n if axis in ctx.max_speeds.keys():\n for key, value in ctx.max_speeds.items():\n if key == axis:\n previous_limit = value\n ctx.max_speeds[axis] = speed_limit\n if to_surface is False:\n self.move_to(well_location.top())\n else:\n if isinstance(well_location, WellH):\n self.move_to(well_location.bottom().move(types.Point(\n x=0, y=0, z=well_location.height+(\n 20*(self._tip_racks[0].wells()[0].depth / 88)))))\n else:\n self.move_to(well_location.center())\n ctx.max_speeds[axis] = previous_limit\n\n def custom_pick_up(self, loc=None):\n nonlocal t_start\n nonlocal t_end\n # `custom_pick_up` will pause the protocol when all tip boxes are out\n # of tips, prompting the user to replace all tip racks. Once tipracks\n # reset, the protocol will start picking up tips from the first tip\n # box as defined in the slot order when assigning the labware def\n # for that tip box. `pick_up()` will track tips for both pipettes if\n # applicable.\n\n # :param loc: User can manually specify location for tip pick up\n\n if loc:\n self.pick_up_tip(loc)\n else:\n try:\n self.pick_up_tip()\n except protocol_api.labware.OutOfTipsError:\n flash_lights()\n ctx.pause('Replace empty tip racks')\n self.reset_tipracks()\n t_start = 0\n t_end = int(num_cols)\n ctx.set_rail_lights(True)\n self.pick_up_tip()\n\n # bind additional methods to pipettes\n for met in [aspirate_h, dispense_h, slow_tip_withdrawal, custom_pick_up]:\n setattr(\n m300, met.__name__,\n MethodType(met, m300))\n\n # reagents\n liquid_waste = rsvr_1.wells()[0].top()\n # cspl = [WellH(well) for well in rsvr_12[0].wells()[:6]]\n # for idx in range(num_cols):\n # cspl[idx//2].height_inc(720*8*1.1)\n\n # helper functions\n def flash_lights():\n for _ in range(19):\n ctx.set_rail_lights(not ctx.rail_lights_on)\n ctx.delay(seconds=0.25)\n\n def flow_rate(asp=92.86, disp=92.86, blow=92.86):\n # This function can be used to quickly modify the flow rates of the\n # m300. If no parameters are entered, the flow rates will be\n # reset.\n\n # :param asp: Aspiration flow rate, in uL/sec\n # :param disp: Dispense flow rate, in uL/sec\n\n m300.flow_rate.aspirate = asp\n m300.flow_rate.dispense = disp\n m300.flow_rate.blow_out = blow\n\n def remove_supernatant(vol, src):\n w = int(str(src).split(' ')[0][1:])\n if src.width is not None:\n radi = float(src.width)/4\n else:\n radi = float(src.diameter)/4\n x0 = radi if w % 2 == 0 else -radi\n while vol > 180:\n m300.aspirate(180, src.bottom().move(types.Point(x=x0, y=0, z=1)))\n m300.dispense(200, liquid_waste)\n m300.blow_out()\n m300.aspirate(20, liquid_waste)\n vol -= 180\n m300.aspirate(vol, src.bottom().move(types.Point(x=x0, y=0, z=0.7)))\n m300.dispense(vol+20, liquid_waste)\n m300.blow_out()\n m300.aspirate(10, liquid_waste)\n\n def wash(srcs, msg, sup=600):\n nonlocal t_start\n nonlocal t_end\n\n if mag_deck.status == 'engaged':\n mag_deck.disengage()\n ctx.comment(f'Performing wash step: {msg}')\n flow_rate()\n for idx, (col, src) in enumerate(zip(mag_samps_h, srcs)):\n m300.custom_pick_up()\n # src = srcs[idx//3]\n for i in range(2):\n flow_rate(asp=150, disp=150)\n if i == 1:\n m300.dispense(20, src.top(-1))\n m300.dispense(20, src)\n m300.mix(1, 200, src)\n flow_rate()\n m300.aspirate(200, src)\n m300.slow_tip_withdrawal(10, src, to_surface=True)\n m300.dispense(180, col.top(-2))\n flow_rate(asp=10)\n m300.aspirate(20, col.top())\n m300.dispense(20, src.top())\n flow_rate()\n m300.mix(1, 140, src)\n m300.aspirate(140, src)\n m300.slow_tip_withdrawal(10, src, to_surface=True)\n m300.dispense(140, col)\n if not off_deck:\n m300.mix(10, 100, col)\n ctx.delay(seconds=5)\n m300.slow_tip_withdrawal(10, col, to_surface=True)\n m300.blow_out()\n m300.touch_tip(speed=40)\n m300.aspirate(10, col.top())\n m300.drop_tip()\n\n if off_deck:\n flash_lights()\n ctx.pause('Please remove plate for manual resuspension')\n\n mag_deck.engage()\n mag_msg = f'Incubating on Mag Deck for {mag_time} minutes'\n ctx.delay(minutes=mag_time, msg=mag_msg)\n\n # Discard Supernatant\n ctx.comment(f'Removing supernatant for wash: {msg}')\n t_start += num_cols\n t_end += num_cols\n for src, t_d in zip(mag_samps_h, all_tips[t_start:t_end]):\n m300.custom_pick_up()\n remove_supernatant(sup, src)\n m300.drop_tip(t_d)\n\n # plate, tube rack maps\n init_samps = samp_plate.rows()[0][:num_cols]\n mag_samps = mag_plate.rows()[0][:num_cols]\n mag_samps_h = [WellH(well) for well in mag_samps]\n pcr_samps = pcr_plate.rows()[0][:num_cols]\n\n # protocol\n ctx.set_rail_lights(True)\n # # Transfer 700\u00b5L CSPL Buffer + 20\u00b5L Prot K\n # ctx.comment('Transferring 720uL of CSPL Buffer + Proteinase K')\n #\n # m300.custom_pick_up()\n # for idx, col in enumerate(init_samps):\n # src = cspl[idx//2]\n # for _ in range(4):\n # m300.aspirate_h(180, src)\n # m300.slow_tip_withdrawal(10, src, to_surface=True)\n # m300.dispense(180, col.top(-2))\n # m300.drop_tip()\n #\n # flash_lights()\n # ctx.pause('Please remove samples and incubate at 56C for 30 minutes, \\\n # then centrifuge at 4000g for 10 minutes. Once complete, please replace \\\n # samples on the deck and place ensure 12-well reservoirs are filled with \\\n # necessary reagents in deck slots 2 and 3. When ready, click RESUME.')\n # ctx.set_rail_lights(True)\n # Creating reagent variables for second part of protocol\n rbb = [WellH(well, current_volume=0) for well in rsvr_12[0].wells()[:4]]\n cspw1 = [WellH(well) for well in rsvr_12[0].wells()[4:8]]\n cspw2 = [WellH(well) for well in rsvr_12[0].wells()[8:]]\n spm = [WellH(well) for well in rsvr_12[1].wells()[:8]]\n h2o = rsvr_12[1]['A9']\n elution_buffer = [WellH(well) for well in rsvr_12[1].wells()[10:]]\n\n cspw1_wells = []\n cspw2_wells = []\n spm1_wells = []\n spm2_wells = []\n elution_wells = []\n\n for idx in range(num_cols):\n rbb[idx//3].height_inc(525*8)\n cspw1[idx//3].height_inc(500*8)\n cspw2[idx//3].height_inc(500*8)\n elution_buffer[idx//6].height_inc(elution_vol*8)\n cspw1_wells.append(cspw1[idx//3])\n cspw2_wells.append(cspw2[idx//3])\n elution_wells.append(elution_buffer[idx//6])\n\n for idx in range(num_cols*2):\n spm[idx//3].height_inc(500*8)\n if idx % 2 == 0:\n spm1_wells.append(spm[idx//3])\n else:\n spm2_wells.append(spm[idx//3])\n\n reagent_keys = {\n 'RBB + RNase + Mag-Bind Beads': rbb,\n 'CSPW 1 Buffer': cspw1,\n 'CSPW 2 Buffer': cspw2,\n 'Elution Buffer': elution_buffer,\n 'SPM': spm,\n }\n for key in reagent_keys:\n for x in reagent_keys[key]:\n ctx.comment(f'load {x.current_volume} of {key} in {x}')\n # for x in rbb:\n # ctx.comment(f'load {x.current_volume} in {x}')\n\n if samp_labware == 'qiagen_96_tuberack_1200ul':\n ctx.comment('Transferring 500uL of sample to plate on MagDeck')\n\n flow_rate(asp=20)\n for src, dest in zip(init_samps, mag_samps_h):\n src_asp = src.top(-asp_ht)\n m300.custom_pick_up()\n for i in range(2):\n m300.aspirate(20, src.top())\n m300.aspirate(180, src_asp)\n m300.slow_tip_withdrawal(10, src)\n m300.dispense_h(180, dest)\n m300.slow_tip_withdrawal(10, dest, to_surface=True)\n m300.dispense(20, dest.bottom(5))\n m300.aspirate(20, src.top())\n m300.aspirate(140, src_asp)\n m300.dispense_h(140, dest)\n m300.slow_tip_withdrawal(10, dest, to_surface=True)\n m300.dispense(20, dest.bottom(5))\n m300.drop_tip()\n flow_rate()\n else:\n flash_lights()\n ctx.pause('Please make sure samples are loaded on MagDeck')\n\n # Transfer 5uL RNAse + 500uL RBB buffer + 20uL Mag-Bind Beads\n ctx.comment('Transferring 5uL RNAse + 500uL RBB buffer + \\\n 20uL Mag-Bind Beads')\n\n m300.custom_pick_up()\n flow_rate(blow=10)\n for idx, dest in enumerate(mag_samps):\n src = rbb[idx//3]\n for _ in range(3):\n flow_rate(asp=20, disp=20)\n m300.mix(1, 100, src)\n m300.aspirate(175, src)\n m300.slow_tip_withdrawal(10, src, to_surface=True)\n flow_rate(disp=10)\n m300.dispense(75, dest.top(-1))\n flow_rate(disp=5)\n m300.dispense(50, dest.top(-1))\n ctx.delay(seconds=3)\n m300.dispense(30, dest.top(-1))\n ctx.delay(seconds=3)\n flow_rate(disp=2)\n m300.dispense(20, dest.top(-1))\n m300.blow_out()\n m300.touch_tip(speed=40)\n m300.drop_tip()\n flow_rate()\n\n if off_deck:\n flash_lights()\n ctx.pause('Please incubate samples for 10 minutes post resuspension.')\n else:\n incubate_msg = f'Incubating at room temperature for {inc_time} \\\n minutes plus mixing'\n ctx.comment(incubate_msg)\n\n if num_cols > 1:\n num_mixes = math.ceil(2*inc_time/num_cols)\n else:\n num_mixes = 10\n for _ in range(num_mixes):\n for col, t_d in zip(mag_samps, all_tips[t_start:t_end]):\n if _ == 0:\n m300.custom_pick_up()\n if not m300.has_tip:\n m300.custom_pick_up(t_d)\n m300.mix(8, 150, col)\n ctx.delay(seconds=1)\n m300.blow_out(col.top(-2))\n m300.touch_tip()\n if len(mag_samps) > 1:\n m300.drop_tip(t_d)\n else:\n ctx.delay(seconds=30)\n if m300.has_tip:\n m300.drop_tip(t_d)\n\n t_start += num_cols\n t_end += num_cols\n mag_deck.engage()\n mag_msg = f'Incubating on Mag Deck for {mag_time} minutes'\n ctx.delay(minutes=mag_time, msg=mag_msg)\n\n # Discard Supernatant\n ctx.comment('Removing supernatant')\n flow_rate(asp=40, disp=40)\n for src, t_d in zip(mag_samps_h, all_tips[t_start:t_end]):\n m300.custom_pick_up()\n remove_supernatant(540, src)\n m300.drop_tip()\n m300.custom_pick_up()\n remove_supernatant(540, src)\n m300.drop_tip(t_d)\n\n flow_rate()\n\n # Wash with 500uL CSPW1 Buffer\n wash(cspw1_wells, 'CSPW1')\n\n # Wash with 500uL CSPW2 Buffer\n wash(cspw2_wells, 'CSPW2')\n\n # Wash with SPM Buffer (1)\n wash(spm1_wells, 'SPM (first wash)')\n\n # Wash with SPM Buffer (2)\n wash(spm2_wells, 'SPM (second wash)', fin_wash)\n\n # Air dry for 10 minutes\n mag_deck.engage()\n if add_water:\n for src in mag_samps_h:\n m300.custom_pick_up()\n m300.aspirate(100, h2o)\n flow_rate(asp=30, disp=30)\n m300.dispense(80, src)\n ctx.delay(seconds=0.5)\n m300.aspirate(100, src)\n flow_rate()\n m300.dispense(120, liquid_waste)\n m300.blow_out()\n m300.drop_tip()\n\n ctx.home()\n air_dry_msg = f'Air drying the beads for {air_dry} minutes. \\\n Please add elution buffer at 65C to 12-well reservoir.'\n ctx.delay(minutes=air_dry, msg=air_dry_msg)\n flash_lights()\n if not ctx.is_simulating():\n if music:\n test_speaker('/var/lib/jupyter/notebooks/mr-blue-sky-ot2.mp3')\n else:\n test_speaker()\n ctx.pause('Please check the Well Plate')\n\n mag_deck.disengage()\n # Add Elution Buffer\n ctx.comment(f'Adding {elution_vol}uL Elution Buffer to samples')\n\n for idx, (col, src) in enumerate(zip(mag_samps_h, elution_wells)):\n m300.custom_pick_up()\n m300.aspirate(elution_vol, src)\n m300.slow_tip_withdrawal(10, src, to_surface=True)\n m300.dispense_h(elution_vol, col)\n if not off_deck:\n m300.mix(10, 50, col)\n m300.slow_tip_withdrawal(10, col, to_surface=True)\n m300.blow_out(col.bottom(6))\n for _ in range(2):\n m300.move_to(col.bottom(5))\n m300.move_to(col.bottom(6))\n m300.drop_tip()\n\n flash_lights()\n ctx.home()\n if not ctx.is_simulating():\n if music:\n test_speaker('/var/lib/jupyter/notebooks/all-i-want-ot2.mp3')\n else:\n test_speaker()\n ctx.pause('Please remove samples and incubate at 65C for 5 minutes.\\\n When complete, replace samples and click RESUME')\n ctx.set_rail_lights(True)\n\n # Transfer elution to PCR plate\n if not off_deck:\n for col in mag_samps_h:\n m300.custom_pick_up()\n m300.mix(10, 50, col)\n m300.slow_tip_withdrawal(10, col, to_surface=True)\n m300.blow_out(col.bottom(6))\n for _ in range(2):\n m300.move_to(col.bottom(5))\n m300.move_to(col.bottom(6))\n m300.drop_tip(home_after=False)\n else:\n ctx.comment('Please perform manual resupsension off deck.')\n\n mag_deck.engage()\n mag_msg = 'Incubating on Mag Deck for 3 minutes'\n ctx.delay(minutes=3, msg=mag_msg)\n\n ctx.comment(f'Transferring {elution_vol}uL to final PCR plate')\n t_start += num_cols\n if t_start >= 60:\n t_start -= 60\n\n flow_rate(asp=20)\n for src, dest, tip in zip(mag_samps, pcr_samps, all_tips[t_start:]):\n w = int(str(src).split(' ')[0][1:])\n if src.width is not None:\n radi = float(src.width)/4\n else:\n radi = float(src.diameter)/4\n x0 = radi if w % 2 == 0 else -radi\n m300.custom_pick_up()\n m300.aspirate(\n elution_vol, src.bottom().move(types.Point(x=x0, y=0, z=1)))\n m300.dispense(elution_vol, dest)\n m300.drop_tip(tip)\n\n mag_deck.disengage()\n ctx.comment('Protocol complete! Please store samples at -20C or \\\n continue processing')\n", "custom_labware_defs": [ { "brand": { @@ -1329,7 +1329,7 @@ } ], "metadata": { - "apiLevel": "2.11", + "apiLevel": "2.13", "author": "Opentrons ", "protocolName": "Omega Bio-Tek Mag-Bind Plant DNA DS Kit", "source": "Custom Protocol Request" diff --git a/protoBuilds/spotsee/spotsee.ot2.apiv2.py.json b/protoBuilds/spotsee/spotsee.ot2.apiv2.py.json index f0da6c924..4f0bc1dcf 100644 --- a/protoBuilds/spotsee/spotsee.ot2.apiv2.py.json +++ b/protoBuilds/spotsee/spotsee.ot2.apiv2.py.json @@ -1,5 +1,5 @@ { - "content": "metadata = {\n 'protocolName': 'Spotsee Well Distribution Protocol',\n 'author': 'Rami Farawi ',\n 'source': 'Custom Protocol Request',\n 'apiLevel': '2.13'\n}\n\n\ndef run(ctx):\n\n [vol, labware, start_tip,\n p20_mount, p300_mount] = get_values( # noqa: F821\n \"vol\", \"labware\", \"start_tip\", \"p20_mount\", \"p300_mount\")\n\n # p20_mount = 'left'\n # vol = 25\n # p300_mount = 'right'\n # labware = '40_well_plate'\n # start_tip = 4\n\n # labware\n reservoir = ctx.load_labware('nest_1_reservoir_195ml', 10)\n plate = ctx.load_labware(labware, 1)\n tips = [ctx.load_labware('opentrons_96_filtertiprack_20ul' if vol < 20 else 'opentrons_96_tiprack_300ul', slot) # noqa: E501\n for slot in [11]]\n\n red_wells = [\n 'J1', 'I1', 'H1', 'G1', 'F1', 'E1', 'D1', 'C1', 'B1', 'A1',\n 'A2', 'B2', 'C2', 'D2', 'E2', 'F2', 'G2', 'H2', 'I2', 'J2',\n 'J3', 'I3', 'H3', 'G3', 'F3', 'E3', 'D3', 'C3', 'B3', 'A3',\n 'A4', 'B4', 'C4', 'D4', 'E4', 'F4', 'G4', 'H4', 'I4', 'J4',\n 'J5', 'I5', 'H5', 'G5', 'F5', 'E5', 'D5', 'C5', 'B5', 'A5',\n 'A6', 'B6', 'C6', 'D6', 'E6', 'F6', 'G6', 'H6', 'I6', 'J6',\n 'J7', 'I7', 'H7', 'G7', 'F7', 'E7', 'D7', 'C7', 'B7', 'A7',\n 'A8', 'B8', 'C8', 'D8', 'E8', 'F8', 'G8', 'H8', 'I8', 'J8'\n ]\n\n # pipettes\n p20 = ctx.load_instrument('p20_single_gen2', p20_mount, tip_racks=tips)\n p300 = ctx.load_instrument('p300_single_gen2', p300_mount, tip_racks=tips)\n pip = p20 if vol < 20 else p300\n\n # mapping\n buffer = reservoir.wells()[0]\n\n # protocol\n ctx.comment('\\n---------------ADDING BUFFER TO PLATE----------------\\n\\n')\n if labware == '80_well_plate':\n num_asp = pip.max_volume // vol\n chunks = [red_wells[i:i+num_asp] for i in range(0, len(red_wells),\n num_asp)]\n\n pip.pick_up_tip(tips[0].wells()[start_tip-1])\n for chunk in chunks:\n pip.aspirate(num_asp*vol, buffer)\n for well in chunk:\n pip.dispense(vol, plate.wells_by_name()[well])\n pip.move_to(plate.wells_by_name()[well].top(z=5))\n pip.drop_tip()\n else:\n num_asp = pip.max_volume // vol\n chunks = [plate.wells()[i:i+num_asp] for i in range(0,\n len(plate.wells()),\n num_asp)]\n\n pip.pick_up_tip(tips[0].wells()[start_tip-1])\n for chunk in chunks:\n pip.aspirate(num_asp*vol, buffer)\n for well in chunk:\n pip.dispense(vol, well)\n pip.move_to(well.top(z=5))\n pip.drop_tip()\n", + "content": "metadata = {\n 'protocolName': 'Spotsee Well Distribution Protocol',\n 'author': 'Rami Farawi ',\n 'source': 'Custom Protocol Request',\n 'apiLevel': '2.13'\n}\n\n\ndef run(ctx):\n\n [num_cycles, vol, labware, start_tip,\n p20_mount, p300_mount] = get_values( # noqa: F821\n \"num_cycles\", \"vol\", \"labware\", \"start_tip\", \"p20_mount\", \"p300_mount\")\n\n # p20_mount = 'left'\n # vol = 25\n # p300_mount = 'right'\n # labware = '40_well_plate'\n # start_tip = 4\n\n # labware\n reservoir = ctx.load_labware('nest_1_reservoir_195ml', 10)\n plate = ctx.load_labware(labware, 1)\n tips = [ctx.load_labware('opentrons_96_filtertiprack_20ul' if vol < 10 else 'opentrons_96_tiprack_300ul', slot) # noqa: E501\n for slot in [11]]\n\n red_wells = [\n 'J1', 'I1', 'H1', 'G1', 'F1', 'E1', 'D1', 'C1', 'B1', 'A1',\n 'A2', 'B2', 'C2', 'D2', 'E2', 'F2', 'G2', 'H2', 'I2', 'J2',\n 'J3', 'I3', 'H3', 'G3', 'F3', 'E3', 'D3', 'C3', 'B3', 'A3',\n 'A4', 'B4', 'C4', 'D4', 'E4', 'F4', 'G4', 'H4', 'I4', 'J4',\n 'J5', 'I5', 'H5', 'G5', 'F5', 'E5', 'D5', 'C5', 'B5', 'A5',\n 'A6', 'B6', 'C6', 'D6', 'E6', 'F6', 'G6', 'H6', 'I6', 'J6',\n 'J7', 'I7', 'H7', 'G7', 'F7', 'E7', 'D7', 'C7', 'B7', 'A7',\n 'A8', 'B8', 'C8', 'D8', 'E8', 'F8', 'G8', 'H8', 'I8', 'J8'\n ]\n\n # pipettes\n p20 = ctx.load_instrument('p20_single_gen2', p20_mount, tip_racks=tips)\n p300 = ctx.load_instrument('p300_single_gen2', p300_mount, tip_racks=tips)\n pip = p20 if vol < 10 else p300\n\n # mapping\n buffer = reservoir.wells()[0]\n\n # protocol\n pip.pick_up_tip(tips[0].wells()[start_tip-1])\n for _ in range(num_cycles):\n ctx.comment('\\n-------------ADDING BUFFER TO PLATE-------------\\n\\n')\n if labware == '80_well_plate':\n num_asp = pip.max_volume // vol\n chunks = [red_wells[i:i+num_asp] for i in range(0, len(red_wells),\n num_asp)]\n for chunk in chunks:\n pip.aspirate(num_asp*vol, buffer)\n for well in chunk:\n pip.dispense(vol, plate.wells_by_name()[well])\n pip.move_to(plate.wells_by_name()[well].top(z=5))\n\n else:\n num_asp = pip.max_volume // vol\n chunks = [plate.wells()[i:i+num_asp] for i in range(0,\n len(plate.wells()),\n num_asp)]\n\n for chunk in chunks:\n pip.aspirate(num_asp*vol, buffer)\n for well in chunk:\n pip.dispense(vol, well)\n pip.move_to(well.top(z=5))\n ctx.pause('Change Sheet on Deck')\n pip.drop_tip()\n", "custom_labware_defs": [ { "brand": { @@ -1543,9 +1543,15 @@ } ], "fields": [ + { + "default": 20, + "label": "Number of cycles before new tip", + "name": "num_cycles", + "type": "int" + }, { "default": 15, - "label": "Volume to each well (1-20ul)", + "label": "Volume to each well", "name": "vol", "type": "int" }, @@ -1625,10 +1631,10 @@ "type": "nest_1_reservoir_195ml" }, { - "name": "Opentrons 96 Filter Tip Rack 20 \u00b5L on 11", + "name": "Opentrons 96 Tip Rack 300 \u00b5L on 11", "share": false, "slot": "11", - "type": "opentrons_96_filtertiprack_20ul" + "type": "opentrons_96_tiprack_300ul" }, { "name": "Opentrons Fixed Trash on 12", diff --git a/protocols/3e0bef/3e0b3f.ot2.apiv2.py b/protocols/3e0bef/3e0b3f.ot2.apiv2.py index 343649e48..7f825c096 100644 --- a/protocols/3e0bef/3e0b3f.ot2.apiv2.py +++ b/protocols/3e0bef/3e0b3f.ot2.apiv2.py @@ -1,3 +1,4 @@ +# flake8: noqa from opentrons import protocol_api from opentrons import types from opentrons.protocol_api.labware import Well @@ -97,502 +98,504 @@ def run(ctx: protocol_api.ProtocolContext): # load instrument m300 = ctx.load_instrument('p300_multi_gen2', m300_mount, tip_racks=tips) - # extend well objects for improved liquid handling - class WellH(Well): - def __init__(self, well, min_height=0.5, comp_coeff=1.1, - current_volume=0): - super().__init__(well.parent, well._core, APIVersion(2, 13)) - self.well = well - # specified minimum well bottom clearance - self.min_height = min_height - self.comp_coeff = comp_coeff - # specified starting volume in ul - self.current_volume = current_volume - # cross sectional area - if self.diameter is not None: - self.radius = self.diameter/2 - cse = math.pi*(self.radius**2) - elif self.length is not None: - cse = self.length*self.width - else: - cse = None - self.cse = cse - # initial liquid level in mm from start vol - if cse: - self.height = (current_volume/cse) - else: - raise Exception('Labware definition must \ -supply well radius or well length and width.') - if self.height < min_height: - self.height = min_height - elif self.height > well.parent.highest_z: - raise Exception('Specified liquid volume \ -can not exceed the height of the labware.') - - def height_dec(self, vol, ppt, bottom=False): - # decrement height (mm) - dh = (vol/self.cse)*self.comp_coeff - # tip immersion (mm) as fraction of tip length - mm_immersed = 0.05*ppt._tip_racks[0].wells()[0].depth - # decrement til target reaches specified min clearance - self.height = self.height - dh if ( - (self.height - dh - mm_immersed) > self.min_height - ) else self.min_height + mm_immersed - self.current_volume = self.current_volume - vol if ( - self.current_volume - vol > 0) else 0 - tip_ht = self.height - mm_immersed if bottom is False else bottom - return self.well.bottom(tip_ht) - - def height_inc(self, vol, top=False): - # increment height (mm) - ih = (vol/self.cse)*self.comp_coeff - # keep calculated liquid ht between min clearance and well depth - self.height = self.min_height if ( - self.height < self.min_height) else self.height - self.height = (self.height + ih) if ( - (self.height + ih) < self.depth) else self.depth - # increment - self.current_volume += vol - if top is False: - tip_ht = self.height + if not ctx.is_simulating: + + # extend well objects for improved liquid handling + class WellH(Well): + def __init__(self, well, min_height=0.5, comp_coeff=1.1, + current_volume=0): + super().__init__(well.parent, well._core, APIVersion(2, 13)) + self.well = well + # specified minimum well bottom clearance + self.min_height = min_height + self.comp_coeff = comp_coeff + # specified starting volume in ul + self.current_volume = current_volume + # cross sectional area + if self.diameter is not None: + self.radius = self.diameter/2 + cse = math.pi*(self.radius**2) + elif self.length is not None: + cse = self.length*self.width + else: + cse = None + self.cse = cse + # initial liquid level in mm from start vol + if cse: + self.height = (current_volume/cse) + else: + raise Exception('Labware definition must \ + supply well radius or well length and width.') + if self.height < min_height: + self.height = min_height + elif self.height > well.parent.highest_z: + raise Exception('Specified liquid volume \ + can not exceed the height of the labware.') + + def height_dec(self, vol, ppt, bottom=False): + # decrement height (mm) + dh = (vol/self.cse)*self.comp_coeff + # tip immersion (mm) as fraction of tip length + mm_immersed = 0.05*ppt._tip_racks[0].wells()[0].depth + # decrement til target reaches specified min clearance + self.height = self.height - dh if ( + (self.height - dh - mm_immersed) > self.min_height + ) else self.min_height + mm_immersed + self.current_volume = self.current_volume - vol if ( + self.current_volume - vol > 0) else 0 + tip_ht = self.height - mm_immersed if bottom is False else bottom return self.well.bottom(tip_ht) - else: - return self.well.top() - # pipette functions # INCLUDE ANY BINDING TO CLASS - def aspirate_h(self, vol, source, rate=1, bottom=False): - self.aspirate( - vol, source.height_dec(vol, self, bottom=bottom), rate=rate) + def height_inc(self, vol, top=False): + # increment height (mm) + ih = (vol/self.cse)*self.comp_coeff + # keep calculated liquid ht between min clearance and well depth + self.height = self.min_height if ( + self.height < self.min_height) else self.height + self.height = (self.height + ih) if ( + (self.height + ih) < self.depth) else self.depth + # increment + self.current_volume += vol + if top is False: + tip_ht = self.height + return self.well.bottom(tip_ht) + else: + return self.well.top() + + # pipette functions # INCLUDE ANY BINDING TO CLASS + def aspirate_h(self, vol, source, rate=1, bottom=False): + self.aspirate( + vol, source.height_dec(vol, self, bottom=bottom), rate=rate) - def dispense_h(self, vol, dest, rate=1, top=False): - self.dispense(vol, dest.height_inc(vol, top=top), rate=rate) + def dispense_h(self, vol, dest, rate=1, top=False): + self.dispense(vol, dest.height_inc(vol, top=top), rate=rate) - def slow_tip_withdrawal( - self, speed_limit, well_location, to_surface=False): - if self.mount == 'right': - axis = 'A' - else: - axis = 'Z' - previous_limit = None - if axis in ctx.max_speeds.keys(): - for key, value in ctx.max_speeds.items(): - if key == axis: - previous_limit = value - ctx.max_speeds[axis] = speed_limit - if to_surface is False: - self.move_to(well_location.top()) - else: - if isinstance(well_location, WellH): - self.move_to(well_location.bottom().move(types.Point( - x=0, y=0, z=well_location.height+( - 20*(self._tip_racks[0].wells()[0].depth / 88))))) + def slow_tip_withdrawal( + self, speed_limit, well_location, to_surface=False): + if self.mount == 'right': + axis = 'A' else: - self.move_to(well_location.center()) - ctx.max_speeds[axis] = previous_limit - - def custom_pick_up(self, loc=None): - nonlocal t_start - nonlocal t_end - # `custom_pick_up` will pause the protocol when all tip boxes are out - # of tips, prompting the user to replace all tip racks. Once tipracks - # reset, the protocol will start picking up tips from the first tip - # box as defined in the slot order when assigning the labware def - # for that tip box. `pick_up()` will track tips for both pipettes if - # applicable. - - # :param loc: User can manually specify location for tip pick up - - if loc: - self.pick_up_tip(loc) - else: - try: - self.pick_up_tip() - except protocol_api.labware.OutOfTipsError: - flash_lights() - ctx.pause('Replace empty tip racks') - self.reset_tipracks() - t_start = 0 - t_end = int(num_cols) - ctx.set_rail_lights(True) - self.pick_up_tip() - - # bind additional methods to pipettes - for met in [aspirate_h, dispense_h, slow_tip_withdrawal, custom_pick_up]: - setattr( - m300, met.__name__, - MethodType(met, m300)) - - # reagents - liquid_waste = rsvr_1.wells()[0].top() - # cspl = [WellH(well) for well in rsvr_12[0].wells()[:6]] - # for idx in range(num_cols): - # cspl[idx//2].height_inc(720*8*1.1) - - # helper functions - def flash_lights(): - for _ in range(19): - ctx.set_rail_lights(not ctx.rail_lights_on) - ctx.delay(seconds=0.25) - - def flow_rate(asp=92.86, disp=92.86, blow=92.86): - # This function can be used to quickly modify the flow rates of the - # m300. If no parameters are entered, the flow rates will be - # reset. - - # :param asp: Aspiration flow rate, in uL/sec - # :param disp: Dispense flow rate, in uL/sec - - m300.flow_rate.aspirate = asp - m300.flow_rate.dispense = disp - m300.flow_rate.blow_out = blow - - def remove_supernatant(vol, src): - w = int(str(src).split(' ')[0][1:]) - if src.width is not None: - radi = float(src.width)/4 - else: - radi = float(src.diameter)/4 - x0 = radi if w % 2 == 0 else -radi - while vol > 180: - m300.aspirate(180, src.bottom().move(types.Point(x=x0, y=0, z=1))) - m300.dispense(200, liquid_waste) + axis = 'Z' + previous_limit = None + if axis in ctx.max_speeds.keys(): + for key, value in ctx.max_speeds.items(): + if key == axis: + previous_limit = value + ctx.max_speeds[axis] = speed_limit + if to_surface is False: + self.move_to(well_location.top()) + else: + if isinstance(well_location, WellH): + self.move_to(well_location.bottom().move(types.Point( + x=0, y=0, z=well_location.height+( + 20*(self._tip_racks[0].wells()[0].depth / 88))))) + else: + self.move_to(well_location.center()) + ctx.max_speeds[axis] = previous_limit + + def custom_pick_up(self, loc=None): + nonlocal t_start + nonlocal t_end + # `custom_pick_up` will pause the protocol when all tip boxes are out + # of tips, prompting the user to replace all tip racks. Once tipracks + # reset, the protocol will start picking up tips from the first tip + # box as defined in the slot order when assigning the labware def + # for that tip box. `pick_up()` will track tips for both pipettes if + # applicable. + + # :param loc: User can manually specify location for tip pick up + + if loc: + self.pick_up_tip(loc) + else: + try: + self.pick_up_tip() + except protocol_api.labware.OutOfTipsError: + flash_lights() + ctx.pause('Replace empty tip racks') + self.reset_tipracks() + t_start = 0 + t_end = int(num_cols) + ctx.set_rail_lights(True) + self.pick_up_tip() + + # bind additional methods to pipettes + for met in [aspirate_h, dispense_h, slow_tip_withdrawal, custom_pick_up]: + setattr( + m300, met.__name__, + MethodType(met, m300)) + + # reagents + liquid_waste = rsvr_1.wells()[0].top() + # cspl = [WellH(well) for well in rsvr_12[0].wells()[:6]] + # for idx in range(num_cols): + # cspl[idx//2].height_inc(720*8*1.1) + + # helper functions + def flash_lights(): + for _ in range(19): + ctx.set_rail_lights(not ctx.rail_lights_on) + ctx.delay(seconds=0.25) + + def flow_rate(asp=92.86, disp=92.86, blow=92.86): + # This function can be used to quickly modify the flow rates of the + # m300. If no parameters are entered, the flow rates will be + # reset. + + # :param asp: Aspiration flow rate, in uL/sec + # :param disp: Dispense flow rate, in uL/sec + + m300.flow_rate.aspirate = asp + m300.flow_rate.dispense = disp + m300.flow_rate.blow_out = blow + + def remove_supernatant(vol, src): + w = int(str(src).split(' ')[0][1:]) + if src.width is not None: + radi = float(src.width)/4 + else: + radi = float(src.diameter)/4 + x0 = radi if w % 2 == 0 else -radi + while vol > 180: + m300.aspirate(180, src.bottom().move(types.Point(x=x0, y=0, z=1))) + m300.dispense(200, liquid_waste) + m300.blow_out() + m300.aspirate(20, liquid_waste) + vol -= 180 + m300.aspirate(vol, src.bottom().move(types.Point(x=x0, y=0, z=0.7))) + m300.dispense(vol+20, liquid_waste) m300.blow_out() - m300.aspirate(20, liquid_waste) - vol -= 180 - m300.aspirate(vol, src.bottom().move(types.Point(x=x0, y=0, z=0.7))) - m300.dispense(vol+20, liquid_waste) - m300.blow_out() - m300.aspirate(10, liquid_waste) - - def wash(srcs, msg, sup=600): - nonlocal t_start - nonlocal t_end - - if mag_deck.status == 'engaged': - mag_deck.disengage() - ctx.comment(f'Performing wash step: {msg}') - flow_rate() - for idx, (col, src) in enumerate(zip(mag_samps_h, srcs)): - m300.custom_pick_up() - # src = srcs[idx//3] - for i in range(2): - flow_rate(asp=150, disp=150) - if i == 1: - m300.dispense(20, src.top(-1)) - m300.dispense(20, src) - m300.mix(1, 200, src) + m300.aspirate(10, liquid_waste) + + def wash(srcs, msg, sup=600): + nonlocal t_start + nonlocal t_end + + if mag_deck.status == 'engaged': + mag_deck.disengage() + ctx.comment(f'Performing wash step: {msg}') + flow_rate() + for idx, (col, src) in enumerate(zip(mag_samps_h, srcs)): + m300.custom_pick_up() + # src = srcs[idx//3] + for i in range(2): + flow_rate(asp=150, disp=150) + if i == 1: + m300.dispense(20, src.top(-1)) + m300.dispense(20, src) + m300.mix(1, 200, src) + flow_rate() + m300.aspirate(200, src) + m300.slow_tip_withdrawal(10, src, to_surface=True) + m300.dispense(180, col.top(-2)) + flow_rate(asp=10) + m300.aspirate(20, col.top()) + m300.dispense(20, src.top()) flow_rate() - m300.aspirate(200, src) + m300.mix(1, 140, src) + m300.aspirate(140, src) m300.slow_tip_withdrawal(10, src, to_surface=True) - m300.dispense(180, col.top(-2)) - flow_rate(asp=10) - m300.aspirate(20, col.top()) - m300.dispense(20, src.top()) + m300.dispense(140, col) + if not off_deck: + m300.mix(10, 100, col) + ctx.delay(seconds=5) + m300.slow_tip_withdrawal(10, col, to_surface=True) + m300.blow_out() + m300.touch_tip(speed=40) + m300.aspirate(10, col.top()) + m300.drop_tip() + + if off_deck: + flash_lights() + ctx.pause('Please remove plate for manual resuspension') + + mag_deck.engage() + mag_msg = f'Incubating on Mag Deck for {mag_time} minutes' + ctx.delay(minutes=mag_time, msg=mag_msg) + + # Discard Supernatant + ctx.comment(f'Removing supernatant for wash: {msg}') + t_start += num_cols + t_end += num_cols + for src, t_d in zip(mag_samps_h, all_tips[t_start:t_end]): + m300.custom_pick_up() + remove_supernatant(sup, src) + m300.drop_tip(t_d) + + # plate, tube rack maps + init_samps = samp_plate.rows()[0][:num_cols] + mag_samps = mag_plate.rows()[0][:num_cols] + mag_samps_h = [WellH(well) for well in mag_samps] + pcr_samps = pcr_plate.rows()[0][:num_cols] + + # protocol + ctx.set_rail_lights(True) + # # Transfer 700µL CSPL Buffer + 20µL Prot K + # ctx.comment('Transferring 720uL of CSPL Buffer + Proteinase K') + # + # m300.custom_pick_up() + # for idx, col in enumerate(init_samps): + # src = cspl[idx//2] + # for _ in range(4): + # m300.aspirate_h(180, src) + # m300.slow_tip_withdrawal(10, src, to_surface=True) + # m300.dispense(180, col.top(-2)) + # m300.drop_tip() + # + # flash_lights() + # ctx.pause('Please remove samples and incubate at 56C for 30 minutes, \ + # then centrifuge at 4000g for 10 minutes. Once complete, please replace \ + # samples on the deck and place ensure 12-well reservoirs are filled with \ + # necessary reagents in deck slots 2 and 3. When ready, click RESUME.') + # ctx.set_rail_lights(True) + # Creating reagent variables for second part of protocol + rbb = [WellH(well, current_volume=0) for well in rsvr_12[0].wells()[:4]] + cspw1 = [WellH(well) for well in rsvr_12[0].wells()[4:8]] + cspw2 = [WellH(well) for well in rsvr_12[0].wells()[8:]] + spm = [WellH(well) for well in rsvr_12[1].wells()[:8]] + h2o = rsvr_12[1]['A9'] + elution_buffer = [WellH(well) for well in rsvr_12[1].wells()[10:]] + + cspw1_wells = [] + cspw2_wells = [] + spm1_wells = [] + spm2_wells = [] + elution_wells = [] + + for idx in range(num_cols): + rbb[idx//3].height_inc(525*8) + cspw1[idx//3].height_inc(500*8) + cspw2[idx//3].height_inc(500*8) + elution_buffer[idx//6].height_inc(elution_vol*8) + cspw1_wells.append(cspw1[idx//3]) + cspw2_wells.append(cspw2[idx//3]) + elution_wells.append(elution_buffer[idx//6]) + + for idx in range(num_cols*2): + spm[idx//3].height_inc(500*8) + if idx % 2 == 0: + spm1_wells.append(spm[idx//3]) + else: + spm2_wells.append(spm[idx//3]) + + reagent_keys = { + 'RBB + RNase + Mag-Bind Beads': rbb, + 'CSPW 1 Buffer': cspw1, + 'CSPW 2 Buffer': cspw2, + 'Elution Buffer': elution_buffer, + 'SPM': spm, + } + for key in reagent_keys: + for x in reagent_keys[key]: + ctx.comment(f'load {x.current_volume} of {key} in {x}') + # for x in rbb: + # ctx.comment(f'load {x.current_volume} in {x}') + + if samp_labware == 'qiagen_96_tuberack_1200ul': + ctx.comment('Transferring 500uL of sample to plate on MagDeck') + + flow_rate(asp=20) + for src, dest in zip(init_samps, mag_samps_h): + src_asp = src.top(-asp_ht) + m300.custom_pick_up() + for i in range(2): + m300.aspirate(20, src.top()) + m300.aspirate(180, src_asp) + m300.slow_tip_withdrawal(10, src) + m300.dispense_h(180, dest) + m300.slow_tip_withdrawal(10, dest, to_surface=True) + m300.dispense(20, dest.bottom(5)) + m300.aspirate(20, src.top()) + m300.aspirate(140, src_asp) + m300.dispense_h(140, dest) + m300.slow_tip_withdrawal(10, dest, to_surface=True) + m300.dispense(20, dest.bottom(5)) + m300.drop_tip() flow_rate() - m300.mix(1, 140, src) - m300.aspirate(140, src) - m300.slow_tip_withdrawal(10, src, to_surface=True) - m300.dispense(140, col) - if not off_deck: - m300.mix(10, 100, col) - ctx.delay(seconds=5) - m300.slow_tip_withdrawal(10, col, to_surface=True) - m300.blow_out() - m300.touch_tip(speed=40) - m300.aspirate(10, col.top()) - m300.drop_tip() + else: + flash_lights() + ctx.pause('Please make sure samples are loaded on MagDeck') + + # Transfer 5uL RNAse + 500uL RBB buffer + 20uL Mag-Bind Beads + ctx.comment('Transferring 5uL RNAse + 500uL RBB buffer + \ + 20uL Mag-Bind Beads') + + m300.custom_pick_up() + flow_rate(blow=10) + for idx, dest in enumerate(mag_samps): + src = rbb[idx//3] + for _ in range(3): + flow_rate(asp=20, disp=20) + m300.mix(1, 100, src) + m300.aspirate(175, src) + m300.slow_tip_withdrawal(10, src, to_surface=True) + flow_rate(disp=10) + m300.dispense(75, dest.top(-1)) + flow_rate(disp=5) + m300.dispense(50, dest.top(-1)) + ctx.delay(seconds=3) + m300.dispense(30, dest.top(-1)) + ctx.delay(seconds=3) + flow_rate(disp=2) + m300.dispense(20, dest.top(-1)) + m300.blow_out() + m300.touch_tip(speed=40) + m300.drop_tip() + flow_rate() if off_deck: flash_lights() - ctx.pause('Please remove plate for manual resuspension') + ctx.pause('Please incubate samples for 10 minutes post resuspension.') + else: + incubate_msg = f'Incubating at room temperature for {inc_time} \ + minutes plus mixing' + ctx.comment(incubate_msg) + if num_cols > 1: + num_mixes = math.ceil(2*inc_time/num_cols) + else: + num_mixes = 10 + for _ in range(num_mixes): + for col, t_d in zip(mag_samps, all_tips[t_start:t_end]): + if _ == 0: + m300.custom_pick_up() + if not m300.has_tip: + m300.custom_pick_up(t_d) + m300.mix(8, 150, col) + ctx.delay(seconds=1) + m300.blow_out(col.top(-2)) + m300.touch_tip() + if len(mag_samps) > 1: + m300.drop_tip(t_d) + else: + ctx.delay(seconds=30) + if m300.has_tip: + m300.drop_tip(t_d) + + t_start += num_cols + t_end += num_cols mag_deck.engage() mag_msg = f'Incubating on Mag Deck for {mag_time} minutes' ctx.delay(minutes=mag_time, msg=mag_msg) # Discard Supernatant - ctx.comment(f'Removing supernatant for wash: {msg}') - t_start += num_cols - t_end += num_cols + ctx.comment('Removing supernatant') + flow_rate(asp=40, disp=40) for src, t_d in zip(mag_samps_h, all_tips[t_start:t_end]): m300.custom_pick_up() - remove_supernatant(sup, src) + remove_supernatant(540, src) + m300.drop_tip() + m300.custom_pick_up() + remove_supernatant(540, src) m300.drop_tip(t_d) - # plate, tube rack maps - init_samps = samp_plate.rows()[0][:num_cols] - mag_samps = mag_plate.rows()[0][:num_cols] - mag_samps_h = [WellH(well) for well in mag_samps] - pcr_samps = pcr_plate.rows()[0][:num_cols] - - # protocol - ctx.set_rail_lights(True) - # # Transfer 700µL CSPL Buffer + 20µL Prot K - # ctx.comment('Transferring 720uL of CSPL Buffer + Proteinase K') - # - # m300.custom_pick_up() - # for idx, col in enumerate(init_samps): - # src = cspl[idx//2] - # for _ in range(4): - # m300.aspirate_h(180, src) - # m300.slow_tip_withdrawal(10, src, to_surface=True) - # m300.dispense(180, col.top(-2)) - # m300.drop_tip() - # - # flash_lights() - # ctx.pause('Please remove samples and incubate at 56C for 30 minutes, \ - # then centrifuge at 4000g for 10 minutes. Once complete, please replace \ - # samples on the deck and place ensure 12-well reservoirs are filled with \ - # necessary reagents in deck slots 2 and 3. When ready, click RESUME.') - # ctx.set_rail_lights(True) - # Creating reagent variables for second part of protocol - rbb = [WellH(well, current_volume=0) for well in rsvr_12[0].wells()[:4]] - cspw1 = [WellH(well) for well in rsvr_12[0].wells()[4:8]] - cspw2 = [WellH(well) for well in rsvr_12[0].wells()[8:]] - spm = [WellH(well) for well in rsvr_12[1].wells()[:8]] - h2o = rsvr_12[1]['A9'] - elution_buffer = [WellH(well) for well in rsvr_12[1].wells()[10:]] - - cspw1_wells = [] - cspw2_wells = [] - spm1_wells = [] - spm2_wells = [] - elution_wells = [] - - for idx in range(num_cols): - rbb[idx//3].height_inc(525*8) - cspw1[idx//3].height_inc(500*8) - cspw2[idx//3].height_inc(500*8) - elution_buffer[idx//6].height_inc(elution_vol*8) - cspw1_wells.append(cspw1[idx//3]) - cspw2_wells.append(cspw2[idx//3]) - elution_wells.append(elution_buffer[idx//6]) - - for idx in range(num_cols*2): - spm[idx//3].height_inc(500*8) - if idx % 2 == 0: - spm1_wells.append(spm[idx//3]) - else: - spm2_wells.append(spm[idx//3]) - - reagent_keys = { - 'RBB + RNase + Mag-Bind Beads': rbb, - 'CSPW 1 Buffer': cspw1, - 'CSPW 2 Buffer': cspw2, - 'Elution Buffer': elution_buffer, - 'SPM': spm, - } - for key in reagent_keys: - for x in reagent_keys[key]: - ctx.comment(f'load {x.current_volume} of {key} in {x}') - # for x in rbb: - # ctx.comment(f'load {x.current_volume} in {x}') - - if samp_labware == 'qiagen_96_tuberack_1200ul': - ctx.comment('Transferring 500uL of sample to plate on MagDeck') - - flow_rate(asp=20) - for src, dest in zip(init_samps, mag_samps_h): - src_asp = src.top(-asp_ht) - m300.custom_pick_up() - for i in range(2): - m300.aspirate(20, src.top()) - m300.aspirate(180, src_asp) - m300.slow_tip_withdrawal(10, src) - m300.dispense_h(180, dest) - m300.slow_tip_withdrawal(10, dest, to_surface=True) - m300.dispense(20, dest.bottom(5)) - m300.aspirate(20, src.top()) - m300.aspirate(140, src_asp) - m300.dispense_h(140, dest) - m300.slow_tip_withdrawal(10, dest, to_surface=True) - m300.dispense(20, dest.bottom(5)) - m300.drop_tip() flow_rate() - else: - flash_lights() - ctx.pause('Please make sure samples are loaded on MagDeck') - - # Transfer 5uL RNAse + 500uL RBB buffer + 20uL Mag-Bind Beads - ctx.comment('Transferring 5uL RNAse + 500uL RBB buffer + \ -20uL Mag-Bind Beads') - - m300.custom_pick_up() - flow_rate(blow=10) - for idx, dest in enumerate(mag_samps): - src = rbb[idx//3] - for _ in range(3): - flow_rate(asp=20, disp=20) - m300.mix(1, 100, src) - m300.aspirate(175, src) - m300.slow_tip_withdrawal(10, src, to_surface=True) - flow_rate(disp=10) - m300.dispense(75, dest.top(-1)) - flow_rate(disp=5) - m300.dispense(50, dest.top(-1)) - ctx.delay(seconds=3) - m300.dispense(30, dest.top(-1)) - ctx.delay(seconds=3) - flow_rate(disp=2) - m300.dispense(20, dest.top(-1)) - m300.blow_out() - m300.touch_tip(speed=40) - m300.drop_tip() - flow_rate() - - if off_deck: - flash_lights() - ctx.pause('Please incubate samples for 10 minutes post resuspension.') - else: - incubate_msg = f'Incubating at room temperature for {inc_time} \ -minutes plus mixing' - ctx.comment(incubate_msg) - - if num_cols > 1: - num_mixes = math.ceil(2*inc_time/num_cols) - else: - num_mixes = 10 - for _ in range(num_mixes): - for col, t_d in zip(mag_samps, all_tips[t_start:t_end]): - if _ == 0: - m300.custom_pick_up() - if not m300.has_tip: - m300.custom_pick_up(t_d) - m300.mix(8, 150, col) - ctx.delay(seconds=1) - m300.blow_out(col.top(-2)) - m300.touch_tip() - if len(mag_samps) > 1: - m300.drop_tip(t_d) - else: - ctx.delay(seconds=30) - if m300.has_tip: - m300.drop_tip(t_d) - t_start += num_cols - t_end += num_cols - mag_deck.engage() - mag_msg = f'Incubating on Mag Deck for {mag_time} minutes' - ctx.delay(minutes=mag_time, msg=mag_msg) - - # Discard Supernatant - ctx.comment('Removing supernatant') - flow_rate(asp=40, disp=40) - for src, t_d in zip(mag_samps_h, all_tips[t_start:t_end]): - m300.custom_pick_up() - remove_supernatant(540, src) - m300.drop_tip() - m300.custom_pick_up() - remove_supernatant(540, src) - m300.drop_tip(t_d) + # Wash with 500uL CSPW1 Buffer + wash(cspw1_wells, 'CSPW1') - flow_rate() + # Wash with 500uL CSPW2 Buffer + wash(cspw2_wells, 'CSPW2') - # Wash with 500uL CSPW1 Buffer - wash(cspw1_wells, 'CSPW1') + # Wash with SPM Buffer (1) + wash(spm1_wells, 'SPM (first wash)') - # Wash with 500uL CSPW2 Buffer - wash(cspw2_wells, 'CSPW2') + # Wash with SPM Buffer (2) + wash(spm2_wells, 'SPM (second wash)', fin_wash) - # Wash with SPM Buffer (1) - wash(spm1_wells, 'SPM (first wash)') + # Air dry for 10 minutes + mag_deck.engage() + if add_water: + for src in mag_samps_h: + m300.custom_pick_up() + m300.aspirate(100, h2o) + flow_rate(asp=30, disp=30) + m300.dispense(80, src) + ctx.delay(seconds=0.5) + m300.aspirate(100, src) + flow_rate() + m300.dispense(120, liquid_waste) + m300.blow_out() + m300.drop_tip() + + ctx.home() + air_dry_msg = f'Air drying the beads for {air_dry} minutes. \ + Please add elution buffer at 65C to 12-well reservoir.' + ctx.delay(minutes=air_dry, msg=air_dry_msg) + flash_lights() + if not ctx.is_simulating(): + if music: + test_speaker('/var/lib/jupyter/notebooks/mr-blue-sky-ot2.mp3') + else: + test_speaker() + ctx.pause('Please check the Well Plate') - # Wash with SPM Buffer (2) - wash(spm2_wells, 'SPM (second wash)', fin_wash) + mag_deck.disengage() + # Add Elution Buffer + ctx.comment(f'Adding {elution_vol}uL Elution Buffer to samples') - # Air dry for 10 minutes - mag_deck.engage() - if add_water: - for src in mag_samps_h: + for idx, (col, src) in enumerate(zip(mag_samps_h, elution_wells)): m300.custom_pick_up() - m300.aspirate(100, h2o) - flow_rate(asp=30, disp=30) - m300.dispense(80, src) - ctx.delay(seconds=0.5) - m300.aspirate(100, src) - flow_rate() - m300.dispense(120, liquid_waste) - m300.blow_out() + m300.aspirate(elution_vol, src) + m300.slow_tip_withdrawal(10, src, to_surface=True) + m300.dispense_h(elution_vol, col) + if not off_deck: + m300.mix(10, 50, col) + m300.slow_tip_withdrawal(10, col, to_surface=True) + m300.blow_out(col.bottom(6)) + for _ in range(2): + m300.move_to(col.bottom(5)) + m300.move_to(col.bottom(6)) m300.drop_tip() - ctx.home() - air_dry_msg = f'Air drying the beads for {air_dry} minutes. \ -Please add elution buffer at 65C to 12-well reservoir.' - ctx.delay(minutes=air_dry, msg=air_dry_msg) - flash_lights() - if not ctx.is_simulating(): - if music: - test_speaker('/var/lib/jupyter/notebooks/mr-blue-sky-ot2.mp3') + flash_lights() + ctx.home() + if not ctx.is_simulating(): + if music: + test_speaker('/var/lib/jupyter/notebooks/all-i-want-ot2.mp3') + else: + test_speaker() + ctx.pause('Please remove samples and incubate at 65C for 5 minutes.\ + When complete, replace samples and click RESUME') + ctx.set_rail_lights(True) + + # Transfer elution to PCR plate + if not off_deck: + for col in mag_samps_h: + m300.custom_pick_up() + m300.mix(10, 50, col) + m300.slow_tip_withdrawal(10, col, to_surface=True) + m300.blow_out(col.bottom(6)) + for _ in range(2): + m300.move_to(col.bottom(5)) + m300.move_to(col.bottom(6)) + m300.drop_tip(home_after=False) else: - test_speaker() - ctx.pause('Please check the Well Plate') + ctx.comment('Please perform manual resupsension off deck.') - mag_deck.disengage() - # Add Elution Buffer - ctx.comment(f'Adding {elution_vol}uL Elution Buffer to samples') + mag_deck.engage() + mag_msg = 'Incubating on Mag Deck for 3 minutes' + ctx.delay(minutes=3, msg=mag_msg) - for idx, (col, src) in enumerate(zip(mag_samps_h, elution_wells)): - m300.custom_pick_up() - m300.aspirate(elution_vol, src) - m300.slow_tip_withdrawal(10, src, to_surface=True) - m300.dispense_h(elution_vol, col) - if not off_deck: - m300.mix(10, 50, col) - m300.slow_tip_withdrawal(10, col, to_surface=True) - m300.blow_out(col.bottom(6)) - for _ in range(2): - m300.move_to(col.bottom(5)) - m300.move_to(col.bottom(6)) - m300.drop_tip() + ctx.comment(f'Transferring {elution_vol}uL to final PCR plate') + t_start += num_cols + if t_start >= 60: + t_start -= 60 - flash_lights() - ctx.home() - if not ctx.is_simulating(): - if music: - test_speaker('/var/lib/jupyter/notebooks/all-i-want-ot2.mp3') - else: - test_speaker() - ctx.pause('Please remove samples and incubate at 65C for 5 minutes.\ -When complete, replace samples and click RESUME') - ctx.set_rail_lights(True) - - # Transfer elution to PCR plate - if not off_deck: - for col in mag_samps_h: + flow_rate(asp=20) + for src, dest, tip in zip(mag_samps, pcr_samps, all_tips[t_start:]): + w = int(str(src).split(' ')[0][1:]) + if src.width is not None: + radi = float(src.width)/4 + else: + radi = float(src.diameter)/4 + x0 = radi if w % 2 == 0 else -radi m300.custom_pick_up() - m300.mix(10, 50, col) - m300.slow_tip_withdrawal(10, col, to_surface=True) - m300.blow_out(col.bottom(6)) - for _ in range(2): - m300.move_to(col.bottom(5)) - m300.move_to(col.bottom(6)) - m300.drop_tip(home_after=False) - else: - ctx.comment('Please perform manual resupsension off deck.') - - mag_deck.engage() - mag_msg = 'Incubating on Mag Deck for 3 minutes' - ctx.delay(minutes=3, msg=mag_msg) - - ctx.comment(f'Transferring {elution_vol}uL to final PCR plate') - t_start += num_cols - if t_start >= 60: - t_start -= 60 - - flow_rate(asp=20) - for src, dest, tip in zip(mag_samps, pcr_samps, all_tips[t_start:]): - w = int(str(src).split(' ')[0][1:]) - if src.width is not None: - radi = float(src.width)/4 - else: - radi = float(src.diameter)/4 - x0 = radi if w % 2 == 0 else -radi - m300.custom_pick_up() - m300.aspirate( - elution_vol, src.bottom().move(types.Point(x=x0, y=0, z=1))) - m300.dispense(elution_vol, dest) - m300.drop_tip(tip) - - mag_deck.disengage() - ctx.comment('Protocol complete! Please store samples at -20C or \ -continue processing') + m300.aspirate( + elution_vol, src.bottom().move(types.Point(x=x0, y=0, z=1))) + m300.dispense(elution_vol, dest) + m300.drop_tip(tip) + + mag_deck.disengage() + ctx.comment('Protocol complete! Please store samples at -20C or \ + continue processing') diff --git a/protocols/spotsee/fields.json b/protocols/spotsee/fields.json index 9d59663d0..8333cedd4 100644 --- a/protocols/spotsee/fields.json +++ b/protocols/spotsee/fields.json @@ -1,7 +1,13 @@ [ { "type": "int", - "label": "Volume to each well (1-20ul)", + "label": "Number of cycles before new tip", + "name": "num_cycles", + "default": 20 + }, + { + "type": "int", + "label": "Volume to each well", "name": "vol", "default": 15 }, diff --git a/protocols/spotsee/spotsee.ot2.apiv2.py b/protocols/spotsee/spotsee.ot2.apiv2.py index f09502a69..85e72c989 100644 --- a/protocols/spotsee/spotsee.ot2.apiv2.py +++ b/protocols/spotsee/spotsee.ot2.apiv2.py @@ -8,9 +8,9 @@ def run(ctx): - [vol, labware, start_tip, + [num_cycles, vol, labware, start_tip, p20_mount, p300_mount] = get_values( # noqa: F821 - "vol", "labware", "start_tip", "p20_mount", "p300_mount") + "num_cycles", "vol", "labware", "start_tip", "p20_mount", "p300_mount") # p20_mount = 'left' # vol = 25 @@ -21,7 +21,7 @@ def run(ctx): # labware reservoir = ctx.load_labware('nest_1_reservoir_195ml', 10) plate = ctx.load_labware(labware, 1) - tips = [ctx.load_labware('opentrons_96_filtertiprack_20ul' if vol < 20 else 'opentrons_96_tiprack_300ul', slot) # noqa: E501 + tips = [ctx.load_labware('opentrons_96_filtertiprack_20ul' if vol < 10 else 'opentrons_96_tiprack_300ul', slot) # noqa: E501 for slot in [11]] red_wells = [ @@ -38,35 +38,35 @@ def run(ctx): # pipettes p20 = ctx.load_instrument('p20_single_gen2', p20_mount, tip_racks=tips) p300 = ctx.load_instrument('p300_single_gen2', p300_mount, tip_racks=tips) - pip = p20 if vol < 20 else p300 + pip = p20 if vol < 10 else p300 # mapping buffer = reservoir.wells()[0] # protocol - ctx.comment('\n---------------ADDING BUFFER TO PLATE----------------\n\n') - if labware == '80_well_plate': - num_asp = pip.max_volume // vol - chunks = [red_wells[i:i+num_asp] for i in range(0, len(red_wells), - num_asp)] + pip.pick_up_tip(tips[0].wells()[start_tip-1]) + for _ in range(num_cycles): + ctx.comment('\n-------------ADDING BUFFER TO PLATE-------------\n\n') + if labware == '80_well_plate': + num_asp = pip.max_volume // vol + chunks = [red_wells[i:i+num_asp] for i in range(0, len(red_wells), + num_asp)] + for chunk in chunks: + pip.aspirate(num_asp*vol, buffer) + for well in chunk: + pip.dispense(vol, plate.wells_by_name()[well]) + pip.move_to(plate.wells_by_name()[well].top(z=5)) - pip.pick_up_tip(tips[0].wells()[start_tip-1]) - for chunk in chunks: - pip.aspirate(num_asp*vol, buffer) - for well in chunk: - pip.dispense(vol, plate.wells_by_name()[well]) - pip.move_to(plate.wells_by_name()[well].top(z=5)) - pip.drop_tip() - else: - num_asp = pip.max_volume // vol - chunks = [plate.wells()[i:i+num_asp] for i in range(0, - len(plate.wells()), - num_asp)] + else: + num_asp = pip.max_volume // vol + chunks = [plate.wells()[i:i+num_asp] for i in range(0, + len(plate.wells()), + num_asp)] - pip.pick_up_tip(tips[0].wells()[start_tip-1]) - for chunk in chunks: - pip.aspirate(num_asp*vol, buffer) - for well in chunk: - pip.dispense(vol, well) - pip.move_to(well.top(z=5)) - pip.drop_tip() + for chunk in chunks: + pip.aspirate(num_asp*vol, buffer) + for well in chunk: + pip.dispense(vol, well) + pip.move_to(well.top(z=5)) + ctx.pause('Change Sheet on Deck') + pip.drop_tip() From 7998287d65b5032fb0b091ffeef797e93cc10610 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9Cramifarawi=E2=80=9D?= <“rami.farawi@opentrons.com”> Date: Mon, 1 Apr 2024 17:01:57 -0400 Subject: [PATCH 15/19] fix --- protoBuilds/spotsee/spotsee.ot2.apiv2.py.json | 2 +- protocols/spotsee/spotsee.ot2.apiv2.py | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/protoBuilds/spotsee/spotsee.ot2.apiv2.py.json b/protoBuilds/spotsee/spotsee.ot2.apiv2.py.json index 4f0bc1dcf..491abe2da 100644 --- a/protoBuilds/spotsee/spotsee.ot2.apiv2.py.json +++ b/protoBuilds/spotsee/spotsee.ot2.apiv2.py.json @@ -1,5 +1,5 @@ { - "content": "metadata = {\n 'protocolName': 'Spotsee Well Distribution Protocol',\n 'author': 'Rami Farawi ',\n 'source': 'Custom Protocol Request',\n 'apiLevel': '2.13'\n}\n\n\ndef run(ctx):\n\n [num_cycles, vol, labware, start_tip,\n p20_mount, p300_mount] = get_values( # noqa: F821\n \"num_cycles\", \"vol\", \"labware\", \"start_tip\", \"p20_mount\", \"p300_mount\")\n\n # p20_mount = 'left'\n # vol = 25\n # p300_mount = 'right'\n # labware = '40_well_plate'\n # start_tip = 4\n\n # labware\n reservoir = ctx.load_labware('nest_1_reservoir_195ml', 10)\n plate = ctx.load_labware(labware, 1)\n tips = [ctx.load_labware('opentrons_96_filtertiprack_20ul' if vol < 10 else 'opentrons_96_tiprack_300ul', slot) # noqa: E501\n for slot in [11]]\n\n red_wells = [\n 'J1', 'I1', 'H1', 'G1', 'F1', 'E1', 'D1', 'C1', 'B1', 'A1',\n 'A2', 'B2', 'C2', 'D2', 'E2', 'F2', 'G2', 'H2', 'I2', 'J2',\n 'J3', 'I3', 'H3', 'G3', 'F3', 'E3', 'D3', 'C3', 'B3', 'A3',\n 'A4', 'B4', 'C4', 'D4', 'E4', 'F4', 'G4', 'H4', 'I4', 'J4',\n 'J5', 'I5', 'H5', 'G5', 'F5', 'E5', 'D5', 'C5', 'B5', 'A5',\n 'A6', 'B6', 'C6', 'D6', 'E6', 'F6', 'G6', 'H6', 'I6', 'J6',\n 'J7', 'I7', 'H7', 'G7', 'F7', 'E7', 'D7', 'C7', 'B7', 'A7',\n 'A8', 'B8', 'C8', 'D8', 'E8', 'F8', 'G8', 'H8', 'I8', 'J8'\n ]\n\n # pipettes\n p20 = ctx.load_instrument('p20_single_gen2', p20_mount, tip_racks=tips)\n p300 = ctx.load_instrument('p300_single_gen2', p300_mount, tip_racks=tips)\n pip = p20 if vol < 10 else p300\n\n # mapping\n buffer = reservoir.wells()[0]\n\n # protocol\n pip.pick_up_tip(tips[0].wells()[start_tip-1])\n for _ in range(num_cycles):\n ctx.comment('\\n-------------ADDING BUFFER TO PLATE-------------\\n\\n')\n if labware == '80_well_plate':\n num_asp = pip.max_volume // vol\n chunks = [red_wells[i:i+num_asp] for i in range(0, len(red_wells),\n num_asp)]\n for chunk in chunks:\n pip.aspirate(num_asp*vol, buffer)\n for well in chunk:\n pip.dispense(vol, plate.wells_by_name()[well])\n pip.move_to(plate.wells_by_name()[well].top(z=5))\n\n else:\n num_asp = pip.max_volume // vol\n chunks = [plate.wells()[i:i+num_asp] for i in range(0,\n len(plate.wells()),\n num_asp)]\n\n for chunk in chunks:\n pip.aspirate(num_asp*vol, buffer)\n for well in chunk:\n pip.dispense(vol, well)\n pip.move_to(well.top(z=5))\n ctx.pause('Change Sheet on Deck')\n pip.drop_tip()\n", + "content": "metadata = {\n 'protocolName': 'Spotsee Well Distribution Protocol',\n 'author': 'Rami Farawi ',\n 'source': 'Custom Protocol Request',\n 'apiLevel': '2.13'\n}\n\n\ndef run(ctx):\n\n [num_cycles, vol, labware, start_tip,\n p20_mount, p300_mount] = get_values( # noqa: F821\n \"num_cycles\", \"vol\", \"labware\", \"start_tip\", \"p20_mount\", \"p300_mount\")\n\n # p20_mount = 'left'\n # vol = 25\n # p300_mount = 'right'\n # labware = '40_well_plate'\n # start_tip = 4\n\n # labware\n reservoir = ctx.load_labware('nest_1_reservoir_195ml', 10)\n plate = ctx.load_labware(labware, 1)\n tips = [ctx.load_labware('opentrons_96_filtertiprack_20ul' if vol < 10 else 'opentrons_96_tiprack_300ul', slot) # noqa: E501\n for slot in [11]]\n\n red_wells = [\n 'J1', 'I1', 'H1', 'G1', 'F1', 'E1', 'D1', 'C1', 'B1', 'A1',\n 'A2', 'B2', 'C2', 'D2', 'E2', 'F2', 'G2', 'H2', 'I2', 'J2',\n 'J3', 'I3', 'H3', 'G3', 'F3', 'E3', 'D3', 'C3', 'B3', 'A3',\n 'A4', 'B4', 'C4', 'D4', 'E4', 'F4', 'G4', 'H4', 'I4', 'J4',\n 'J5', 'I5', 'H5', 'G5', 'F5', 'E5', 'D5', 'C5', 'B5', 'A5',\n 'A6', 'B6', 'C6', 'D6', 'E6', 'F6', 'G6', 'H6', 'I6', 'J6',\n 'J7', 'I7', 'H7', 'G7', 'F7', 'E7', 'D7', 'C7', 'B7', 'A7',\n 'A8', 'B8', 'C8', 'D8', 'E8', 'F8', 'G8', 'H8', 'I8', 'J8'\n ]\n\n # pipettes\n p20 = ctx.load_instrument('p20_single_gen2', p20_mount, tip_racks=tips)\n p300 = ctx.load_instrument('p300_single_gen2', p300_mount, tip_racks=tips)\n pip = p20 if vol < 10 else p300\n\n # mapping\n buffer = reservoir.wells()[0]\n\n # protocol\n pip.pick_up_tip(tips[0].wells()[start_tip-1])\n\n for _ in range(num_cycles):\n ctx.comment('\\n-------------ADDING BUFFER TO PLATE-------------\\n\\n')\n if labware == '80_well_plate':\n num_asp = pip.max_volume // vol\n\n chunks = [red_wells[i:i+num_asp] for i in range(0, len(red_wells),\n num_asp)]\n\n for chunk in chunks:\n pip.aspirate(num_asp*vol, buffer)\n for well in chunk:\n pip.dispense(vol, plate.wells_by_name()[well])\n pip.move_to(plate.wells_by_name()[well].top(z=5))\n\n else:\n num_asp = pip.max_volume // vol\n chunks = [plate.wells()[i:i+num_asp] for i in range(0,\n len(plate.wells()),\n num_asp)]\n\n for chunk in chunks:\n pip.aspirate(num_asp*vol, buffer)\n for well in chunk:\n pip.dispense(vol, well)\n pip.move_to(well.top(z=5))\n pip.dispense(pip.current_volume, buffer.top())\n ctx.pause('Change Sheet on Deck')\n pip.drop_tip()\n", "custom_labware_defs": [ { "brand": { diff --git a/protocols/spotsee/spotsee.ot2.apiv2.py b/protocols/spotsee/spotsee.ot2.apiv2.py index 85e72c989..a6e2c53ad 100644 --- a/protocols/spotsee/spotsee.ot2.apiv2.py +++ b/protocols/spotsee/spotsee.ot2.apiv2.py @@ -45,12 +45,15 @@ def run(ctx): # protocol pip.pick_up_tip(tips[0].wells()[start_tip-1]) + for _ in range(num_cycles): ctx.comment('\n-------------ADDING BUFFER TO PLATE-------------\n\n') if labware == '80_well_plate': num_asp = pip.max_volume // vol + chunks = [red_wells[i:i+num_asp] for i in range(0, len(red_wells), num_asp)] + for chunk in chunks: pip.aspirate(num_asp*vol, buffer) for well in chunk: @@ -68,5 +71,6 @@ def run(ctx): for well in chunk: pip.dispense(vol, well) pip.move_to(well.top(z=5)) + pip.dispense(pip.current_volume, buffer.top()) ctx.pause('Change Sheet on Deck') pip.drop_tip() From 45abd2f16b454541cfd7e7e7c2fa6b25b1560ed0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9Cramifarawi=E2=80=9D?= <“rami.farawi@opentrons.com”> Date: Thu, 4 Apr 2024 16:25:50 -0400 Subject: [PATCH 16/19] fix --- protocols/spotsee/spotsee.ot2.apiv2.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/protocols/spotsee/spotsee.ot2.apiv2.py b/protocols/spotsee/spotsee.ot2.apiv2.py index a6e2c53ad..1611c297f 100644 --- a/protocols/spotsee/spotsee.ot2.apiv2.py +++ b/protocols/spotsee/spotsee.ot2.apiv2.py @@ -46,7 +46,7 @@ def run(ctx): # protocol pip.pick_up_tip(tips[0].wells()[start_tip-1]) - for _ in range(num_cycles): + for cycle in range(num_cycles): ctx.comment('\n-------------ADDING BUFFER TO PLATE-------------\n\n') if labware == '80_well_plate': num_asp = pip.max_volume // vol @@ -59,6 +59,7 @@ def run(ctx): for well in chunk: pip.dispense(vol, plate.wells_by_name()[well]) pip.move_to(plate.wells_by_name()[well].top(z=5)) + ctx.comment(f'This is sheet number {cycle+1} out of total {num_cycles} sheets') # noqa: E501 else: num_asp = pip.max_volume // vol @@ -71,6 +72,8 @@ def run(ctx): for well in chunk: pip.dispense(vol, well) pip.move_to(well.top(z=5)) + ctx.comment(f'This is sheet number {cycle+1} out of total {num_cycles} sheets') # noqa: E501 + pip.dispense(pip.current_volume, buffer.top()) ctx.pause('Change Sheet on Deck') pip.drop_tip() From 316183270205360d905d3f8808f8a7278915d853 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9Cramifarawi=E2=80=9D?= <“rami.farawi@opentrons.com”> Date: Thu, 4 Apr 2024 16:26:46 -0400 Subject: [PATCH 17/19] fix --- protoBuilds/spotsee/spotsee.ot2.apiv2.py.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/protoBuilds/spotsee/spotsee.ot2.apiv2.py.json b/protoBuilds/spotsee/spotsee.ot2.apiv2.py.json index 491abe2da..ec08d485f 100644 --- a/protoBuilds/spotsee/spotsee.ot2.apiv2.py.json +++ b/protoBuilds/spotsee/spotsee.ot2.apiv2.py.json @@ -1,5 +1,5 @@ { - "content": "metadata = {\n 'protocolName': 'Spotsee Well Distribution Protocol',\n 'author': 'Rami Farawi ',\n 'source': 'Custom Protocol Request',\n 'apiLevel': '2.13'\n}\n\n\ndef run(ctx):\n\n [num_cycles, vol, labware, start_tip,\n p20_mount, p300_mount] = get_values( # noqa: F821\n \"num_cycles\", \"vol\", \"labware\", \"start_tip\", \"p20_mount\", \"p300_mount\")\n\n # p20_mount = 'left'\n # vol = 25\n # p300_mount = 'right'\n # labware = '40_well_plate'\n # start_tip = 4\n\n # labware\n reservoir = ctx.load_labware('nest_1_reservoir_195ml', 10)\n plate = ctx.load_labware(labware, 1)\n tips = [ctx.load_labware('opentrons_96_filtertiprack_20ul' if vol < 10 else 'opentrons_96_tiprack_300ul', slot) # noqa: E501\n for slot in [11]]\n\n red_wells = [\n 'J1', 'I1', 'H1', 'G1', 'F1', 'E1', 'D1', 'C1', 'B1', 'A1',\n 'A2', 'B2', 'C2', 'D2', 'E2', 'F2', 'G2', 'H2', 'I2', 'J2',\n 'J3', 'I3', 'H3', 'G3', 'F3', 'E3', 'D3', 'C3', 'B3', 'A3',\n 'A4', 'B4', 'C4', 'D4', 'E4', 'F4', 'G4', 'H4', 'I4', 'J4',\n 'J5', 'I5', 'H5', 'G5', 'F5', 'E5', 'D5', 'C5', 'B5', 'A5',\n 'A6', 'B6', 'C6', 'D6', 'E6', 'F6', 'G6', 'H6', 'I6', 'J6',\n 'J7', 'I7', 'H7', 'G7', 'F7', 'E7', 'D7', 'C7', 'B7', 'A7',\n 'A8', 'B8', 'C8', 'D8', 'E8', 'F8', 'G8', 'H8', 'I8', 'J8'\n ]\n\n # pipettes\n p20 = ctx.load_instrument('p20_single_gen2', p20_mount, tip_racks=tips)\n p300 = ctx.load_instrument('p300_single_gen2', p300_mount, tip_racks=tips)\n pip = p20 if vol < 10 else p300\n\n # mapping\n buffer = reservoir.wells()[0]\n\n # protocol\n pip.pick_up_tip(tips[0].wells()[start_tip-1])\n\n for _ in range(num_cycles):\n ctx.comment('\\n-------------ADDING BUFFER TO PLATE-------------\\n\\n')\n if labware == '80_well_plate':\n num_asp = pip.max_volume // vol\n\n chunks = [red_wells[i:i+num_asp] for i in range(0, len(red_wells),\n num_asp)]\n\n for chunk in chunks:\n pip.aspirate(num_asp*vol, buffer)\n for well in chunk:\n pip.dispense(vol, plate.wells_by_name()[well])\n pip.move_to(plate.wells_by_name()[well].top(z=5))\n\n else:\n num_asp = pip.max_volume // vol\n chunks = [plate.wells()[i:i+num_asp] for i in range(0,\n len(plate.wells()),\n num_asp)]\n\n for chunk in chunks:\n pip.aspirate(num_asp*vol, buffer)\n for well in chunk:\n pip.dispense(vol, well)\n pip.move_to(well.top(z=5))\n pip.dispense(pip.current_volume, buffer.top())\n ctx.pause('Change Sheet on Deck')\n pip.drop_tip()\n", + "content": "metadata = {\n 'protocolName': 'Spotsee Well Distribution Protocol',\n 'author': 'Rami Farawi ',\n 'source': 'Custom Protocol Request',\n 'apiLevel': '2.13'\n}\n\n\ndef run(ctx):\n\n [num_cycles, vol, labware, start_tip,\n p20_mount, p300_mount] = get_values( # noqa: F821\n \"num_cycles\", \"vol\", \"labware\", \"start_tip\", \"p20_mount\", \"p300_mount\")\n\n # p20_mount = 'left'\n # vol = 25\n # p300_mount = 'right'\n # labware = '40_well_plate'\n # start_tip = 4\n\n # labware\n reservoir = ctx.load_labware('nest_1_reservoir_195ml', 10)\n plate = ctx.load_labware(labware, 1)\n tips = [ctx.load_labware('opentrons_96_filtertiprack_20ul' if vol < 10 else 'opentrons_96_tiprack_300ul', slot) # noqa: E501\n for slot in [11]]\n\n red_wells = [\n 'J1', 'I1', 'H1', 'G1', 'F1', 'E1', 'D1', 'C1', 'B1', 'A1',\n 'A2', 'B2', 'C2', 'D2', 'E2', 'F2', 'G2', 'H2', 'I2', 'J2',\n 'J3', 'I3', 'H3', 'G3', 'F3', 'E3', 'D3', 'C3', 'B3', 'A3',\n 'A4', 'B4', 'C4', 'D4', 'E4', 'F4', 'G4', 'H4', 'I4', 'J4',\n 'J5', 'I5', 'H5', 'G5', 'F5', 'E5', 'D5', 'C5', 'B5', 'A5',\n 'A6', 'B6', 'C6', 'D6', 'E6', 'F6', 'G6', 'H6', 'I6', 'J6',\n 'J7', 'I7', 'H7', 'G7', 'F7', 'E7', 'D7', 'C7', 'B7', 'A7',\n 'A8', 'B8', 'C8', 'D8', 'E8', 'F8', 'G8', 'H8', 'I8', 'J8'\n ]\n\n # pipettes\n p20 = ctx.load_instrument('p20_single_gen2', p20_mount, tip_racks=tips)\n p300 = ctx.load_instrument('p300_single_gen2', p300_mount, tip_racks=tips)\n pip = p20 if vol < 10 else p300\n\n # mapping\n buffer = reservoir.wells()[0]\n\n # protocol\n pip.pick_up_tip(tips[0].wells()[start_tip-1])\n\n for cycle in range(num_cycles):\n ctx.comment('\\n-------------ADDING BUFFER TO PLATE-------------\\n\\n')\n if labware == '80_well_plate':\n num_asp = pip.max_volume // vol\n\n chunks = [red_wells[i:i+num_asp] for i in range(0, len(red_wells),\n num_asp)]\n\n for chunk in chunks:\n pip.aspirate(num_asp*vol, buffer)\n for well in chunk:\n pip.dispense(vol, plate.wells_by_name()[well])\n pip.move_to(plate.wells_by_name()[well].top(z=5))\n ctx.comment(f'This is sheet number {cycle+1} out of total {num_cycles} sheets') # noqa: E501\n\n else:\n num_asp = pip.max_volume // vol\n chunks = [plate.wells()[i:i+num_asp] for i in range(0,\n len(plate.wells()),\n num_asp)]\n\n for chunk in chunks:\n pip.aspirate(num_asp*vol, buffer)\n for well in chunk:\n pip.dispense(vol, well)\n pip.move_to(well.top(z=5))\n ctx.comment(f'This is sheet number {cycle+1} out of total {num_cycles} sheets') # noqa: E501\n\n pip.dispense(pip.current_volume, buffer.top())\n ctx.pause('Change Sheet on Deck')\n pip.drop_tip()\n", "custom_labware_defs": [ { "brand": { From a3b5859b461807855e268ef61b3d2080be3213d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9Cramifarawi=E2=80=9D?= <“rami.farawi@opentrons.com”> Date: Thu, 25 Apr 2024 10:49:46 -0400 Subject: [PATCH 18/19] fi --- data/data/fields.csv | 2 ++ protoBuilds/spotsee/spotsee.ot2.apiv2.py.json | 32 ++++++++++++++++++- protocols/spotsee/fields.json | 19 +++++++++++ protocols/spotsee/spotsee.ot2.apiv2.py | 14 +++++--- 4 files changed, 62 insertions(+), 5 deletions(-) diff --git a/data/data/fields.csv b/data/data/fields.csv index 3adf671c7..5fddc01e5 100644 --- a/data/data/fields.csv +++ b/data/data/fields.csv @@ -1614,6 +1614,8 @@ use_filter_tips_left,2 use_filter_tips_right,2 use_middle_2,2 use_nacl,1 +use_p20,1 +use_p300,1 use_single_source,1 use_temp,1 use_tuberack_a,1 diff --git a/protoBuilds/spotsee/spotsee.ot2.apiv2.py.json b/protoBuilds/spotsee/spotsee.ot2.apiv2.py.json index ec08d485f..8ec1a01ea 100644 --- a/protoBuilds/spotsee/spotsee.ot2.apiv2.py.json +++ b/protoBuilds/spotsee/spotsee.ot2.apiv2.py.json @@ -1,5 +1,5 @@ { - "content": "metadata = {\n 'protocolName': 'Spotsee Well Distribution Protocol',\n 'author': 'Rami Farawi ',\n 'source': 'Custom Protocol Request',\n 'apiLevel': '2.13'\n}\n\n\ndef run(ctx):\n\n [num_cycles, vol, labware, start_tip,\n p20_mount, p300_mount] = get_values( # noqa: F821\n \"num_cycles\", \"vol\", \"labware\", \"start_tip\", \"p20_mount\", \"p300_mount\")\n\n # p20_mount = 'left'\n # vol = 25\n # p300_mount = 'right'\n # labware = '40_well_plate'\n # start_tip = 4\n\n # labware\n reservoir = ctx.load_labware('nest_1_reservoir_195ml', 10)\n plate = ctx.load_labware(labware, 1)\n tips = [ctx.load_labware('opentrons_96_filtertiprack_20ul' if vol < 10 else 'opentrons_96_tiprack_300ul', slot) # noqa: E501\n for slot in [11]]\n\n red_wells = [\n 'J1', 'I1', 'H1', 'G1', 'F1', 'E1', 'D1', 'C1', 'B1', 'A1',\n 'A2', 'B2', 'C2', 'D2', 'E2', 'F2', 'G2', 'H2', 'I2', 'J2',\n 'J3', 'I3', 'H3', 'G3', 'F3', 'E3', 'D3', 'C3', 'B3', 'A3',\n 'A4', 'B4', 'C4', 'D4', 'E4', 'F4', 'G4', 'H4', 'I4', 'J4',\n 'J5', 'I5', 'H5', 'G5', 'F5', 'E5', 'D5', 'C5', 'B5', 'A5',\n 'A6', 'B6', 'C6', 'D6', 'E6', 'F6', 'G6', 'H6', 'I6', 'J6',\n 'J7', 'I7', 'H7', 'G7', 'F7', 'E7', 'D7', 'C7', 'B7', 'A7',\n 'A8', 'B8', 'C8', 'D8', 'E8', 'F8', 'G8', 'H8', 'I8', 'J8'\n ]\n\n # pipettes\n p20 = ctx.load_instrument('p20_single_gen2', p20_mount, tip_racks=tips)\n p300 = ctx.load_instrument('p300_single_gen2', p300_mount, tip_racks=tips)\n pip = p20 if vol < 10 else p300\n\n # mapping\n buffer = reservoir.wells()[0]\n\n # protocol\n pip.pick_up_tip(tips[0].wells()[start_tip-1])\n\n for cycle in range(num_cycles):\n ctx.comment('\\n-------------ADDING BUFFER TO PLATE-------------\\n\\n')\n if labware == '80_well_plate':\n num_asp = pip.max_volume // vol\n\n chunks = [red_wells[i:i+num_asp] for i in range(0, len(red_wells),\n num_asp)]\n\n for chunk in chunks:\n pip.aspirate(num_asp*vol, buffer)\n for well in chunk:\n pip.dispense(vol, plate.wells_by_name()[well])\n pip.move_to(plate.wells_by_name()[well].top(z=5))\n ctx.comment(f'This is sheet number {cycle+1} out of total {num_cycles} sheets') # noqa: E501\n\n else:\n num_asp = pip.max_volume // vol\n chunks = [plate.wells()[i:i+num_asp] for i in range(0,\n len(plate.wells()),\n num_asp)]\n\n for chunk in chunks:\n pip.aspirate(num_asp*vol, buffer)\n for well in chunk:\n pip.dispense(vol, well)\n pip.move_to(well.top(z=5))\n ctx.comment(f'This is sheet number {cycle+1} out of total {num_cycles} sheets') # noqa: E501\n\n pip.dispense(pip.current_volume, buffer.top())\n ctx.pause('Change Sheet on Deck')\n pip.drop_tip()\n", + "content": "metadata = {\n 'protocolName': 'Spotsee Well Distribution Protocol',\n 'author': 'Rami Farawi ',\n 'source': 'Custom Protocol Request',\n 'apiLevel': '2.13'\n}\n\n\ndef run(ctx):\n\n [num_cycles, vol, labware, start_tip,\n p20_mount, use_p20, p300_mount, use_p300] = get_values( # noqa: F821\n \"num_cycles\", \"vol\", \"labware\", \"start_tip\", \"p20_mount\", \"use_p20\",\n \"p300_mount\", \"use_p300\")\n\n # p20_mount = 'left'\n # vol = 25\n # p300_mount = 'right'\n # labware = '40_well_plate'\n # start_tip = 4\n\n # labware\n reservoir = ctx.load_labware('nest_1_reservoir_195ml', 10)\n plate = ctx.load_labware(labware, 1)\n tips = [ctx.load_labware('opentrons_96_filtertiprack_20ul' if vol < 10 else 'opentrons_96_tiprack_300ul', slot) # noqa: E501\n for slot in [11]]\n\n red_wells = [\n 'J1', 'I1', 'H1', 'G1', 'F1', 'E1', 'D1', 'C1', 'B1', 'A1',\n 'A2', 'B2', 'C2', 'D2', 'E2', 'F2', 'G2', 'H2', 'I2', 'J2',\n 'J3', 'I3', 'H3', 'G3', 'F3', 'E3', 'D3', 'C3', 'B3', 'A3',\n 'A4', 'B4', 'C4', 'D4', 'E4', 'F4', 'G4', 'H4', 'I4', 'J4',\n 'J5', 'I5', 'H5', 'G5', 'F5', 'E5', 'D5', 'C5', 'B5', 'A5',\n 'A6', 'B6', 'C6', 'D6', 'E6', 'F6', 'G6', 'H6', 'I6', 'J6',\n 'J7', 'I7', 'H7', 'G7', 'F7', 'E7', 'D7', 'C7', 'B7', 'A7',\n 'A8', 'B8', 'C8', 'D8', 'E8', 'F8', 'G8', 'H8', 'I8', 'J8'\n ]\n\n # pipettes\n if use_p20:\n p20 = ctx.load_instrument('p20_single_gen2', p20_mount,\n tip_racks=tips)\n if use_p300:\n p300 = ctx.load_instrument('p300_single_gen2', p300_mount,\n tip_racks=tips)\n\n pip = p20 if vol < 10 else p300\n\n # mapping\n buffer = reservoir.wells()[0]\n\n # protocol\n pip.pick_up_tip(tips[0].wells()[start_tip-1])\n\n for cycle in range(num_cycles):\n ctx.comment('\\n-------------ADDING BUFFER TO PLATE-------------\\n\\n')\n if labware == '80_well_plate':\n num_asp = pip.max_volume // vol\n\n chunks = [red_wells[i:i+num_asp] for i in range(0, len(red_wells),\n num_asp)]\n\n for chunk in chunks:\n pip.aspirate(num_asp*vol, buffer)\n for well in chunk:\n pip.dispense(vol, plate.wells_by_name()[well])\n pip.move_to(plate.wells_by_name()[well].top(z=5))\n ctx.comment(f'This is sheet number {cycle+1} out of total {num_cycles} sheets') # noqa: E501\n\n else:\n num_asp = pip.max_volume // vol\n chunks = [plate.wells()[i:i+num_asp] for i in range(0,\n len(plate.wells()),\n num_asp)]\n\n for chunk in chunks:\n pip.aspirate(num_asp*vol, buffer)\n for well in chunk:\n pip.dispense(vol, well)\n pip.move_to(well.top(z=5))\n ctx.comment(f'This is sheet number {cycle+1} out of total {num_cycles} sheets') # noqa: E501\n\n pip.dispense(pip.current_volume, buffer.top())\n ctx.pause('Change Sheet on Deck')\n pip.drop_tip()\n", "custom_labware_defs": [ { "brand": { @@ -1591,6 +1591,21 @@ ], "type": "dropDown" }, + { + "label": "Use P20 pipette in protocol?", + "name": "use_p20", + "options": [ + { + "label": "Yes, my P20 pipette is on the robot", + "value": true + }, + { + "label": "No, my P20 pipette is not on the robot", + "value": false + } + ], + "type": "dropDown" + }, { "label": "P300 Single-Channel Mount", "name": "p300_mount", @@ -1605,6 +1620,21 @@ } ], "type": "dropDown" + }, + { + "label": "Use P300 pipette in protocol?", + "name": "use_p300", + "options": [ + { + "label": "Yes, my P300 pipette is on the robot", + "value": true + }, + { + "label": "No, my P300 pipette is not on the robot", + "value": false + } + ], + "type": "dropDown" } ], "instruments": [ diff --git a/protocols/spotsee/fields.json b/protocols/spotsee/fields.json index 8333cedd4..16f53fae6 100644 --- a/protocols/spotsee/fields.json +++ b/protocols/spotsee/fields.json @@ -35,6 +35,16 @@ {"label": "Right", "value": "right"} ] }, + { + "type": "dropDown", + "label": "Use P20 pipette in protocol?", + "name": "use_p20", + "options": [ + {"label": "Yes, my P20 pipette is on the robot", "value": true}, + {"label": "No, my P20 pipette is not on the robot", "value": false} + ] + }, + { "type": "dropDown", "label": "P300 Single-Channel Mount", @@ -43,5 +53,14 @@ {"label": "Right", "value": "right"}, {"label": "Left", "value": "left"} ] + }, + { + "type": "dropDown", + "label": "Use P300 pipette in protocol?", + "name": "use_p300", + "options": [ + {"label": "Yes, my P300 pipette is on the robot", "value": true}, + {"label": "No, my P300 pipette is not on the robot", "value": false} + ] } ] diff --git a/protocols/spotsee/spotsee.ot2.apiv2.py b/protocols/spotsee/spotsee.ot2.apiv2.py index 1611c297f..3f6a29f3b 100644 --- a/protocols/spotsee/spotsee.ot2.apiv2.py +++ b/protocols/spotsee/spotsee.ot2.apiv2.py @@ -9,8 +9,9 @@ def run(ctx): [num_cycles, vol, labware, start_tip, - p20_mount, p300_mount] = get_values( # noqa: F821 - "num_cycles", "vol", "labware", "start_tip", "p20_mount", "p300_mount") + p20_mount, use_p20, p300_mount, use_p300] = get_values( # noqa: F821 + "num_cycles", "vol", "labware", "start_tip", "p20_mount", "use_p20", + "p300_mount", "use_p300") # p20_mount = 'left' # vol = 25 @@ -36,8 +37,13 @@ def run(ctx): ] # pipettes - p20 = ctx.load_instrument('p20_single_gen2', p20_mount, tip_racks=tips) - p300 = ctx.load_instrument('p300_single_gen2', p300_mount, tip_racks=tips) + if use_p20: + p20 = ctx.load_instrument('p20_single_gen2', p20_mount, + tip_racks=tips) + if use_p300: + p300 = ctx.load_instrument('p300_single_gen2', p300_mount, + tip_racks=tips) + pip = p20 if vol < 10 else p300 # mapping From 0df497a3b6f3afb19ba27462ba83f1d702614b71 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9Cramifarawi=E2=80=9D?= <“rami.farawi@opentrons.com”> Date: Tue, 7 May 2024 14:19:15 -0400 Subject: [PATCH 19/19] fix --- protoBuilds/0909e6/README.json | 30 -- .../0909e6/media_transfer.ot2.apiv2.py.json | 118 ------ protoBuilds/0909e6/metadata.json | 20 -- protocols/0909e6/README.md | 55 --- protocols/0909e6/fields.json | 35 -- protocols/0909e6/media_transfer.ot2.apiv2.py | 338 ------------------ 6 files changed, 596 deletions(-) delete mode 100644 protoBuilds/0909e6/README.json delete mode 100644 protoBuilds/0909e6/media_transfer.ot2.apiv2.py.json delete mode 100644 protoBuilds/0909e6/metadata.json delete mode 100644 protocols/0909e6/README.md delete mode 100644 protocols/0909e6/fields.json delete mode 100644 protocols/0909e6/media_transfer.ot2.apiv2.py diff --git a/protoBuilds/0909e6/README.json b/protoBuilds/0909e6/README.json deleted file mode 100644 index f6363fa5c..000000000 --- a/protoBuilds/0909e6/README.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "author": "Opentrons", - "categories": { - "Sterile Workflows": [ - "Cell Culture" - ] - }, - "deck-setup": "", - "description": "This protocol performs a custom 12-factor cell culture assay in a 96-deepwell plate. Please use this example .csv template to format your worklist! When uploading your file below, please ensure it is saved in the format .csv.", - "internal": "0909e6", - "labware": "\nOpentrons 6 Tube Rack with Falcon 50 mL Conical\nUSA Scientific 96 Deep Well Plate 2.4 mL #1896-2000\nOpentrons 96 Filter Tip Rack 200 \u00b5L\nOpentrons 96 Filter Tip Rack 1000 \u00b5L\n", - "markdown": { - "author": "[Opentrons](https://opentrons.com/)\n\n\n\n\n", - "categories": "* Sterile Workflows\n\t* Cell Culture\n\n\n", - "deck-setup": "![deck](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/0909e6/deck3.png)\n\n\n", - "description": "This protocol performs a custom 12-factor cell culture assay in a 96-deepwell plate. Please use [this example .csv template](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/0909e6/ex4.csv) to format your worklist! When uploading your file below, please ensure it is saved in the format `.csv`.\n\n\n", - "internal": "0909e6\n", - "labware": "* [Opentrons 6 Tube Rack with Falcon 50 mL Conical](https://shop.opentrons.com/collections/opentrons-tips/products/tube-rack-set-1)\n* [USA Scientific 96 Deep Well Plate 2.4 mL #1896-2000](https://www.usascientific.com/2ml-deep96-well-plateone-bulk.aspx)\n* Opentrons 96 Filter Tip Rack 200 \u00b5L\n* Opentrons 96 Filter Tip Rack 1000 \u00b5L\n\n\n", - "notes": "If you have any questions about this protocol, please contact the Protocol Development Team by filling out the [Troubleshooting Survey](https://protocol-troubleshooting.paperform.co/).\n\n\n", - "pipettes": "* [Opentrons P1000 Single Channel Electronic Pipette (GEN2)](https://shop.opentrons.com/single-channel-electronic-pipette-p20/)\n* [Opentrons P300 Single Channel Electronic Pipette (GEN2)](https://shop.opentrons.com/single-channel-electronic-pipette-p20/)\n\n\n", - "process": "1. Input your protocol parameters above.\n2. Download your protocol and unzip if needed.\n3. Upload your custom labware to the [OT App](https://opentrons.com/ot-app) by navigating to `More` > `Custom Labware` > `Add Labware`, and selecting your labware files (.json extensions) if needed.\n4. Upload your protocol file (.py extension) to the [OT App](https://opentrons.com/ot-app) in the `Protocol` tab.\n5. Set up your deck according to the deck map.\n6. Calibrate your labware, tiprack and pipette using the OT App. For calibration tips, check out our [support articles](https://support.opentrons.com/en/collections/1559720-guide-for-getting-started-with-the-ot-2).\n7. Hit \"Run\".\n\n\n", - "reagent-setup": "![reagents](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/0909e6/reagents2.png) \nNOTE that factors 16-30 are arranged in the same format as factors 1-15.\n\n\n", - "title": "DOE" - }, - "notes": "If you have any questions about this protocol, please contact the Protocol Development Team by filling out the Troubleshooting Survey.", - "pipettes": "\nOpentrons P1000 Single Channel Electronic Pipette (GEN2)\nOpentrons P300 Single Channel Electronic Pipette (GEN2)\n", - "process": "\nInput your protocol parameters above.\nDownload your protocol and unzip if needed.\nUpload your custom labware to the OT App by navigating to More > Custom Labware > Add Labware, and selecting your labware files (.json extensions) if needed.\nUpload your protocol file (.py extension) to the OT App in the Protocol tab.\nSet up your deck according to the deck map.\nCalibrate your labware, tiprack and pipette using the OT App. For calibration tips, check out our support articles.\nHit \"Run\".\n", - "reagent-setup": "\nNOTE that factors 16-30 are arranged in the same format as factors 1-15.", - "title": "DOE" -} \ No newline at end of file diff --git a/protoBuilds/0909e6/media_transfer.ot2.apiv2.py.json b/protoBuilds/0909e6/media_transfer.ot2.apiv2.py.json deleted file mode 100644 index ed791824e..000000000 --- a/protoBuilds/0909e6/media_transfer.ot2.apiv2.py.json +++ /dev/null @@ -1,118 +0,0 @@ -{ - "content": "import math\nfrom opentrons.protocol_api.labware import Well\nfrom opentrons.protocols.api_support.types import APIVersion\nfrom opentrons.types import Point\n\nmetadata = {\n 'protocolName': 'DOE',\n 'author': 'Nick self.min_height:\n self.height = self.height - dh\n else:\n self.height = self.min_height\n if self.current_volume - vol > 0:\n self.current_volume = self.current_volume - vol\n else:\n self.current_volume = 0\n return self.well.bottom(self.height)\n\n def height_inc(self, vol):\n dh = (vol/(math.pi*(self.radius**2)))*self.comp_coeff\n if self.height + dh < self.depth:\n self.height = self.height + dh\n else:\n self.height = self.depth\n self.current_volume += vol\n return self.well.bottom(self.height + 20)\n\n # labware\n tuberack50 = ctx.load_labware('opentrons_6_tuberack_falcon_50ml_conical',\n '1', 'media tuberack')\n tuberacks15 = [\n ctx.load_labware(\n 'opentrons_15_tuberack_falcon_15ml_conical', slot,\n f'factors {tube_set}')\n for i, (slot, tube_set) in enumerate(\n zip(['4', '7'], ['1-15', '16-30']))]\n tuberacks2 = [\n ctx.load_labware(\n 'opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap', slot,\n f'factors {tube_set}')\n for i, (slot, tube_set) in enumerate(\n zip(['5', '8'], ['31-54', '55-78']))]\n plate = ctx.load_labware('usascientific_96_wellplate_2.4ml_deep', '2')\n tiprack_small = [ctx.load_labware(tiprack_small_type, '3')]\n tiprack1000 = [\n ctx.load_labware('opentrons_96_filtertiprack_1000ul', slot)\n for slot in ['6']]\n\n # pipettes\n pip_small = ctx.load_instrument(type_pipette_small, 'left',\n tip_racks=tiprack_small)\n p1000 = ctx.load_instrument('p1000_single_gen2', 'right',\n tip_racks=tiprack1000)\n\n # reagents\n vol_media_list = [float(val) for val in vol_media_tubes.split(',')]\n media_rows_ordered = [tube for row in tuberack50.rows() for tube in row]\n media = [\n WellH(well, current_volume=vol, height=well.depth*(vol/50000)*0.9)\n for well, vol in zip(\n media_rows_ordered[:len(vol_media_list)],\n [vol_media_tube*1000 for vol_media_tube in vol_media_list])]\n\n # parse data\n factor_data = [\n [float(val) for val in line.split(',')[1:] if val.strip()]\n for line in csv_factors.splitlines()[3:]\n ]\n\n all_factor_tubes = [\n well for rack_set in [tuberacks15, tuberacks2]\n for rack in rack_set\n for well in rack.wells()]\n\n factor_indices = [\n int(cell.strip().split(' ')[-1]) - 1\n for cell in csv_factors.splitlines()[0].split(',')[1:]\n if cell.strip()]\n factor_tubes = [\n all_factor_tubes[ind] for ind in factor_indices]\n factor_viscosities = [\n bool(visc) for visc in csv_factors.splitlines()[1].split(',')[1:]\n if visc.strip()]\n factor_volumes_ul = [\n float(cell)*1000 for cell in csv_factors.splitlines()[2].split(',')[1:]\n if cell.strip()]\n # ref_vol = tuberacks15[0].wells()[0].max_volume / 1000 # 2ml or 15ml\n # ref_height = tuberacks15[0].wells()[0].depth\n factor_heights = [\n # ensure tip is submerged\n round(factor_vol/(factor_tube.max_volume)*factor_tube.depth*0.9,\n 1)\n for factor_tube, factor_vol in zip(factor_tubes, factor_volumes_ul)]\n factors = [\n WellH(well, current_volume=vol, height=height)\n for well, vol, height in zip(\n factor_tubes, factor_volumes_ul, factor_heights)]\n\n def slow_withdraw(well, pip=p1000, delay_s=2.0):\n ctx.max_speeds['A'] = 25\n ctx.max_speeds['Z'] = 25\n if delay_s > 0:\n ctx.delay(seconds=delay_s)\n pip.move_to(well.top())\n del ctx.max_speeds['A']\n del ctx.max_speeds['Z']\n\n def split_media_vol(vol):\n num_transfers = math.ceil(vol/(1000-vol_pre_airgap_1000))\n vol_per_transfer = round(vol/num_transfers, 1)\n return [vol_per_transfer]*num_transfers\n\n # iterate\n iterator_media = iter(media)\n current_media = next(iterator_media)\n\n def check_media(vol):\n nonlocal current_media\n if current_media.current_volume - vol < current_media.min_vol:\n current_media = next(iterator_media)\n\n def custom_distribute(info, pip):\n pip_volume = pip.tip_racks[0].wells()[0].max_volume\n vol_pre_airgap = vol_pre_airgap_small if pip == \\\n pip_small else vol_pre_airgap_1000\n max_vol = pip_volume\n sets = []\n running = []\n current_vol = 0\n for d in info:\n well = [key for key in d.keys()][0]\n vol = [val for val in d.values()][0]\n if vol > 0:\n if current_vol + vol + vol_pre_airgap > max_vol:\n sets.append(running)\n running = []\n current_vol = 0\n running.append({well: vol})\n current_vol += vol + vol_pre_airgap\n sets.append(running)\n return sets\n\n # transfer media\n p1000.pick_up_tip()\n wells_ordered = [well for row in plate.rows() for well in row]\n vols_media = [\n float(line.split(',')[0]) for line in csv_factors.splitlines()[3:]]\n media_info = []\n for well, vol_media in zip(wells_ordered, vols_media):\n vols_split = split_media_vol(vol_media)\n for vol in vols_split:\n media_info.append({well: vol})\n\n wells_h = [\n WellH(well, height=0) for well in wells_ordered]\n\n for d in media_info:\n well = list(d.keys())[0]\n asp_vol = list(d.values())[0]\n if p1000.current_volume:\n p1000.dispense(p1000.current_volume, current_media.well.top())\n check_media(asp_vol)\n p1000.aspirate(vol_pre_airgap_1000, current_media.well.top())\n p1000.aspirate(asp_vol, current_media.height_dec(asp_vol))\n slow_withdraw(current_media.well, p1000)\n p1000.dispense(p1000.current_volume, well.bottom(well.depth/2))\n p1000.blow_out(well.bottom(well.depth/2))\n slow_withdraw(well, p1000)\n\n # media_sets = custom_distribute(media_info, pip=p1000)\n # for media_set in media_sets:\n # if p1000.current_volume:\n # p1000.dispense(p1000.current_volume, current_media.well.top())\n # # pre-air_gap to fully void tip on blow_out\n # for d in media_set:\n # asp_vol = sum(d.values())\n # check_media(asp_vol)\n # p1000.aspirate(vol_pre_airgap_1000, current_media.well.top())\n # p1000.aspirate(asp_vol, current_media.height_dec(asp_vol))\n # slow_withdraw(current_media.well, p1000)\n # for i, d in enumerate(media_set):\n # well = [key for key in d.keys()][0]\n # vol = [val for val in d.values()][0]\n # p1000.dispense(vol+vol_pre_airgap_1000,\n # well.bottom(well.depth/2))\n # if i == len(media_set) - 1:\n # p1000.blow_out(well.bottom(well.depth/2))\n # slow_withdraw(well, p1000)\n p1000.return_tip()\n p1000.reset_tipracks()\n\n viscosity_map = {\n 20: {\n 'aspirate': 6.5,\n 'delay_aspiration': 2.0,\n 'dispense': 6.5,\n 'delay_dispense': 2.0,\n 'default': 7.56\n },\n 300: {\n 'aspirate': 80,\n 'delay_aspiration': 2.0,\n 'dispense': 80,\n 'delay_dispense': 2.0,\n 'default': 92.86\n },\n 1000: {\n 'aspirate': 247,\n 'delay_aspiration': 2.0,\n 'dispense': 247,\n 'delay_dispense': 2.0,\n 'default': 247\n }\n }\n\n # transfer factors\n for i, (visc, factor) in enumerate(zip(factor_viscosities, factors)):\n factor_vols = [line[i] for line in factor_data]\n factor_info = [\n {well: vol}\n for well, vol in zip(wells_h, factor_vols)]\n factor_sets = custom_distribute(factor_info, pip=pip_small)\n if visc:\n asp_rate_relative = viscosity_map[\n int(pip_small.max_volume)]['aspirate'] / (\n viscosity_map[int(pip_small.max_volume)]['default'])\n asp_delay = viscosity_map[\n int(pip_small.max_volume)]['delay_aspiration']\n disp_rate_relative = viscosity_map[\n int(pip_small.max_volume)]['dispense'] / (\n viscosity_map[int(pip_small.max_volume)]['default'])\n disp_delay = viscosity_map[\n int(pip_small.max_volume)]['delay_dispense']\n else:\n asp_rate_relative = 1\n asp_delay = 2.0\n disp_rate_relative = 1\n disp_delay = 2.0\n for factor_set in factor_sets:\n # aspirate total vol needed\n if not pip_small.has_tip:\n pip_small.pick_up_tip()\n # pre-air_gap to fully void tip on blow_out\n for d in factor_set:\n well = [k for k in d.keys()][0]\n asp_vol = [k for k in d.values()][0]\n if asp_vol + vol_pre_airgap_small <= pip_small.max_volume:\n ag_vol = vol_pre_airgap_small\n else:\n ag_vol = pip_small.max_volume - asp_vol\n pip_small.aspirate(ag_vol, factor.well.top())\n pip_small.aspirate(\n asp_vol, factor.height_dec(asp_vol),\n rate=asp_rate_relative)\n slow_withdraw(factor.well, pip_small, delay_s=asp_delay)\n pip_small.dispense(\n pip_small.current_volume,\n well.height_inc(asp_vol).move(Point(z=3)),\n rate=disp_rate_relative)\n ctx.delay(seconds=disp_delay)\n pip_small.blow_out(well.top(-2))\n\n # total_factor_vol = sum([sum(dict.values()) for dict in\n # factor_set])\n # p300.aspirate(total_factor_vol,\n # factor.height_dec(total_factor_vol))\n # for i, dict in enumerate(factor_set):\n # for well, vol in dict.items():\n # pip_small.dispense(\n # vol+vol_pre_airgap_small, well.bottom(well.depth/2))\n # if i == len(factor_set) - 1:\n # pip_small.blow_out(well.top(-2))\n\n # for d in factor_set:\n # asp_vol = sum(d.values())\n # if asp_vol + vol_pre_airgap_small <= pip_small.max_volume:\n # ag_vol = vol_pre_airgap_small\n # else:\n # ag_vol = pip_small.max_volume - asp_vol\n # pip_small.aspirate(ag_vol, factor.well.top())\n # pip_small.aspirate(asp_vol, factor.height_dec(asp_vol))\n # # total_factor_vol = sum([sum(dict.values()) for dict in\n # # factor_set])\n # # p300.aspirate(total_factor_vol,\n # # factor.height_dec(total_factor_vol))\n # slow_withdraw(factor.well, pip_small)\n # for i, dict in enumerate(factor_set):\n # for well, vol in dict.items():\n # pip_small.dispense(\n # vol+vol_pre_airgap_small, well.bottom(well.depth/2))\n # if i == len(factor_set) - 1:\n # pip_small.blow_out(well.top(-2))\n if pip_small.has_tip:\n pip_small.drop_tip()\n\n # mix\n for well in plate.wells()[:len(factor_data)]:\n p1000.pick_up_tip()\n p1000.mix(reps_mix, vol_mix, well.bottom(2))\n slow_withdraw(well, p1000)\n p1000.drop_tip()\n", - "custom_labware_defs": [], - "fields": [ - { - "default": "Media Total,Factor 1,Factor 2,Factor 3,Factor 4,Factor 5,Factor 6,Factor 7,Factor 8,Factor 9,Factor 10,Factor 11,Factor 12,\nfactor_volumes (in ml):,5,1.5,7,14,10.1,5,1.5,7,14,10.1,2,2,\n1170,0,0,0,0,0,0,0,0,0,0,65,65,\n1235,0,65,0,0,0,0,0,0,0,0,0,0,\n1040,65,65,0,65,0,0,0,0,0,0,0,65,\n975,0,65,65,65,65,0,0,0,0,0,0,65,\n1053,0,0,65,65,0,52,0,0,0,0,65,0,\n988,0,65,65,0,65,52,0,0,0,0,65,0,\n845,65,65,65,65,0,0,65,0,0,0,65,65,\n910,0,65,0,65,65,0,65,0,0,0,65,65,\n858,65,65,65,0,65,52,65,0,0,0,0,65,\n988,0,0,0,65,65,52,65,0,0,0,0,65,\n1040,0,65,65,0,0,0,0,65,0,0,65,0,\n1105,0,0,0,65,0,0,0,65,0,0,0,65,\n1040,65,0,0,0,65,0,0,65,0,0,0,65,\n923,65,0,65,0,0,52,0,65,0,0,65,65,\n923,0,65,0,65,65,52,0,65,0,0,65,0,\n923,65,0,65,65,65,52,0,65,0,0,0,0,\n975,65,0,0,65,0,0,65,65,0,0,65,0,\n1040,0,0,0,0,65,0,65,65,0,0,65,0,\n910,65,65,65,0,65,0,65,65,0,0,0,0,\n1053,0,0,65,0,0,52,65,65,0,0,0,0,\n858,0,65,65,65,0,52,65,65,0,0,0,65,\n793,65,65,0,0,65,52,65,65,0,0,65,65,\n793,0,0,65,65,65,52,65,65,0,0,65,65,\n975,65,65,65,0,0,0,0,0,65,0,0,65,\n1040,65,0,65,65,0,0,0,0,65,0,0,0,\n910,65,0,0,65,65,0,0,0,65,0,65,65,\n1053,0,65,0,0,0,52,0,0,65,0,0,65,\n728,65,65,65,65,65,52,0,0,65,0,65,65,\n1040,0,0,0,65,0,0,65,0,65,0,0,65,\n910,65,65,0,0,65,0,65,0,65,0,65,0,\n1040,0,0,65,0,65,0,65,0,65,0,0,0,\n858,65,0,65,0,0,52,65,0,65,0,65,65,\n923,65,65,0,65,0,52,65,0,65,0,0,0,\n1105,65,0,0,0,0,0,0,65,65,0,0,0,\n910,65,65,0,65,65,0,0,65,65,0,0,0,\n910,0,0,65,65,65,0,0,65,65,0,65,0,\n923,65,65,0,0,0,52,0,65,65,0,65,0,\n923,0,0,0,0,65,52,0,65,65,0,65,65,\n793,65,65,65,0,65,52,0,65,65,0,0,65,\n910,0,65,65,65,0,0,65,65,65,0,0,0,\n780,0,65,65,0,65,0,65,65,65,0,65,65,\n793,0,65,0,65,0,52,65,65,65,0,65,65,\n793,65,0,65,65,0,52,65,65,65,0,0,65,\n923,0,65,0,0,65,52,65,65,65,0,0,0,\n793,65,0,65,0,65,52,65,65,65,0,65,0,\n1118,0,0,65,0,0,0,0,0,0,52,0,65,\n1118,0,0,0,65,65,0,0,0,0,52,0,0,\n858,65,65,65,65,65,0,0,0,0,52,65,0,\n1001,65,65,65,0,0,52,0,0,0,52,0,0,\n936,0,65,0,65,0,52,0,0,0,52,65,65,\n871,0,0,65,65,65,52,0,0,0,52,65,65,\n988,0,65,65,0,0,0,65,0,0,52,65,0,\n988,65,0,65,65,0,0,65,0,0,52,0,0,\n988,0,65,0,0,65,0,65,0,0,52,0,65,\n858,65,0,65,0,65,0,65,0,0,52,65,65,\n871,65,0,0,65,0,52,65,0,0,52,65,65,\n1001,65,0,0,0,65,52,65,0,0,52,0,0,\n871,0,65,65,65,65,52,65,0,0,52,0,0,\n923,65,65,0,0,0,0,0,65,0,52,65,65,\n988,0,65,65,65,0,0,0,65,0,52,0,0,\n1066,0,0,0,0,0,52,0,65,0,52,65,0,\n806,65,65,0,65,65,52,0,65,0,52,0,65,\n858,65,65,65,0,0,0,65,65,0,52,0,65,\n858,0,0,65,65,0,0,65,65,0,52,65,65,\n858,65,65,0,0,65,0,65,65,0,52,65,0,\n793,65,0,0,65,65,0,65,65,0,52,65,65,\n871,65,65,0,65,0,52,65,65,0,52,0,0,\n741,65,65,65,65,0,52,65,65,0,52,65,0,\n871,0,0,65,0,65,52,65,65,0,52,0,65,\n988,65,0,65,0,0,0,0,0,65,52,65,0,\n988,0,65,0,65,0,0,0,0,65,52,65,0,\n858,0,65,65,0,65,0,0,0,65,52,65,65,\n1001,65,0,0,0,0,52,0,0,65,52,0,65,\n806,65,65,0,0,65,52,0,0,65,52,65,65,\n871,65,0,65,65,65,52,0,0,65,52,0,0,\n858,65,65,0,65,65,0,65,0,65,52,0,0,\n858,0,0,65,65,65,0,65,0,65,52,65,0,\n1001,0,0,0,0,0,52,65,0,65,52,65,0,\n806,0,65,65,65,0,52,65,0,65,52,0,65,\n871,0,0,0,0,65,52,65,0,65,52,65,65,\n988,0,0,65,0,0,0,0,65,65,52,0,65,\n858,65,65,65,0,65,0,0,65,65,52,0,0,\n793,0,65,0,65,65,0,0,65,65,52,65,65,\n793,65,0,65,65,65,0,0,65,65,52,0,65,\n806,0,65,65,0,0,52,0,65,65,52,65,65,\n806,65,0,0,65,65,52,0,65,65,52,65,0,\n806,0,65,65,65,65,52,0,65,65,52,0,0,\n663,65,65,65,65,0,0,65,65,65,52,65,65,\n858,65,0,0,0,65,0,65,65,65,52,0,65,\n728,0,65,65,65,65,0,65,65,65,52,0,65,\n871,0,65,0,0,0,52,65,65,65,52,0,65,\n936,0,0,0,65,0,52,65,65,65,52,0,0,\n923,32.5,32.5,32.5,32.5,32.5,26,32.5,32.5,32.5,26,32.5,32.5,\n923,32.5,32.5,32.5,32.5,32.5,26,32.5,32.5,32.5,26,32.5,32.5,\n1300,0,0,0,0,0,0,0,0,0,0,0,0,\n1300,0,0,0,0,0,0,0,0,0,0,0,0,\n", - "label": "factor .csv file", - "name": "csv_factors", - "type": "textFile" - }, - { - "default": "48.0,48.0,0,0,0,0", - "label": "media tube A1 volume (,-separated, in mL, A1,A2,A3,B1,B2,B3)", - "name": "vol_media_tubes", - "type": "str" - }, - { - "default": 800.0, - "label": "final mix volume (in uL)", - "name": "vol_mix", - "type": "float" - }, - { - "default": 3, - "label": "final mix repetitions", - "name": "reps_mix", - "type": "int" - }, - { - "label": "smaller pipette type", - "name": "type_pipette_small", - "options": [ - { - "label": "P300 (20-200ul)", - "value": "p300_single_gen2" - }, - { - "label": "P20 (1-20ul)", - "value": "p20_single_gen2" - } - ], - "type": "dropDown" - } - ], - "instruments": [ - { - "mount": "left", - "name": "p300_single_gen2" - }, - { - "mount": "right", - "name": "p1000_single_gen2" - } - ], - "labware": [ - { - "name": "media tuberack on 1", - "share": false, - "slot": "1", - "type": "opentrons_6_tuberack_falcon_50ml_conical" - }, - { - "name": "USA Scientific 96 Deep Well Plate 2.4 mL on 2", - "share": false, - "slot": "2", - "type": "usascientific_96_wellplate_2.4ml_deep" - }, - { - "name": "Opentrons 96 Filter Tip Rack 200 \u00b5L on 3", - "share": false, - "slot": "3", - "type": "opentrons_96_filtertiprack_200ul" - }, - { - "name": "factors 1-15 on 4", - "share": false, - "slot": "4", - "type": "opentrons_15_tuberack_falcon_15ml_conical" - }, - { - "name": "factors 31-54 on 5", - "share": false, - "slot": "5", - "type": "opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap" - }, - { - "name": "Opentrons 96 Filter Tip Rack 1000 \u00b5L on 6", - "share": false, - "slot": "6", - "type": "opentrons_96_filtertiprack_1000ul" - }, - { - "name": "factors 16-30 on 7", - "share": false, - "slot": "7", - "type": "opentrons_15_tuberack_falcon_15ml_conical" - }, - { - "name": "factors 55-78 on 8", - "share": false, - "slot": "8", - "type": "opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap" - }, - { - "name": "Opentrons Fixed Trash on 12", - "share": false, - "slot": "12", - "type": "opentrons_1_trash_1100ml_fixed" - } - ], - "metadata": { - "apiLevel": "2.12", - "author": "Nick `Custom Labware` > `Add Labware`, and selecting your labware files (.json extensions) if needed. -4. Upload your protocol file (.py extension) to the [OT App](https://opentrons.com/ot-app) in the `Protocol` tab. -5. Set up your deck according to the deck map. -6. Calibrate your labware, tiprack and pipette using the OT App. For calibration tips, check out our [support articles](https://support.opentrons.com/en/collections/1559720-guide-for-getting-started-with-the-ot-2). -7. Hit "Run". - - -### Additional Notes -If you have any questions about this protocol, please contact the Protocol Development Team by filling out the [Troubleshooting Survey](https://protocol-troubleshooting.paperform.co/). - - -###### Internal -0909e6 diff --git a/protocols/0909e6/fields.json b/protocols/0909e6/fields.json deleted file mode 100644 index 87de32621..000000000 --- a/protocols/0909e6/fields.json +++ /dev/null @@ -1,35 +0,0 @@ -[ - { - "type": "textFile", - "label": "factor .csv file", - "name": "csv_factors", - "default": "Media Total,Factor 1,Factor 2,Factor 3,Factor 4,Factor 5,Factor 6,Factor 7,Factor 8,Factor 9,Factor 10,Factor 11,Factor 12,\nfactor_volumes (in ml):,5,1.5,7,14,10.1,5,1.5,7,14,10.1,2,2,\n1170,0,0,0,0,0,0,0,0,0,0,65,65,\n1235,0,65,0,0,0,0,0,0,0,0,0,0,\n1040,65,65,0,65,0,0,0,0,0,0,0,65,\n975,0,65,65,65,65,0,0,0,0,0,0,65,\n1053,0,0,65,65,0,52,0,0,0,0,65,0,\n988,0,65,65,0,65,52,0,0,0,0,65,0,\n845,65,65,65,65,0,0,65,0,0,0,65,65,\n910,0,65,0,65,65,0,65,0,0,0,65,65,\n858,65,65,65,0,65,52,65,0,0,0,0,65,\n988,0,0,0,65,65,52,65,0,0,0,0,65,\n1040,0,65,65,0,0,0,0,65,0,0,65,0,\n1105,0,0,0,65,0,0,0,65,0,0,0,65,\n1040,65,0,0,0,65,0,0,65,0,0,0,65,\n923,65,0,65,0,0,52,0,65,0,0,65,65,\n923,0,65,0,65,65,52,0,65,0,0,65,0,\n923,65,0,65,65,65,52,0,65,0,0,0,0,\n975,65,0,0,65,0,0,65,65,0,0,65,0,\n1040,0,0,0,0,65,0,65,65,0,0,65,0,\n910,65,65,65,0,65,0,65,65,0,0,0,0,\n1053,0,0,65,0,0,52,65,65,0,0,0,0,\n858,0,65,65,65,0,52,65,65,0,0,0,65,\n793,65,65,0,0,65,52,65,65,0,0,65,65,\n793,0,0,65,65,65,52,65,65,0,0,65,65,\n975,65,65,65,0,0,0,0,0,65,0,0,65,\n1040,65,0,65,65,0,0,0,0,65,0,0,0,\n910,65,0,0,65,65,0,0,0,65,0,65,65,\n1053,0,65,0,0,0,52,0,0,65,0,0,65,\n728,65,65,65,65,65,52,0,0,65,0,65,65,\n1040,0,0,0,65,0,0,65,0,65,0,0,65,\n910,65,65,0,0,65,0,65,0,65,0,65,0,\n1040,0,0,65,0,65,0,65,0,65,0,0,0,\n858,65,0,65,0,0,52,65,0,65,0,65,65,\n923,65,65,0,65,0,52,65,0,65,0,0,0,\n1105,65,0,0,0,0,0,0,65,65,0,0,0,\n910,65,65,0,65,65,0,0,65,65,0,0,0,\n910,0,0,65,65,65,0,0,65,65,0,65,0,\n923,65,65,0,0,0,52,0,65,65,0,65,0,\n923,0,0,0,0,65,52,0,65,65,0,65,65,\n793,65,65,65,0,65,52,0,65,65,0,0,65,\n910,0,65,65,65,0,0,65,65,65,0,0,0,\n780,0,65,65,0,65,0,65,65,65,0,65,65,\n793,0,65,0,65,0,52,65,65,65,0,65,65,\n793,65,0,65,65,0,52,65,65,65,0,0,65,\n923,0,65,0,0,65,52,65,65,65,0,0,0,\n793,65,0,65,0,65,52,65,65,65,0,65,0,\n1118,0,0,65,0,0,0,0,0,0,52,0,65,\n1118,0,0,0,65,65,0,0,0,0,52,0,0,\n858,65,65,65,65,65,0,0,0,0,52,65,0,\n1001,65,65,65,0,0,52,0,0,0,52,0,0,\n936,0,65,0,65,0,52,0,0,0,52,65,65,\n871,0,0,65,65,65,52,0,0,0,52,65,65,\n988,0,65,65,0,0,0,65,0,0,52,65,0,\n988,65,0,65,65,0,0,65,0,0,52,0,0,\n988,0,65,0,0,65,0,65,0,0,52,0,65,\n858,65,0,65,0,65,0,65,0,0,52,65,65,\n871,65,0,0,65,0,52,65,0,0,52,65,65,\n1001,65,0,0,0,65,52,65,0,0,52,0,0,\n871,0,65,65,65,65,52,65,0,0,52,0,0,\n923,65,65,0,0,0,0,0,65,0,52,65,65,\n988,0,65,65,65,0,0,0,65,0,52,0,0,\n1066,0,0,0,0,0,52,0,65,0,52,65,0,\n806,65,65,0,65,65,52,0,65,0,52,0,65,\n858,65,65,65,0,0,0,65,65,0,52,0,65,\n858,0,0,65,65,0,0,65,65,0,52,65,65,\n858,65,65,0,0,65,0,65,65,0,52,65,0,\n793,65,0,0,65,65,0,65,65,0,52,65,65,\n871,65,65,0,65,0,52,65,65,0,52,0,0,\n741,65,65,65,65,0,52,65,65,0,52,65,0,\n871,0,0,65,0,65,52,65,65,0,52,0,65,\n988,65,0,65,0,0,0,0,0,65,52,65,0,\n988,0,65,0,65,0,0,0,0,65,52,65,0,\n858,0,65,65,0,65,0,0,0,65,52,65,65,\n1001,65,0,0,0,0,52,0,0,65,52,0,65,\n806,65,65,0,0,65,52,0,0,65,52,65,65,\n871,65,0,65,65,65,52,0,0,65,52,0,0,\n858,65,65,0,65,65,0,65,0,65,52,0,0,\n858,0,0,65,65,65,0,65,0,65,52,65,0,\n1001,0,0,0,0,0,52,65,0,65,52,65,0,\n806,0,65,65,65,0,52,65,0,65,52,0,65,\n871,0,0,0,0,65,52,65,0,65,52,65,65,\n988,0,0,65,0,0,0,0,65,65,52,0,65,\n858,65,65,65,0,65,0,0,65,65,52,0,0,\n793,0,65,0,65,65,0,0,65,65,52,65,65,\n793,65,0,65,65,65,0,0,65,65,52,0,65,\n806,0,65,65,0,0,52,0,65,65,52,65,65,\n806,65,0,0,65,65,52,0,65,65,52,65,0,\n806,0,65,65,65,65,52,0,65,65,52,0,0,\n663,65,65,65,65,0,0,65,65,65,52,65,65,\n858,65,0,0,0,65,0,65,65,65,52,0,65,\n728,0,65,65,65,65,0,65,65,65,52,0,65,\n871,0,65,0,0,0,52,65,65,65,52,0,65,\n936,0,0,0,65,0,52,65,65,65,52,0,0,\n923,32.5,32.5,32.5,32.5,32.5,26,32.5,32.5,32.5,26,32.5,32.5,\n923,32.5,32.5,32.5,32.5,32.5,26,32.5,32.5,32.5,26,32.5,32.5,\n1300,0,0,0,0,0,0,0,0,0,0,0,0,\n1300,0,0,0,0,0,0,0,0,0,0,0,0,\n" - }, - { - "type": "str", - "label": "media tube A1 volume (,-separated, in mL, A1,A2,A3,B1,B2,B3)", - "name": "vol_media_tubes", - "default": "48.0,48.0,0,0,0,0" - }, - { - "type": "float", - "label": "final mix volume (in uL)", - "name": "vol_mix", - "default": 800.0 - }, - { - "type": "int", - "label": "final mix repetitions", - "name": "reps_mix", - "default": 3 - }, - { - "type": "dropDown", - "label": "smaller pipette type", - "name": "type_pipette_small", - "options": [ - { "label": "P300 (20-200ul)", "value": "p300_single_gen2" }, - { "label": "P20 (1-20ul)", "value": "p20_single_gen2" } - ] - } -] diff --git a/protocols/0909e6/media_transfer.ot2.apiv2.py b/protocols/0909e6/media_transfer.ot2.apiv2.py deleted file mode 100644 index c1bf70129..000000000 --- a/protocols/0909e6/media_transfer.ot2.apiv2.py +++ /dev/null @@ -1,338 +0,0 @@ -import math -from opentrons.protocol_api.labware import Well -from opentrons.protocols.api_support.types import APIVersion -from opentrons.types import Point - -metadata = { - 'protocolName': 'DOE', - 'author': 'Nick self.min_height: - self.height = self.height - dh - else: - self.height = self.min_height - if self.current_volume - vol > 0: - self.current_volume = self.current_volume - vol - else: - self.current_volume = 0 - return self.well.bottom(self.height) - - def height_inc(self, vol): - dh = (vol/(math.pi*(self.radius**2)))*self.comp_coeff - if self.height + dh < self.depth: - self.height = self.height + dh - else: - self.height = self.depth - self.current_volume += vol - return self.well.bottom(self.height + 20) - - # labware - tuberack50 = ctx.load_labware('opentrons_6_tuberack_falcon_50ml_conical', - '1', 'media tuberack') - tuberacks15 = [ - ctx.load_labware( - 'opentrons_15_tuberack_falcon_15ml_conical', slot, - f'factors {tube_set}') - for i, (slot, tube_set) in enumerate( - zip(['4', '7'], ['1-15', '16-30']))] - tuberacks2 = [ - ctx.load_labware( - 'opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap', slot, - f'factors {tube_set}') - for i, (slot, tube_set) in enumerate( - zip(['5', '8'], ['31-54', '55-78']))] - plate = ctx.load_labware('usascientific_96_wellplate_2.4ml_deep', '2') - tiprack_small = [ctx.load_labware(tiprack_small_type, '3')] - tiprack1000 = [ - ctx.load_labware('opentrons_96_filtertiprack_1000ul', slot) - for slot in ['6']] - - # pipettes - pip_small = ctx.load_instrument(type_pipette_small, 'left', - tip_racks=tiprack_small) - p1000 = ctx.load_instrument('p1000_single_gen2', 'right', - tip_racks=tiprack1000) - - # reagents - vol_media_list = [float(val) for val in vol_media_tubes.split(',')] - media_rows_ordered = [tube for row in tuberack50.rows() for tube in row] - media = [ - WellH(well, current_volume=vol, height=well.depth*(vol/50000)*0.9) - for well, vol in zip( - media_rows_ordered[:len(vol_media_list)], - [vol_media_tube*1000 for vol_media_tube in vol_media_list])] - - # parse data - factor_data = [ - [float(val) for val in line.split(',')[1:] if val.strip()] - for line in csv_factors.splitlines()[3:] - ] - - all_factor_tubes = [ - well for rack_set in [tuberacks15, tuberacks2] - for rack in rack_set - for well in rack.wells()] - - factor_indices = [ - int(cell.strip().split(' ')[-1]) - 1 - for cell in csv_factors.splitlines()[0].split(',')[1:] - if cell.strip()] - factor_tubes = [ - all_factor_tubes[ind] for ind in factor_indices] - factor_viscosities = [ - bool(visc) for visc in csv_factors.splitlines()[1].split(',')[1:] - if visc.strip()] - factor_volumes_ul = [ - float(cell)*1000 for cell in csv_factors.splitlines()[2].split(',')[1:] - if cell.strip()] - # ref_vol = tuberacks15[0].wells()[0].max_volume / 1000 # 2ml or 15ml - # ref_height = tuberacks15[0].wells()[0].depth - factor_heights = [ - # ensure tip is submerged - round(factor_vol/(factor_tube.max_volume)*factor_tube.depth*0.9, - 1) - for factor_tube, factor_vol in zip(factor_tubes, factor_volumes_ul)] - factors = [ - WellH(well, current_volume=vol, height=height) - for well, vol, height in zip( - factor_tubes, factor_volumes_ul, factor_heights)] - - def slow_withdraw(well, pip=p1000, delay_s=2.0): - ctx.max_speeds['A'] = 25 - ctx.max_speeds['Z'] = 25 - if delay_s > 0: - ctx.delay(seconds=delay_s) - pip.move_to(well.top()) - del ctx.max_speeds['A'] - del ctx.max_speeds['Z'] - - def split_media_vol(vol): - num_transfers = math.ceil(vol/(1000-vol_pre_airgap_1000)) - vol_per_transfer = round(vol/num_transfers, 1) - return [vol_per_transfer]*num_transfers - - # iterate - iterator_media = iter(media) - current_media = next(iterator_media) - - def check_media(vol): - nonlocal current_media - if current_media.current_volume - vol < current_media.min_vol: - current_media = next(iterator_media) - - def custom_distribute(info, pip): - pip_volume = pip.tip_racks[0].wells()[0].max_volume - vol_pre_airgap = vol_pre_airgap_small if pip == \ - pip_small else vol_pre_airgap_1000 - max_vol = pip_volume - sets = [] - running = [] - current_vol = 0 - for d in info: - well = [key for key in d.keys()][0] - vol = [val for val in d.values()][0] - if vol > 0: - if current_vol + vol + vol_pre_airgap > max_vol: - sets.append(running) - running = [] - current_vol = 0 - running.append({well: vol}) - current_vol += vol + vol_pre_airgap - sets.append(running) - return sets - - # transfer media - p1000.pick_up_tip() - wells_ordered = [well for row in plate.rows() for well in row] - vols_media = [ - float(line.split(',')[0]) for line in csv_factors.splitlines()[3:]] - media_info = [] - for well, vol_media in zip(wells_ordered, vols_media): - vols_split = split_media_vol(vol_media) - for vol in vols_split: - media_info.append({well: vol}) - - wells_h = [ - WellH(well, height=0) for well in wells_ordered] - - for d in media_info: - well = list(d.keys())[0] - asp_vol = list(d.values())[0] - if p1000.current_volume: - p1000.dispense(p1000.current_volume, current_media.well.top()) - check_media(asp_vol) - p1000.aspirate(vol_pre_airgap_1000, current_media.well.top()) - p1000.aspirate(asp_vol, current_media.height_dec(asp_vol)) - slow_withdraw(current_media.well, p1000) - p1000.dispense(p1000.current_volume, well.bottom(well.depth/2)) - p1000.blow_out(well.bottom(well.depth/2)) - slow_withdraw(well, p1000) - - # media_sets = custom_distribute(media_info, pip=p1000) - # for media_set in media_sets: - # if p1000.current_volume: - # p1000.dispense(p1000.current_volume, current_media.well.top()) - # # pre-air_gap to fully void tip on blow_out - # for d in media_set: - # asp_vol = sum(d.values()) - # check_media(asp_vol) - # p1000.aspirate(vol_pre_airgap_1000, current_media.well.top()) - # p1000.aspirate(asp_vol, current_media.height_dec(asp_vol)) - # slow_withdraw(current_media.well, p1000) - # for i, d in enumerate(media_set): - # well = [key for key in d.keys()][0] - # vol = [val for val in d.values()][0] - # p1000.dispense(vol+vol_pre_airgap_1000, - # well.bottom(well.depth/2)) - # if i == len(media_set) - 1: - # p1000.blow_out(well.bottom(well.depth/2)) - # slow_withdraw(well, p1000) - p1000.return_tip() - p1000.reset_tipracks() - - viscosity_map = { - 20: { - 'aspirate': 6.5, - 'delay_aspiration': 2.0, - 'dispense': 6.5, - 'delay_dispense': 2.0, - 'default': 7.56 - }, - 300: { - 'aspirate': 80, - 'delay_aspiration': 2.0, - 'dispense': 80, - 'delay_dispense': 2.0, - 'default': 92.86 - }, - 1000: { - 'aspirate': 247, - 'delay_aspiration': 2.0, - 'dispense': 247, - 'delay_dispense': 2.0, - 'default': 247 - } - } - - # transfer factors - for i, (visc, factor) in enumerate(zip(factor_viscosities, factors)): - factor_vols = [line[i] for line in factor_data] - factor_info = [ - {well: vol} - for well, vol in zip(wells_h, factor_vols)] - factor_sets = custom_distribute(factor_info, pip=pip_small) - if visc: - asp_rate_relative = viscosity_map[ - int(pip_small.max_volume)]['aspirate'] / ( - viscosity_map[int(pip_small.max_volume)]['default']) - asp_delay = viscosity_map[ - int(pip_small.max_volume)]['delay_aspiration'] - disp_rate_relative = viscosity_map[ - int(pip_small.max_volume)]['dispense'] / ( - viscosity_map[int(pip_small.max_volume)]['default']) - disp_delay = viscosity_map[ - int(pip_small.max_volume)]['delay_dispense'] - else: - asp_rate_relative = 1 - asp_delay = 2.0 - disp_rate_relative = 1 - disp_delay = 2.0 - for factor_set in factor_sets: - # aspirate total vol needed - if not pip_small.has_tip: - pip_small.pick_up_tip() - # pre-air_gap to fully void tip on blow_out - for d in factor_set: - well = [k for k in d.keys()][0] - asp_vol = [k for k in d.values()][0] - if asp_vol + vol_pre_airgap_small <= pip_small.max_volume: - ag_vol = vol_pre_airgap_small - else: - ag_vol = pip_small.max_volume - asp_vol - pip_small.aspirate(ag_vol, factor.well.top()) - pip_small.aspirate( - asp_vol, factor.height_dec(asp_vol), - rate=asp_rate_relative) - slow_withdraw(factor.well, pip_small, delay_s=asp_delay) - pip_small.dispense( - pip_small.current_volume, - well.height_inc(asp_vol).move(Point(z=3)), - rate=disp_rate_relative) - ctx.delay(seconds=disp_delay) - pip_small.blow_out(well.top(-2)) - - # total_factor_vol = sum([sum(dict.values()) for dict in - # factor_set]) - # p300.aspirate(total_factor_vol, - # factor.height_dec(total_factor_vol)) - # for i, dict in enumerate(factor_set): - # for well, vol in dict.items(): - # pip_small.dispense( - # vol+vol_pre_airgap_small, well.bottom(well.depth/2)) - # if i == len(factor_set) - 1: - # pip_small.blow_out(well.top(-2)) - - # for d in factor_set: - # asp_vol = sum(d.values()) - # if asp_vol + vol_pre_airgap_small <= pip_small.max_volume: - # ag_vol = vol_pre_airgap_small - # else: - # ag_vol = pip_small.max_volume - asp_vol - # pip_small.aspirate(ag_vol, factor.well.top()) - # pip_small.aspirate(asp_vol, factor.height_dec(asp_vol)) - # # total_factor_vol = sum([sum(dict.values()) for dict in - # # factor_set]) - # # p300.aspirate(total_factor_vol, - # # factor.height_dec(total_factor_vol)) - # slow_withdraw(factor.well, pip_small) - # for i, dict in enumerate(factor_set): - # for well, vol in dict.items(): - # pip_small.dispense( - # vol+vol_pre_airgap_small, well.bottom(well.depth/2)) - # if i == len(factor_set) - 1: - # pip_small.blow_out(well.top(-2)) - if pip_small.has_tip: - pip_small.drop_tip() - - # mix - for well in plate.wells()[:len(factor_data)]: - p1000.pick_up_tip() - p1000.mix(reps_mix, vol_mix, well.bottom(2)) - slow_withdraw(well, p1000) - p1000.drop_tip()