diff --git a/protoBuilds/090c2e/README.json b/protoBuilds/090c2e/README.json index b3d224680..db9e18afd 100644 --- a/protoBuilds/090c2e/README.json +++ b/protoBuilds/090c2e/README.json @@ -1,26 +1,25 @@ { "author": "Opentrons", "categories": { - "Nucleic Acid Purification": [ - "Omega Bio-Tek Mag-Bind Environmental DNA 96 Kit" - ] + "Nucleic Acid Purification": [], + "Omega Bio-Tek Mag-Bind Environmental DNA 96 Kit": [] }, "deck-setup": "", "description": "This protocol performs a nucleic acid purification according to the Omega Bio-Tek Mag-Bind Environmental DNA 96 Kit.", "internal": "090c2e", "labware": "\nQIAGEN 96 Tube Rack 1.2mL #19560\nNEST 12 Well Reservoir 15 mL #360102\nNEST 1 Well Reservoir 195 mL #360103\nOpentrons 96 Filter Tip Rack 200 \u00b5L\nNEST 96 Well Plate 100 \u00b5L PCR Full Skirt #402501\n", "markdown": { - "author": "[Opentrons](https://opentrons.com/)\n\n\n", - "categories": "* Nucleic Acid Purification\n\t* Omega Bio-Tek Mag-Bind Environmental DNA 96 Kit\n\n\n", - "deck-setup": "![deck](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/090c2e/deck.png)\n\n\n", - "description": "This protocol performs a nucleic acid purification according to the [Omega Bio-Tek Mag-Bind Environmental DNA 96 Kit](https://s3.amazonaws.com/pf-user-files-01/u-4256/uploads/2023-03-14/is13ts3/QMF27.0248.M5645%20v9.0%202.pdf).\n\n\n", - "internal": "090c2e\n", - "labware": "* QIAGEN 96 Tube Rack 1.2mL #19560\n* [NEST 12 Well Reservoir 15 mL #360102](http://www.cell-nest.com/page94?_l=en&product_id=102)\n* [NEST 1 Well Reservoir 195 mL #360103](http://www.cell-nest.com/page94?_l=en&product_id=102)\n* Opentrons 96 Filter Tip Rack 200 \u00b5L\n* [NEST 96 Well Plate 100 \u00b5L PCR Full Skirt #402501](http://www.cell-nest.com/page94?_l=en&product_id=97&product_category=96)\n\n\n", - "modules": "* [Opentrons Magnetic Module (GEN2)](https://shop.opentrons.com/magnetic-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 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", - "reagent-setup": "![reagents](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/090c2e/reagents.png)\n\n\n", + "author": "\n[Opentrons](https://opentrons.com/)\n\n", + "categories": "\n- Nucleic Acid Purification\n - Omega Bio-Tek Mag-Bind Environmental DNA 96 Kit\n\n", + "deck-setup": "\n![deck](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/090c2e/deckv2.png)\n\n", + "description": "\nThis protocol performs a nucleic acid purification according to the [Omega Bio-Tek Mag-Bind Environmental DNA 96 Kit](https://s3.amazonaws.com/pf-user-files-01/u-4256/uploads/2023-03-14/is13ts3/QMF27.0248.M5645%20v9.0%202.pdf).\n\n", + "internal": "\n090c2e\n", + "labware": "\n- QIAGEN 96 Tube Rack 1.2mL #19560\n- [NEST 12 Well Reservoir 15 mL #360102](http://www.cell-nest.com/page94?_l=en&product_id=102)\n- [NEST 1 Well Reservoir 195 mL #360103](http://www.cell-nest.com/page94?_l=en&product_id=102)\n- Opentrons 96 Filter Tip Rack 200 \u00b5L\n- [NEST 96 Well Plate 100 \u00b5L PCR Full Skirt #402501](http://www.cell-nest.com/page94?_l=en&product_id=97&product_category=96)\n\n", + "modules": "\n- [Opentrons Magnetic Module (GEN2)](https://shop.opentrons.com/magnetic-module-gen2/)\n\n", + "notes": "\nIf 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", + "pipettes": "\n- [Opentrons P300 8 Channel Electronic Pipette (GEN2)](https://shop.opentrons.com/8-channel-electronic-pipette/)\n\n", + "process": "\n1. 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", + "reagent-setup": "\n![reagents](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/090c2e/reagentsv2.png)\n\n", "title": "Omega Bio-Tek Mag-Bind Environmental DNA 96 Kit" }, "modules": [ diff --git a/protoBuilds/0b97ae-protocol-3B/0b97ae-protocol-3B.ot2.apiv2.py.json b/protoBuilds/0b97ae-protocol-3B/0b97ae-protocol-3B.ot2.apiv2.py.json index f669d77f8..a5512c033 100644 --- a/protoBuilds/0b97ae-protocol-3B/0b97ae-protocol-3B.ot2.apiv2.py.json +++ b/protoBuilds/0b97ae-protocol-3B/0b97ae-protocol-3B.ot2.apiv2.py.json @@ -1,5 +1,5 @@ { - "content": "# flake8: noqa\n\n\n\"\"\"OPENTRONS.\"\"\"\nfrom opentrons import protocol_api\nimport math\nimport threading\nfrom time import sleep\nfrom opentrons import types\n\nmetadata = {\n 'protocolName': 'QIAseq FastSelect Extraction',\n 'author': 'Trevor ',\n 'source': 'Custom Protocol Request',\n 'apiLevel': '2.13' # CHECK IF YOUR API LEVEL HERE IS UP TO DATE\n # IN SECTION 5.2 OF THE APIV2 \"VERSIONING\"\n}\n\n# Definitions for deck light flashing\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: protocol_api.ProtocolContext):\n \"\"\"PROTOCOLS.\"\"\"\n [\n num_samples, vol_dna , flash, bead_timer] = get_values( # noqa: F821 (<--- DO NOT REMOVE!)\n \"num_samples\",\"vol_dna\",\"flash\",\"bead_timer\")\n num_samples = int(num_samples)\n\n 'Global variables'\n TEST_MODE = False\n bead_delay_time_1 = 2\n bead_delay_time = 5\n wash_delay_time = 10\n supernatant_headspeed_modulator = 10\n mag_height = 3.5\n air_dry_time = bead_timer\n ctx.max_speeds['Z'] = 125\n ctx.max_speeds['A'] = 125\n # Setup for flashing lights notification to empty trash\n cancellationToken = CancellationToken()\n\n # define all custom variables above here with descriptions:\n num_columns = math.ceil(num_samples/8)\n\n # load modules\n tempdeck_1 = ctx.load_module('temperature module gen2', '10')\n tempdeck_1.set_temperature(4)\n tempdeck_2 = ctx.load_module('temperature module gen2', '7')\n tempdeck_2.set_temperature(4)\n Mag_mod = ctx.load_module('magnetic module', '4')\n Mag_mod.disengage()\n\n # load labware\n mag_plate = Mag_mod.load_labware('nest_96_wellplate_2ml_deep','Extraction Plate')\n final_plate = tempdeck_1.load_labware('opentrons_96_aluminumblock_biorad_wellplate_200ul', #noqa: E501\n 'Reagent Plate')\n Diluted_plate = tempdeck_2.load_labware('appliedbiosystemsenduraplate_96_aluminumblock_220ul', # noqa: E501\n 'Diluted RNA plate')\n water_res = ctx.load_labware('perkinelmer_12_reservoir_21000ul', 2,\n 'Water reservoir')\n Reagent_plate = ctx.load_labware('biorad_96_wellplate_200ul_pcr', '1')\n\n # load tipracks\n tips3 = [ctx.load_labware('opentrons_96_tiprack_300ul', slot)\n for slot in ['8', '9', '11']]\n tips = [ctx.load_labware('opentrons_96_filtertiprack_20ul', slot)\n for slot in ['3', '5', '6']]\n # load instrument\n\n p20 = ctx.load_instrument('p20_multi_gen2', 'left',\n tip_racks=tips)\n p300 = ctx.load_instrument('p300_multi_gen2', 'right',\n tip_racks=tips3)\n\n # reagents\n samples_start = Diluted_plate.rows()[0][:num_columns]\n samples_mag = mag_plate.rows()[0][:num_columns]\n etoh = water_res.rows()[0][2]\n etoh_1 = water_res.rows()[0][3]\n final_dest = final_plate.rows()[0][:num_columns]\n water_1 = water_res.rows()[0][0]\n bb = water_res.rows()[0][1]\n bb = water_res.rows()[0][1]\n Removal_Trash_1 = water_res.rows()[0][9]\n Removal_Trash_2 = water_res.rows()[0][10]\n Removal_Trash_3 = water_res.rows()[0][11]\n mm_1 = Reagent_plate.rows()[0][0]\n beads = Reagent_plate.rows()[0][0]\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') # noqa: E501\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 tips_dropped = 0\n\n def drop_tip(pip, home=True):\n nonlocal tips_dropped\n pip.drop_tip(home_after=home)\n if pip == p300:\n tips_dropped += 8\n else:\n tips_dropped += 1\n if tips_dropped == 288:\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 EMPTY TRASH~~~~~~~~~~~~~~~\\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 tips_dropped = 0\n\n def bead_mixing(well, pip, mvol, reps=10):\n \"\"\"bead_mixing.\"\"\"\n \"\"\"\n 'bead_mixing' will mix liquid that contains beads. This will be done by\n aspirating from the middle of the well & dispensing from the bottom to\n mix the beads with the other liquids as much as possible. Aspiration &\n dispensing will also be reversed to ensure proper mixing.\n param well: The current well that the mixing will occur in.\n param pip: The pipet that is currently attached/ being used.\n param mvol: The volume that is transferred before the mixing steps.\n param reps: The number of mix repetitions that should occur. Note~\n During each mix rep, there are 2 cycles of aspirating from bottom,\n dispensing at the top and 2 cycles of aspirating from middle,\n dispensing at the bottom\n \"\"\"\n vol = mvol * .9\n\n pip.move_to(well.center())\n for _ in range(reps):\n pip.aspirate(vol, well.bottom(1), rate=2)\n pip.dispense(vol, well.bottom(5), rate=2)\n\n # protocol\n ctx.comment('\\n~~~~~~~~~~~~~~ADDING SAMPLES TO MAG PLATE~~~~~~~~~~~~~~\\n')\n for s, d in zip(samples_start, samples_mag):\n pick_up(p20)\n p20.aspirate(vol_dna, s)\n p20.dispense(vol_dna, d)\n drop_tip(p20)\n\n ctx.comment('\\n~~~~~~~~~~~~~~ADDING BEADS TO SAMPLES~~~~~~~~~~~~~~\\n')\n for i, dest in enumerate(samples_mag):\n pick_up(p20)\n if i % 3 == 0:\n bead_mixing(beads, p20, 15)\n p20.aspirate(19.5, beads, rate=0.5)\n ctx.delay(seconds=1)\n ctx.max_speeds['Z'] /= supernatant_headspeed_modulator\n ctx.max_speeds['A'] /= supernatant_headspeed_modulator\n p20.move_to(beads.top())\n ctx.max_speeds['Z'] *= supernatant_headspeed_modulator\n ctx.max_speeds['A'] *= supernatant_headspeed_modulator\n p20.dispense(19.5, dest, rate=0.5)\n bead_mixing(dest, p20, 15, reps=6)\n p20.blow_out(dest.bottom(20))\n drop_tip(p20)\n\n ctx.pause('Remove Plate and Centrifuge, place back on deck at site 4, on the magnetic module')\n ctx.comment('\\n~~~~~~~~~~~~~~INCUBATING SAMPLES WITH BEADS~~~~~~~~~~~~~\\n')\n\n Mag_mod.engage(height_from_base=mag_height)\n ctx.comment('\\n~~~~~~~~~~~~~~SEPARATING BEADS~~~~~~~~~~~~~\\n')\n if TEST_MODE:\n ctx.delay(minutes=bead_delay_time_1)\n else:\n ctx.delay(minutes=bead_delay_time_1)\n\n ctx.comment('\\n~~~~~~~~~~~~~~REMOVING SUPERNATANT~~~~~~~~~~~~~\\n')\n for i, dest in enumerate(samples_mag):\n side = -1 if i % 2 == 0 else 1\n pick_up(p20)\n for _ in range(2):\n\n p20.move_to(dest.top())\n ctx.max_speeds['Z'] /= supernatant_headspeed_modulator\n ctx.max_speeds['A'] /= supernatant_headspeed_modulator\n p20.aspirate(9.75, dest.bottom().move(types.Point(x=side,\n y=0, z=1)),\n rate=0.1)\n ctx.delay(seconds=1)\n p20.move_to(dest.top())\n p20.aspirate(1.5, dest.top())\n ctx.max_speeds['Z'] *= supernatant_headspeed_modulator\n ctx.max_speeds['A'] *= supernatant_headspeed_modulator\n p20.dispense(p20.current_volume, Removal_Trash_1)\n p20.blow_out()\n p20.air_gap(1)\n drop_tip(p20)\n\n ctx.comment('\\n~~~~~~~~~~~~~~ADDING Water TO SAMPLES~~~~~~~~~~~~~~\\n')\n pick_up(p20)\n for i, dest in enumerate(samples_mag):\n p20.aspirate(15, water_1)\n p20.dispense(15, dest.top())\n drop_tip(p20)\n\n ctx.comment('\\n~~~ADDING QIAseq Bead Binding Buffer TO SAMPLES~~~~~~~\\n')\n for i, dest in enumerate(samples_mag):\n pick_up(p20)\n p20.aspirate(19.5, bb)\n p20.dispense(19.5, dest)\n p20.mix(3, 17, dest)\n drop_tip(p20)\n\n ctx.pause('''\n Remove Plate and Centrifuge, place back on deck at site 4,\n on the magnetic module''')\n ctx.comment('\\n~~~~~~~~~~~~~~INCUBATING SAMPLES~~~~~~~~~~~~~\\n')\n if TEST_MODE:\n ctx.delay(seconds=5)\n else:\n ctx.delay(minutes=5)\n\n Mag_mod.engage(height_from_base=mag_height)\n ctx.comment('\\n~~~~~~~~~~~~~~SEPARATING BEADS~~~~~~~~~~~~~\\n')\n if TEST_MODE:\n ctx.delay(minutes=bead_delay_time_1)\n else:\n ctx.delay(minutes=bead_delay_time_1)\n\n ctx.comment('\\n~~~~~~~~~~~~~~WASHING TWICE WITH ETHANOL~~~~~~~~~~~~~\\n')\n for _ in range(2):\n pick_up(p300)\n ctx.comment('\\n~~~~~~~~~~~~~~ADDING ETHANOL~~~~~~~~~~~~~\\n')\n if _ > 0:\n for i, dest in enumerate(samples_mag):\n p300.mix(1, 150, etoh_1)\n p300.aspirate(210, etoh_1)\n p300.dispense(200, dest.top())\n p300.aspirate(20, dest.top())\n p300.dispense(30, etoh_1.top())\n else:\n for i, dest in enumerate(samples_mag):\n p300.mix(1, 150, etoh)\n p300.aspirate(210, etoh)\n p300.dispense(200, dest.top())\n p300.aspirate(20, dest.top())\n p300.dispense(30, etoh.top())\n\n ctx.delay(seconds=30)\n ctx.comment('\\n~~~~~~~~~~~~~~REMOVING ETHANOL~~~~~~~~~~~~~\\n')\n for i, dest in enumerate(samples_mag):\n side = -1 if i % 2 == 0 else 1\n if i > 0:\n pick_up(p300)\n p300.move_to(dest.top(2))\n ctx.max_speeds['Z'] /= supernatant_headspeed_modulator\n ctx.max_speeds['A'] /= supernatant_headspeed_modulator\n p300.aspirate(200, dest.bottom().move(types.Point(x=side,\n y=0, z=1)),\n rate=0.1)\n p300.move_to(dest.top(2))\n ctx.max_speeds['Z'] *= supernatant_headspeed_modulator\n ctx.max_speeds['A'] *= supernatant_headspeed_modulator\n if i > 5:\n p300.dispense(200, Removal_Trash_3)\n else:\n p300.dispense(200, Removal_Trash_2)\n drop_tip(p300)\n if _ == 1:\n for i, dest in enumerate(samples_mag):\n pick_up(p20)\n p20.aspirate(10, dest.bottom(0.25), rate=.1)\n p20.aspirate(2, dest.top())\n if i > 5:\n p20.dispense(p20.current_volume, Removal_Trash_3)\n p20.aspirate(10, Removal_Trash_3)\n else:\n p20.dispense(p20.current_volume, Removal_Trash_2)\n p20.aspirate(10, Removal_Trash_2)\n p20.drop_tip()\n\n ctx.comment('\\n~~~~~~~~~~~~~~AIR DRY BEADS FOR 5 MINUTES~~~~~~~~~~~~~\\n')\n if TEST_MODE:\n ctx.delay(minutes=air_dry_time)\n else:\n ctx.delay(minutes=air_dry_time)\n\n Mag_mod.disengage()\n\n ctx.pause('''\n Remove Plate and inspect pellet to confirm it is completely\n dry, place back on deck at site 4, on the magnetic module\n ''')\n\n ctx.comment('\\n~~~~~~~~~~~~~ELUTING WITH Nucleas-free Water~~~~~~~~~~~\\n')\n for i, dest in enumerate(samples_mag):\n pick_up(p20)\n p20.aspirate(16, water_1)\n p20.dispense(16, dest)\n bead_mixing(dest, p20, 17)\n p20.blow_out(dest.top())\n p20.air_gap(1)\n drop_tip(p20)\n\n ctx.comment('\\n~~~~~~~~~~~~~~ELUTING FOR 2 MINUTES~~~~~~~~~~~~~\\n')\n if TEST_MODE:\n ctx.delay(seconds=2)\n else:\n ctx.delay(minutes=2)\n\n ctx.comment('\\n~~~~~~~~~~~~~~SEPARATING BEADS~~~~~~~~~~~~~\\n')\n Mag_mod.engage(height_from_base=mag_height)\n if TEST_MODE:\n ctx.delay(minutes=bead_delay_time)\n else:\n ctx.delay(minutes=bead_delay_time)\n\n ctx.comment('\\n~~~~~~~~~~~~~~MOVING cDNA TO FINAL PLATE~~~~~~~~~~~~~\\n')\n\n for s, d in zip(samples_mag, final_dest):\n pick_up(p20)\n p20.aspirate(14, s.bottom().move(types.Point(x=0, y=0, z=0.7)),\n rate=0.1)\n p20.dispense(14, d)\n drop_tip(p20)\n\n # ctx.comment('\\n~~~~~~~~~~~~~~FIRST STRAND SYNTHESIS SETUP~~~~~~~~~~~~~\\n')\n # for i, dest in enumerate(final_dest):\n # pick_up(p20)\n # p20.aspirate(11, mm_1)\n # p20.dispense(11, dest.top())\n # bead_mixing(dest, p20, 19)\n # p20.blow_out(dest.top())\n # p20.air_gap(1)\n # drop_tip(p20)\n\n if flash:\n if not ctx._hw_manager.hardware.is_simulator:\n cancellationToken.set_true()\n thread = create_thread(ctx, cancellationToken)\n p20.home()\n ctx.pause('\\n\\n~~~~~~~~~~~~~~PROTOCOL COMPLETE~~~~~~~~~~~~~~~\\n')\n ctx.home() # home before continuing with protocol\n Mag_mod.disengage()\n tempdeck_1.deactivate()\n tempdeck_2.deactivate()\n if flash:\n cancellationToken.set_false()\n thread.join()\n ctx.set_rail_lights(True)\n", + "content": "# flake8: noqa\n\n\n\"\"\"OPENTRONS.\"\"\"\nfrom opentrons import protocol_api\nimport math\nimport threading\nfrom time import sleep\nfrom opentrons import types\n\nmetadata = {\n 'protocolName': 'QIAseq FastSelect Extraction',\n 'author': 'Trevor ',\n 'source': 'Custom Protocol Request',\n 'apiLevel': '2.13' # CHECK IF YOUR API LEVEL HERE IS UP TO DATE\n # IN SECTION 5.2 OF THE APIV2 \"VERSIONING\"\n}\n\n# Definitions for deck light flashing\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: protocol_api.ProtocolContext):\n \"\"\"PROTOCOLS.\"\"\"\n [\n num_samples, vol_dna , flash, bead_timer] = get_values( # noqa: F821 (<--- DO NOT REMOVE!)\n \"num_samples\",\"vol_dna\",\"flash\",\"bead_timer\")\n num_samples = int(num_samples)\n\n 'Global variables'\n TEST_MODE = False\n bead_delay_time_1 = 2\n bead_delay_time = 5\n wash_delay_time = 10\n supernatant_headspeed_modulator = 10\n mag_height = 3.5\n air_dry_time = bead_timer\n ctx.max_speeds['Z'] = 125\n ctx.max_speeds['A'] = 125\n # Setup for flashing lights notification to empty trash\n cancellationToken = CancellationToken()\n\n # define all custom variables above here with descriptions:\n num_columns = math.ceil(num_samples/8)\n\n # load modules\n tempdeck_1 = ctx.load_module('temperature module gen2', '10')\n tempdeck_1.set_temperature(4)\n tempdeck_2 = ctx.load_module('temperature module gen2', '7')\n tempdeck_2.set_temperature(4)\n Mag_mod = ctx.load_module('magnetic module gen2', '4')\n Mag_mod.disengage()\n\n # load labware\n mag_plate = Mag_mod.load_labware('nest_96_wellplate_2ml_deep','Extraction Plate')\n final_plate = tempdeck_1.load_labware('opentrons_96_aluminumblock_biorad_wellplate_200ul', #noqa: E501\n 'Reagent Plate')\n Diluted_plate = tempdeck_2.load_labware('appliedbiosystemsenduraplate_96_aluminumblock_220ul', # noqa: E501\n 'Diluted RNA plate')\n water_res = ctx.load_labware('perkinelmer_12_reservoir_21000ul', 2,\n 'Water reservoir')\n Reagent_plate = ctx.load_labware('biorad_96_wellplate_200ul_pcr', '1')\n\n # load tipracks\n tips3 = [ctx.load_labware('opentrons_96_tiprack_300ul', slot)\n for slot in ['8', '9', '11']]\n tips = [ctx.load_labware('opentrons_96_filtertiprack_20ul', slot)\n for slot in ['3', '5', '6']]\n # load instrument\n\n p20 = ctx.load_instrument('p20_multi_gen2', 'left',\n tip_racks=tips)\n p300 = ctx.load_instrument('p300_multi_gen2', 'right',\n tip_racks=tips3)\n\n # reagents\n samples_start = Diluted_plate.rows()[0][:num_columns]\n samples_mag = mag_plate.rows()[0][:num_columns]\n etoh = water_res.rows()[0][2]\n etoh_1 = water_res.rows()[0][3]\n final_dest = final_plate.rows()[0][:num_columns]\n water_1 = water_res.rows()[0][0]\n bb = water_res.rows()[0][1]\n bb = water_res.rows()[0][1]\n Removal_Trash_1 = water_res.rows()[0][9]\n Removal_Trash_2 = water_res.rows()[0][10]\n Removal_Trash_3 = water_res.rows()[0][11]\n mm_1 = Reagent_plate.rows()[0][0]\n beads = Reagent_plate.rows()[0][0]\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') # noqa: E501\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 tips_dropped = 0\n\n def drop_tip(pip, home=True):\n nonlocal tips_dropped\n pip.drop_tip(home_after=home)\n if pip == p300:\n tips_dropped += 8\n else:\n tips_dropped += 1\n if tips_dropped == 288:\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 EMPTY TRASH~~~~~~~~~~~~~~~\\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 tips_dropped = 0\n\n def bead_mixing(well, pip, mvol, reps=10):\n \"\"\"bead_mixing.\"\"\"\n \"\"\"\n 'bead_mixing' will mix liquid that contains beads. This will be done by\n aspirating from the middle of the well & dispensing from the bottom to\n mix the beads with the other liquids as much as possible. Aspiration &\n dispensing will also be reversed to ensure proper mixing.\n param well: The current well that the mixing will occur in.\n param pip: The pipet that is currently attached/ being used.\n param mvol: The volume that is transferred before the mixing steps.\n param reps: The number of mix repetitions that should occur. Note~\n During each mix rep, there are 2 cycles of aspirating from bottom,\n dispensing at the top and 2 cycles of aspirating from middle,\n dispensing at the bottom\n \"\"\"\n vol = mvol * .9\n\n pip.move_to(well.center())\n for _ in range(reps):\n pip.aspirate(vol, well.bottom(1), rate=2)\n pip.dispense(vol, well.bottom(5), rate=2)\n\n # protocol\n ctx.comment('\\n~~~~~~~~~~~~~~ADDING SAMPLES TO MAG PLATE~~~~~~~~~~~~~~\\n')\n for s, d in zip(samples_start, samples_mag):\n pick_up(p20)\n p20.aspirate(vol_dna, s)\n p20.dispense(vol_dna, d)\n drop_tip(p20)\n\n ctx.comment('\\n~~~~~~~~~~~~~~ADDING BEADS TO SAMPLES~~~~~~~~~~~~~~\\n')\n for i, dest in enumerate(samples_mag):\n pick_up(p20)\n if i % 3 == 0:\n bead_mixing(beads, p20, 15)\n p20.aspirate(19.5, beads, rate=0.5)\n ctx.delay(seconds=1)\n ctx.max_speeds['Z'] /= supernatant_headspeed_modulator\n ctx.max_speeds['A'] /= supernatant_headspeed_modulator\n p20.move_to(beads.top())\n ctx.max_speeds['Z'] *= supernatant_headspeed_modulator\n ctx.max_speeds['A'] *= supernatant_headspeed_modulator\n p20.dispense(19.5, dest, rate=0.5)\n bead_mixing(dest, p20, 15, reps=6)\n p20.blow_out(dest.bottom(20))\n p20.aspirate(1, dest.top())\n ctx.delay(seconds=10)\n p20.aspirate(1, dest.top())\n drop_tip(p20)\n\n ctx.pause('Remove Plate and Centrifuge, place back on deck at site 4, on the magnetic module')\n ctx.comment('\\n~~~~~~~~~~~~~~INCUBATING SAMPLES WITH BEADS~~~~~~~~~~~~~\\n')\n\n Mag_mod.engage(height_from_base=mag_height)\n ctx.comment('\\n~~~~~~~~~~~~~~SEPARATING BEADS~~~~~~~~~~~~~\\n')\n if TEST_MODE:\n ctx.delay(minutes=bead_delay_time_1)\n else:\n ctx.delay(minutes=bead_delay_time_1)\n\n ctx.comment('\\n~~~~~~~~~~~~~~REMOVING SUPERNATANT~~~~~~~~~~~~~\\n')\n for i, dest in enumerate(samples_mag):\n side = -1 if i % 2 == 0 else 1\n pick_up(p20)\n for _ in range(2):\n\n p20.move_to(dest.top())\n ctx.max_speeds['Z'] /= supernatant_headspeed_modulator\n ctx.max_speeds['A'] /= supernatant_headspeed_modulator\n p20.aspirate(9.75, dest.bottom().move(types.Point(x=side,\n y=0, z=1)),\n rate=0.1)\n ctx.delay(seconds=1)\n p20.move_to(dest.top())\n p20.aspirate(1.5, dest.top())\n ctx.max_speeds['Z'] *= supernatant_headspeed_modulator\n ctx.max_speeds['A'] *= supernatant_headspeed_modulator\n p20.dispense(p20.current_volume, Removal_Trash_1)\n p20.blow_out()\n p20.air_gap(1)\n ctx.delay(seconds=10)\n p20.air_gap(1)\n drop_tip(p20)\n\n ctx.comment('\\n~~~~~~~~~~~~~~ADDING Water TO SAMPLES~~~~~~~~~~~~~~\\n')\n pick_up(p20)\n for i, dest in enumerate(samples_mag):\n p20.aspirate(15, water_1)\n p20.dispense(15, dest.top())\n drop_tip(p20)\n\n ctx.comment('\\n~~~ADDING QIAseq Bead Binding Buffer TO SAMPLES~~~~~~~\\n')\n for i, dest in enumerate(samples_mag):\n pick_up(p20)\n p20.aspirate(19.5, bb)\n p20.dispense(19.5, dest)\n p20.mix(3, 17, dest)\n drop_tip(p20)\n\n ctx.pause('''\n Remove Plate and Centrifuge, place back on deck at site 4,\n on the magnetic module''')\n ctx.comment('\\n~~~~~~~~~~~~~~INCUBATING SAMPLES~~~~~~~~~~~~~\\n')\n if TEST_MODE:\n ctx.delay(seconds=5)\n else:\n ctx.delay(minutes=5)\n\n Mag_mod.engage(height_from_base=mag_height)\n ctx.comment('\\n~~~~~~~~~~~~~~SEPARATING BEADS~~~~~~~~~~~~~\\n')\n if TEST_MODE:\n ctx.delay(minutes=bead_delay_time_1)\n else:\n ctx.delay(minutes=bead_delay_time_1)\n\n ctx.comment('\\n~~~~~~~~~~~~~~WASHING TWICE WITH ETHANOL~~~~~~~~~~~~~\\n')\n for _ in range(2):\n pick_up(p300)\n ctx.comment('\\n~~~~~~~~~~~~~~ADDING ETHANOL~~~~~~~~~~~~~\\n')\n if _ > 0:\n for i, dest in enumerate(samples_mag):\n p300.mix(1, 150, etoh_1)\n p300.aspirate(210, etoh_1)\n p300.dispense(200, dest.top())\n p300.aspirate(20, dest.top())\n p300.dispense(30, etoh_1.top())\n else:\n for i, dest in enumerate(samples_mag):\n p300.mix(1, 150, etoh)\n p300.aspirate(210, etoh)\n p300.dispense(200, dest.top())\n p300.aspirate(20, dest.top())\n p300.dispense(30, etoh.top())\n\n ctx.delay(seconds=30)\n ctx.comment('\\n~~~~~~~~~~~~~~REMOVING ETHANOL~~~~~~~~~~~~~\\n')\n for i, dest in enumerate(samples_mag):\n side = -1 if i % 2 == 0 else 1\n if i > 0:\n pick_up(p300)\n p300.move_to(dest.top(2))\n ctx.max_speeds['Z'] /= supernatant_headspeed_modulator\n ctx.max_speeds['A'] /= supernatant_headspeed_modulator\n p300.aspirate(200, dest.bottom().move(types.Point(x=side,\n y=0, z=1)),\n rate=0.1)\n p300.move_to(dest.top(2))\n ctx.max_speeds['Z'] *= supernatant_headspeed_modulator\n ctx.max_speeds['A'] *= supernatant_headspeed_modulator\n if i > 5:\n p300.dispense(200, Removal_Trash_3)\n else:\n p300.dispense(200, Removal_Trash_2)\n drop_tip(p300)\n if _ == 1:\n for i, dest in enumerate(samples_mag):\n pick_up(p20)\n p20.aspirate(10, dest.bottom(0.25), rate=.1)\n p20.aspirate(2, dest.top())\n if i > 5:\n p20.dispense(p20.current_volume, Removal_Trash_3)\n p20.aspirate(10, Removal_Trash_3)\n else:\n p20.dispense(p20.current_volume, Removal_Trash_2)\n p20.aspirate(10, Removal_Trash_2)\n p20.drop_tip()\n\n ctx.comment('\\n~~~~~~~~~~~~~~AIR DRY BEADS FOR 5 MINUTES~~~~~~~~~~~~~\\n')\n if TEST_MODE:\n ctx.delay(minutes=air_dry_time)\n else:\n ctx.delay(minutes=air_dry_time)\n\n Mag_mod.disengage()\n\n ctx.pause('''\n Remove Plate and inspect pellet to confirm it is completely\n dry, place back on deck at site 4, on the magnetic module\n ''')\n\n ctx.comment('\\n~~~~~~~~~~~~~ELUTING WITH Nucleas-free Water~~~~~~~~~~~\\n')\n for i, dest in enumerate(samples_mag):\n pick_up(p20)\n p20.aspirate(16, water_1)\n p20.dispense(16, dest)\n bead_mixing(dest, p20, 17)\n p20.blow_out(dest.top())\n p20.air_gap(1)\n drop_tip(p20)\n\n ctx.comment('\\n~~~~~~~~~~~~~~ELUTING FOR 2 MINUTES~~~~~~~~~~~~~\\n')\n if TEST_MODE:\n ctx.delay(seconds=2)\n else:\n ctx.delay(minutes=2)\n\n ctx.comment('\\n~~~~~~~~~~~~~~SEPARATING BEADS~~~~~~~~~~~~~\\n')\n Mag_mod.engage(height_from_base=mag_height)\n if TEST_MODE:\n ctx.delay(minutes=bead_delay_time)\n else:\n ctx.delay(minutes=bead_delay_time)\n\n ctx.comment('\\n~~~~~~~~~~~~~~MOVING cDNA TO FINAL PLATE~~~~~~~~~~~~~\\n')\n\n for s, d in zip(samples_mag, final_dest):\n pick_up(p20)\n p20.aspirate(14, s.bottom().move(types.Point(x=0, y=0, z=0.7)),\n rate=0.1)\n p20.dispense(14, d)\n drop_tip(p20)\n\n # ctx.comment('\\n~~~~~~~~~~~~~~FIRST STRAND SYNTHESIS SETUP~~~~~~~~~~~~~\\n')\n # for i, dest in enumerate(final_dest):\n # pick_up(p20)\n # p20.aspirate(11, mm_1)\n # p20.dispense(11, dest.top())\n # bead_mixing(dest, p20, 19)\n # p20.blow_out(dest.top())\n # p20.air_gap(1)\n # drop_tip(p20)\n\n if flash:\n if not ctx._hw_manager.hardware.is_simulator:\n cancellationToken.set_true()\n thread = create_thread(ctx, cancellationToken)\n p20.home()\n ctx.pause('\\n\\n~~~~~~~~~~~~~~PROTOCOL COMPLETE~~~~~~~~~~~~~~~\\n')\n ctx.home() # home before continuing with protocol\n Mag_mod.disengage()\n tempdeck_1.deactivate()\n tempdeck_2.deactivate()\n if flash:\n cancellationToken.set_false()\n thread.join()\n ctx.set_rail_lights(True)\n", "custom_labware_defs": [ { "brand": { @@ -1458,7 +1458,7 @@ "type": "opentrons_96_filtertiprack_20ul" }, { - "name": "Extraction Plate on Magnetic Module GEN1 on 4", + "name": "Extraction Plate on Magnetic Module GEN2 on 4", "share": false, "slot": "4", "type": "nest_96_wellplate_2ml_deep" @@ -1532,7 +1532,7 @@ "type": "tempdeck" }, { - "name": "MagneticModuleContext at Magnetic Module GEN1 on 4 lw Extraction Plate on Magnetic Module GEN1 on 4", + "name": "MagneticModuleContext at Magnetic Module GEN2 on 4 lw Extraction Plate on Magnetic Module GEN2 on 4", "share": false, "slot": "4", "type": "magdeck" diff --git a/protoBuilds/onsite-circlelabs/onsite-circlelabs.ot2.apiv2.py.json b/protoBuilds/onsite-circlelabs/onsite-circlelabs.ot2.apiv2.py.json index ae73dc678..766ef920e 100644 --- a/protoBuilds/onsite-circlelabs/onsite-circlelabs.ot2.apiv2.py.json +++ b/protoBuilds/onsite-circlelabs/onsite-circlelabs.ot2.apiv2.py.json @@ -1,5 +1,5 @@ { - "content": "import math\nfrom opentrons import types\n\nmetadata = {\n \"protocolName\": \"Tagmentation and Bead Cleanup\",\n \"author\": \"Rami Farawi \",\n \"source\": \"Custom Protocol Request\",\n \"apiLevel\": \"2.13\"\n}\n\n\ndef run(ctx):\n\n [num_samp, barcode_sample_plate, water_vol,\n barcode_vol, temp_mod_temp,\n p300_mount, m20_mount] = get_values( # noqa: F821\n \"num_samp\", \"barcode_sample_plate\",\n \"water_vol\", \"barcode_vol\", \"temp_mod_temp\", \"p300_mount\",\n \"m20_mount\")\n\n num_samp = int(num_samp)\n\n if barcode_sample_plate == \"fisher_96_wellplate_200ul\":\n temp_mod_plate = \"fisher_96_aluminumblock_200ul\"\n\n elif barcode_sample_plate == \"bulldog_96_wellplate_200ul\":\n temp_mod_plate = \"bulldog_96_aluminumblock_200ul\"\n\n else:\n temp_mod_plate = \"opentrons_96_aluminumblock_biorad_wellplate_200ul\"\n\n # labware\n mag_mod = ctx.load_module(\"magnetic module gen2\", 4)\n mag_plate = mag_mod.load_labware(\"nest_96_wellplate_2ml_deep\")\n temp_mod = ctx.load_module(\"temperature module gen2\", 6)\n res = ctx.load_labware(\"nest_12_reservoir_15ml\", 2)\n sample_plate = ctx.load_labware(barcode_sample_plate, 3)\n dest_plate = temp_mod.load_labware(temp_mod_plate, 6)\n barcode_plate = ctx.load_labware(barcode_sample_plate, 1)\n reag_rack = ctx.load_labware(\"opentrons_24_aluminumblock_nest_2ml_snapcap\", 5) # noqa: E501\n\n tips300 = [ctx.load_labware(\"opentrons_96_filtertiprack_200ul\", slot)\n for slot in [8]]\n tips20 = [ctx.load_labware(\"opentrons_96_tiprack_20ul\", slot)\n for slot in [9, 10, 11]]\n\n # pipettes\n m20 = ctx.load_instrument(\"p20_multi_gen2\", m20_mount, tip_racks=tips20)\n p300 = ctx.load_instrument(\"p300_single_gen2\", p300_mount,\n tip_racks=tips300)\n\n p300.flow_rate.blow_out = 0.33*p300.flow_rate.blow_out\n m20.flow_rate.blow_out = 0.33*m20.flow_rate.blow_out\n\n # functions\n # apply speed limit to departing tip\n def slow_tip_withdrawal(pipette, well_location, to_center=False):\n if pipette.mount == \"right\":\n axis = \"A\"\n else:\n axis = \"Z\"\n ctx.max_speeds[axis] = 10\n if to_center is False:\n pipette.move_to(well_location.top())\n else:\n pipette.move_to(well_location.center())\n ctx.max_speeds[axis] = None\n\n def resuspend_pellet(well, pip, mvol, reps=5):\n \"\"\"\n \"resuspend_pellet\" will forcefully dispense liquid over the pellet\n after the magdeck engage in order to more thoroughly resuspend the\n pellet. param well: The current well that the resuspension will occur\n in. param pip: The pipet that is currently attached/ being used.\n param mvol: The volume that is transferred before the mixing steps.\n param reps: The number of mix repetitions that should occur. Note~\n During each mix rep, there are 2 cycles of aspirating from center,\n dispensing at the top and 2 cycles of aspirating from center,\n dispensing at the bottom (5 mixes total)\n \"\"\"\n\n rightLeft = int(str(well).split(\" \")[0][1:]) % 2\n \"\"\"\n \"rightLeft\" will determine which value to use in the list of \"top\" and\n \"bottom\" (below), based on the column of the \"well\" used.\n In the case that an Even column is used, the first value of \"top\" and\n \"bottom\" will be used, otherwise, the second value of each will be\n used.\n \"\"\"\n center = well.bottom().move(types.Point(x=0, y=0, z=0.8))\n top = [\n well.bottom().move(types.Point(x=-1, y=1, z=0.4)),\n well.bottom().move(types.Point(x=1, y=1, z=0.4))\n ]\n bottom = [\n well.bottom().move(types.Point(x=-1, y=0, z=0.4)),\n well.bottom().move(types.Point(x=1, y=0, z=0.4))\n ]\n\n pip.flow_rate.dispense = 500\n pip.flow_rate.aspirate = 150\n\n mix_vol = 200\n\n pip.move_to(center)\n for _ in range(reps):\n for _ in range(2):\n pip.aspirate(mix_vol, center)\n pip.dispense(mix_vol, top[rightLeft])\n for _ in range(2):\n pip.aspirate(mix_vol, center)\n pip.dispense(mix_vol, bottom[rightLeft])\n\n # mapping\n num_col = math.ceil(num_samp/8)\n dna_vol = 9 - water_vol\n # ethanol = reservoir.wells()[0]\n water = res.wells()[0]\n dest_cols = dest_plate.rows()[0][:num_col]\n dna_samples = sample_plate.rows()[0][:num_col]\n barcode_wells = barcode_plate.rows()[0][:num_col]\n pool_wells = [mag_plate.wells()[0], mag_plate.wells()[1]]\n bead_vol = 10*num_samp/2\n beads = reag_rack.wells()[0]\n trash = res.wells()[-1].top(z=-5)\n ethanol = res.wells()[1]\n\n # protocol\n ctx.comment(\"\\n---------------ADDING WATER----------------\\n\\n\")\n m20.pick_up_tip()\n for col in dest_cols:\n m20.aspirate(water_vol, water)\n m20.dispense(water_vol, col)\n m20.drop_tip()\n\n ctx.comment(\"\\n---------------ADDING BARCODE----------------\\n\\n\")\n # CHANGE MIX ########################################################\n\n for s, d in zip(barcode_wells, dest_cols):\n m20.pick_up_tip()\n\n m20.aspirate(barcode_vol, s.bottom(z=0.8), rate=0.1)\n # slow_tip_withdrawal(m20, d)\n m20.dispense(barcode_vol, d)\n m20.mix(1, 4, d)\n m20.move_to(d.bottom(z=5))\n ctx.delay(2)\n m20.blow_out(d.bottom(z=5))\n\n m20.drop_tip()\n #\n ctx.comment(\"\\n---------------ADDING DNA----------------\\n\\n\")\n\n for s, d in zip(dna_samples, dest_cols):\n m20.pick_up_tip()\n m20.aspirate(dna_vol, s.bottom(z=0.8))\n m20.dispense(dna_vol, d)\n m20.mix(3, 5, d)\n slow_tip_withdrawal(m20, d)\n ctx.delay(seconds=2)\n m20.blow_out(d.top())\n m20.touch_tip()\n m20.drop_tip()\n\n ctx.pause(\"Move plate to thermocycler then bring back on slot 6.\")\n\n ctx.comment(\"\\n---------------POOLING INTO COL----------------\\n\\n\")\n pool_col = mag_plate.rows()[0][0]\n m20.pick_up_tip() # do we change tip here or keep tip\n for col in dest_cols:\n m20.aspirate(11, col.bottom(z=0.5))\n m20.dispense(11, pool_col)\n m20.drop_tip()\n\n ctx.comment(\"\\n---------------POOLING INTO WELLS----------------\\n\\n\")\n p300.pick_up_tip()\n for well in mag_plate.columns()[0][2:5]:\n\n p300.aspirate(10*num_col+5, well.bottom(z=0.3), rate=1.2)\n p300.dispense(10*num_col+5, pool_wells[0])\n p300.mix(1, 0.8*10*num_col, pool_wells[0])\n p300.blow_out(pool_wells[0].bottom(7))\n\n for well in mag_plate.columns()[0][5:]:\n\n p300.aspirate(10*num_col+5, well.bottom(z=0.3), rate=1.2)\n p300.dispense(10*num_col+5, pool_wells[1])\n p300.mix(1, 0.8*10*num_col, pool_wells[1])\n p300.blow_out(pool_wells[1].bottom(7))\n p300.drop_tip()\n\n ctx.comment(\"\\n---------------ADDING BEADS----------------\\n\\n\")\n p300.pick_up_tip()\n p300.mix(15, 200, beads, rate=1.5)\n ctx.comment(\"\\n\")\n for i, pool_well in enumerate(pool_wells):\n if not p300.has_tip:\n p300.pick_up_tip()\n num_transfers = math.floor(bead_vol / 200)\n leftover_vol = bead_vol % 200\n for _ in range(num_transfers):\n p300.aspirate(200, beads, rate=0.6)\n slow_tip_withdrawal(p300, beads)\n p300.dispense(200, pool_well)\n\n p300.aspirate(leftover_vol, beads, rate=0.1)\n p300.dispense(leftover_vol, pool_well)\n resuspend_pellet(pool_well, p300, 200, reps=8)\n p300.drop_tip()\n ctx.comment(\"\\n\\n\")\n\n ctx.delay(minutes=5)\n\n mag_mod.engage(offset=-1)\n\n ctx.delay(seconds=7*60)\n\n supernatant_volume = bead_vol*2\n num_transfers = math.floor(supernatant_volume / 200)\n leftover_vol = supernatant_volume % 200\n\n p300.pick_up_tip()\n m20.pick_up_tip()\n for pool_well in pool_wells:\n\n for _ in range(num_transfers):\n p300.aspirate(200, pool_well.bottom(z=0.6), rate=0.1)\n p300.dispense(200, trash)\n ctx.delay(seconds=2)\n p300.blow_out()\n\n p300.aspirate(leftover_vol, pool_well.bottom(z=0.6), rate=0.1)\n p300.dispense(leftover_vol, trash)\n\n ctx.delay(seconds=2)\n p300.blow_out()\n\n m20.aspirate(20, pool_wells[0].bottom(z=0.6), rate=0.1)\n ctx.delay(seconds=2)\n m20.blow_out(trash)\n m20.dispense(20, trash)\n ctx.delay(seconds=2)\n m20.blow_out(trash)\n p300.drop_tip()\n\n mag_mod.disengage()\n\n if not m20.has_tip:\n m20.pick_up_tip()\n\n if not p300.has_tip:\n p300.pick_up_tip()\n\n ctx.comment(\"\\n---------------TWO WASHES----------------\\n\\n\")\n for i in range(2):\n if not p300.has_tip:\n p300.pick_up_tip()\n for pool_well in pool_wells:\n for _ in range(3):\n p300.aspirate(200, ethanol)\n p300.dispense(200, pool_well.top(), rate=0.5)\n p300.move_to(pool_well.top())\n ctx.delay(seconds=4)\n p300.blow_out()\n ctx.comment(\"\\n\")\n\n for pool_well in pool_wells:\n resuspend_pellet(pool_well, p300, 200, reps=8)\n p300.mix(15, 200,\n pool_well.bottom(z=1), rate=1.5)\n ctx.comment(\"\\n\")\n\n p300.move_to(pool_well.top())\n\n mag_mod.engage(offset=-1)\n ctx.delay(seconds=7*60)\n for pool_well in pool_wells:\n for _ in range(3 if i == 0 else 2):\n p300.aspirate(200, pool_well.bottom(z=0.6), rate=0.1)\n p300.dispense(200, trash)\n ctx.delay(seconds=4)\n p300.blow_out()\n if i == 0:\n m20.aspirate(20, pool_wells[0].bottom(z=0.6), rate=0.1)\n m20.dispense(20, trash)\n ctx.delay(seconds=2)\n p300.blow_out()\n mag_mod.disengage()\n\n mag_mod.disengage()\n resuspend_pellet(pool_wells[1], p300, 200, reps=8)\n p300.aspirate(200, pool_wells[1])\n p300.dispense(200, pool_wells[0])\n p300.mix(10, 200, pool_wells[0])\n p300.move_to(pool_wells[0].top())\n mag_mod.engage()\n ctx.delay(seconds=7*60)\n ctx.pause(\"Samples are all consolidated with ethanol in A1\")\n\n for _ in range(2):\n p300.aspirate(200, pool_wells[0].bottom(z=0.6), rate=0.1)\n p300.dispense(200, trash)\n ctx.delay(seconds=4)\n p300.blow_out()\n\n if not m20.has_tip:\n m20.pick_up_tip()\n m20.aspirate(20, pool_wells[0].bottom(z=0.6), rate=0.1)\n m20.dispense(20, trash)\n ctx.delay(seconds=2)\n p300.blow_out()\n\n p300.drop_tip()\n m20.drop_tip()\n", + "content": "import math\nfrom opentrons import types\n\nmetadata = {\n \"protocolName\": \"Tagmentation and Bead Cleanup\",\n \"author\": \"Rami Farawi \",\n \"source\": \"Custom Protocol Request\",\n \"apiLevel\": \"2.13\"\n}\n\n\ndef run(ctx):\n\n [num_samp, barcode_sample_plate, water_vol,\n barcode_vol, temp_mod_temp,\n p300_mount, m20_mount] = get_values( # noqa: F821\n \"num_samp\", \"barcode_sample_plate\",\n \"water_vol\", \"barcode_vol\", \"temp_mod_temp\", \"p300_mount\",\n \"m20_mount\")\n\n num_samp = int(num_samp)\n\n if barcode_sample_plate == \"fisher_96_wellplate_200ul\":\n temp_mod_plate = \"fisher_96_aluminumblock_200ul\"\n\n elif barcode_sample_plate == \"bulldog_96_wellplate_200ul\":\n temp_mod_plate = \"bulldog_96_aluminumblock_200ul\"\n\n else:\n temp_mod_plate = \"opentrons_96_aluminumblock_biorad_wellplate_200ul\"\n\n # labware\n mag_mod = ctx.load_module(\"magnetic module gen2\", 4)\n mag_plate = mag_mod.load_labware(\"nest_96_wellplate_2ml_deep\")\n temp_mod = ctx.load_module(\"temperature module gen2\", 6)\n res = ctx.load_labware(\"nest_12_reservoir_15ml\", 2)\n sample_plate = ctx.load_labware(barcode_sample_plate, 3)\n dest_plate = temp_mod.load_labware(temp_mod_plate, 6)\n barcode_plate = ctx.load_labware(barcode_sample_plate, 1)\n reag_rack = ctx.load_labware(\"opentrons_24_aluminumblock_nest_2ml_snapcap\", 5) # noqa: E501\n\n tips300 = [ctx.load_labware(\"opentrons_96_filtertiprack_200ul\", slot)\n for slot in [8]]\n tips20 = [ctx.load_labware(\"opentrons_96_tiprack_20ul\", slot)\n for slot in [9, 10, 11]]\n\n # pipettes\n m20 = ctx.load_instrument(\"p20_multi_gen2\", m20_mount, tip_racks=tips20)\n p300 = ctx.load_instrument(\"p300_single_gen2\", p300_mount,\n tip_racks=tips300)\n\n p300.flow_rate.blow_out = 0.33*p300.flow_rate.blow_out\n m20.flow_rate.blow_out = 0.33*m20.flow_rate.blow_out\n\n # functions\n # apply speed limit to departing tip\n def slow_tip_withdrawal(pipette, well_location, to_center=False):\n if pipette.mount == \"right\":\n axis = \"A\"\n else:\n axis = \"Z\"\n ctx.max_speeds[axis] = 10\n if to_center is False:\n pipette.move_to(well_location.top())\n else:\n pipette.move_to(well_location.center())\n ctx.max_speeds[axis] = None\n\n def resuspend_pellet(well, pip, mvol, reps=5):\n \"\"\"\n \"resuspend_pellet\" will forcefully dispense liquid over the pellet\n after the magdeck engage in order to more thoroughly resuspend the\n pellet. param well: The current well that the resuspension will occur\n in. param pip: The pipet that is currently attached/ being used.\n param mvol: The volume that is transferred before the mixing steps.\n param reps: The number of mix repetitions that should occur. Note~\n During each mix rep, there are 2 cycles of aspirating from center,\n dispensing at the top and 2 cycles of aspirating from center,\n dispensing at the bottom (5 mixes total)\n \"\"\"\n\n rightLeft = int(str(well).split(\" \")[0][1:]) % 2\n \"\"\"\n \"rightLeft\" will determine which value to use in the list of \"top\" and\n \"bottom\" (below), based on the column of the \"well\" used.\n In the case that an Even column is used, the first value of \"top\" and\n \"bottom\" will be used, otherwise, the second value of each will be\n used.\n \"\"\"\n center = well.bottom().move(types.Point(x=0, y=0, z=0.8))\n top = [\n well.bottom().move(types.Point(x=-1, y=1, z=0.4)),\n well.bottom().move(types.Point(x=1, y=1, z=0.4))\n ]\n bottom = [\n well.bottom().move(types.Point(x=-1, y=0, z=0.4)),\n well.bottom().move(types.Point(x=1, y=0, z=0.4))\n ]\n\n pip.flow_rate.dispense = 500\n pip.flow_rate.aspirate = 150\n\n mix_vol = 200\n\n pip.move_to(center)\n for _ in range(reps):\n for _ in range(2):\n pip.aspirate(mix_vol, center)\n pip.dispense(mix_vol, top[rightLeft])\n for _ in range(2):\n pip.aspirate(mix_vol, center)\n pip.dispense(mix_vol, bottom[rightLeft])\n\n # mapping\n num_col = math.ceil(num_samp/8)\n dna_vol = 9 - water_vol\n # ethanol = reservoir.wells()[0]\n water = res.wells()[0]\n dest_cols = dest_plate.rows()[0][:num_col]\n dna_samples = sample_plate.rows()[0][:num_col]\n barcode_wells = barcode_plate.rows()[0][:num_col]\n pool_wells = [mag_plate.wells()[0], mag_plate.wells()[1]]\n bead_vol = 10*num_samp/2\n beads = reag_rack.wells()[0]\n trash = res.wells()[-1].top(z=-5)\n ethanol = res.wells()[1]\n\n # protocol\n ctx.comment(\"\\n---------------ADDING WATER----------------\\n\\n\")\n m20.pick_up_tip()\n for col in dest_cols:\n m20.aspirate(water_vol, water)\n m20.dispense(water_vol, col)\n m20.drop_tip()\n\n ctx.comment(\"\\n---------------ADDING BARCODE----------------\\n\\n\")\n # CHANGE MIX ########################################################\n\n for s, d in zip(barcode_wells, dest_cols):\n m20.pick_up_tip()\n\n m20.aspirate(barcode_vol, s.bottom(z=0.8), rate=0.1)\n # slow_tip_withdrawal(m20, d)\n m20.dispense(barcode_vol, d)\n m20.mix(7, 4, d)\n m20.move_to(d.bottom(z=5))\n ctx.delay(2)\n m20.blow_out(d.bottom(z=5))\n\n m20.drop_tip()\n #\n ctx.comment(\"\\n---------------ADDING DNA----------------\\n\\n\")\n\n for s, d in zip(dna_samples, dest_cols):\n m20.pick_up_tip()\n m20.aspirate(dna_vol, s.bottom(z=0.8))\n m20.dispense(dna_vol, d)\n m20.mix(3, 5, d)\n slow_tip_withdrawal(m20, d)\n ctx.delay(seconds=2)\n m20.blow_out(d.top())\n m20.touch_tip()\n m20.drop_tip()\n\n ctx.pause(\"Move plate to thermocycler then bring back on slot 6.\")\n\n ctx.comment(\"\\n---------------POOLING INTO COL----------------\\n\\n\")\n pool_col = mag_plate.rows()[0][0]\n m20.pick_up_tip() # do we change tip here or keep tip\n for col in dest_cols:\n m20.aspirate(11, col.bottom(z=0.5))\n m20.dispense(11, pool_col)\n m20.drop_tip()\n\n ctx.comment(\"\\n---------------POOLING INTO WELLS----------------\\n\\n\")\n p300.pick_up_tip()\n for well in mag_plate.columns()[0][2:5]:\n\n p300.aspirate(10*num_col+5, well.bottom(z=0.3), rate=1.2)\n p300.dispense(10*num_col+5, pool_wells[0])\n p300.mix(1, 0.8*10*num_col, pool_wells[0])\n p300.blow_out(pool_wells[0].bottom(7))\n\n for well in mag_plate.columns()[0][5:]:\n\n p300.aspirate(10*num_col+5, well.bottom(z=0.3), rate=1.2)\n p300.dispense(10*num_col+5, pool_wells[1])\n p300.mix(1, 0.8*10*num_col, pool_wells[1])\n p300.blow_out(pool_wells[1].bottom(7))\n p300.drop_tip()\n\n ctx.comment(\"\\n---------------ADDING BEADS----------------\\n\\n\")\n p300.pick_up_tip()\n p300.mix(15, 200, beads, rate=1.5)\n ctx.comment(\"\\n\")\n for i, pool_well in enumerate(pool_wells):\n if not p300.has_tip:\n p300.pick_up_tip()\n num_transfers = math.floor(bead_vol / 200)\n leftover_vol = bead_vol % 200\n for _ in range(num_transfers):\n p300.aspirate(200, beads, rate=0.6)\n slow_tip_withdrawal(p300, beads)\n p300.dispense(200, pool_well)\n\n p300.aspirate(leftover_vol, beads, rate=0.1)\n p300.dispense(leftover_vol, pool_well)\n resuspend_pellet(pool_well, p300, 200, reps=8)\n p300.drop_tip()\n ctx.comment(\"\\n\\n\")\n\n ctx.delay(minutes=5)\n\n mag_mod.engage(offset=-1)\n\n ctx.delay(seconds=7*60)\n\n supernatant_volume = bead_vol*2\n num_transfers = math.floor(supernatant_volume / 200)\n leftover_vol = supernatant_volume % 200\n\n p300.pick_up_tip()\n m20.pick_up_tip()\n for pool_well in pool_wells:\n\n for _ in range(num_transfers):\n p300.aspirate(200, pool_well.bottom(z=0.6), rate=0.1)\n p300.dispense(200, trash)\n ctx.delay(seconds=2)\n p300.blow_out()\n\n p300.aspirate(leftover_vol, pool_well.bottom(z=0.6), rate=0.1)\n p300.dispense(leftover_vol, trash)\n\n ctx.delay(seconds=2)\n p300.blow_out()\n\n m20.aspirate(20, pool_wells[0].bottom(z=0.6), rate=0.1)\n ctx.delay(seconds=2)\n m20.blow_out(trash)\n m20.dispense(20, trash)\n ctx.delay(seconds=2)\n m20.blow_out(trash)\n p300.drop_tip()\n\n mag_mod.disengage()\n\n if not m20.has_tip:\n m20.pick_up_tip()\n\n if not p300.has_tip:\n p300.pick_up_tip()\n\n ctx.comment(\"\\n---------------TWO WASHES----------------\\n\\n\")\n for i in range(2):\n if not p300.has_tip:\n p300.pick_up_tip()\n for pool_well in pool_wells:\n for _ in range(3):\n p300.aspirate(200, ethanol)\n p300.dispense(200, pool_well.top(), rate=0.5)\n p300.move_to(pool_well.top())\n ctx.delay(seconds=4)\n p300.blow_out()\n ctx.comment(\"\\n\")\n\n for pool_well in pool_wells:\n resuspend_pellet(pool_well, p300, 200, reps=8)\n p300.mix(15, 200,\n pool_well.bottom(z=1), rate=1.5)\n ctx.comment(\"\\n\")\n\n p300.move_to(pool_well.top())\n\n mag_mod.engage(offset=-1)\n ctx.delay(seconds=7*60)\n for pool_well in pool_wells:\n for _ in range(3 if i == 0 else 2):\n p300.aspirate(200, pool_well.bottom(z=0.6), rate=0.1)\n p300.dispense(200, trash)\n ctx.delay(seconds=4)\n p300.blow_out()\n if i == 0:\n m20.aspirate(20, pool_wells[0].bottom(z=0.6), rate=0.1)\n m20.dispense(20, trash)\n ctx.delay(seconds=2)\n p300.blow_out()\n mag_mod.disengage()\n\n mag_mod.disengage()\n resuspend_pellet(pool_wells[1], p300, 200, reps=8)\n p300.aspirate(200, pool_wells[1])\n p300.dispense(200, pool_wells[0])\n p300.mix(10, 200, pool_wells[0])\n p300.move_to(pool_wells[0].top())\n mag_mod.engage()\n ctx.delay(seconds=7*60)\n ctx.pause(\"Samples are all consolidated with ethanol in A1\")\n\n for _ in range(2):\n p300.aspirate(200, pool_wells[0].bottom(z=0.6), rate=0.1)\n p300.dispense(200, trash)\n ctx.delay(seconds=4)\n p300.blow_out()\n\n if not m20.has_tip:\n m20.pick_up_tip()\n m20.aspirate(20, pool_wells[0].bottom(z=0.6), rate=0.1)\n m20.dispense(20, trash)\n ctx.delay(seconds=2)\n p300.blow_out()\n\n p300.drop_tip()\n m20.drop_tip()\n", "custom_labware_defs": [ { "brand": { diff --git a/protocols/090c2e/README.md b/protocols/090c2e/README.md index 8a53b3d46..af74ac3ef 100644 --- a/protocols/090c2e/README.md +++ b/protocols/090c2e/README.md @@ -1,44 +1,44 @@ # Omega Bio-Tek Mag-Bind Environmental DNA 96 Kit - ### Author -[Opentrons](https://opentrons.com/) +[Opentrons](https://opentrons.com/) ## Categories -* Nucleic Acid Purification - * Omega Bio-Tek Mag-Bind Environmental DNA 96 Kit +- Nucleic Acid Purification + - Omega Bio-Tek Mag-Bind Environmental DNA 96 Kit ## Description -This protocol performs a nucleic acid purification according to the [Omega Bio-Tek Mag-Bind Environmental DNA 96 Kit](https://s3.amazonaws.com/pf-user-files-01/u-4256/uploads/2023-03-14/is13ts3/QMF27.0248.M5645%20v9.0%202.pdf). +This protocol performs a nucleic acid purification according to the [Omega Bio-Tek Mag-Bind Environmental DNA 96 Kit](https://s3.amazonaws.com/pf-user-files-01/u-4256/uploads/2023-03-14/is13ts3/QMF27.0248.M5645%20v9.0%202.pdf). ### Modules -* [Opentrons Magnetic Module (GEN2)](https://shop.opentrons.com/magnetic-module-gen2/) +- [Opentrons Magnetic Module (GEN2)](https://shop.opentrons.com/magnetic-module-gen2/) ### Labware -* QIAGEN 96 Tube Rack 1.2mL #19560 -* [NEST 12 Well Reservoir 15 mL #360102](http://www.cell-nest.com/page94?_l=en&product_id=102) -* [NEST 1 Well Reservoir 195 mL #360103](http://www.cell-nest.com/page94?_l=en&product_id=102) -* Opentrons 96 Filter Tip Rack 200 µL -* [NEST 96 Well Plate 100 µL PCR Full Skirt #402501](http://www.cell-nest.com/page94?_l=en&product_id=97&product_category=96) +- QIAGEN 96 Tube Rack 1.2mL #19560 +- [NEST 12 Well Reservoir 15 mL #360102](http://www.cell-nest.com/page94?_l=en&product_id=102) +- [NEST 1 Well Reservoir 195 mL #360103](http://www.cell-nest.com/page94?_l=en&product_id=102) +- Opentrons 96 Filter Tip Rack 200 µL +- [NEST 96 Well Plate 100 µL PCR Full Skirt #402501](http://www.cell-nest.com/page94?_l=en&product_id=97&product_category=96) ### Pipettes -* [Opentrons P300 8 Channel Electronic Pipette (GEN2)](https://shop.opentrons.com/8-channel-electronic-pipette/) +- [Opentrons P300 8 Channel Electronic Pipette (GEN2)](https://shop.opentrons.com/8-channel-electronic-pipette/) ### Deck Setup -![deck](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/090c2e/deck.png) +![deck](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/090c2e/deckv2.png) ### Reagent Setup -![reagents](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/090c2e/reagents.png) +![reagents](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/090c2e/reagentsv2.png) ### 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. @@ -47,10 +47,10 @@ This protocol performs a nucleic acid purification according to the [Omega Bio-T 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/). +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 + 090c2e diff --git a/protocols/0b97ae-protocol-3B/0b97ae-protocol-3B.ot2.apiv2.py b/protocols/0b97ae-protocol-3B/0b97ae-protocol-3B.ot2.apiv2.py index b14e52983..5a2bc25d9 100644 --- a/protocols/0b97ae-protocol-3B/0b97ae-protocol-3B.ot2.apiv2.py +++ b/protocols/0b97ae-protocol-3B/0b97ae-protocol-3B.ot2.apiv2.py @@ -78,7 +78,7 @@ def run(ctx: protocol_api.ProtocolContext): tempdeck_1.set_temperature(4) tempdeck_2 = ctx.load_module('temperature module gen2', '7') tempdeck_2.set_temperature(4) - Mag_mod = ctx.load_module('magnetic module', '4') + Mag_mod = ctx.load_module('magnetic module gen2', '4') Mag_mod.disengage() # load labware @@ -204,6 +204,9 @@ def bead_mixing(well, pip, mvol, reps=10): p20.dispense(19.5, dest, rate=0.5) bead_mixing(dest, p20, 15, reps=6) p20.blow_out(dest.bottom(20)) + p20.aspirate(1, dest.top()) + ctx.delay(seconds=10) + p20.aspirate(1, dest.top()) drop_tip(p20) ctx.pause('Remove Plate and Centrifuge, place back on deck at site 4, on the magnetic module') @@ -236,6 +239,8 @@ def bead_mixing(well, pip, mvol, reps=10): p20.dispense(p20.current_volume, Removal_Trash_1) p20.blow_out() p20.air_gap(1) + ctx.delay(seconds=10) + p20.air_gap(1) drop_tip(p20) ctx.comment('\n~~~~~~~~~~~~~~ADDING Water TO SAMPLES~~~~~~~~~~~~~~\n') diff --git a/protocols/onsite-circlelabs/onsite-circlelabs.ot2.apiv2.py b/protocols/onsite-circlelabs/onsite-circlelabs.ot2.apiv2.py index a88a3f10d..d86659b04 100644 --- a/protocols/onsite-circlelabs/onsite-circlelabs.ot2.apiv2.py +++ b/protocols/onsite-circlelabs/onsite-circlelabs.ot2.apiv2.py @@ -142,7 +142,7 @@ def resuspend_pellet(well, pip, mvol, reps=5): m20.aspirate(barcode_vol, s.bottom(z=0.8), rate=0.1) # slow_tip_withdrawal(m20, d) m20.dispense(barcode_vol, d) - m20.mix(1, 4, d) + m20.mix(7, 4, d) m20.move_to(d.bottom(z=5)) ctx.delay(2) m20.blow_out(d.bottom(z=5))