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 a5512c033..211e44dd9 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 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", + "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, reservoir, F_Plate, D_Plate, R_Plate] = get_values( # noqa: F821 (<--- DO NOT REMOVE!)\n \"num_samples\",\"vol_dna\",\"flash\",\"bead_timer\",\"reservoir\",\"final_plate\",\"dilution_plate\",\"reagent_plate\")\n num_samples = int(num_samples)\n if reservoir == 'perkinelmer':\n res_labware = 'perkinelmer_12_reservoir_21000ul'\n else:\n res_labware = 'nest_12_reservoir_15ml'\n\n if F_Plate == 'Biorad':\n F_labware = 'opentrons_96_aluminumblock_biorad_wellplate_200ul'\n else:\n F_labware = 'appliedbiosystemsenduraplate_96_aluminumblock_220ul'\n\n if D_Plate == 'Biorad':\n D_labware = 'opentrons_96_aluminumblock_biorad_wellplate_200ul'\n else:\n D_labware = 'appliedbiosystemsenduraplate_96_aluminumblock_220ul'\n \n if R_Plate == 'Biorad':\n R_labware = 'biorad_96_wellplate_200ul_pcr'\n else:\n R_labware = 'appliedbiosystemsenduraplate_96_aluminumblock_220ul'\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(F_labware, #noqa: E501\n 'Reagent Plate')\n Diluted_plate = tempdeck_2.load_labware(D_labware, # noqa: E501\n 'Diluted RNA plate')\n water_res = ctx.load_labware(res_labware, 2,\n 'Water reservoir')\n Reagent_plate = ctx.load_labware(R_labware, '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": { @@ -1426,6 +1426,66 @@ "label": "Bead Timer?", "name": "bead_timer", "type": "int" + }, + { + "label": "Is the Reservoir PerkinElmer or Nest?", + "name": "reservoir", + "options": [ + { + "label": "perkinelmer", + "value": "perkinelmer" + }, + { + "label": "nest", + "value": "nest" + } + ], + "type": "dropDown" + }, + { + "label": "Is the Final Plate Biorad or AppliedBio?", + "name": "final_plate", + "options": [ + { + "label": "Biorad", + "value": "Biorad" + }, + { + "label": "AppliedBio", + "value": "AppliedBio" + } + ], + "type": "dropDown" + }, + { + "label": "Is the Diluted DNA Plate Biorad or AppliedBio?", + "name": "dilution_plate", + "options": [ + { + "label": "Biorad", + "value": "Biorad" + }, + { + "label": "AppliedBio", + "value": "AppliedBio" + } + ], + "type": "dropDown" + }, + { + "label": "Is the Reagent Plate Biorad or AppliedBio?", + "name": "reagent_plate", + "options": [ + { + "label": "Biorad", + "value": "Biorad" + }, + { + "label": "AppliedBio", + "value": "AppliedBio" + } + ], + "type": "dropDown" } ], "instruments": [ @@ -1479,7 +1539,7 @@ "name": "Diluted RNA plate on Temperature Module GEN2 on 7", "share": false, "slot": "7", - "type": "appliedbiosystemsenduraplate_96_aluminumblock_220ul" + "type": "opentrons_96_aluminumblock_biorad_wellplate_200ul" }, { "name": "Opentrons 96 Tip Rack 300 \u00b5L on 8", diff --git a/protoBuilds/0b97ae-protocol-3B/README.json b/protoBuilds/0b97ae-protocol-3B/README.json index 58e81b6c9..037597d5b 100644 --- a/protoBuilds/0b97ae-protocol-3B/README.json +++ b/protoBuilds/0b97ae-protocol-3B/README.json @@ -6,7 +6,7 @@ ] }, "deck-setup": "\nWater Reservoir (slot 2):\n Column 1: Nuclease Free Water\n Column 2: Binding Buffer\n Column 3 & 4: Ethanol\n Column 10, 11 & 12: Empty for Supernatent Removal\nDiluted RNA Plate (slot 7 Temperature Module):\n RNA Samples Starting Plate\nReagent Plate (Slot 10):\n Column 1: MasterMix\n Column 2: Magentic Beads", - "description": "This is Part 3 to the QIAseq FastSelect 5s, 16s, 23s Protocol. This protocol is used to perform the addition of samples with mastermix into a plate.\nPart 1 to this protocol is the normalization of samples.\nPart 2 to this protocol is the Fragementation.\nLinks:\n Part 1: Sample Normalization\n Part 2: QIAseq FastSelect 5s, 16s, 23s Fragmentation\n* Part 3: QIAseq FastSelect 5s, 16s, 23s Extraction", + "description": "This is Part 3 to the QIAseq FastSelect 5s, 16s, 23s Protocol. This protocol is used to perform the addition of samples with mastermix into a plate.\nPart 1 to this protocol is the normalization of samples.\nPart 2 to this protocol is the Fragementation.\nLinks:\n* Part 1: Sample Normalization\n* Part 2: QIAseq FastSelect 5s, 16s, 23s Fragmentation\n* Part 3: QIAseq FastSelect 5s, 16s, 23s Extraction", "internal": "0b97ae-protocol-3B", "labware": "\nPerkin Elmer 12 Reservoir 21000 \u00b5L\nApplied Biosystems Enduraplate 96 Aluminum Block 220 \u00b5L\nBio-Rad 96 Well Plate 200 \u00b5L PCR #hsp9601\nOpentrons 96 Filter Tip Rack 20 \u00b5L\nNEST 96 Deepwell Plate 2mL #503001\nOpentrons 96 Tip Rack 300 \u00b5L\nOpentrons 96 Well Aluminum Block with Bio-Rad Well Plate 200 \u00b5L\n", "markdown": {