diff --git a/protoBuilds/0909e6/README.json b/protoBuilds/0909e6/README.json deleted file mode 100644 index f6363fa5c..000000000 --- a/protoBuilds/0909e6/README.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "author": "Opentrons", - "categories": { - "Sterile Workflows": [ - "Cell Culture" - ] - }, - "deck-setup": "", - "description": "This protocol performs a custom 12-factor cell culture assay in a 96-deepwell plate. Please use this example .csv template to format your worklist! When uploading your file below, please ensure it is saved in the format .csv.", - "internal": "0909e6", - "labware": "\nOpentrons 6 Tube Rack with Falcon 50 mL Conical\nUSA Scientific 96 Deep Well Plate 2.4 mL #1896-2000\nOpentrons 96 Filter Tip Rack 200 \u00b5L\nOpentrons 96 Filter Tip Rack 1000 \u00b5L\n", - "markdown": { - "author": "[Opentrons](https://opentrons.com/)\n\n\n\n\n", - "categories": "* Sterile Workflows\n\t* Cell Culture\n\n\n", - "deck-setup": "![deck](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/0909e6/deck3.png)\n\n\n", - "description": "This protocol performs a custom 12-factor cell culture assay in a 96-deepwell plate. Please use [this example .csv template](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/0909e6/ex4.csv) to format your worklist! When uploading your file below, please ensure it is saved in the format `.csv`.\n\n\n", - "internal": "0909e6\n", - "labware": "* [Opentrons 6 Tube Rack with Falcon 50 mL Conical](https://shop.opentrons.com/collections/opentrons-tips/products/tube-rack-set-1)\n* [USA Scientific 96 Deep Well Plate 2.4 mL #1896-2000](https://www.usascientific.com/2ml-deep96-well-plateone-bulk.aspx)\n* Opentrons 96 Filter Tip Rack 200 \u00b5L\n* Opentrons 96 Filter Tip Rack 1000 \u00b5L\n\n\n", - "notes": "If you have any questions about this protocol, please contact the Protocol Development Team by filling out the [Troubleshooting Survey](https://protocol-troubleshooting.paperform.co/).\n\n\n", - "pipettes": "* [Opentrons P1000 Single Channel Electronic Pipette (GEN2)](https://shop.opentrons.com/single-channel-electronic-pipette-p20/)\n* [Opentrons P300 Single Channel Electronic Pipette (GEN2)](https://shop.opentrons.com/single-channel-electronic-pipette-p20/)\n\n\n", - "process": "1. Input your protocol parameters above.\n2. Download your protocol and unzip if needed.\n3. Upload your custom labware to the [OT App](https://opentrons.com/ot-app) by navigating to `More` > `Custom Labware` > `Add Labware`, and selecting your labware files (.json extensions) if needed.\n4. Upload your protocol file (.py extension) to the [OT App](https://opentrons.com/ot-app) in the `Protocol` tab.\n5. Set up your deck according to the deck map.\n6. Calibrate your labware, tiprack and pipette using the OT App. For calibration tips, check out our [support articles](https://support.opentrons.com/en/collections/1559720-guide-for-getting-started-with-the-ot-2).\n7. Hit \"Run\".\n\n\n", - "reagent-setup": "![reagents](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/0909e6/reagents2.png) \nNOTE that factors 16-30 are arranged in the same format as factors 1-15.\n\n\n", - "title": "DOE" - }, - "notes": "If you have any questions about this protocol, please contact the Protocol Development Team by filling out the Troubleshooting Survey.", - "pipettes": "\nOpentrons P1000 Single Channel Electronic Pipette (GEN2)\nOpentrons P300 Single Channel Electronic Pipette (GEN2)\n", - "process": "\nInput your protocol parameters above.\nDownload your protocol and unzip if needed.\nUpload your custom labware to the OT App by navigating to More > Custom Labware > Add Labware, and selecting your labware files (.json extensions) if needed.\nUpload your protocol file (.py extension) to the OT App in the Protocol tab.\nSet up your deck according to the deck map.\nCalibrate your labware, tiprack and pipette using the OT App. For calibration tips, check out our support articles.\nHit \"Run\".\n", - "reagent-setup": "\nNOTE that factors 16-30 are arranged in the same format as factors 1-15.", - "title": "DOE" -} \ No newline at end of file diff --git a/protoBuilds/0909e6/media_transfer.ot2.apiv2.py.json b/protoBuilds/0909e6/media_transfer.ot2.apiv2.py.json deleted file mode 100644 index ed791824e..000000000 --- a/protoBuilds/0909e6/media_transfer.ot2.apiv2.py.json +++ /dev/null @@ -1,118 +0,0 @@ -{ - "content": "import math\nfrom opentrons.protocol_api.labware import Well\nfrom opentrons.protocols.api_support.types import APIVersion\nfrom opentrons.types import Point\n\nmetadata = {\n 'protocolName': 'DOE',\n 'author': 'Nick self.min_height:\n self.height = self.height - dh\n else:\n self.height = self.min_height\n if self.current_volume - vol > 0:\n self.current_volume = self.current_volume - vol\n else:\n self.current_volume = 0\n return self.well.bottom(self.height)\n\n def height_inc(self, vol):\n dh = (vol/(math.pi*(self.radius**2)))*self.comp_coeff\n if self.height + dh < self.depth:\n self.height = self.height + dh\n else:\n self.height = self.depth\n self.current_volume += vol\n return self.well.bottom(self.height + 20)\n\n # labware\n tuberack50 = ctx.load_labware('opentrons_6_tuberack_falcon_50ml_conical',\n '1', 'media tuberack')\n tuberacks15 = [\n ctx.load_labware(\n 'opentrons_15_tuberack_falcon_15ml_conical', slot,\n f'factors {tube_set}')\n for i, (slot, tube_set) in enumerate(\n zip(['4', '7'], ['1-15', '16-30']))]\n tuberacks2 = [\n ctx.load_labware(\n 'opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap', slot,\n f'factors {tube_set}')\n for i, (slot, tube_set) in enumerate(\n zip(['5', '8'], ['31-54', '55-78']))]\n plate = ctx.load_labware('usascientific_96_wellplate_2.4ml_deep', '2')\n tiprack_small = [ctx.load_labware(tiprack_small_type, '3')]\n tiprack1000 = [\n ctx.load_labware('opentrons_96_filtertiprack_1000ul', slot)\n for slot in ['6']]\n\n # pipettes\n pip_small = ctx.load_instrument(type_pipette_small, 'left',\n tip_racks=tiprack_small)\n p1000 = ctx.load_instrument('p1000_single_gen2', 'right',\n tip_racks=tiprack1000)\n\n # reagents\n vol_media_list = [float(val) for val in vol_media_tubes.split(',')]\n media_rows_ordered = [tube for row in tuberack50.rows() for tube in row]\n media = [\n WellH(well, current_volume=vol, height=well.depth*(vol/50000)*0.9)\n for well, vol in zip(\n media_rows_ordered[:len(vol_media_list)],\n [vol_media_tube*1000 for vol_media_tube in vol_media_list])]\n\n # parse data\n factor_data = [\n [float(val) for val in line.split(',')[1:] if val.strip()]\n for line in csv_factors.splitlines()[3:]\n ]\n\n all_factor_tubes = [\n well for rack_set in [tuberacks15, tuberacks2]\n for rack in rack_set\n for well in rack.wells()]\n\n factor_indices = [\n int(cell.strip().split(' ')[-1]) - 1\n for cell in csv_factors.splitlines()[0].split(',')[1:]\n if cell.strip()]\n factor_tubes = [\n all_factor_tubes[ind] for ind in factor_indices]\n factor_viscosities = [\n bool(visc) for visc in csv_factors.splitlines()[1].split(',')[1:]\n if visc.strip()]\n factor_volumes_ul = [\n float(cell)*1000 for cell in csv_factors.splitlines()[2].split(',')[1:]\n if cell.strip()]\n # ref_vol = tuberacks15[0].wells()[0].max_volume / 1000 # 2ml or 15ml\n # ref_height = tuberacks15[0].wells()[0].depth\n factor_heights = [\n # ensure tip is submerged\n round(factor_vol/(factor_tube.max_volume)*factor_tube.depth*0.9,\n 1)\n for factor_tube, factor_vol in zip(factor_tubes, factor_volumes_ul)]\n factors = [\n WellH(well, current_volume=vol, height=height)\n for well, vol, height in zip(\n factor_tubes, factor_volumes_ul, factor_heights)]\n\n def slow_withdraw(well, pip=p1000, delay_s=2.0):\n ctx.max_speeds['A'] = 25\n ctx.max_speeds['Z'] = 25\n if delay_s > 0:\n ctx.delay(seconds=delay_s)\n pip.move_to(well.top())\n del ctx.max_speeds['A']\n del ctx.max_speeds['Z']\n\n def split_media_vol(vol):\n num_transfers = math.ceil(vol/(1000-vol_pre_airgap_1000))\n vol_per_transfer = round(vol/num_transfers, 1)\n return [vol_per_transfer]*num_transfers\n\n # iterate\n iterator_media = iter(media)\n current_media = next(iterator_media)\n\n def check_media(vol):\n nonlocal current_media\n if current_media.current_volume - vol < current_media.min_vol:\n current_media = next(iterator_media)\n\n def custom_distribute(info, pip):\n pip_volume = pip.tip_racks[0].wells()[0].max_volume\n vol_pre_airgap = vol_pre_airgap_small if pip == \\\n pip_small else vol_pre_airgap_1000\n max_vol = pip_volume\n sets = []\n running = []\n current_vol = 0\n for d in info:\n well = [key for key in d.keys()][0]\n vol = [val for val in d.values()][0]\n if vol > 0:\n if current_vol + vol + vol_pre_airgap > max_vol:\n sets.append(running)\n running = []\n current_vol = 0\n running.append({well: vol})\n current_vol += vol + vol_pre_airgap\n sets.append(running)\n return sets\n\n # transfer media\n p1000.pick_up_tip()\n wells_ordered = [well for row in plate.rows() for well in row]\n vols_media = [\n float(line.split(',')[0]) for line in csv_factors.splitlines()[3:]]\n media_info = []\n for well, vol_media in zip(wells_ordered, vols_media):\n vols_split = split_media_vol(vol_media)\n for vol in vols_split:\n media_info.append({well: vol})\n\n wells_h = [\n WellH(well, height=0) for well in wells_ordered]\n\n for d in media_info:\n well = list(d.keys())[0]\n asp_vol = list(d.values())[0]\n if p1000.current_volume:\n p1000.dispense(p1000.current_volume, current_media.well.top())\n check_media(asp_vol)\n p1000.aspirate(vol_pre_airgap_1000, current_media.well.top())\n p1000.aspirate(asp_vol, current_media.height_dec(asp_vol))\n slow_withdraw(current_media.well, p1000)\n p1000.dispense(p1000.current_volume, well.bottom(well.depth/2))\n p1000.blow_out(well.bottom(well.depth/2))\n slow_withdraw(well, p1000)\n\n # media_sets = custom_distribute(media_info, pip=p1000)\n # for media_set in media_sets:\n # if p1000.current_volume:\n # p1000.dispense(p1000.current_volume, current_media.well.top())\n # # pre-air_gap to fully void tip on blow_out\n # for d in media_set:\n # asp_vol = sum(d.values())\n # check_media(asp_vol)\n # p1000.aspirate(vol_pre_airgap_1000, current_media.well.top())\n # p1000.aspirate(asp_vol, current_media.height_dec(asp_vol))\n # slow_withdraw(current_media.well, p1000)\n # for i, d in enumerate(media_set):\n # well = [key for key in d.keys()][0]\n # vol = [val for val in d.values()][0]\n # p1000.dispense(vol+vol_pre_airgap_1000,\n # well.bottom(well.depth/2))\n # if i == len(media_set) - 1:\n # p1000.blow_out(well.bottom(well.depth/2))\n # slow_withdraw(well, p1000)\n p1000.return_tip()\n p1000.reset_tipracks()\n\n viscosity_map = {\n 20: {\n 'aspirate': 6.5,\n 'delay_aspiration': 2.0,\n 'dispense': 6.5,\n 'delay_dispense': 2.0,\n 'default': 7.56\n },\n 300: {\n 'aspirate': 80,\n 'delay_aspiration': 2.0,\n 'dispense': 80,\n 'delay_dispense': 2.0,\n 'default': 92.86\n },\n 1000: {\n 'aspirate': 247,\n 'delay_aspiration': 2.0,\n 'dispense': 247,\n 'delay_dispense': 2.0,\n 'default': 247\n }\n }\n\n # transfer factors\n for i, (visc, factor) in enumerate(zip(factor_viscosities, factors)):\n factor_vols = [line[i] for line in factor_data]\n factor_info = [\n {well: vol}\n for well, vol in zip(wells_h, factor_vols)]\n factor_sets = custom_distribute(factor_info, pip=pip_small)\n if visc:\n asp_rate_relative = viscosity_map[\n int(pip_small.max_volume)]['aspirate'] / (\n viscosity_map[int(pip_small.max_volume)]['default'])\n asp_delay = viscosity_map[\n int(pip_small.max_volume)]['delay_aspiration']\n disp_rate_relative = viscosity_map[\n int(pip_small.max_volume)]['dispense'] / (\n viscosity_map[int(pip_small.max_volume)]['default'])\n disp_delay = viscosity_map[\n int(pip_small.max_volume)]['delay_dispense']\n else:\n asp_rate_relative = 1\n asp_delay = 2.0\n disp_rate_relative = 1\n disp_delay = 2.0\n for factor_set in factor_sets:\n # aspirate total vol needed\n if not pip_small.has_tip:\n pip_small.pick_up_tip()\n # pre-air_gap to fully void tip on blow_out\n for d in factor_set:\n well = [k for k in d.keys()][0]\n asp_vol = [k for k in d.values()][0]\n if asp_vol + vol_pre_airgap_small <= pip_small.max_volume:\n ag_vol = vol_pre_airgap_small\n else:\n ag_vol = pip_small.max_volume - asp_vol\n pip_small.aspirate(ag_vol, factor.well.top())\n pip_small.aspirate(\n asp_vol, factor.height_dec(asp_vol),\n rate=asp_rate_relative)\n slow_withdraw(factor.well, pip_small, delay_s=asp_delay)\n pip_small.dispense(\n pip_small.current_volume,\n well.height_inc(asp_vol).move(Point(z=3)),\n rate=disp_rate_relative)\n ctx.delay(seconds=disp_delay)\n pip_small.blow_out(well.top(-2))\n\n # total_factor_vol = sum([sum(dict.values()) for dict in\n # factor_set])\n # p300.aspirate(total_factor_vol,\n # factor.height_dec(total_factor_vol))\n # for i, dict in enumerate(factor_set):\n # for well, vol in dict.items():\n # pip_small.dispense(\n # vol+vol_pre_airgap_small, well.bottom(well.depth/2))\n # if i == len(factor_set) - 1:\n # pip_small.blow_out(well.top(-2))\n\n # for d in factor_set:\n # asp_vol = sum(d.values())\n # if asp_vol + vol_pre_airgap_small <= pip_small.max_volume:\n # ag_vol = vol_pre_airgap_small\n # else:\n # ag_vol = pip_small.max_volume - asp_vol\n # pip_small.aspirate(ag_vol, factor.well.top())\n # pip_small.aspirate(asp_vol, factor.height_dec(asp_vol))\n # # total_factor_vol = sum([sum(dict.values()) for dict in\n # # factor_set])\n # # p300.aspirate(total_factor_vol,\n # # factor.height_dec(total_factor_vol))\n # slow_withdraw(factor.well, pip_small)\n # for i, dict in enumerate(factor_set):\n # for well, vol in dict.items():\n # pip_small.dispense(\n # vol+vol_pre_airgap_small, well.bottom(well.depth/2))\n # if i == len(factor_set) - 1:\n # pip_small.blow_out(well.top(-2))\n if pip_small.has_tip:\n pip_small.drop_tip()\n\n # mix\n for well in plate.wells()[:len(factor_data)]:\n p1000.pick_up_tip()\n p1000.mix(reps_mix, vol_mix, well.bottom(2))\n slow_withdraw(well, p1000)\n p1000.drop_tip()\n", - "custom_labware_defs": [], - "fields": [ - { - "default": "Media Total,Factor 1,Factor 2,Factor 3,Factor 4,Factor 5,Factor 6,Factor 7,Factor 8,Factor 9,Factor 10,Factor 11,Factor 12,\nfactor_volumes (in ml):,5,1.5,7,14,10.1,5,1.5,7,14,10.1,2,2,\n1170,0,0,0,0,0,0,0,0,0,0,65,65,\n1235,0,65,0,0,0,0,0,0,0,0,0,0,\n1040,65,65,0,65,0,0,0,0,0,0,0,65,\n975,0,65,65,65,65,0,0,0,0,0,0,65,\n1053,0,0,65,65,0,52,0,0,0,0,65,0,\n988,0,65,65,0,65,52,0,0,0,0,65,0,\n845,65,65,65,65,0,0,65,0,0,0,65,65,\n910,0,65,0,65,65,0,65,0,0,0,65,65,\n858,65,65,65,0,65,52,65,0,0,0,0,65,\n988,0,0,0,65,65,52,65,0,0,0,0,65,\n1040,0,65,65,0,0,0,0,65,0,0,65,0,\n1105,0,0,0,65,0,0,0,65,0,0,0,65,\n1040,65,0,0,0,65,0,0,65,0,0,0,65,\n923,65,0,65,0,0,52,0,65,0,0,65,65,\n923,0,65,0,65,65,52,0,65,0,0,65,0,\n923,65,0,65,65,65,52,0,65,0,0,0,0,\n975,65,0,0,65,0,0,65,65,0,0,65,0,\n1040,0,0,0,0,65,0,65,65,0,0,65,0,\n910,65,65,65,0,65,0,65,65,0,0,0,0,\n1053,0,0,65,0,0,52,65,65,0,0,0,0,\n858,0,65,65,65,0,52,65,65,0,0,0,65,\n793,65,65,0,0,65,52,65,65,0,0,65,65,\n793,0,0,65,65,65,52,65,65,0,0,65,65,\n975,65,65,65,0,0,0,0,0,65,0,0,65,\n1040,65,0,65,65,0,0,0,0,65,0,0,0,\n910,65,0,0,65,65,0,0,0,65,0,65,65,\n1053,0,65,0,0,0,52,0,0,65,0,0,65,\n728,65,65,65,65,65,52,0,0,65,0,65,65,\n1040,0,0,0,65,0,0,65,0,65,0,0,65,\n910,65,65,0,0,65,0,65,0,65,0,65,0,\n1040,0,0,65,0,65,0,65,0,65,0,0,0,\n858,65,0,65,0,0,52,65,0,65,0,65,65,\n923,65,65,0,65,0,52,65,0,65,0,0,0,\n1105,65,0,0,0,0,0,0,65,65,0,0,0,\n910,65,65,0,65,65,0,0,65,65,0,0,0,\n910,0,0,65,65,65,0,0,65,65,0,65,0,\n923,65,65,0,0,0,52,0,65,65,0,65,0,\n923,0,0,0,0,65,52,0,65,65,0,65,65,\n793,65,65,65,0,65,52,0,65,65,0,0,65,\n910,0,65,65,65,0,0,65,65,65,0,0,0,\n780,0,65,65,0,65,0,65,65,65,0,65,65,\n793,0,65,0,65,0,52,65,65,65,0,65,65,\n793,65,0,65,65,0,52,65,65,65,0,0,65,\n923,0,65,0,0,65,52,65,65,65,0,0,0,\n793,65,0,65,0,65,52,65,65,65,0,65,0,\n1118,0,0,65,0,0,0,0,0,0,52,0,65,\n1118,0,0,0,65,65,0,0,0,0,52,0,0,\n858,65,65,65,65,65,0,0,0,0,52,65,0,\n1001,65,65,65,0,0,52,0,0,0,52,0,0,\n936,0,65,0,65,0,52,0,0,0,52,65,65,\n871,0,0,65,65,65,52,0,0,0,52,65,65,\n988,0,65,65,0,0,0,65,0,0,52,65,0,\n988,65,0,65,65,0,0,65,0,0,52,0,0,\n988,0,65,0,0,65,0,65,0,0,52,0,65,\n858,65,0,65,0,65,0,65,0,0,52,65,65,\n871,65,0,0,65,0,52,65,0,0,52,65,65,\n1001,65,0,0,0,65,52,65,0,0,52,0,0,\n871,0,65,65,65,65,52,65,0,0,52,0,0,\n923,65,65,0,0,0,0,0,65,0,52,65,65,\n988,0,65,65,65,0,0,0,65,0,52,0,0,\n1066,0,0,0,0,0,52,0,65,0,52,65,0,\n806,65,65,0,65,65,52,0,65,0,52,0,65,\n858,65,65,65,0,0,0,65,65,0,52,0,65,\n858,0,0,65,65,0,0,65,65,0,52,65,65,\n858,65,65,0,0,65,0,65,65,0,52,65,0,\n793,65,0,0,65,65,0,65,65,0,52,65,65,\n871,65,65,0,65,0,52,65,65,0,52,0,0,\n741,65,65,65,65,0,52,65,65,0,52,65,0,\n871,0,0,65,0,65,52,65,65,0,52,0,65,\n988,65,0,65,0,0,0,0,0,65,52,65,0,\n988,0,65,0,65,0,0,0,0,65,52,65,0,\n858,0,65,65,0,65,0,0,0,65,52,65,65,\n1001,65,0,0,0,0,52,0,0,65,52,0,65,\n806,65,65,0,0,65,52,0,0,65,52,65,65,\n871,65,0,65,65,65,52,0,0,65,52,0,0,\n858,65,65,0,65,65,0,65,0,65,52,0,0,\n858,0,0,65,65,65,0,65,0,65,52,65,0,\n1001,0,0,0,0,0,52,65,0,65,52,65,0,\n806,0,65,65,65,0,52,65,0,65,52,0,65,\n871,0,0,0,0,65,52,65,0,65,52,65,65,\n988,0,0,65,0,0,0,0,65,65,52,0,65,\n858,65,65,65,0,65,0,0,65,65,52,0,0,\n793,0,65,0,65,65,0,0,65,65,52,65,65,\n793,65,0,65,65,65,0,0,65,65,52,0,65,\n806,0,65,65,0,0,52,0,65,65,52,65,65,\n806,65,0,0,65,65,52,0,65,65,52,65,0,\n806,0,65,65,65,65,52,0,65,65,52,0,0,\n663,65,65,65,65,0,0,65,65,65,52,65,65,\n858,65,0,0,0,65,0,65,65,65,52,0,65,\n728,0,65,65,65,65,0,65,65,65,52,0,65,\n871,0,65,0,0,0,52,65,65,65,52,0,65,\n936,0,0,0,65,0,52,65,65,65,52,0,0,\n923,32.5,32.5,32.5,32.5,32.5,26,32.5,32.5,32.5,26,32.5,32.5,\n923,32.5,32.5,32.5,32.5,32.5,26,32.5,32.5,32.5,26,32.5,32.5,\n1300,0,0,0,0,0,0,0,0,0,0,0,0,\n1300,0,0,0,0,0,0,0,0,0,0,0,0,\n", - "label": "factor .csv file", - "name": "csv_factors", - "type": "textFile" - }, - { - "default": "48.0,48.0,0,0,0,0", - "label": "media tube A1 volume (,-separated, in mL, A1,A2,A3,B1,B2,B3)", - "name": "vol_media_tubes", - "type": "str" - }, - { - "default": 800.0, - "label": "final mix volume (in uL)", - "name": "vol_mix", - "type": "float" - }, - { - "default": 3, - "label": "final mix repetitions", - "name": "reps_mix", - "type": "int" - }, - { - "label": "smaller pipette type", - "name": "type_pipette_small", - "options": [ - { - "label": "P300 (20-200ul)", - "value": "p300_single_gen2" - }, - { - "label": "P20 (1-20ul)", - "value": "p20_single_gen2" - } - ], - "type": "dropDown" - } - ], - "instruments": [ - { - "mount": "left", - "name": "p300_single_gen2" - }, - { - "mount": "right", - "name": "p1000_single_gen2" - } - ], - "labware": [ - { - "name": "media tuberack on 1", - "share": false, - "slot": "1", - "type": "opentrons_6_tuberack_falcon_50ml_conical" - }, - { - "name": "USA Scientific 96 Deep Well Plate 2.4 mL on 2", - "share": false, - "slot": "2", - "type": "usascientific_96_wellplate_2.4ml_deep" - }, - { - "name": "Opentrons 96 Filter Tip Rack 200 \u00b5L on 3", - "share": false, - "slot": "3", - "type": "opentrons_96_filtertiprack_200ul" - }, - { - "name": "factors 1-15 on 4", - "share": false, - "slot": "4", - "type": "opentrons_15_tuberack_falcon_15ml_conical" - }, - { - "name": "factors 31-54 on 5", - "share": false, - "slot": "5", - "type": "opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap" - }, - { - "name": "Opentrons 96 Filter Tip Rack 1000 \u00b5L on 6", - "share": false, - "slot": "6", - "type": "opentrons_96_filtertiprack_1000ul" - }, - { - "name": "factors 16-30 on 7", - "share": false, - "slot": "7", - "type": "opentrons_15_tuberack_falcon_15ml_conical" - }, - { - "name": "factors 55-78 on 8", - "share": false, - "slot": "8", - "type": "opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap" - }, - { - "name": "Opentrons Fixed Trash on 12", - "share": false, - "slot": "12", - "type": "opentrons_1_trash_1100ml_fixed" - } - ], - "metadata": { - "apiLevel": "2.12", - "author": "Nick `Custom Labware` > `Add Labware`, and selecting your labware files (.json extensions) if needed. -4. Upload your protocol file (.py extension) to the [OT App](https://opentrons.com/ot-app) in the `Protocol` tab. -5. Set up your deck according to the deck map. -6. Calibrate your labware, tiprack and pipette using the OT App. For calibration tips, check out our [support articles](https://support.opentrons.com/en/collections/1559720-guide-for-getting-started-with-the-ot-2). -7. Hit "Run". - - -### Additional Notes -If you have any questions about this protocol, please contact the Protocol Development Team by filling out the [Troubleshooting Survey](https://protocol-troubleshooting.paperform.co/). - - -###### Internal -0909e6 diff --git a/protocols/0909e6/fields.json b/protocols/0909e6/fields.json deleted file mode 100644 index 87de32621..000000000 --- a/protocols/0909e6/fields.json +++ /dev/null @@ -1,35 +0,0 @@ -[ - { - "type": "textFile", - "label": "factor .csv file", - "name": "csv_factors", - "default": "Media Total,Factor 1,Factor 2,Factor 3,Factor 4,Factor 5,Factor 6,Factor 7,Factor 8,Factor 9,Factor 10,Factor 11,Factor 12,\nfactor_volumes (in ml):,5,1.5,7,14,10.1,5,1.5,7,14,10.1,2,2,\n1170,0,0,0,0,0,0,0,0,0,0,65,65,\n1235,0,65,0,0,0,0,0,0,0,0,0,0,\n1040,65,65,0,65,0,0,0,0,0,0,0,65,\n975,0,65,65,65,65,0,0,0,0,0,0,65,\n1053,0,0,65,65,0,52,0,0,0,0,65,0,\n988,0,65,65,0,65,52,0,0,0,0,65,0,\n845,65,65,65,65,0,0,65,0,0,0,65,65,\n910,0,65,0,65,65,0,65,0,0,0,65,65,\n858,65,65,65,0,65,52,65,0,0,0,0,65,\n988,0,0,0,65,65,52,65,0,0,0,0,65,\n1040,0,65,65,0,0,0,0,65,0,0,65,0,\n1105,0,0,0,65,0,0,0,65,0,0,0,65,\n1040,65,0,0,0,65,0,0,65,0,0,0,65,\n923,65,0,65,0,0,52,0,65,0,0,65,65,\n923,0,65,0,65,65,52,0,65,0,0,65,0,\n923,65,0,65,65,65,52,0,65,0,0,0,0,\n975,65,0,0,65,0,0,65,65,0,0,65,0,\n1040,0,0,0,0,65,0,65,65,0,0,65,0,\n910,65,65,65,0,65,0,65,65,0,0,0,0,\n1053,0,0,65,0,0,52,65,65,0,0,0,0,\n858,0,65,65,65,0,52,65,65,0,0,0,65,\n793,65,65,0,0,65,52,65,65,0,0,65,65,\n793,0,0,65,65,65,52,65,65,0,0,65,65,\n975,65,65,65,0,0,0,0,0,65,0,0,65,\n1040,65,0,65,65,0,0,0,0,65,0,0,0,\n910,65,0,0,65,65,0,0,0,65,0,65,65,\n1053,0,65,0,0,0,52,0,0,65,0,0,65,\n728,65,65,65,65,65,52,0,0,65,0,65,65,\n1040,0,0,0,65,0,0,65,0,65,0,0,65,\n910,65,65,0,0,65,0,65,0,65,0,65,0,\n1040,0,0,65,0,65,0,65,0,65,0,0,0,\n858,65,0,65,0,0,52,65,0,65,0,65,65,\n923,65,65,0,65,0,52,65,0,65,0,0,0,\n1105,65,0,0,0,0,0,0,65,65,0,0,0,\n910,65,65,0,65,65,0,0,65,65,0,0,0,\n910,0,0,65,65,65,0,0,65,65,0,65,0,\n923,65,65,0,0,0,52,0,65,65,0,65,0,\n923,0,0,0,0,65,52,0,65,65,0,65,65,\n793,65,65,65,0,65,52,0,65,65,0,0,65,\n910,0,65,65,65,0,0,65,65,65,0,0,0,\n780,0,65,65,0,65,0,65,65,65,0,65,65,\n793,0,65,0,65,0,52,65,65,65,0,65,65,\n793,65,0,65,65,0,52,65,65,65,0,0,65,\n923,0,65,0,0,65,52,65,65,65,0,0,0,\n793,65,0,65,0,65,52,65,65,65,0,65,0,\n1118,0,0,65,0,0,0,0,0,0,52,0,65,\n1118,0,0,0,65,65,0,0,0,0,52,0,0,\n858,65,65,65,65,65,0,0,0,0,52,65,0,\n1001,65,65,65,0,0,52,0,0,0,52,0,0,\n936,0,65,0,65,0,52,0,0,0,52,65,65,\n871,0,0,65,65,65,52,0,0,0,52,65,65,\n988,0,65,65,0,0,0,65,0,0,52,65,0,\n988,65,0,65,65,0,0,65,0,0,52,0,0,\n988,0,65,0,0,65,0,65,0,0,52,0,65,\n858,65,0,65,0,65,0,65,0,0,52,65,65,\n871,65,0,0,65,0,52,65,0,0,52,65,65,\n1001,65,0,0,0,65,52,65,0,0,52,0,0,\n871,0,65,65,65,65,52,65,0,0,52,0,0,\n923,65,65,0,0,0,0,0,65,0,52,65,65,\n988,0,65,65,65,0,0,0,65,0,52,0,0,\n1066,0,0,0,0,0,52,0,65,0,52,65,0,\n806,65,65,0,65,65,52,0,65,0,52,0,65,\n858,65,65,65,0,0,0,65,65,0,52,0,65,\n858,0,0,65,65,0,0,65,65,0,52,65,65,\n858,65,65,0,0,65,0,65,65,0,52,65,0,\n793,65,0,0,65,65,0,65,65,0,52,65,65,\n871,65,65,0,65,0,52,65,65,0,52,0,0,\n741,65,65,65,65,0,52,65,65,0,52,65,0,\n871,0,0,65,0,65,52,65,65,0,52,0,65,\n988,65,0,65,0,0,0,0,0,65,52,65,0,\n988,0,65,0,65,0,0,0,0,65,52,65,0,\n858,0,65,65,0,65,0,0,0,65,52,65,65,\n1001,65,0,0,0,0,52,0,0,65,52,0,65,\n806,65,65,0,0,65,52,0,0,65,52,65,65,\n871,65,0,65,65,65,52,0,0,65,52,0,0,\n858,65,65,0,65,65,0,65,0,65,52,0,0,\n858,0,0,65,65,65,0,65,0,65,52,65,0,\n1001,0,0,0,0,0,52,65,0,65,52,65,0,\n806,0,65,65,65,0,52,65,0,65,52,0,65,\n871,0,0,0,0,65,52,65,0,65,52,65,65,\n988,0,0,65,0,0,0,0,65,65,52,0,65,\n858,65,65,65,0,65,0,0,65,65,52,0,0,\n793,0,65,0,65,65,0,0,65,65,52,65,65,\n793,65,0,65,65,65,0,0,65,65,52,0,65,\n806,0,65,65,0,0,52,0,65,65,52,65,65,\n806,65,0,0,65,65,52,0,65,65,52,65,0,\n806,0,65,65,65,65,52,0,65,65,52,0,0,\n663,65,65,65,65,0,0,65,65,65,52,65,65,\n858,65,0,0,0,65,0,65,65,65,52,0,65,\n728,0,65,65,65,65,0,65,65,65,52,0,65,\n871,0,65,0,0,0,52,65,65,65,52,0,65,\n936,0,0,0,65,0,52,65,65,65,52,0,0,\n923,32.5,32.5,32.5,32.5,32.5,26,32.5,32.5,32.5,26,32.5,32.5,\n923,32.5,32.5,32.5,32.5,32.5,26,32.5,32.5,32.5,26,32.5,32.5,\n1300,0,0,0,0,0,0,0,0,0,0,0,0,\n1300,0,0,0,0,0,0,0,0,0,0,0,0,\n" - }, - { - "type": "str", - "label": "media tube A1 volume (,-separated, in mL, A1,A2,A3,B1,B2,B3)", - "name": "vol_media_tubes", - "default": "48.0,48.0,0,0,0,0" - }, - { - "type": "float", - "label": "final mix volume (in uL)", - "name": "vol_mix", - "default": 800.0 - }, - { - "type": "int", - "label": "final mix repetitions", - "name": "reps_mix", - "default": 3 - }, - { - "type": "dropDown", - "label": "smaller pipette type", - "name": "type_pipette_small", - "options": [ - { "label": "P300 (20-200ul)", "value": "p300_single_gen2" }, - { "label": "P20 (1-20ul)", "value": "p20_single_gen2" } - ] - } -] diff --git a/protocols/0909e6/media_transfer.ot2.apiv2.py b/protocols/0909e6/media_transfer.ot2.apiv2.py deleted file mode 100644 index c1bf70129..000000000 --- a/protocols/0909e6/media_transfer.ot2.apiv2.py +++ /dev/null @@ -1,338 +0,0 @@ -import math -from opentrons.protocol_api.labware import Well -from opentrons.protocols.api_support.types import APIVersion -from opentrons.types import Point - -metadata = { - 'protocolName': 'DOE', - 'author': 'Nick self.min_height: - self.height = self.height - dh - else: - self.height = self.min_height - if self.current_volume - vol > 0: - self.current_volume = self.current_volume - vol - else: - self.current_volume = 0 - return self.well.bottom(self.height) - - def height_inc(self, vol): - dh = (vol/(math.pi*(self.radius**2)))*self.comp_coeff - if self.height + dh < self.depth: - self.height = self.height + dh - else: - self.height = self.depth - self.current_volume += vol - return self.well.bottom(self.height + 20) - - # labware - tuberack50 = ctx.load_labware('opentrons_6_tuberack_falcon_50ml_conical', - '1', 'media tuberack') - tuberacks15 = [ - ctx.load_labware( - 'opentrons_15_tuberack_falcon_15ml_conical', slot, - f'factors {tube_set}') - for i, (slot, tube_set) in enumerate( - zip(['4', '7'], ['1-15', '16-30']))] - tuberacks2 = [ - ctx.load_labware( - 'opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap', slot, - f'factors {tube_set}') - for i, (slot, tube_set) in enumerate( - zip(['5', '8'], ['31-54', '55-78']))] - plate = ctx.load_labware('usascientific_96_wellplate_2.4ml_deep', '2') - tiprack_small = [ctx.load_labware(tiprack_small_type, '3')] - tiprack1000 = [ - ctx.load_labware('opentrons_96_filtertiprack_1000ul', slot) - for slot in ['6']] - - # pipettes - pip_small = ctx.load_instrument(type_pipette_small, 'left', - tip_racks=tiprack_small) - p1000 = ctx.load_instrument('p1000_single_gen2', 'right', - tip_racks=tiprack1000) - - # reagents - vol_media_list = [float(val) for val in vol_media_tubes.split(',')] - media_rows_ordered = [tube for row in tuberack50.rows() for tube in row] - media = [ - WellH(well, current_volume=vol, height=well.depth*(vol/50000)*0.9) - for well, vol in zip( - media_rows_ordered[:len(vol_media_list)], - [vol_media_tube*1000 for vol_media_tube in vol_media_list])] - - # parse data - factor_data = [ - [float(val) for val in line.split(',')[1:] if val.strip()] - for line in csv_factors.splitlines()[3:] - ] - - all_factor_tubes = [ - well for rack_set in [tuberacks15, tuberacks2] - for rack in rack_set - for well in rack.wells()] - - factor_indices = [ - int(cell.strip().split(' ')[-1]) - 1 - for cell in csv_factors.splitlines()[0].split(',')[1:] - if cell.strip()] - factor_tubes = [ - all_factor_tubes[ind] for ind in factor_indices] - factor_viscosities = [ - bool(visc) for visc in csv_factors.splitlines()[1].split(',')[1:] - if visc.strip()] - factor_volumes_ul = [ - float(cell)*1000 for cell in csv_factors.splitlines()[2].split(',')[1:] - if cell.strip()] - # ref_vol = tuberacks15[0].wells()[0].max_volume / 1000 # 2ml or 15ml - # ref_height = tuberacks15[0].wells()[0].depth - factor_heights = [ - # ensure tip is submerged - round(factor_vol/(factor_tube.max_volume)*factor_tube.depth*0.9, - 1) - for factor_tube, factor_vol in zip(factor_tubes, factor_volumes_ul)] - factors = [ - WellH(well, current_volume=vol, height=height) - for well, vol, height in zip( - factor_tubes, factor_volumes_ul, factor_heights)] - - def slow_withdraw(well, pip=p1000, delay_s=2.0): - ctx.max_speeds['A'] = 25 - ctx.max_speeds['Z'] = 25 - if delay_s > 0: - ctx.delay(seconds=delay_s) - pip.move_to(well.top()) - del ctx.max_speeds['A'] - del ctx.max_speeds['Z'] - - def split_media_vol(vol): - num_transfers = math.ceil(vol/(1000-vol_pre_airgap_1000)) - vol_per_transfer = round(vol/num_transfers, 1) - return [vol_per_transfer]*num_transfers - - # iterate - iterator_media = iter(media) - current_media = next(iterator_media) - - def check_media(vol): - nonlocal current_media - if current_media.current_volume - vol < current_media.min_vol: - current_media = next(iterator_media) - - def custom_distribute(info, pip): - pip_volume = pip.tip_racks[0].wells()[0].max_volume - vol_pre_airgap = vol_pre_airgap_small if pip == \ - pip_small else vol_pre_airgap_1000 - max_vol = pip_volume - sets = [] - running = [] - current_vol = 0 - for d in info: - well = [key for key in d.keys()][0] - vol = [val for val in d.values()][0] - if vol > 0: - if current_vol + vol + vol_pre_airgap > max_vol: - sets.append(running) - running = [] - current_vol = 0 - running.append({well: vol}) - current_vol += vol + vol_pre_airgap - sets.append(running) - return sets - - # transfer media - p1000.pick_up_tip() - wells_ordered = [well for row in plate.rows() for well in row] - vols_media = [ - float(line.split(',')[0]) for line in csv_factors.splitlines()[3:]] - media_info = [] - for well, vol_media in zip(wells_ordered, vols_media): - vols_split = split_media_vol(vol_media) - for vol in vols_split: - media_info.append({well: vol}) - - wells_h = [ - WellH(well, height=0) for well in wells_ordered] - - for d in media_info: - well = list(d.keys())[0] - asp_vol = list(d.values())[0] - if p1000.current_volume: - p1000.dispense(p1000.current_volume, current_media.well.top()) - check_media(asp_vol) - p1000.aspirate(vol_pre_airgap_1000, current_media.well.top()) - p1000.aspirate(asp_vol, current_media.height_dec(asp_vol)) - slow_withdraw(current_media.well, p1000) - p1000.dispense(p1000.current_volume, well.bottom(well.depth/2)) - p1000.blow_out(well.bottom(well.depth/2)) - slow_withdraw(well, p1000) - - # media_sets = custom_distribute(media_info, pip=p1000) - # for media_set in media_sets: - # if p1000.current_volume: - # p1000.dispense(p1000.current_volume, current_media.well.top()) - # # pre-air_gap to fully void tip on blow_out - # for d in media_set: - # asp_vol = sum(d.values()) - # check_media(asp_vol) - # p1000.aspirate(vol_pre_airgap_1000, current_media.well.top()) - # p1000.aspirate(asp_vol, current_media.height_dec(asp_vol)) - # slow_withdraw(current_media.well, p1000) - # for i, d in enumerate(media_set): - # well = [key for key in d.keys()][0] - # vol = [val for val in d.values()][0] - # p1000.dispense(vol+vol_pre_airgap_1000, - # well.bottom(well.depth/2)) - # if i == len(media_set) - 1: - # p1000.blow_out(well.bottom(well.depth/2)) - # slow_withdraw(well, p1000) - p1000.return_tip() - p1000.reset_tipracks() - - viscosity_map = { - 20: { - 'aspirate': 6.5, - 'delay_aspiration': 2.0, - 'dispense': 6.5, - 'delay_dispense': 2.0, - 'default': 7.56 - }, - 300: { - 'aspirate': 80, - 'delay_aspiration': 2.0, - 'dispense': 80, - 'delay_dispense': 2.0, - 'default': 92.86 - }, - 1000: { - 'aspirate': 247, - 'delay_aspiration': 2.0, - 'dispense': 247, - 'delay_dispense': 2.0, - 'default': 247 - } - } - - # transfer factors - for i, (visc, factor) in enumerate(zip(factor_viscosities, factors)): - factor_vols = [line[i] for line in factor_data] - factor_info = [ - {well: vol} - for well, vol in zip(wells_h, factor_vols)] - factor_sets = custom_distribute(factor_info, pip=pip_small) - if visc: - asp_rate_relative = viscosity_map[ - int(pip_small.max_volume)]['aspirate'] / ( - viscosity_map[int(pip_small.max_volume)]['default']) - asp_delay = viscosity_map[ - int(pip_small.max_volume)]['delay_aspiration'] - disp_rate_relative = viscosity_map[ - int(pip_small.max_volume)]['dispense'] / ( - viscosity_map[int(pip_small.max_volume)]['default']) - disp_delay = viscosity_map[ - int(pip_small.max_volume)]['delay_dispense'] - else: - asp_rate_relative = 1 - asp_delay = 2.0 - disp_rate_relative = 1 - disp_delay = 2.0 - for factor_set in factor_sets: - # aspirate total vol needed - if not pip_small.has_tip: - pip_small.pick_up_tip() - # pre-air_gap to fully void tip on blow_out - for d in factor_set: - well = [k for k in d.keys()][0] - asp_vol = [k for k in d.values()][0] - if asp_vol + vol_pre_airgap_small <= pip_small.max_volume: - ag_vol = vol_pre_airgap_small - else: - ag_vol = pip_small.max_volume - asp_vol - pip_small.aspirate(ag_vol, factor.well.top()) - pip_small.aspirate( - asp_vol, factor.height_dec(asp_vol), - rate=asp_rate_relative) - slow_withdraw(factor.well, pip_small, delay_s=asp_delay) - pip_small.dispense( - pip_small.current_volume, - well.height_inc(asp_vol).move(Point(z=3)), - rate=disp_rate_relative) - ctx.delay(seconds=disp_delay) - pip_small.blow_out(well.top(-2)) - - # total_factor_vol = sum([sum(dict.values()) for dict in - # factor_set]) - # p300.aspirate(total_factor_vol, - # factor.height_dec(total_factor_vol)) - # for i, dict in enumerate(factor_set): - # for well, vol in dict.items(): - # pip_small.dispense( - # vol+vol_pre_airgap_small, well.bottom(well.depth/2)) - # if i == len(factor_set) - 1: - # pip_small.blow_out(well.top(-2)) - - # for d in factor_set: - # asp_vol = sum(d.values()) - # if asp_vol + vol_pre_airgap_small <= pip_small.max_volume: - # ag_vol = vol_pre_airgap_small - # else: - # ag_vol = pip_small.max_volume - asp_vol - # pip_small.aspirate(ag_vol, factor.well.top()) - # pip_small.aspirate(asp_vol, factor.height_dec(asp_vol)) - # # total_factor_vol = sum([sum(dict.values()) for dict in - # # factor_set]) - # # p300.aspirate(total_factor_vol, - # # factor.height_dec(total_factor_vol)) - # slow_withdraw(factor.well, pip_small) - # for i, dict in enumerate(factor_set): - # for well, vol in dict.items(): - # pip_small.dispense( - # vol+vol_pre_airgap_small, well.bottom(well.depth/2)) - # if i == len(factor_set) - 1: - # pip_small.blow_out(well.top(-2)) - if pip_small.has_tip: - pip_small.drop_tip() - - # mix - for well in plate.wells()[:len(factor_data)]: - p1000.pick_up_tip() - p1000.mix(reps_mix, vol_mix, well.bottom(2)) - slow_withdraw(well, p1000) - p1000.drop_tip()