From b898a2cd93235d9434ccc8f7bcd272c712790df4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9Cramifarawi=E2=80=9D?= <“rami.farawi@opentrons.com”> Date: Mon, 27 Nov 2023 13:41:38 -0500 Subject: [PATCH 1/2] fix --- protocols/010d6c/010d6c.ot2.apiv2.py | 14 ++++++++++---- protocols/010d6c/README.md | 2 +- ...te_galatea_normalization.ot2.apiv2.ot2.apiv2.py | 5 ++--- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/protocols/010d6c/010d6c.ot2.apiv2.py b/protocols/010d6c/010d6c.ot2.apiv2.py index e17bb3be7..05fb15ac0 100644 --- a/protocols/010d6c/010d6c.ot2.apiv2.py +++ b/protocols/010d6c/010d6c.ot2.apiv2.py @@ -1,3 +1,9 @@ +def get_values(*names): + import json + _all_values = json.loads("""{"csv_samp":"source slot,source well,dest well\\n8,A1,A4\\n8,A1,A5","plate_standard":true,"diluent_buff_col":1,"duplicate_plating":true,"m300_mount":"left","p300_mount":"right"}""") + return [_all_values[n] for n in names] + + # flake8: noqa metadata = { @@ -139,7 +145,7 @@ def Transfer_With_TT(Pipette, Source, Destination, Vol, Dispense_Top): calibration_vols = [1000, 750, 500, 250, 100, 50, 20, 0] p300.pick_up_tip() # Moved to outside of loop - p300.mix(1, 300, calibration_solution) # Moved to outside of loop + p300.mix(1, 300, calibration_solution.bottom(z=4)) # Moved to outside of loop for vol, well in zip(calibration_vols, diluent_buff_col): if vol == 0: @@ -249,7 +255,7 @@ def Transfer_With_TT(Pipette, Source, Destination, Vol, Dispense_Top): for well in dispense_wells: m300.dispense(50, well.top()) ctx.delay(seconds = 1) - m300.move_to(well.top(z = -3)) + m300.move_to(well.top(z = 0)) m300.touch_tip() ctx.delay(seconds = 1) @@ -263,7 +269,7 @@ def Transfer_With_TT(Pipette, Source, Destination, Vol, Dispense_Top): for well in dispense_wells: m300.dispense(50, well.top()) ctx.delay(seconds = 1) - m300.move_to(well.top(z = -3)) + m300.move_to(well.top(z = 0)) m300.touch_tip() ctx.delay(seconds = 1) @@ -290,7 +296,7 @@ def Transfer_With_TT(Pipette, Source, Destination, Vol, Dispense_Top): for well in wells: m300.dispense(100, well.top()) ctx.delay(seconds = 1) - m300.move_to(well.top(z = -3)) + m300.move_to(well.top(z = 0)) m300.touch_tip() ctx.delay(seconds = 1) diff --git a/protocols/010d6c/README.md b/protocols/010d6c/README.md index 8005d1689..2dc17b26c 100644 --- a/protocols/010d6c/README.md +++ b/protocols/010d6c/README.md @@ -29,7 +29,7 @@ This protocol performs a Ribrogreen assay - for detailed protocol steps, please ### Deck Setup -![deck](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/010d6c/ddddd.png) +![deck](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/010d6c/Screen+Shot+2023-11-27+at+1.39.18+PM.png) ### Reagent Setup diff --git a/protocols/onsite_galatea_normalization/onsite_galatea_normalization.ot2.apiv2.ot2.apiv2.py b/protocols/onsite_galatea_normalization/onsite_galatea_normalization.ot2.apiv2.ot2.apiv2.py index 5a626fae2..a7d513382 100644 --- a/protocols/onsite_galatea_normalization/onsite_galatea_normalization.ot2.apiv2.ot2.apiv2.py +++ b/protocols/onsite_galatea_normalization/onsite_galatea_normalization.ot2.apiv2.ot2.apiv2.py @@ -135,9 +135,8 @@ def pick_up_less(): if transfer_vol <= 0: continue - - p20.aspirate(transfer_vol, water) - p20.dispense(transfer_vol, dest_well.bottom(z=1.5)) + p20.transfer(transfer_vol, water, dest_well.bottom(z=1.5), + new_tip='never') p20.blow_out() p20.drop_tip() From 4fdea9f4cc6ad5a172f59ec3f20d936dd3cf93ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9Cramifarawi=E2=80=9D?= <“rami.farawi@opentrons.com”> Date: Mon, 27 Nov 2023 13:44:23 -0500 Subject: [PATCH 2/2] fix --- protoBuilds/010d6c/010d6c.ot2.apiv2.py.json | 2 +- protoBuilds/010d6c/README.json | 2 +- .../onsite_galatea_normalization.ot2.apiv2.ot2.apiv2.py.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/protoBuilds/010d6c/010d6c.ot2.apiv2.py.json b/protoBuilds/010d6c/010d6c.ot2.apiv2.py.json index eafcce891..530ecf523 100644 --- a/protoBuilds/010d6c/010d6c.ot2.apiv2.py.json +++ b/protoBuilds/010d6c/010d6c.ot2.apiv2.py.json @@ -1,5 +1,5 @@ { - "content": "# flake8: noqa\n\nmetadata = {\n 'protocolName': 'Ribogreen Assay',\n 'author': 'Rami Farawi ',\n 'source': 'Custom Protocol Request',\n 'apiLevel': '2.13'\n}\n\n\ndef run(ctx):\n\n [csv_samp, plate_standard, diluent_buff_col,\n duplicate_plating, m300_mount, p300_mount] = get_values( # noqa: F821\n \"csv_samp\", \"plate_standard\", \"diluent_buff_col\",\n \"duplicate_plating\", \"m300_mount\", \"p300_mount\")\n\n # p300_mount = 'left'\n # m300_mount = 'right'\n # plate_standard = True\n # diluent_buff_col = 4\n # duplicate_plating = False\n # csv_samp = \"\"\"\n #\n # source slot, source well, dest well\n # 7, A1, A1\n # 8, A1, A2\n # 7, A3, A3\n #\n # \"\"\"\n\n def Transfer_With_TT(Pipette, Source, Destination, Vol, Dispense_Top):\n # Split transfer up to allow for more control over touch tip height\n ## p300.transfer(vol, matrix_buff, well, new_tip='never')\n\n # Loop is used if volume is more than pipette max\n current_vol = Vol\n while current_vol > Pipette.max_volume:\n # Aspirate max volume\n Pipette.aspirate(Pipette.max_volume, Source.bottom(z = 4))\n # Touch tip\n Pipette.move_to(Source.top(z = -3))\n Pipette.touch_tip()\n\n # Dispense max volume\n if not Dispense_Top:\n Pipette.dispense(Pipette.max_volume, Destination.bottom(z = 3)) # With z offset\n else:\n Pipette.dispense(Pipette.max_volume, Destination.top())\n\n # Touch tip\n Pipette.move_to(Destination.top(z = -3))\n Pipette.touch_tip()\n\n # Update current volume\n current_vol -= Pipette.max_volume\n\n # If volume to transfer is 0, do nothing\n if current_vol == 0:\n return()\n\n # If volume more than 0 but less than or equal to max\n\n # Aspirate volume\n Pipette.aspirate(current_vol, Source.bottom(z = 4))\n # Touch tip\n Pipette.move_to(Source.top(z = -3))\n Pipette.touch_tip()\n\n # Dispense volume\n if not Dispense_Top:\n Pipette.dispense(current_vol, Destination.bottom(z = 3)) # With z offset\n else:\n Pipette.dispense(current_vol, Destination.top())\n # Touch tip\n Pipette.move_to(Destination.top(z = -3))\n Pipette.touch_tip()\n\n\n # labware\n reservoir = ctx.load_labware('corning_12_reservoir', 2)\n try:\n heater_shaker = ctx.load_module('heaterShakerModuleV1', 6)\n heater_shaker.close_labware_latch()\n hs_plate = heater_shaker.load_labware('nunc_96_wellplate_400ul')\n except ValueError:\n hs_plate = ctx.load_labware('nunc_96_wellplate_400ul', 6)\n\n deep_plate = ctx.load_labware('pyramid_96_wellplate_2000ul', 4)\n tuberack_15 = ctx.load_labware('opentrons_15_tuberack_5000ul', 7)\n tuberack_24 = ctx.load_labware('opentrons_24_tuberack_nest_2ml_snapcap', 8)\n tuberack_24 = tuberack_24\n\n tips = [ctx.load_labware('opentrons_96_tiprack_300ul', slot)\n for slot in [1]]\n\n # pipettes\n p300 = ctx.load_instrument('p300_single_gen2', p300_mount, tip_racks=tips)\n m300 = ctx.load_instrument('p300_multi_gen2', m300_mount, tip_racks=tips)\n\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 # mapping\n matrix_buff = reservoir.wells_by_name()['A1']\n\n triton = reservoir.wells_by_name()['A3']\n\n te = reservoir.wells_by_name()['A5']\n\n dye = reservoir.wells_by_name()['A7']\n\n calibration_solution = tuberack_15.wells()[0]\n\n\n # protocol\n diluent_buff_col = deep_plate.columns()[diluent_buff_col-1]\n if plate_standard:\n ctx.comment('\\n------------ADDING BUFFER TO PLATE------------\\n\\n')\n buffer_vols = [0, 250, 500, 750, 900, 950, 980, 1000]\n\n p300.pick_up_tip()\n p300.mix(1, 300, matrix_buff)\n\n for vol, well in zip(buffer_vols, diluent_buff_col):\n\n Transfer_With_TT(\n Pipette = p300,\n Source = matrix_buff,\n Destination = well,\n Vol = vol,\n Dispense_Top = False\n )\n\n p300.drop_tip()\n\n ctx.comment('\\n------------ADDING CALIBRATION------------\\n\\n')\n calibration_vols = [1000, 750, 500, 250, 100, 50, 20, 0]\n\n p300.pick_up_tip() # Moved to outside of loop\n p300.mix(1, 300, calibration_solution) # Moved to outside of loop\n\n for vol, well in zip(calibration_vols, diluent_buff_col):\n if vol == 0:\n continue\n\n Transfer_With_TT(\n Pipette = p300,\n Source = calibration_solution,\n Destination = well,\n Vol = vol,\n Dispense_Top = True\n )\n\n p300.drop_tip() # Moved to outside of loop\n\n if duplicate_plating:\n ctx.comment('\\n------------DUPLICATE PLATING------------\\n\\n')\n dispense_wells = [hs_plate.wells_by_name()[well]\n for well in ['A1', 'A2', 'A11', 'A12']]\n source_col = diluent_buff_col[0]\n m300.pick_up_tip()\n m300.mix(1, 220, source_col.bottom(z = 3)) # Added in pre-wet\n m300.aspirate(220, source_col.bottom(z = 3))\n\n # Added in touch tip\n m300.move_to(source_col.top(z = -3))\n m300.touch_tip()\n\n for well in dispense_wells:\n m300.dispense(50, well.bottom(z = 3))\n\n # Added in touch tip\n m300.move_to(well.top(z = -3))\n m300.touch_tip()\n\n m300.drop_tip()\n\n else:\n ctx.comment('\\n------------TRIPLICATE PLATING------------\\n\\n')\n dispense_wells = [hs_plate.wells_by_name()[well]\n for well in ['A1', 'A2', 'A3', 'A10', 'A11', 'A12']]\n source_col = diluent_buff_col[0]\n m300.pick_up_tip()\n m300.mix(1, 300, source_col.bottom(z = 3)) # Added in pre-wet\n m300.aspirate(300, source_col.bottom(z = 3))\n\n # Added in touch tip\n m300.move_to(source_col.top(z = -3))\n m300.touch_tip()\n\n for well in dispense_wells:\n m300.dispense(50, well.bottom(z = 3))\n\n # Added in touch tip\n m300.move_to(well.top(z = -3))\n m300.touch_tip()\n\n m300.drop_tip()\n\n ctx.comment('\\n------------ADDING SAMPLE------------\\n\\n')\n\n # Modified for faster sample addition with less tip wastage\n if duplicate_plating:\n reps = 2 * 2\n else:\n reps = 3 * 2\n\n for index, line in enumerate(csv_lines):\n csv_slot = int(line[0])\n\n csv_well = line[1]\n source_well = ctx.loaded_labwares[csv_slot].wells_by_name()[csv_well]\n dest_well = line[2]\n\n # Only pick up tip and aspirate if start of new replicate batch\n if index%reps == 0:\n p300.pick_up_tip()\n p300.mix(1, 50*reps, source_well.bottom(z = 3)) # Added in pre-wet\n p300.aspirate(50*reps, source_well.bottom(z = 3))\n p300.move_to(source_well.top(-3))\n p300.touch_tip()\n\n p300.dispense(50, hs_plate.wells_by_name()[dest_well].bottom(z = 3)) # Set z offset\n p300.move_to(hs_plate.wells_by_name()[dest_well].top(-3))\n p300.touch_tip()\n\n # Only drop up tip if end of new replicate batch\n if index%reps == reps - 1:\n p300.drop_tip()\n\n ctx.comment('\\n------------PLATING TRITON------------\\n\\n')\n\n # Slow down aspirate and dispense rate\n m300.flow_rate.dispense *= 2\n m300.flow_rate.aspirate *= 2\n\n dispense_wells = hs_plate.rows()[0][:6]\n m300.pick_up_tip()\n m300.mix(1, 300, triton.bottom(z = 3))\n m300.aspirate(300, triton.bottom(z = 3))\n\n # Added in touch tip\n m300.move_to(triton.top(z = -3))\n m300.touch_tip()\n\n\n for well in dispense_wells:\n m300.dispense(50, well.top())\n ctx.delay(seconds = 1)\n m300.move_to(well.top(z = -3))\n m300.touch_tip()\n ctx.delay(seconds = 1)\n\n m300.drop_tip()\n\n ctx.comment('\\n------------PLATING TE------------\\n\\n')\n dispense_wells = hs_plate.rows()[0][6:]\n m300.pick_up_tip()\n m300.mix(1, 300, te.bottom(z = 3))\n m300.aspirate(300, te.bottom(z = 3))\n for well in dispense_wells:\n m300.dispense(50, well.top())\n ctx.delay(seconds = 1)\n m300.move_to(well.top(z = -3))\n m300.touch_tip()\n ctx.delay(seconds = 1)\n\n m300.drop_tip()\n\n try:\n heater_shaker.set_and_wait_for_temperature(37)\n ctx.delay(minutes=10)\n heater_shaker.deactivate_heater()\n except:\n ctx.delay(minutes=10)\n\n ctx.comment('\\n------------PLATING DYE------------\\n\\n')\n\n m300.pick_up_tip()\n m300.mix(1, 300, dye.bottom(z = 3))\n\n # Changed how dye is dispensed so that each well only has one transfer action to preserve accuracy\n for i in range(0, 12, 3):\n wells = [well for well in hs_plate.rows()[0][i : i+3]]\n m300.aspirate(300, dye.bottom(z = 3))\n m300.touch_tip()\n\n for well in wells:\n m300.dispense(100, well.top())\n ctx.delay(seconds = 1)\n m300.move_to(well.top(z = -3))\n m300.touch_tip()\n ctx.delay(seconds = 1)\n\n# for _ in range(2):\n# m300.distribute(50, dye, [well.top() for well in hs_plate.rows()[0]],\n# new_tip='never')\n\n m300.drop_tip()\n\n ctx.pause('''\n Plate is ready! Please remove, seal, and transport to the plate reader for\n analysis. Please remember to tidy the robot deck and dispose of any waste.\n ''')\n", + "content": "def get_values(*names):\n import json\n _all_values = json.loads(\"\"\"{\"csv_samp\":\"source slot,source well,dest well\\\\n8,A1,A4\\\\n8,A1,A5\",\"plate_standard\":true,\"diluent_buff_col\":1,\"duplicate_plating\":true,\"m300_mount\":\"left\",\"p300_mount\":\"right\"}\"\"\")\n return [_all_values[n] for n in names]\n\n\n# flake8: noqa\n\nmetadata = {\n 'protocolName': 'Ribogreen Assay',\n 'author': 'Rami Farawi ',\n 'source': 'Custom Protocol Request',\n 'apiLevel': '2.13'\n}\n\n\ndef run(ctx):\n\n [csv_samp, plate_standard, diluent_buff_col,\n duplicate_plating, m300_mount, p300_mount] = get_values( # noqa: F821\n \"csv_samp\", \"plate_standard\", \"diluent_buff_col\",\n \"duplicate_plating\", \"m300_mount\", \"p300_mount\")\n\n # p300_mount = 'left'\n # m300_mount = 'right'\n # plate_standard = True\n # diluent_buff_col = 4\n # duplicate_plating = False\n # csv_samp = \"\"\"\n #\n # source slot, source well, dest well\n # 7, A1, A1\n # 8, A1, A2\n # 7, A3, A3\n #\n # \"\"\"\n\n def Transfer_With_TT(Pipette, Source, Destination, Vol, Dispense_Top):\n # Split transfer up to allow for more control over touch tip height\n ## p300.transfer(vol, matrix_buff, well, new_tip='never')\n\n # Loop is used if volume is more than pipette max\n current_vol = Vol\n while current_vol > Pipette.max_volume:\n # Aspirate max volume\n Pipette.aspirate(Pipette.max_volume, Source.bottom(z = 4))\n # Touch tip\n Pipette.move_to(Source.top(z = -3))\n Pipette.touch_tip()\n\n # Dispense max volume\n if not Dispense_Top:\n Pipette.dispense(Pipette.max_volume, Destination.bottom(z = 3)) # With z offset\n else:\n Pipette.dispense(Pipette.max_volume, Destination.top())\n\n # Touch tip\n Pipette.move_to(Destination.top(z = -3))\n Pipette.touch_tip()\n\n # Update current volume\n current_vol -= Pipette.max_volume\n\n # If volume to transfer is 0, do nothing\n if current_vol == 0:\n return()\n\n # If volume more than 0 but less than or equal to max\n\n # Aspirate volume\n Pipette.aspirate(current_vol, Source.bottom(z = 4))\n # Touch tip\n Pipette.move_to(Source.top(z = -3))\n Pipette.touch_tip()\n\n # Dispense volume\n if not Dispense_Top:\n Pipette.dispense(current_vol, Destination.bottom(z = 3)) # With z offset\n else:\n Pipette.dispense(current_vol, Destination.top())\n # Touch tip\n Pipette.move_to(Destination.top(z = -3))\n Pipette.touch_tip()\n\n\n # labware\n reservoir = ctx.load_labware('corning_12_reservoir', 2)\n try:\n heater_shaker = ctx.load_module('heaterShakerModuleV1', 6)\n heater_shaker.close_labware_latch()\n hs_plate = heater_shaker.load_labware('nunc_96_wellplate_400ul')\n except ValueError:\n hs_plate = ctx.load_labware('nunc_96_wellplate_400ul', 6)\n\n deep_plate = ctx.load_labware('pyramid_96_wellplate_2000ul', 4)\n tuberack_15 = ctx.load_labware('opentrons_15_tuberack_5000ul', 7)\n tuberack_24 = ctx.load_labware('opentrons_24_tuberack_nest_2ml_snapcap', 8)\n tuberack_24 = tuberack_24\n\n tips = [ctx.load_labware('opentrons_96_tiprack_300ul', slot)\n for slot in [1]]\n\n # pipettes\n p300 = ctx.load_instrument('p300_single_gen2', p300_mount, tip_racks=tips)\n m300 = ctx.load_instrument('p300_multi_gen2', m300_mount, tip_racks=tips)\n\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 # mapping\n matrix_buff = reservoir.wells_by_name()['A1']\n\n triton = reservoir.wells_by_name()['A3']\n\n te = reservoir.wells_by_name()['A5']\n\n dye = reservoir.wells_by_name()['A7']\n\n calibration_solution = tuberack_15.wells()[0]\n\n\n # protocol\n diluent_buff_col = deep_plate.columns()[diluent_buff_col-1]\n if plate_standard:\n ctx.comment('\\n------------ADDING BUFFER TO PLATE------------\\n\\n')\n buffer_vols = [0, 250, 500, 750, 900, 950, 980, 1000]\n\n p300.pick_up_tip()\n p300.mix(1, 300, matrix_buff)\n\n for vol, well in zip(buffer_vols, diluent_buff_col):\n\n Transfer_With_TT(\n Pipette = p300,\n Source = matrix_buff,\n Destination = well,\n Vol = vol,\n Dispense_Top = False\n )\n\n p300.drop_tip()\n\n ctx.comment('\\n------------ADDING CALIBRATION------------\\n\\n')\n calibration_vols = [1000, 750, 500, 250, 100, 50, 20, 0]\n\n p300.pick_up_tip() # Moved to outside of loop\n p300.mix(1, 300, calibration_solution.bottom(z=4)) # Moved to outside of loop\n\n for vol, well in zip(calibration_vols, diluent_buff_col):\n if vol == 0:\n continue\n\n Transfer_With_TT(\n Pipette = p300,\n Source = calibration_solution,\n Destination = well,\n Vol = vol,\n Dispense_Top = True\n )\n\n p300.drop_tip() # Moved to outside of loop\n\n if duplicate_plating:\n ctx.comment('\\n------------DUPLICATE PLATING------------\\n\\n')\n dispense_wells = [hs_plate.wells_by_name()[well]\n for well in ['A1', 'A2', 'A11', 'A12']]\n source_col = diluent_buff_col[0]\n m300.pick_up_tip()\n m300.mix(1, 220, source_col.bottom(z = 3)) # Added in pre-wet\n m300.aspirate(220, source_col.bottom(z = 3))\n\n # Added in touch tip\n m300.move_to(source_col.top(z = -3))\n m300.touch_tip()\n\n for well in dispense_wells:\n m300.dispense(50, well.bottom(z = 3))\n\n # Added in touch tip\n m300.move_to(well.top(z = -3))\n m300.touch_tip()\n\n m300.drop_tip()\n\n else:\n ctx.comment('\\n------------TRIPLICATE PLATING------------\\n\\n')\n dispense_wells = [hs_plate.wells_by_name()[well]\n for well in ['A1', 'A2', 'A3', 'A10', 'A11', 'A12']]\n source_col = diluent_buff_col[0]\n m300.pick_up_tip()\n m300.mix(1, 300, source_col.bottom(z = 3)) # Added in pre-wet\n m300.aspirate(300, source_col.bottom(z = 3))\n\n # Added in touch tip\n m300.move_to(source_col.top(z = -3))\n m300.touch_tip()\n\n for well in dispense_wells:\n m300.dispense(50, well.bottom(z = 3))\n\n # Added in touch tip\n m300.move_to(well.top(z = -3))\n m300.touch_tip()\n\n m300.drop_tip()\n\n ctx.comment('\\n------------ADDING SAMPLE------------\\n\\n')\n\n # Modified for faster sample addition with less tip wastage\n if duplicate_plating:\n reps = 2 * 2\n else:\n reps = 3 * 2\n\n for index, line in enumerate(csv_lines):\n csv_slot = int(line[0])\n\n csv_well = line[1]\n source_well = ctx.loaded_labwares[csv_slot].wells_by_name()[csv_well]\n dest_well = line[2]\n\n # Only pick up tip and aspirate if start of new replicate batch\n if index%reps == 0:\n p300.pick_up_tip()\n p300.mix(1, 50*reps, source_well.bottom(z = 3)) # Added in pre-wet\n p300.aspirate(50*reps, source_well.bottom(z = 3))\n p300.move_to(source_well.top(-3))\n p300.touch_tip()\n\n p300.dispense(50, hs_plate.wells_by_name()[dest_well].bottom(z = 3)) # Set z offset\n p300.move_to(hs_plate.wells_by_name()[dest_well].top(-3))\n p300.touch_tip()\n\n # Only drop up tip if end of new replicate batch\n if index%reps == reps - 1:\n p300.drop_tip()\n\n ctx.comment('\\n------------PLATING TRITON------------\\n\\n')\n\n # Slow down aspirate and dispense rate\n m300.flow_rate.dispense *= 2\n m300.flow_rate.aspirate *= 2\n\n dispense_wells = hs_plate.rows()[0][:6]\n m300.pick_up_tip()\n m300.mix(1, 300, triton.bottom(z = 3))\n m300.aspirate(300, triton.bottom(z = 3))\n\n # Added in touch tip\n m300.move_to(triton.top(z = -3))\n m300.touch_tip()\n\n\n for well in dispense_wells:\n m300.dispense(50, well.top())\n ctx.delay(seconds = 1)\n m300.move_to(well.top(z = 0))\n m300.touch_tip()\n ctx.delay(seconds = 1)\n\n m300.drop_tip()\n\n ctx.comment('\\n------------PLATING TE------------\\n\\n')\n dispense_wells = hs_plate.rows()[0][6:]\n m300.pick_up_tip()\n m300.mix(1, 300, te.bottom(z = 3))\n m300.aspirate(300, te.bottom(z = 3))\n for well in dispense_wells:\n m300.dispense(50, well.top())\n ctx.delay(seconds = 1)\n m300.move_to(well.top(z = 0))\n m300.touch_tip()\n ctx.delay(seconds = 1)\n\n m300.drop_tip()\n\n try:\n heater_shaker.set_and_wait_for_temperature(37)\n ctx.delay(minutes=10)\n heater_shaker.deactivate_heater()\n except:\n ctx.delay(minutes=10)\n\n ctx.comment('\\n------------PLATING DYE------------\\n\\n')\n\n m300.pick_up_tip()\n m300.mix(1, 300, dye.bottom(z = 3))\n\n # Changed how dye is dispensed so that each well only has one transfer action to preserve accuracy\n for i in range(0, 12, 3):\n wells = [well for well in hs_plate.rows()[0][i : i+3]]\n m300.aspirate(300, dye.bottom(z = 3))\n m300.touch_tip()\n\n for well in wells:\n m300.dispense(100, well.top())\n ctx.delay(seconds = 1)\n m300.move_to(well.top(z = 0))\n m300.touch_tip()\n ctx.delay(seconds = 1)\n\n# for _ in range(2):\n# m300.distribute(50, dye, [well.top() for well in hs_plate.rows()[0]],\n# new_tip='never')\n\n m300.drop_tip()\n\n ctx.pause('''\n Plate is ready! Please remove, seal, and transport to the plate reader for\n analysis. Please remember to tidy the robot deck and dispose of any waste.\n ''')\n", "custom_labware_defs": [ { "brand": { diff --git a/protoBuilds/010d6c/README.json b/protoBuilds/010d6c/README.json index ea43b7bc8..6168dd181 100644 --- a/protoBuilds/010d6c/README.json +++ b/protoBuilds/010d6c/README.json @@ -12,7 +12,7 @@ "markdown": { "author": "[Opentrons](https://opentrons.com/)\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/010d6c/ddddd.png)\n\n\n", + "deck-setup": "![deck](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/010d6c/Screen+Shot+2023-11-27+at+1.39.18+PM.png)\n\n\n", "description": "This protocol performs a Ribrogreen assay - for detailed protocol steps, please see below. There is the option to perform duplicate/triplicate plating. The csv for sample input should include `source slot, source well, destination well` in the header.\n\n\n", "internal": "010d6c\n", "labware": "* Corning 12 Reservoir 2000 \u00b5L\n* Nunc 96 Well Plate 400 \u00b5L\n* Opentrons 15 Tube Rack with eppendorf 5 mL\n* Pyramid 96 Well Plate 2000 \u00b5L\n* [Opentrons 96 Tip Rack 300 \u00b5L](https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-300ul-tips)\n* [Opentrons 24 Tube Rack with NEST 2 mL Snapcap](https://shop.opentrons.com/collections/opentrons-tips/products/tube-rack-set-1)\n\n\n", diff --git a/protoBuilds/onsite_galatea_normalization/onsite_galatea_normalization.ot2.apiv2.ot2.apiv2.py.json b/protoBuilds/onsite_galatea_normalization/onsite_galatea_normalization.ot2.apiv2.ot2.apiv2.py.json index 66344f7bc..36396bf79 100644 --- a/protoBuilds/onsite_galatea_normalization/onsite_galatea_normalization.ot2.apiv2.ot2.apiv2.py.json +++ b/protoBuilds/onsite_galatea_normalization/onsite_galatea_normalization.ot2.apiv2.ot2.apiv2.py.json @@ -1,5 +1,5 @@ { - "content": "from opentrons import protocol_api\nimport threading\nfrom time import sleep\n\n\nmetadata = {\n 'protocolName': 'Normalization and Barcode Addition',\n 'author': 'Rami Farawi ',\n 'source': 'Custom Protocol Request',\n 'apiLevel': '2.11'\n}\n\n\nclass CancellationToken:\n \"\"\"FLASH SETUP.\"\"\"\n\n def __init__(self):\n \"\"\"FLASH SETUP.\"\"\"\n self.is_continued = False\n\n def set_true(self):\n \"\"\"FLASH SETUP.\"\"\"\n self.is_continued = True\n\n def set_false(self):\n \"\"\"FLASH SETUP.\"\"\"\n self.is_continued = False\n\n\ndef turn_on_blinking_notification(hardware, pause):\n \"\"\"FLASH SETUP\"\"\"\n while pause.is_continued:\n hardware.set_lights(rails=True)\n sleep(1)\n hardware.set_lights(rails=False)\n sleep(1)\n\n\ndef create_thread(ctx, cancel_token):\n \"\"\"FLASH SETUP.\"\"\"\n t1 = threading.Thread(target=turn_on_blinking_notification,\n args=(ctx._hw_manager.hardware, cancel_token))\n t1.start()\n return t1\n\n\ndef run(ctx):\n cancellationToken = CancellationToken()\n\n [csv_samp, dna_plate_type, if_48,\n p20_mount, m20_mount] = get_values( # noqa: F821\n \"csv_samp\", \"dna_plate_type\", \"if_48\", \"p20_mount\", \"m20_mount\")\n\n flash = True\n\n # labware\n reservoir = ctx.load_labware('nest_12_reservoir_15ml', 1)\n barcode_plate = ctx.load_labware('biorad_96_wellplate_200ul_pcr',\n 5)\n buffer_plate = ctx.load_labware('nest_96_wellplate_100ul_pcr_full_skirt',\n 6)\n\n dna_plate = ctx.load_labware(dna_plate_type, 2)\n\n final_plate = ctx.load_labware('nest_96_wellplate_100ul_pcr_full_skirt', 3)\n\n tips = [ctx.load_labware('opentrons_96_filtertiprack_20ul', slot)\n for slot in [10, 11]]\n tipbox_less_than_eight = [ctx.load_labware(\n 'opentrons_96_filtertiprack_20ul', slot)\n for slot in [8, 9]]\n\n # pipettes\n p20 = ctx.load_instrument('p20_single_gen2', p20_mount, tip_racks=tips)\n m20 = ctx.load_instrument('p20_multi_gen2', m20_mount, tip_racks=tips)\n\n def pick_up(pip):\n try:\n pip.pick_up_tip()\n except protocol_api.labware.OutOfTipsError:\n if flash:\n if not ctx._hw_manager.hardware.is_simulator:\n cancellationToken.set_true()\n thread = create_thread(ctx, cancellationToken)\n pip.home()\n ctx.pause('\\n\\n~~~~~~~~~~PLEASE REPLACE TIPRACKS~~~~~~~~~~~\\n')\n ctx.home() # home before continuing with protocol\n if flash:\n cancellationToken.set_false() # stop light flashing after home\n thread.join()\n ctx.set_rail_lights(True)\n pip.reset_tipracks()\n pick_up(pip)\n\n # mapping\n water = reservoir.wells()[0]\n buffer_A = buffer_plate.rows()[0][0]\n buffer_B = buffer_plate.rows()[0][1]\n\n pool_wells_left = barcode_plate.rows()[0][1:6]\n pool_wells_right = barcode_plate.rows()[0][6:11]\n pool_dest_left = barcode_plate.rows()[0][0]\n pool_dest_right = barcode_plate.rows()[0][11]\n\n pool_wells_left_bottom = barcode_plate.rows()[4][1:6]\n pool_wells_right_bottom = barcode_plate.rows()[4][6:11]\n pool_dest_left_bottom = barcode_plate.rows()[4][0]\n pool_dest_right_bottom = barcode_plate.rows()[4][11]\n\n csv_rows = [[val.strip() for val in line.split(',')]\n for line in csv_samp.splitlines()\n if line.split(',')[0].strip()][1:]\n\n num_chan = 4\n tips_ordered = [\n tip for rack in tipbox_less_than_eight\n for row in rack.rows()[\n len(rack.rows())-num_chan::-1*num_chan]\n for tip in row]\n\n tip_count = 0\n\n def pick_up_less():\n nonlocal tip_count\n m20.pick_up_tip(tips_ordered[tip_count])\n tip_count += 1\n\n # protocol\n ctx.comment('\\n------------ADDING WATER TO FINAL PLATE-------------\\n\\n')\n p20.pick_up_tip()\n for line in csv_rows:\n dest_well_name = line[0]\n dest_well = final_plate.wells_by_name()[dest_well_name]\n transfer_vol = round(float(line[4]))\n\n if transfer_vol <= 0:\n continue\n\n p20.aspirate(transfer_vol, water)\n p20.dispense(transfer_vol, dest_well.bottom(z=1.5))\n p20.blow_out()\n\n p20.drop_tip()\n\n ctx.comment('\\n------------ADDING DNA TO FINAL PLATE-------------\\n\\n')\n\n for line in csv_rows:\n p20.pick_up_tip()\n source_well_name = line[0]\n source_well = dna_plate.wells_by_name()[source_well_name]\n\n dest_well_name = line[0]\n dest_well = final_plate.wells_by_name()[dest_well_name]\n transfer_vol = round(float(line[3]))\n\n p20.transfer(transfer_vol, source_well, dest_well.bottom(z=1.5),\n new_tip='never')\n\n p20.blow_out()\n p20.drop_tip()\n\n ctx.pause()\n\n ctx.comment('\\n----------ADDING SAMPLE TO BARCODE PLATE-----------\\n\\n')\n # are we for sure 96 samples\n if if_48 == \"96\":\n\n for s_col, d_col in zip(final_plate.rows()[0],\n barcode_plate.rows()[0]):\n pick_up(m20)\n m20.aspirate(6, s_col.bottom(-0.5))\n m20.dispense(6, d_col)\n m20.mix(10, 8, d_col)\n m20.blow_out()\n m20.drop_tip()\n\n elif if_48 == \"top48\":\n\n for s_col, d_col in zip(final_plate.rows()[0],\n barcode_plate.rows()[0]):\n pick_up_less()\n m20.aspirate(6, s_col)\n m20.dispense(6, d_col)\n m20.mix(10, 8, d_col)\n m20.blow_out()\n m20.drop_tip()\n else:\n\n for s_col, d_col in zip(final_plate.rows()[0],\n barcode_plate.rows()[4]):\n pick_up_less()\n m20.aspirate(6, s_col)\n m20.dispense(6, d_col)\n m20.mix(10, 8, d_col)\n m20.blow_out()\n m20.drop_tip()\n\n ctx.comment('\\n----------ADDING BUFFER A TO BARCODE PLATE-----------\\n\\n')\n if if_48 == \"96\":\n for col in barcode_plate.rows()[0]:\n pick_up(m20)\n m20.aspirate(5, buffer_A)\n m20.dispense(5, col)\n m20.mix(10, 8, col)\n m20.blow_out()\n m20.drop_tip()\n elif if_48 == \"top48\":\n for col in barcode_plate.rows()[0]:\n pick_up_less()\n m20.aspirate(5, buffer_A)\n m20.dispense(5, col)\n m20.mix(10, 8, col)\n m20.blow_out()\n m20.drop_tip()\n else:\n for col in barcode_plate.rows()[4]:\n pick_up_less()\n m20.aspirate(5, buffer_A)\n m20.dispense(5, col)\n m20.mix(10, 8, col)\n m20.blow_out()\n m20.drop_tip()\n\n ctx.pause()\n\n ctx.comment('\\n----------ADDING BUFFER B TO BARCODE PLATE-----------\\n\\n')\n if if_48 == \"96\":\n for col in barcode_plate.rows()[0]:\n pick_up(m20)\n m20.aspirate(7.5, buffer_B, rate=0.2)\n ctx.delay(seconds=1.5)\n m20.dispense(7.5, col)\n m20.mix(10, 14, col, rate=0.5)\n m20.blow_out()\n m20.drop_tip()\n\n elif if_48 == \"top48\":\n for col in barcode_plate.rows()[0]:\n pick_up_less()\n m20.aspirate(7.5, buffer_B, rate=0.2)\n ctx.delay(seconds=1.5)\n m20.dispense(7.5, col)\n m20.mix(10, 14, col, rate=0.5)\n m20.blow_out()\n m20.drop_tip()\n\n else:\n for col in barcode_plate.rows()[4]:\n pick_up_less()\n m20.aspirate(7.5, buffer_B, rate=0.2)\n ctx.delay(seconds=1.5)\n m20.dispense(7.5, col)\n m20.mix(10, 14, col, rate=0.5)\n m20.blow_out()\n m20.drop_tip()\n\n ctx.pause(\"Second buffer just added to plate. Resume for pooling.\")\n\n ctx.comment('\\n----------POOLING-----------\\n\\n')\n # are we for sure 96 samples\n if if_48 == \"96\":\n\n for side_of_plate, pool_well in zip([pool_wells_left,\n pool_wells_right],\n [pool_dest_left,\n pool_dest_right]):\n pick_up(m20)\n for col in side_of_plate:\n for _ in range(2):\n m20.aspirate(12, col)\n m20.dispense(12, pool_well)\n m20.blow_out()\n m20.drop_tip()\n\n elif if_48 == \"top48\":\n\n for side_of_plate, pool_well in zip([pool_wells_left,\n pool_wells_right],\n [pool_dest_left,\n pool_dest_right]):\n pick_up_less()\n for col in side_of_plate:\n for _ in range(2):\n m20.aspirate(12, col)\n m20.dispense(12, pool_well)\n m20.blow_out()\n m20.drop_tip()\n\n else:\n\n for side_of_plate, pool_well in zip([pool_wells_left_bottom,\n pool_wells_right_bottom],\n [pool_dest_left_bottom,\n pool_dest_right_bottom]):\n pick_up_less()\n for col in side_of_plate:\n for _ in range(2):\n m20.aspirate(12, col)\n m20.dispense(12, pool_well)\n m20.blow_out()\n m20.drop_tip()\n", + "content": "from opentrons import protocol_api\nimport threading\nfrom time import sleep\n\n\nmetadata = {\n 'protocolName': 'Normalization and Barcode Addition',\n 'author': 'Rami Farawi ',\n 'source': 'Custom Protocol Request',\n 'apiLevel': '2.11'\n}\n\n\nclass CancellationToken:\n \"\"\"FLASH SETUP.\"\"\"\n\n def __init__(self):\n \"\"\"FLASH SETUP.\"\"\"\n self.is_continued = False\n\n def set_true(self):\n \"\"\"FLASH SETUP.\"\"\"\n self.is_continued = True\n\n def set_false(self):\n \"\"\"FLASH SETUP.\"\"\"\n self.is_continued = False\n\n\ndef turn_on_blinking_notification(hardware, pause):\n \"\"\"FLASH SETUP\"\"\"\n while pause.is_continued:\n hardware.set_lights(rails=True)\n sleep(1)\n hardware.set_lights(rails=False)\n sleep(1)\n\n\ndef create_thread(ctx, cancel_token):\n \"\"\"FLASH SETUP.\"\"\"\n t1 = threading.Thread(target=turn_on_blinking_notification,\n args=(ctx._hw_manager.hardware, cancel_token))\n t1.start()\n return t1\n\n\ndef run(ctx):\n cancellationToken = CancellationToken()\n\n [csv_samp, dna_plate_type, if_48,\n p20_mount, m20_mount] = get_values( # noqa: F821\n \"csv_samp\", \"dna_plate_type\", \"if_48\", \"p20_mount\", \"m20_mount\")\n\n flash = True\n\n # labware\n reservoir = ctx.load_labware('nest_12_reservoir_15ml', 1)\n barcode_plate = ctx.load_labware('biorad_96_wellplate_200ul_pcr',\n 5)\n buffer_plate = ctx.load_labware('nest_96_wellplate_100ul_pcr_full_skirt',\n 6)\n\n dna_plate = ctx.load_labware(dna_plate_type, 2)\n\n final_plate = ctx.load_labware('nest_96_wellplate_100ul_pcr_full_skirt', 3)\n\n tips = [ctx.load_labware('opentrons_96_filtertiprack_20ul', slot)\n for slot in [10, 11]]\n tipbox_less_than_eight = [ctx.load_labware(\n 'opentrons_96_filtertiprack_20ul', slot)\n for slot in [8, 9]]\n\n # pipettes\n p20 = ctx.load_instrument('p20_single_gen2', p20_mount, tip_racks=tips)\n m20 = ctx.load_instrument('p20_multi_gen2', m20_mount, tip_racks=tips)\n\n def pick_up(pip):\n try:\n pip.pick_up_tip()\n except protocol_api.labware.OutOfTipsError:\n if flash:\n if not ctx._hw_manager.hardware.is_simulator:\n cancellationToken.set_true()\n thread = create_thread(ctx, cancellationToken)\n pip.home()\n ctx.pause('\\n\\n~~~~~~~~~~PLEASE REPLACE TIPRACKS~~~~~~~~~~~\\n')\n ctx.home() # home before continuing with protocol\n if flash:\n cancellationToken.set_false() # stop light flashing after home\n thread.join()\n ctx.set_rail_lights(True)\n pip.reset_tipracks()\n pick_up(pip)\n\n # mapping\n water = reservoir.wells()[0]\n buffer_A = buffer_plate.rows()[0][0]\n buffer_B = buffer_plate.rows()[0][1]\n\n pool_wells_left = barcode_plate.rows()[0][1:6]\n pool_wells_right = barcode_plate.rows()[0][6:11]\n pool_dest_left = barcode_plate.rows()[0][0]\n pool_dest_right = barcode_plate.rows()[0][11]\n\n pool_wells_left_bottom = barcode_plate.rows()[4][1:6]\n pool_wells_right_bottom = barcode_plate.rows()[4][6:11]\n pool_dest_left_bottom = barcode_plate.rows()[4][0]\n pool_dest_right_bottom = barcode_plate.rows()[4][11]\n\n csv_rows = [[val.strip() for val in line.split(',')]\n for line in csv_samp.splitlines()\n if line.split(',')[0].strip()][1:]\n\n num_chan = 4\n tips_ordered = [\n tip for rack in tipbox_less_than_eight\n for row in rack.rows()[\n len(rack.rows())-num_chan::-1*num_chan]\n for tip in row]\n\n tip_count = 0\n\n def pick_up_less():\n nonlocal tip_count\n m20.pick_up_tip(tips_ordered[tip_count])\n tip_count += 1\n\n # protocol\n ctx.comment('\\n------------ADDING WATER TO FINAL PLATE-------------\\n\\n')\n p20.pick_up_tip()\n for line in csv_rows:\n dest_well_name = line[0]\n dest_well = final_plate.wells_by_name()[dest_well_name]\n transfer_vol = round(float(line[4]))\n\n if transfer_vol <= 0:\n continue\n p20.transfer(transfer_vol, water, dest_well.bottom(z=1.5),\n new_tip='never')\n p20.blow_out()\n\n p20.drop_tip()\n\n ctx.comment('\\n------------ADDING DNA TO FINAL PLATE-------------\\n\\n')\n\n for line in csv_rows:\n p20.pick_up_tip()\n source_well_name = line[0]\n source_well = dna_plate.wells_by_name()[source_well_name]\n\n dest_well_name = line[0]\n dest_well = final_plate.wells_by_name()[dest_well_name]\n transfer_vol = round(float(line[3]))\n\n p20.transfer(transfer_vol, source_well, dest_well.bottom(z=1.5),\n new_tip='never')\n\n p20.blow_out()\n p20.drop_tip()\n\n ctx.pause()\n\n ctx.comment('\\n----------ADDING SAMPLE TO BARCODE PLATE-----------\\n\\n')\n # are we for sure 96 samples\n if if_48 == \"96\":\n\n for s_col, d_col in zip(final_plate.rows()[0],\n barcode_plate.rows()[0]):\n pick_up(m20)\n m20.aspirate(6, s_col.bottom(-0.5))\n m20.dispense(6, d_col)\n m20.mix(10, 8, d_col)\n m20.blow_out()\n m20.drop_tip()\n\n elif if_48 == \"top48\":\n\n for s_col, d_col in zip(final_plate.rows()[0],\n barcode_plate.rows()[0]):\n pick_up_less()\n m20.aspirate(6, s_col)\n m20.dispense(6, d_col)\n m20.mix(10, 8, d_col)\n m20.blow_out()\n m20.drop_tip()\n else:\n\n for s_col, d_col in zip(final_plate.rows()[0],\n barcode_plate.rows()[4]):\n pick_up_less()\n m20.aspirate(6, s_col)\n m20.dispense(6, d_col)\n m20.mix(10, 8, d_col)\n m20.blow_out()\n m20.drop_tip()\n\n ctx.comment('\\n----------ADDING BUFFER A TO BARCODE PLATE-----------\\n\\n')\n if if_48 == \"96\":\n for col in barcode_plate.rows()[0]:\n pick_up(m20)\n m20.aspirate(5, buffer_A)\n m20.dispense(5, col)\n m20.mix(10, 8, col)\n m20.blow_out()\n m20.drop_tip()\n elif if_48 == \"top48\":\n for col in barcode_plate.rows()[0]:\n pick_up_less()\n m20.aspirate(5, buffer_A)\n m20.dispense(5, col)\n m20.mix(10, 8, col)\n m20.blow_out()\n m20.drop_tip()\n else:\n for col in barcode_plate.rows()[4]:\n pick_up_less()\n m20.aspirate(5, buffer_A)\n m20.dispense(5, col)\n m20.mix(10, 8, col)\n m20.blow_out()\n m20.drop_tip()\n\n ctx.pause()\n\n ctx.comment('\\n----------ADDING BUFFER B TO BARCODE PLATE-----------\\n\\n')\n if if_48 == \"96\":\n for col in barcode_plate.rows()[0]:\n pick_up(m20)\n m20.aspirate(7.5, buffer_B, rate=0.2)\n ctx.delay(seconds=1.5)\n m20.dispense(7.5, col)\n m20.mix(10, 14, col, rate=0.5)\n m20.blow_out()\n m20.drop_tip()\n\n elif if_48 == \"top48\":\n for col in barcode_plate.rows()[0]:\n pick_up_less()\n m20.aspirate(7.5, buffer_B, rate=0.2)\n ctx.delay(seconds=1.5)\n m20.dispense(7.5, col)\n m20.mix(10, 14, col, rate=0.5)\n m20.blow_out()\n m20.drop_tip()\n\n else:\n for col in barcode_plate.rows()[4]:\n pick_up_less()\n m20.aspirate(7.5, buffer_B, rate=0.2)\n ctx.delay(seconds=1.5)\n m20.dispense(7.5, col)\n m20.mix(10, 14, col, rate=0.5)\n m20.blow_out()\n m20.drop_tip()\n\n ctx.pause(\"Second buffer just added to plate. Resume for pooling.\")\n\n ctx.comment('\\n----------POOLING-----------\\n\\n')\n # are we for sure 96 samples\n if if_48 == \"96\":\n\n for side_of_plate, pool_well in zip([pool_wells_left,\n pool_wells_right],\n [pool_dest_left,\n pool_dest_right]):\n pick_up(m20)\n for col in side_of_plate:\n for _ in range(2):\n m20.aspirate(12, col)\n m20.dispense(12, pool_well)\n m20.blow_out()\n m20.drop_tip()\n\n elif if_48 == \"top48\":\n\n for side_of_plate, pool_well in zip([pool_wells_left,\n pool_wells_right],\n [pool_dest_left,\n pool_dest_right]):\n pick_up_less()\n for col in side_of_plate:\n for _ in range(2):\n m20.aspirate(12, col)\n m20.dispense(12, pool_well)\n m20.blow_out()\n m20.drop_tip()\n\n else:\n\n for side_of_plate, pool_well in zip([pool_wells_left_bottom,\n pool_wells_right_bottom],\n [pool_dest_left_bottom,\n pool_dest_right_bottom]):\n pick_up_less()\n for col in side_of_plate:\n for _ in range(2):\n m20.aspirate(12, col)\n m20.dispense(12, pool_well)\n m20.blow_out()\n m20.drop_tip()\n", "custom_labware_defs": [], "fields": [ {