-
Notifications
You must be signed in to change notification settings - Fork 52
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
“ramifarawi”
committed
Oct 30, 2023
1 parent
917da50
commit b735de7
Showing
6 changed files
with
40 additions
and
27 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,5 +1,5 @@ | ||
{ | ||
"content": "import math\n\nmetadata = {\n 'protocolName': 'ELISA',\n 'author': 'Alise <[email protected]>',\n 'source': 'Custom Protocol Request',\n 'apiLevel': '2.13'\n}\n\n\ndef run(ctx):\n [number_of_standards, concentration_csv] = get_values( # noqa: F821\n 'number_of_standards', 'concentration_csv')\n\n # labware setup\n tuberack_4 = ctx.load_labware(\n 'opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap', '4')\n deep_plates = [ctx.load_labware('nest_96_wellplate_2ml_deep', slot)\n for slot in ['5', '6']]\n trough = ctx.load_labware('nest_12_reservoir_15ml', '8')\n plate = ctx.load_labware(\n 'corning_96_wellplate_360ul_flat', '9')\n\n tipracks_300 = [ctx.load_labware('opentrons_96_tiprack_300ul', slot)\n for slot in ['3', '10']]\n tiprack_m300 = ctx.load_labware('opentrons_96_tiprack_300ul', '7')\n\n # instrument setup\n m300 = ctx.load_instrument(\n 'p300_multi_gen2',\n mount='left',\n tip_racks=[tiprack_m300])\n p300 = ctx.load_instrument(\n 'p300_single',\n mount='right',\n tip_racks=tipracks_300)\n\n # reagent setup\n tubes = [well for row in tuberack_4.rows() for well in row]\n water = tubes[0]\n diluent = tubes[1]\n standards = tubes[2:2 + number_of_standards]\n samples = tubes[2 + number_of_standards:]\n antibody = trough.wells('A1')\n\n # define elution pool\n dil_dests = [row for deep_plate in deep_plates\n for row in deep_plate.rows()]\n conc_lists = [[int(cell) for cell in line.split(',') if cell]\n for line in concentration_csv.splitlines() if line]\n concs = [5, 10, 25, 50, 100, 500, 1000, 5000, 10000, 25000, 50000, 100000]\n\n samples = [\n row[concs.index(conc)]\n for concentrations, row in zip(conc_lists, dil_dests)\n for conc in concentrations\n ]\n\n dests = [\n [plate.columns()[index][num], plate.columns()[index+1][num]]\n for index in range(0, 12, 2) for num in range(8)\n ]\n\n \"\"\"\n Adding Enzyme Conjugate Reagent\n \"\"\"\n num_cols = math.ceil((2 + number_of_standards + len(samples)) / 8) * 2\n m300.distribute(100, antibody,\n plate.columns()[:num_cols], blow_out=antibody)\n\n \"\"\"\n Adding Water\n \"\"\"\n p300.distribute(50, water, dests[0])\n dests.pop(0)\n\n \"\"\"\n Adding Dilution Buffer\n \"\"\"\n p300.distribute(50, diluent, dests[0])\n dests.pop(0)\n\n \"\"\"\n Adding HCP Standards\n \"\"\"\n for standard in standards:\n p300.distribute(50, standard, dests[0])\n dests.pop(0)\n\n \"\"\"\n Adding Samples\n \"\"\"\n for sample in samples:\n p300.pick_up_tip()\n p300.aspirate(130, sample)\n for dest in dests[0]:\n p300.dispense(50, dest)\n p300.drop_tip()\n dests.pop(0)\n", | ||
"content": "import math\n\nmetadata = {\n 'protocolName': 'Antibody Addition',\n 'author': 'Alise <[email protected]>',\n 'source': 'Custom Protocol Request',\n 'apiLevel': '2.14'\n}\n\n\ndef run(ctx):\n [number_of_standards, concentration_csv] = get_values( # noqa: F821\n 'number_of_standards', 'concentration_csv')\n\n # labware setup\n tuberack_4 = ctx.load_labware(\n 'opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap', '4')\n deep_plates = [ctx.load_labware('nest_96_wellplate_2ml_deep', slot)\n for slot in ['5', '6']]\n trough = ctx.load_labware('nest_12_reservoir_15ml', '8')\n plate = ctx.load_labware(\n 'corning_96_wellplate_360ul_flat', '9')\n\n tipracks_300 = [ctx.load_labware('opentrons_96_tiprack_300ul', slot)\n for slot in ['3', '10']]\n tiprack_m300 = ctx.load_labware('opentrons_96_tiprack_300ul', '7')\n\n # instrument setup\n m300 = ctx.load_instrument(\n 'p300_multi_gen2',\n mount='left',\n tip_racks=[tiprack_m300])\n p300 = ctx.load_instrument(\n 'p300_single',\n mount='right',\n tip_racks=tipracks_300)\n\n # reagent setup\n tubes = [well for row in tuberack_4.rows() for well in row]\n water = tubes[0]\n diluent = tubes[1]\n standards = tubes[2:2 + number_of_standards]\n samples = tubes[2 + number_of_standards:]\n antibody = trough.wells('A1')\n\n # define elution pool\n dil_dests = [row for deep_plate in deep_plates\n for row in deep_plate.rows()]\n conc_lists = [[int(cell) for cell in line.split(',') if cell]\n for line in concentration_csv.splitlines() if line]\n concs = [5, 10, 25, 50, 100, 500, 1000, 5000, 10000, 25000, 50000, 100000]\n\n samples = [\n row[concs.index(conc)]\n for concentrations, row in zip(conc_lists, dil_dests)\n for conc in concentrations\n ]\n\n dests = [\n [plate.columns()[index][num], plate.columns()[index+1][num]]\n for index in range(0, 12, 2) for num in range(8)\n ]\n\n \"\"\"\n Adding Enzyme Conjugate Reagent\n \"\"\"\n num_cols = math.ceil((2 + number_of_standards + len(samples)) / 8) * 2\n m300.distribute(100, antibody,\n plate.columns()[:num_cols], blow_out=antibody)\n\n \"\"\"\n Adding Water\n \"\"\"\n p300.distribute(50, water, dests[0])\n dests.pop(0)\n\n \"\"\"\n Adding Dilution Buffer\n \"\"\"\n p300.distribute(50, diluent, dests[0])\n dests.pop(0)\n\n \"\"\"\n Adding HCP Standards\n \"\"\"\n ctx.comment('hcp')\n for standard in standards:\n p300.distribute(50, standard, dests[0])\n dests.pop(0)\n\n \"\"\"\n Adding Samples\n \"\"\"\n for sample, chunk in zip(samples, dests):\n p300.pick_up_tip()\n p300.aspirate(130, sample)\n for well in chunk:\n p300.dispense(50, well)\n p300.drop_tip()\n # dests.pop(0)\n", | ||
"custom_labware_defs": [], | ||
"fields": [ | ||
{ | ||
|
@@ -82,9 +82,9 @@ | |
} | ||
], | ||
"metadata": { | ||
"apiLevel": "2.13", | ||
"apiLevel": "2.14", | ||
"author": "Alise <[email protected]>", | ||
"protocolName": "ELISA", | ||
"protocolName": "Antibody Addition", | ||
"source": "Custom Protocol Request" | ||
}, | ||
"modules": [] | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -5,12 +5,12 @@ | |
"ELISA" | ||
] | ||
}, | ||
"description": "Links:\n Part 1: Dilution\n Part 2-1: Antibody Addition\n* Part 2-2: Substrate and Stop Solution Addition\nThis is the first part of a ELISA protocol: Dilution Procedure. The robot will perform serial dilutions samples located in the Opentrons 2 mL Eppendorf tube rack in the 1.2 mL tube plates. User will need to upload a CSV specifying the desired concentrations of each sample to be transferred to a separate 96-well plate in part 2 of the protocol. See more information on the CSV requirement in Additional Notes below.\nDownload full protocol details here.\n\nYou will need:\n P1000 Single-channel Pipette\n P300 Single-channel Pipette\n Opentrons Tube Racks (2 mL Eppendorf)\n Opentrons Tube Rack (15 + 50 mL)\n 2 mL 96-deep well Plate\n 96-well Plate\n 12-row Trough\n 1000 uL Tip Rack\n* 300 uL Tip Rack", | ||
"description": "Links:\n Part 1: Dilution\n Part 2-1: Antibody Addition\n* Part 2-2: Substrate and Stop Solution Addition\nThis is the first part of a ELISA protocol: Dilution Procedure. The robot will perform serial dilutions samples located in the Opentrons 2 mL Eppendorf tube rack in the 1.2 mL tube plates. User will need to upload a CSV specifying the desired concentrations of each sample to be transferred to a separate 96-well plate in part 2 of the protocol. See more information on the CSV requirement in Additional Notes below.\nDownload full protocol details here.\n\nYou will need:\n P1000 Single-channel Pipette\n P300 Single-channel Pipette\n Opentrons Tube Racks (2 mL Eppendorf)\n Opentrons Tube Rack (15 + 50 mL)\n NEST 2 mL 96-deep well Plate\n 96-well Plate\n 12-row Trough\n 1000 uL Tip Rack\n* 300 uL Tip Rack", | ||
"internal": "1464", | ||
"markdown": { | ||
"author": "[Opentrons](http://www.opentrons.com/)\n\n", | ||
"categories": "* Proteins & Proteomics\n * ELISA\n\n", | ||
"description": "Links:\n* [Part 1: Dilution](./1464)\n* [Part 2-1: Antibody Addition](./1464-2)\n* [Part 2-2: Substrate and Stop Solution Addition](1464-3)\n\nThis is the first part of a ELISA protocol: Dilution Procedure. The robot will perform serial dilutions samples located in the Opentrons 2 mL Eppendorf tube rack in the 1.2 mL tube plates. User will need to upload a CSV specifying the desired concentrations of each sample to be transferred to a separate 96-well plate in part 2 of the protocol. See more information on the CSV requirement in Additional Notes below.\n\n\nDownload full protocol details [here](https://s3.amazonaws.com/opentrons-protocol-library-website/custom-README-images/1464-natrix-separations-inc-milliporesigma/NEW_ELISA_protocol.xlsx).\n\n---\n\nYou will need:\n* P1000 Single-channel Pipette\n* P300 Single-channel Pipette\n* [Opentrons Tube Racks (2 mL Eppendorf)](https://shop.opentrons.com/collections/opentrons-tips/products/tube-rack-set-1)\n* [Opentrons Tube Rack (15 + 50 mL)](https://shop.opentrons.com/collections/opentrons-tips/products/tube-rack-set-1)\n* [2 mL 96-deep well Plate](https://www.usascientific.com/2ml-deep96-well-plateone-bulk.aspx)\n* 96-well Plate\n* 12-row Trough\n* 1000 uL Tip Rack\n* 300 uL Tip Rack\n\n", | ||
"description": "Links:\n* [Part 1: Dilution](./1464)\n* [Part 2-1: Antibody Addition](./1464-2)\n* [Part 2-2: Substrate and Stop Solution Addition](1464-3)\n\nThis is the first part of a ELISA protocol: Dilution Procedure. The robot will perform serial dilutions samples located in the Opentrons 2 mL Eppendorf tube rack in the 1.2 mL tube plates. User will need to upload a CSV specifying the desired concentrations of each sample to be transferred to a separate 96-well plate in part 2 of the protocol. See more information on the CSV requirement in Additional Notes below.\n\n\nDownload full protocol details [here](https://s3.amazonaws.com/opentrons-protocol-library-website/custom-README-images/1464-natrix-separations-inc-milliporesigma/NEW_ELISA_protocol.xlsx).\n\n---\n\nYou will need:\n* P1000 Single-channel Pipette\n* P300 Single-channel Pipette\n* [Opentrons Tube Racks (2 mL Eppendorf)](https://shop.opentrons.com/collections/opentrons-tips/products/tube-rack-set-1)\n* [Opentrons Tube Rack (15 + 50 mL)](https://shop.opentrons.com/collections/opentrons-tips/products/tube-rack-set-1)\n* NEST 2 mL 96-deep well Plate\n* 96-well Plate\n* 12-row Trough\n* 1000 uL Tip Rack\n* 300 uL Tip Rack\n\n", | ||
"internal": "1464\n", | ||
"notes": "Tube Rack setup: (slot 4)\n* DI Water: A1\n* Diluent: A2\n* HCP Standards: A3-B2 if number of standards is 6, A3-B4 if 8\n* Samples: B3-(D6) if number of standards is 6, B5-(D6) if 8\nYou will need to shift the locations of the samples based on the number of standards you have each run. This configuration must be consistent of that of part 2.\n\n---\n\nCSV Layout:\n\n![csv](https://s3.amazonaws.com/opentrons-protocol-library-website/custom-README-images/1464-natrix-separations-inc-milliporesigma/csv_layout.png)\n\n* No headers\n* Each row represents each sample\n* Each column represents the dilution factor of that sample to be transferred to the output plate in part 2 of the protocol\n* Robot will determine the dilution scheme of each sample based on the concentrations in the CSV\n\n---\n\nIf you have any questions about this protocol, please contact [email protected].\n\n", | ||
"process": "1. Download your protocol.\n2. Upload your protocol into the [OT App](https://opentrons.com/ot-app).\n3. Set up your deck according to the deck map.\n4. Calibrate your labware, tiprack and pipette using the OT App. For calibration tips, check out our [support article](https://support.opentrons.com/ot-2/getting-started-software-setup/deck-calibration).\n5. Hit \"Run\".\n\n\n", | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,10 +1,10 @@ | ||
import math | ||
|
||
metadata = { | ||
'protocolName': 'ELISA', | ||
'protocolName': 'Antibody Addition', | ||
'author': 'Alise <[email protected]>', | ||
'source': 'Custom Protocol Request', | ||
'apiLevel': '2.13' | ||
'apiLevel': '2.14' | ||
} | ||
|
||
|
||
|
@@ -83,17 +83,18 @@ def run(ctx): | |
""" | ||
Adding HCP Standards | ||
""" | ||
ctx.comment('hcp') | ||
for standard in standards: | ||
p300.distribute(50, standard, dests[0]) | ||
dests.pop(0) | ||
|
||
""" | ||
Adding Samples | ||
""" | ||
for sample in samples: | ||
for sample, chunk in zip(samples, dests): | ||
p300.pick_up_tip() | ||
p300.aspirate(130, sample) | ||
for dest in dests[0]: | ||
p300.dispense(50, dest) | ||
for well in chunk: | ||
p300.dispense(50, well) | ||
p300.drop_tip() | ||
dests.pop(0) | ||
# dests.pop(0) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,8 +1,8 @@ | ||
metadata = { | ||
'protocolName': 'ELISA', | ||
'protocolName': 'Substrate and Stop Solution Addition', | ||
'author': 'Alise <[email protected]>', | ||
'source': 'Custom Protocol Request', | ||
'apiLevel': '2.13' | ||
'apiLevel': '2.14' | ||
} | ||
|
||
|
||
|
@@ -29,18 +29,20 @@ def run(ctx): | |
tip_racks=tiprack_m300) | ||
|
||
# reagent setup | ||
TMB_substrate = trough.wells_by_name()['A6'] | ||
stop_solution = trough.wells_by_name()['A12'] | ||
TMB_substrate = trough.wells_by_name()['A6'].bottom(z=0) | ||
stop_solution = trough.wells_by_name()['A12'].bottom(z=0) | ||
|
||
""" | ||
Adding TMB substrate | ||
""" | ||
m300.pick_up_tip() | ||
m300.distribute( | ||
100, | ||
TMB_substrate.bottom(), | ||
TMB_substrate, | ||
[col[0].top() for col in plate.columns()[:number_of_columns]], | ||
blow_out=TMB_substrate, | ||
blow_out=False, | ||
disposal_volume=0.05, | ||
|
||
new_tip='never') | ||
m300.aspirate(20, plate.columns()[number_of_columns-1][0].top()) | ||
m300.drop_tip() | ||
|
@@ -52,5 +54,5 @@ def run(ctx): | |
""" | ||
for col in plate.columns()[:number_of_columns]: | ||
m300.pick_up_tip() | ||
m300.transfer(100, stop_solution.bottom(), col, new_tip='never') | ||
m300.transfer(100, stop_solution, col, new_tip='never') | ||
m300.drop_tip() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,10 +1,16 @@ | ||
cimport math | ||
def get_values(*names): | ||
import json | ||
_all_values = json.loads("""{"starting_buffer_volume":50,"number_of_standards":6,"concentration_csv":"50,500,5000\\n10,10000,100000\\n100,,\\n5,,"}""") | ||
return [_all_values[n] for n in names] | ||
|
||
|
||
import math | ||
|
||
metadata = { | ||
'protocolName': 'ELISA: Dilution', | ||
'author': 'Alise <[email protected]>', | ||
'source': 'Custom Protocol Request', | ||
'apiLevel': '2.13' | ||
'apiLevel': '2.14' | ||
} | ||
|
||
|
||
|
@@ -19,7 +25,7 @@ def run(ctx): | |
'opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical', '1') | ||
tuberack_4 = ctx.load_labware( | ||
'opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap', '4') | ||
deep_plates = [ctx.load_labware('plateone_96_wellplate_2000ul', slot) | ||
deep_plates = [ctx.load_labware('nest_96_wellplate_2ml_deep', slot) | ||
for slot in ['5', '6']] | ||
|
||
tiprack_1000 = ctx.load_labware('opentrons_96_tiprack_1000ul', '2') | ||
|
@@ -47,9 +53,12 @@ def run(ctx): | |
conc_lists = [[int(cell) for cell in line.split(',') if cell] | ||
for line in concentration_csv.splitlines() if line] | ||
|
||
concs = [5, 10, 25, 50, 100, 500, 1000, 2500, 5000, 10000, 50000, 100000] | ||
diluent_vols = [320, 450, 180, 320, 450, 320, 450, 180, 320, 450, 180, 450] | ||
sample_vols = [80, 50, 120, 80, 50, 80, 50, 120, 80, 50, 80, 50] | ||
concs = [5, 10, 25, 50, 100, 500, 1000, 5000, 10000, 25000, 50000, 100000] | ||
|
||
diluent_vols = [320, 450, 180, 320, 450, 320, 450, 320, 450, 180, 320, 450] | ||
|
||
sample_vols = [80, 50, 120, 80, 50, 80, 50, 80, 50, 120, 80, 50] | ||
|
||
concs_init = [1, 1, 10, 10, 10, 100, 100, 1000, 1000, 1000, 10000, 10000] | ||
dil_formulae = { | ||
conc: {'diluent_vol': diluent_vol, | ||
|
@@ -82,14 +91,15 @@ def run(ctx): | |
dilution_concs.append(new_concs) | ||
|
||
# transfer dilution buffer | ||
p1000.pick_up_tip() | ||
|
||
for sample_index, (row, concs) in enumerate( | ||
zip(dil_dests, dilution_concs)): | ||
volumes = [dil_formulae[conc]['diluent_vol'] | ||
for c_list in concs for conc in c_list] | ||
dests = [row[dil_formulae[conc]['col_index']] | ||
for c_list in concs for conc in c_list] | ||
for volume, dest in zip(volumes, dests): | ||
p1000.pick_up_tip() | ||
buffer_height += volume / (math.pi * (13.5 ** 2)) | ||
if buffer_height > 75: | ||
source = dilution_buffer.bottom(3) | ||
|
@@ -101,7 +111,7 @@ def run(ctx): | |
dest.top(-20), | ||
new_tip='never') | ||
p1000.blow_out(dest.top()) | ||
p1000.drop_tip() | ||
p1000.drop_tip() | ||
|
||
# transfer samples | ||
for sample_index, (row, concs) in enumerate( | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters