-
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.
Merge pull request #5014 from Opentrons/019968
019968
- Loading branch information
Showing
8 changed files
with
1,749 additions
and
4 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
Large diffs are not rendered by default.
Oops, something went wrong.
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 |
---|---|---|
@@ -0,0 +1,32 @@ | ||
{ | ||
"author": "Opentrons", | ||
"categories": { | ||
"Broad Category": [ | ||
"Specific Category" | ||
] | ||
}, | ||
"deck-setup": "", | ||
"description": "This protocol does stuff!", | ||
"internal": "019968", | ||
"labware": "\nWaters 48 Tube Rack with ThermoFisher 0.3 mL #700011047\nOpentrons 24 Well Aluminum Block with Generic 2 mL Screwcap\nOpentrons 96 Tip Rack 300 \u00b5L\nOpentrons 96 Tip Rack 1000 \u00b5L\nOpentrons 10 Tube Rack with Falcon 4x50 mL, 6x15 mL Conical\n", | ||
"markdown": { | ||
"author": "[Opentrons](https://opentrons.com/)\n\n\n", | ||
"categories": "* Broad Category\n\t* Specific Category\n\n\n", | ||
"deck-setup": "![deck](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/019968/deck.png)\n\n\n", | ||
"description": "This protocol does stuff!\n\n\n", | ||
"internal": "019968\n", | ||
"labware": "* Waters 48 Tube Rack with ThermoFisher 0.3 mL #700011047\n* [Opentrons 24 Well Aluminum Block with Generic 2 mL Screwcap](https://shop.opentrons.com/collections/hardware-modules/products/aluminum-block-set)\n* [Opentrons 96 Tip Rack 300 \u00b5L](https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-300ul-tips)\n* [Opentrons 96 Tip Rack 1000 \u00b5L](https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-1000ul-tips)\n* [Opentrons 10 Tube Rack with Falcon 4x50 mL, 6x15 mL Conical](https://shop.opentrons.com/collections/opentrons-tips/products/tube-rack-set-1)\n\n\n", | ||
"notes": "If you have any questions about this protocol, please contact the Protocol Development Team by filling out the [Troubleshooting Survey](https://protocol-troubleshooting.paperform.co/).\n\n\n", | ||
"pipettes": "* [Opentrons P300 Single Channel Electronic Pipette (GEN2)](https://shop.opentrons.com/single-channel-electronic-pipette-p20/)\n* [Opentrons P1000 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", | ||
"protocol-steps": "1. Step 1...\n\n\n", | ||
"reagent-setup": "![reagents](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/019968/reagents.png)\n\n\n", | ||
"title": "Methanol Dilution for LCMS Analysis" | ||
}, | ||
"notes": "If you have any questions about this protocol, please contact the Protocol Development Team by filling out the Troubleshooting Survey.", | ||
"pipettes": "\nOpentrons P300 Single Channel Electronic Pipette (GEN2)\nOpentrons P1000 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", | ||
"protocol-steps": "\nStep 1...\n", | ||
"reagent-setup": "", | ||
"title": "Methanol Dilution for LCMS Analysis" | ||
} |
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 |
---|---|---|
@@ -0,0 +1,20 @@ | ||
{ | ||
"files": { | ||
"OT 1 protocol": [], | ||
"OT 2 protocol": [ | ||
"019968.ot2.apiv2.py" | ||
], | ||
"description": [ | ||
"README.md" | ||
] | ||
}, | ||
"flags": { | ||
"embedded-app": false, | ||
"feature": false, | ||
"hide-from-search": false, | ||
"skip-tests": false | ||
}, | ||
"path": "protocols/019968", | ||
"slug": "019968", | ||
"status": "ok" | ||
} |
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 |
---|---|---|
@@ -0,0 +1,216 @@ | ||
# flake8: noqa | ||
|
||
import math | ||
|
||
metadata = { | ||
'protocolName': 'Methanol Dilution for LCMS Analysis', | ||
'author': 'Rami Farawi <[email protected]>', | ||
'source': 'Custom Protocol Request', | ||
'apiLevel': '2.13' | ||
} | ||
|
||
|
||
def run(ctx): | ||
|
||
[num_samp, include_pause, single_dilution, | ||
init_vol_meth, init_vol_standard, | ||
p300_mount, p1000_mount] = get_values( # noqa: F821 | ||
"num_samp", "include_pause", "single_dilution", | ||
"init_vol_meth", "init_vol_standard", "p300_mount", "p1000_mount") | ||
|
||
# num_samp = 30 | ||
# p300_mount = 'left' | ||
# p1000_mount = 'right' | ||
# init_vol_standard = 13 | ||
# init_vol_meth = 45 | ||
# include_pause = True | ||
# single_dilution = False | ||
|
||
# labware | ||
if single_dilution: | ||
waters_racks = [ | ||
ctx.load_labware('waters_48_tuberack_300ul', # change this | ||
slot) for slot in [1, 2]] | ||
|
||
aluminum_racks = [ | ||
ctx.load_labware('opentrons_24_aluminumblock_generic_2ml_screwcap', | ||
slot) for slot in [4, 5, 7, 8]] | ||
|
||
tuberack = ctx.load_labware('opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical', 11) | ||
|
||
tip300 = [ctx.load_labware('opentrons_96_tiprack_300ul', slot) | ||
for slot in [3, 6]] | ||
tip1000 = [ctx.load_labware('opentrons_96_tiprack_1000ul', slot) | ||
for slot in [9]] | ||
|
||
else: | ||
waters_racks = [ | ||
ctx.load_labware('opentrons_24_aluminumblock_generic_2ml_screwcap', | ||
slot) for slot in [1, 2]] | ||
|
||
aluminum_racks = [ | ||
ctx.load_labware('opentrons_24_aluminumblock_generic_2ml_screwcap', | ||
slot) for slot in [4, 5, 7, 8]] | ||
|
||
tuberack = ctx.load_labware('opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical', 11) | ||
|
||
tip300 = [ctx.load_labware('opentrons_96_tiprack_300ul', slot) | ||
for slot in [3, 6]] | ||
tip1000 = [ctx.load_labware('opentrons_96_tiprack_1000ul', slot) | ||
for slot in [9]] | ||
|
||
# pipettes | ||
p300 = ctx.load_instrument('p300_single_gen2', p300_mount, | ||
tip_racks=tip300) | ||
p1000 = ctx.load_instrument('p1000_single_gen2', p1000_mount, | ||
tip_racks=tip1000) | ||
|
||
# liquid height tracking | ||
v_naught_standard = init_vol_standard*1000 | ||
v_naught_meth = init_vol_meth*1000 | ||
|
||
radius_standard = tuberack.rows()[0][0].diameter/2 | ||
radius_meth = tuberack.rows()[0][2].diameter/2 | ||
|
||
h_naught_standard = 0.85*v_naught_standard/(math.pi*radius_standard**2) | ||
h_naught_meth = 0.85*v_naught_meth/(math.pi*radius_meth**2) | ||
|
||
h_standard = h_naught_standard | ||
h_meth = h_naught_meth | ||
|
||
def adjust_height(vol, standard_or_meth): | ||
nonlocal h_standard | ||
nonlocal h_meth | ||
|
||
if standard_or_meth == 'standard': | ||
radius = radius_standard | ||
elif standard_or_meth == 'meth': | ||
radius = radius_meth | ||
|
||
dh = (vol/(math.pi*radius**2))*1.33 | ||
if standard_or_meth == 'standard': | ||
h_standard -= dh | ||
elif standard_or_meth == 'meth': | ||
h_meth -= dh | ||
|
||
if h_standard < 12: | ||
h_standard = 1 | ||
if h_meth < 12: | ||
h_meth = 1 | ||
|
||
# mapping | ||
methanol = tuberack['A3'] | ||
standard = tuberack['A1'] | ||
empty_sample_tubes = [tube | ||
for rack in aluminum_racks[:2] | ||
for row in rack.rows() for tube in row][:num_samp] | ||
sample_tubes = [tube | ||
for rack in aluminum_racks[2:] | ||
for row in rack.rows() for tube in row][:num_samp] | ||
|
||
final_tubes = [tube | ||
for rack in waters_racks | ||
for row in rack.rows() for tube in row][:num_samp] | ||
|
||
# protocol | ||
if single_dilution: | ||
ctx.comment('\n---------------ADDING METHANOL----------------\n\n') | ||
p1000.pick_up_tip() | ||
p1000.mix(1, 900, methanol.bottom(z=h_meth-5)) | ||
for tube in empty_sample_tubes: | ||
p1000.aspirate(750, methanol.bottom(z=h_meth)) | ||
p1000.dispense(750, tube.bottom(z=10)) | ||
p1000.move_to(tube.top(z=-3)) | ||
ctx.delay(seconds=2.5) | ||
p1000.blow_out() | ||
adjust_height(750, 'meth') | ||
p1000.drop_tip() | ||
ctx.comment('\n\n') | ||
|
||
ctx.comment('\n---------------ADDING STANDARD----------------\n\n') | ||
p300.pick_up_tip() | ||
p300.mix(1, 250, standard.bottom(z=h_standard-5)) | ||
for tube in empty_sample_tubes: | ||
p300.aspirate(150, standard.bottom(z=h_standard)) | ||
p300.dispense(150, tube.top()) | ||
ctx.delay(seconds=2.5) | ||
p300.blow_out() | ||
adjust_height(150, 'standard') | ||
p300.drop_tip() | ||
ctx.comment('\n\n') | ||
|
||
ctx.comment('\n---------------ADDING SAMPLE----------------\n\n') | ||
for s, d in zip(sample_tubes, empty_sample_tubes): | ||
p300.pick_up_tip() | ||
p300.aspirate(100, s) | ||
p300.dispense(100, d) | ||
p300.drop_tip() | ||
|
||
if include_pause: | ||
ctx.pause("Please cap tubes, then select Resume in the app.") | ||
|
||
ctx.comment('\n---------------ADDING SAMPLE----------------\n\n') | ||
for s, d in zip(empty_sample_tubes, final_tubes): | ||
p300.pick_up_tip() | ||
p300.mix(2, 250, s) | ||
p300.aspirate(200, s) | ||
p300.dispense(200, d) | ||
p300.drop_tip() | ||
|
||
else: | ||
ctx.comment('\n---------------ADDING METHANOL----------------\n\n') | ||
p1000.pick_up_tip() | ||
p1000.mix(1, 900, methanol.bottom(z=h_meth-5)) | ||
for tube in empty_sample_tubes: | ||
p1000.aspirate(900, methanol.bottom(z=h_meth)) | ||
p1000.dispense(900, tube.bottom(z=10)) | ||
p1000.move_to(tube.top(z=-3)) | ||
ctx.delay(seconds=2.5) | ||
p1000.blow_out() | ||
adjust_height(900, 'meth') | ||
p1000.drop_tip() | ||
ctx.comment('\n\n') | ||
|
||
ctx.comment('\n---------------ADDING SAMPLE----------------\n\n') | ||
for s, d in zip(sample_tubes, empty_sample_tubes): | ||
p300.pick_up_tip() | ||
p300.aspirate(100, s) | ||
p300.dispense(100, d) | ||
p300.mix(3, 200, d) | ||
p300.drop_tip() | ||
|
||
if include_pause: | ||
ctx.pause("Please cap tubes, then select Resume in the app.") | ||
|
||
ctx.comment('\n---------------ADDING METHANOL----------------\n\n') | ||
p1000.pick_up_tip() | ||
p1000.mix(1, 900, methanol.bottom(z=h_meth-5)) | ||
for tube in final_tubes: | ||
p1000.aspirate(750, methanol.bottom(z=h_meth)) | ||
p1000.dispense(750, tube.bottom(z=10)) | ||
p1000.move_to(tube.top(z=-3)) | ||
ctx.delay(seconds=2.5) | ||
p1000.blow_out() | ||
adjust_height(750, 'meth') | ||
p1000.drop_tip() | ||
ctx.comment('\n\n') | ||
|
||
ctx.comment('\n---------------ADDING STANDARD----------------\n\n') | ||
p300.pick_up_tip() | ||
p300.mix(1, 250, standard.bottom(z=h_standard-5)) | ||
for tube in final_tubes: | ||
p300.aspirate(150, standard.bottom(z=h_standard)) | ||
p300.dispense(150, tube.top()) | ||
ctx.delay(seconds=2.5) | ||
p300.blow_out() | ||
adjust_height(150, 'standard') | ||
p300.drop_tip() | ||
ctx.comment('\n\n') | ||
|
||
ctx.comment('\n---------------ADDING SAMPLE----------------\n\n') | ||
for s, d in zip(empty_sample_tubes, final_tubes): | ||
p300.pick_up_tip() | ||
p300.mix(2, 250, s) | ||
p300.aspirate(100, s) | ||
p300.dispense(100, d) | ||
p300.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 |
---|---|---|
@@ -0,0 +1,52 @@ | ||
# Methanol Dilution for LCMS Analysis | ||
|
||
|
||
### Author | ||
[Opentrons](https://opentrons.com/) | ||
|
||
|
||
## Categories | ||
* Sample Prep | ||
* Plate Filling | ||
|
||
|
||
## Description | ||
This protocol either perfors single, or double dilution of sample with methanol and standard for LCMS analysis. For more details, please see below. | ||
|
||
|
||
### Labware | ||
* Waters 48 Tube Rack with ThermoFisher 0.3 mL #700011047 | ||
* [Opentrons 24 Well Aluminum Block with Generic 2 mL Screwcap](https://shop.opentrons.com/collections/hardware-modules/products/aluminum-block-set) | ||
* [Opentrons 96 Tip Rack 300 µL](https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-300ul-tips) | ||
* [Opentrons 96 Tip Rack 1000 µL](https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-1000ul-tips) | ||
* [Opentrons 10 Tube Rack with Falcon 4x50 mL, 6x15 mL Conical](https://shop.opentrons.com/collections/opentrons-tips/products/tube-rack-set-1) | ||
|
||
|
||
### Pipettes | ||
* [Opentrons P300 Single Channel Electronic Pipette (GEN2)](https://shop.opentrons.com/single-channel-electronic-pipette-p20/) | ||
* [Opentrons P1000 Single Channel Electronic Pipette (GEN2)](https://shop.opentrons.com/single-channel-electronic-pipette-p20/) | ||
|
||
|
||
### Deck Setup | ||
|
||
* This is the single dilution deck setup. For the double dilution workflow, replace the waters 48 racks on slots 1 and 2 with Opentrons 24 tuberack aluminum as seen in slots 4 and 5. | ||
![deck](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/019968/deck.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. | ||
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 | ||
019968 |
Oops, something went wrong.