diff --git a/data/data/fields.csv b/data/data/fields.csv index a6dd7fb7c..4cea30f18 100644 --- a/data/data/fields.csv +++ b/data/data/fields.csv @@ -637,6 +637,7 @@ 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 @@ -664,7 +665,6 @@ labware_samp,1 labware_sample_plate,1 labware_sampleplates,1 labware_source,1 -labware_temp_deck,1 labware_tempmod,12 labware_tempmod2,5 labware_tips20,3 @@ -1439,7 +1439,7 @@ te_well,2 temp,2 temp_gen,1 temp_lysate,1 -temp_mod,2 +temp_mod,3 temp_mod_lname,2 temp_mod_on,2 temp_mod_s1_lname,1 @@ -1460,7 +1460,7 @@ tempblock,1 tempdeck_gen,1 tempdeck_name,1 tempdeck_slot,1 -temperature,12 +temperature,13 temperature1,1 temperature2,1 tempgen,1 diff --git a/protoBuilds/010d6c/010d6c.ot2.apiv2.py.json b/protoBuilds/010d6c/010d6c.ot2.apiv2.py.json index 1ee6e05aa..eafcce891 100644 --- a/protoBuilds/010d6c/010d6c.ot2.apiv2.py.json +++ b/protoBuilds/010d6c/010d6c.ot2.apiv2.py.json @@ -1,5 +1,5 @@ { - "content": "\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 # 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'].bottom(z=4)\n triton = reservoir.wells_by_name()['A3'].bottom(z=4)\n te = reservoir.wells_by_name()['A5'].bottom(z=4)\n dye = reservoir.wells_by_name()['A7'].bottom(z=4)\n calibration_solution = tuberack_15.wells()[0]\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 p300.pick_up_tip()\n p300.mix(1, 300, matrix_buff)\n for vol, well in zip(buffer_vols, diluent_buff_col):\n if vol == 0:\n continue\n p300.transfer(vol, matrix_buff, well, new_tip='never')\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 for vol, well in zip(calibration_vols, diluent_buff_col):\n if vol == 0:\n continue\n p300.pick_up_tip()\n p300.mix(1, 300, matrix_buff)\n p300.transfer(vol, calibration_solution, well.top(),\n new_tip='never')\n p300.drop_tip()\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.aspirate(220, source_col)\n for well in dispense_wells:\n m300.dispense(50, well)\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.aspirate(300, source_col)\n for well in dispense_wells:\n m300.dispense(50, well)\n m300.drop_tip()\n\n ctx.comment('\\n------------ADDING SAMPLE------------\\n\\n')\n for line in 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 p300.pick_up_tip()\n p300.aspirate(50, source_well)\n p300.dispense(50, hs_plate.wells_by_name()[dest_well])\n p300.drop_tip()\n\n ctx.comment('\\n------------PLATING TRITON------------\\n\\n')\n m300.flow_rate.dispense = 200\n dispense_wells = hs_plate.rows()[0][:6]\n m300.pick_up_tip()\n m300.mix(1, 300, triton)\n m300.aspirate(300, triton)\n for well in dispense_wells:\n m300.dispense(50, well.top())\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)\n m300.aspirate(300, te)\n for well in dispense_wells:\n m300.dispense(50, well.top())\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 UnboundLocalError:\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, te)\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": "# 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", "custom_labware_defs": [ { "brand": { @@ -2787,17 +2787,17 @@ ], "fields": [ { - "default": "source slot, source well, dest well\n7, A1, A1", + "default": "source slot,source well,dest well\n8,A1,A4\n8,A1,A5", "label": ".CSV File (header: source slot, source well, dest well)", "name": "csv_samp", "type": "textFile" }, { - "label": "Plate matrix buffer solution?", + "label": "Do calibration standards need prepared?", "name": "plate_standard", "options": [ { - "label": "Yes, plate matrix buffer", + "label": "Yes, prepare calibration standards", "value": true }, { @@ -2808,7 +2808,7 @@ "type": "dropDown" }, { - "label": "Deepwell plate column (1-12)", + "label": "Which column in the deepwell plate should the calibration standard be prepared in? (1-12)", "name": "diluent_buff_col", "options": [ { diff --git a/protoBuilds/010d6c/README.json b/protoBuilds/010d6c/README.json index 3e6af1145..ea43b7bc8 100644 --- a/protoBuilds/010d6c/README.json +++ b/protoBuilds/010d6c/README.json @@ -12,21 +12,21 @@ "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/deck.png)\n\n\n", + "deck-setup": "![deck](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/010d6c/ddddd.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", "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 P300 Single Channel Electronic Pipette (GEN2)](https://shop.opentrons.com/single-channel-electronic-pipette-p20/)\n* [Opentrons P300 8 Channel Electronic Pipette (GEN2)](https://shop.opentrons.com/8-channel-electronic-pipette/)\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. ADDING BUFFER TO PLATE\n2. ADDING CALIBRATION\n3. DUPLICATE PLATING/TRIPLICATE PLATING\n4. ADDING SAMPLE\n5. PLATING TRITON\n6. PLATING TE\n7. PLATING DYE\n\n\n", + "protocol-steps": "1. Calibration standard preparation in deep well plate (matrix buffer addition)\n2. Calibration standard preparation in deep well plate (4 ug/mL calibration stock addition)\n3. Calibration standard plating (duplicate or triplicate)\n4. Sample plating (duplicate or triplicate)\n5. Triton addition\n6. TE addition\n7. Heating at 37 C for 10 minutes\n8. Dye addition\n\n\n\n", "reagent-setup": "![reagents](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/010d6c/reagents.png)\n\n\n", "title": "Ribogreen Assay" }, "notes": "If you have any questions about this protocol, please contact the Protocol Development Team by filling out the Troubleshooting Survey.", "pipettes": "\nOpentrons P300 Single Channel Electronic Pipette (GEN2)\nOpentrons P300 8 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": "\nADDING BUFFER TO PLATE\nADDING CALIBRATION\nDUPLICATE PLATING/TRIPLICATE PLATING\nADDING SAMPLE\nPLATING TRITON\nPLATING TE\nPLATING DYE\n", + "protocol-steps": "\nCalibration standard preparation in deep well plate (matrix buffer addition)\nCalibration standard preparation in deep well plate (4 ug/mL calibration stock addition)\nCalibration standard plating (duplicate or triplicate)\nSample plating (duplicate or triplicate)\nTriton addition\nTE addition\nHeating at 37 C for 10 minutes\nDye addition\n", "reagent-setup": "", "title": "Ribogreen Assay" } \ No newline at end of file diff --git a/protoBuilds/08207f/08207f.ot2.apiv2.py.json b/protoBuilds/08207f/08207f.ot2.apiv2.py.json index 862e6b2f0..e4aa5399c 100644 --- a/protoBuilds/08207f/08207f.ot2.apiv2.py.json +++ b/protoBuilds/08207f/08207f.ot2.apiv2.py.json @@ -1,5 +1,5 @@ { - "content": "import math\n\nmetadata = {\n 'protocolName': 'Normalization Using .csv File',\n 'author': 'Parrish Payne ',\n 'source': 'Custom Protocol Request',\n 'apiLevel': '2.13'\n}\n\n\ndef run(ctx):\n\n [input_csv, init_vol_buff, labware_pcr_plate, labware_temp_deck,\n p20_mount, p300_mount] = get_values( # noqa: F821\n \"input_csv\", \"init_vol_buff\", \"labware_pcr_plate\", \"labware_temp_deck\",\n \"p20_mount\", \"p300_mount\")\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 tempdeck = ctx.load_module('temperature module gen2', '3')\n dna_plate = tempdeck.load_labware(labware_temp_deck) # noqa: E501\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 # mapping\n\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 > 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\n if volume > 20:\n p300.pick_up_tip()\n p300.aspirate(volume, source_well)\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)\n p20.dispense(volume, dest_well)\n p20.mix(mix_reps, 10)\n p20.blow_out()\n p20.drop_tip()\n", + "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": { @@ -4546,7 +4546,7 @@ }, { "label": "Labware on the Temperature Module", - "name": "labware_temp_deck", + "name": "labware_dna_plate", "options": [ { "label": "eppendorftwin.tec96_96_aluminumblock_150ul", @@ -4559,6 +4559,27 @@ ], "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", @@ -4614,7 +4635,7 @@ "type": "opentrons_96_filtertiprack_200ul" }, { - "name": "Eppendorf Twin.Tec 96 96 Aluminum Block 150 \u00b5L on Temperature Module GEN2 on 3", + "name": "sample plate on 3", "share": false, "slot": "3", "type": "eppendorftwin.tec96_96_aluminumblock_150ul" @@ -4656,12 +4677,5 @@ "protocolName": "Normalization Using .csv File", "source": "Custom Protocol Request" }, - "modules": [ - { - "name": "TemperatureModuleContext at Temperature Module GEN2 on 3 lw Eppendorf Twin.Tec 96 96 Aluminum Block 150 \u00b5L on Temperature Module GEN2 on 3", - "share": false, - "slot": "3", - "type": "tempdeck" - } - ] + "modules": [] } \ No newline at end of file diff --git a/protocols/010d6c/010d6c.ot2.apiv2.py b/protocols/010d6c/010d6c.ot2.apiv2.py index 93fbb5a39..e17bb3be7 100644 --- a/protocols/010d6c/010d6c.ot2.apiv2.py +++ b/protocols/010d6c/010d6c.ot2.apiv2.py @@ -1,4 +1,4 @@ - +# flake8: noqa metadata = { 'protocolName': 'Ribogreen Assay', @@ -29,6 +29,54 @@ def run(ctx): # # """ + def Transfer_With_TT(Pipette, Source, Destination, Vol, Dispense_Top): + # Split transfer up to allow for more control over touch tip height + ## p300.transfer(vol, matrix_buff, well, new_tip='never') + + # Loop is used if volume is more than pipette max + current_vol = Vol + while current_vol > Pipette.max_volume: + # Aspirate max volume + Pipette.aspirate(Pipette.max_volume, Source.bottom(z = 4)) + # Touch tip + Pipette.move_to(Source.top(z = -3)) + Pipette.touch_tip() + + # Dispense max volume + if not Dispense_Top: + Pipette.dispense(Pipette.max_volume, Destination.bottom(z = 3)) # With z offset + else: + Pipette.dispense(Pipette.max_volume, Destination.top()) + + # Touch tip + Pipette.move_to(Destination.top(z = -3)) + Pipette.touch_tip() + + # Update current volume + current_vol -= Pipette.max_volume + + # If volume to transfer is 0, do nothing + if current_vol == 0: + return() + + # If volume more than 0 but less than or equal to max + + # Aspirate volume + Pipette.aspirate(current_vol, Source.bottom(z = 4)) + # Touch tip + Pipette.move_to(Source.top(z = -3)) + Pipette.touch_tip() + + # Dispense volume + if not Dispense_Top: + Pipette.dispense(current_vol, Destination.bottom(z = 3)) # With z offset + else: + Pipette.dispense(current_vol, Destination.top()) + # Touch tip + Pipette.move_to(Destination.top(z = -3)) + Pipette.touch_tip() + + # labware reservoir = ctx.load_labware('corning_12_reservoir', 2) try: @@ -55,36 +103,57 @@ def run(ctx): if line.split(',')[0].strip()][1:] # mapping - matrix_buff = reservoir.wells_by_name()['A1'].bottom(z=4) - triton = reservoir.wells_by_name()['A3'].bottom(z=4) - te = reservoir.wells_by_name()['A5'].bottom(z=4) - dye = reservoir.wells_by_name()['A7'].bottom(z=4) + matrix_buff = reservoir.wells_by_name()['A1'] + + triton = reservoir.wells_by_name()['A3'] + + te = reservoir.wells_by_name()['A5'] + + dye = reservoir.wells_by_name()['A7'] + calibration_solution = tuberack_15.wells()[0] + # protocol diluent_buff_col = deep_plate.columns()[diluent_buff_col-1] if plate_standard: ctx.comment('\n------------ADDING BUFFER TO PLATE------------\n\n') buffer_vols = [0, 250, 500, 750, 900, 950, 980, 1000] + p300.pick_up_tip() p300.mix(1, 300, matrix_buff) + for vol, well in zip(buffer_vols, diluent_buff_col): - if vol == 0: - continue - p300.transfer(vol, matrix_buff, well, new_tip='never') + + Transfer_With_TT( + Pipette = p300, + Source = matrix_buff, + Destination = well, + Vol = vol, + Dispense_Top = False + ) + p300.drop_tip() ctx.comment('\n------------ADDING CALIBRATION------------\n\n') 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 + for vol, well in zip(calibration_vols, diluent_buff_col): if vol == 0: continue - p300.pick_up_tip() - p300.mix(1, 300, matrix_buff) - p300.transfer(vol, calibration_solution, well.top(), - new_tip='never') - p300.drop_tip() + + Transfer_With_TT( + Pipette = p300, + Source = calibration_solution, + Destination = well, + Vol = vol, + Dispense_Top = True + ) + + p300.drop_tip() # Moved to outside of loop if duplicate_plating: ctx.comment('\n------------DUPLICATE PLATING------------\n\n') @@ -92,9 +161,20 @@ def run(ctx): for well in ['A1', 'A2', 'A11', 'A12']] source_col = diluent_buff_col[0] m300.pick_up_tip() - m300.aspirate(220, source_col) + m300.mix(1, 220, source_col.bottom(z = 3)) # Added in pre-wet + m300.aspirate(220, source_col.bottom(z = 3)) + + # Added in touch tip + m300.move_to(source_col.top(z = -3)) + m300.touch_tip() + for well in dispense_wells: - m300.dispense(50, well) + m300.dispense(50, well.bottom(z = 3)) + + # Added in touch tip + m300.move_to(well.top(z = -3)) + m300.touch_tip() + m300.drop_tip() else: @@ -103,61 +183,124 @@ def run(ctx): for well in ['A1', 'A2', 'A3', 'A10', 'A11', 'A12']] source_col = diluent_buff_col[0] m300.pick_up_tip() - m300.aspirate(300, source_col) + m300.mix(1, 300, source_col.bottom(z = 3)) # Added in pre-wet + m300.aspirate(300, source_col.bottom(z = 3)) + + # Added in touch tip + m300.move_to(source_col.top(z = -3)) + m300.touch_tip() + for well in dispense_wells: - m300.dispense(50, well) + m300.dispense(50, well.bottom(z = 3)) + + # Added in touch tip + m300.move_to(well.top(z = -3)) + m300.touch_tip() + m300.drop_tip() ctx.comment('\n------------ADDING SAMPLE------------\n\n') - for line in csv_lines: + + # Modified for faster sample addition with less tip wastage + if duplicate_plating: + reps = 2 * 2 + else: + reps = 3 * 2 + + for index, line in enumerate(csv_lines): csv_slot = int(line[0]) csv_well = line[1] source_well = ctx.loaded_labwares[csv_slot].wells_by_name()[csv_well] dest_well = line[2] - p300.pick_up_tip() - p300.aspirate(50, source_well) - p300.dispense(50, hs_plate.wells_by_name()[dest_well]) - p300.drop_tip() + + # Only pick up tip and aspirate if start of new replicate batch + if index%reps == 0: + p300.pick_up_tip() + p300.mix(1, 50*reps, source_well.bottom(z = 3)) # Added in pre-wet + p300.aspirate(50*reps, source_well.bottom(z = 3)) + p300.move_to(source_well.top(-3)) + p300.touch_tip() + + p300.dispense(50, hs_plate.wells_by_name()[dest_well].bottom(z = 3)) # Set z offset + p300.move_to(hs_plate.wells_by_name()[dest_well].top(-3)) + p300.touch_tip() + + # Only drop up tip if end of new replicate batch + if index%reps == reps - 1: + p300.drop_tip() ctx.comment('\n------------PLATING TRITON------------\n\n') - m300.flow_rate.dispense = 200 + + # Slow down aspirate and dispense rate + m300.flow_rate.dispense *= 2 + m300.flow_rate.aspirate *= 2 + dispense_wells = hs_plate.rows()[0][:6] m300.pick_up_tip() - m300.mix(1, 300, triton) - m300.aspirate(300, triton) + m300.mix(1, 300, triton.bottom(z = 3)) + m300.aspirate(300, triton.bottom(z = 3)) + + # Added in touch tip + m300.move_to(triton.top(z = -3)) + m300.touch_tip() + + for well in dispense_wells: m300.dispense(50, well.top()) + ctx.delay(seconds = 1) + m300.move_to(well.top(z = -3)) + m300.touch_tip() + ctx.delay(seconds = 1) + m300.drop_tip() ctx.comment('\n------------PLATING TE------------\n\n') dispense_wells = hs_plate.rows()[0][6:] m300.pick_up_tip() - m300.mix(1, 300, te) - m300.aspirate(300, te) + m300.mix(1, 300, te.bottom(z = 3)) + m300.aspirate(300, te.bottom(z = 3)) for well in dispense_wells: m300.dispense(50, well.top()) + ctx.delay(seconds = 1) + m300.move_to(well.top(z = -3)) + m300.touch_tip() + ctx.delay(seconds = 1) + m300.drop_tip() try: heater_shaker.set_and_wait_for_temperature(37) ctx.delay(minutes=10) heater_shaker.deactivate_heater() - except UnboundLocalError: + except: ctx.delay(minutes=10) ctx.comment('\n------------PLATING DYE------------\n\n') m300.pick_up_tip() - m300.mix(1, 300, te) + m300.mix(1, 300, dye.bottom(z = 3)) + + # Changed how dye is dispensed so that each well only has one transfer action to preserve accuracy + for i in range(0, 12, 3): + wells = [well for well in hs_plate.rows()[0][i : i+3]] + m300.aspirate(300, dye.bottom(z = 3)) + m300.touch_tip() + + for well in wells: + m300.dispense(100, well.top()) + ctx.delay(seconds = 1) + m300.move_to(well.top(z = -3)) + m300.touch_tip() + ctx.delay(seconds = 1) - for _ in range(2): - m300.distribute(50, dye, [well.top() for well in hs_plate.rows()[0]], - new_tip='never') +# for _ in range(2): +# m300.distribute(50, dye, [well.top() for well in hs_plate.rows()[0]], +# new_tip='never') m300.drop_tip() ctx.pause(''' - Plate is ready! Please remove, seal and transport to the plate reader for + Plate is ready! Please remove, seal, and transport to the plate reader for analysis. Please remember to tidy the robot deck and dispose of any waste. ''') diff --git a/protocols/010d6c/README.md b/protocols/010d6c/README.md index d653594c0..8005d1689 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/deck.png) +![deck](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/010d6c/ddddd.png) ### Reagent Setup @@ -37,13 +37,15 @@ This protocol performs a Ribrogreen assay - for detailed protocol steps, please ### Protocol Steps -1. ADDING BUFFER TO PLATE -2. ADDING CALIBRATION -3. DUPLICATE PLATING/TRIPLICATE PLATING -4. ADDING SAMPLE -5. PLATING TRITON -6. PLATING TE -7. PLATING DYE +1. Calibration standard preparation in deep well plate (matrix buffer addition) +2. Calibration standard preparation in deep well plate (4 ug/mL calibration stock addition) +3. Calibration standard plating (duplicate or triplicate) +4. Sample plating (duplicate or triplicate) +5. Triton addition +6. TE addition +7. Heating at 37 C for 10 minutes +8. Dye addition + ### Process diff --git a/protocols/010d6c/fields.json b/protocols/010d6c/fields.json index 584c5150b..9dceee839 100644 --- a/protocols/010d6c/fields.json +++ b/protocols/010d6c/fields.json @@ -3,20 +3,20 @@ "type": "textFile", "label": ".CSV File (header: source slot, source well, dest well)", "name": "csv_samp", - "default": "source slot, source well, dest well\n7, A1, A1" + "default": "source slot,source well,dest well\n8,A1,A4\n8,A1,A5" }, { "type": "dropDown", - "label": "Plate matrix buffer solution?", + "label": "Do calibration standards need prepared?", "name": "plate_standard", "options": [ - {"label": "Yes, plate matrix buffer", "value": true}, + {"label": "Yes, prepare calibration standards", "value": true}, {"label": "No, start at plating calibration standards", "value": false} ] }, { "type": "dropDown", - "label": "Deepwell plate column (1-12)", + "label": "Which column in the deepwell plate should the calibration standard be prepared in? (1-12)", "name": "diluent_buff_col", "options": [ {"label": "1", "value": 1}, diff --git a/protocols/08207f/08207f.ot2.apiv2.py b/protocols/08207f/08207f.ot2.apiv2.py index a6b441ad0..4728864ee 100644 --- a/protocols/08207f/08207f.ot2.apiv2.py +++ b/protocols/08207f/08207f.ot2.apiv2.py @@ -1,3 +1,5 @@ +# flake8: noqa +from opentrons import protocol_api import math metadata = { @@ -7,14 +9,24 @@ 'apiLevel': '2.13' } - def run(ctx): - [input_csv, init_vol_buff, labware_pcr_plate, labware_temp_deck, + [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_temp_deck", + "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, @@ -24,11 +36,20 @@ def run(ctx): ctx.load_labware( 'opentrons_96_filtertiprack_200ul', slot, '200ul tiprack') for slot in ['2', '9']] - tempdeck = ctx.load_module('temperature module gen2', '3') - dna_plate = tempdeck.load_labware(labware_temp_deck) # noqa: E501 + + 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 + dest_plate = ctx.load_labware(labware_pcr_plate, '6', 'end-point-plate') # noqa: E501 # pipettes p20 = ctx.load_instrument( @@ -65,8 +86,13 @@ def slow_withdraw(pip, well, delay_seconds=2.0): pip.move_to(well.top()) pip.default_speed *= 16 - # mapping + # 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 @@ -80,17 +106,18 @@ def slow_withdraw(pip, well, delay_seconds=2.0): dest_well = dest_plate.wells_by_name()[well] volume = float(row[7]) - if volume > 20: - if not p300.has_tip: - p300.pick_up_tip() - p300.aspirate(volume, buffer.bottom(h_buff)) - p300.dispense(volume, dest_well) + 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) + 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) @@ -108,19 +135,21 @@ def slow_withdraw(pip, well, delay_seconds=2.0): volume = float(row[6]) mix_reps = 2 + tip_height = 0.5 - if volume > 20: - p300.pick_up_tip() - p300.aspirate(volume, source_well) - 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) - p20.dispense(volume, dest_well) - p20.mix(mix_reps, 10) - p20.blow_out() - p20.drop_tip() + 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/fields.json b/protocols/08207f/fields.json index c024effd3..60b67bf11 100644 --- a/protocols/08207f/fields.json +++ b/protocols/08207f/fields.json @@ -23,12 +23,27 @@ { "type": "dropDown", "label": "Labware on the Temperature Module", - "name": "labware_temp_deck", + "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",