diff --git a/protocols/bms-illumina-dna-prep/README.md b/protocols/bms-illumina-dna-prep/README.md new file mode 100644 index 000000000..fd25fc40d --- /dev/null +++ b/protocols/bms-illumina-dna-prep/README.md @@ -0,0 +1,115 @@ +# Illumina DNA Prep - BMS +### Author +[Opentrons](https://opentrons.com/) + +### Partner +[Illumina](https://www.illumina.com/) + +## Categories +* NGS Library Prep + * Illumina DNA Prep + +## Description +This protocol automates the [Illumina DNA prep protocol](https://support.illumina.com/content/dam/illumina-support/documents/documentation/chemistry_documentation/illumina_prep/illumina-dna-prep-reference-guide-1000000025416-09.pdf). Illumina DNA prep offers a fast, integrated workflow for a wide range of applications, from human whole-genome sequencing to amplicons, plasmids, and microbial species + +The protocol allows you to set the number of samples to 8, 16 or 24 (i.e. 8 samples per column, up to 3 columns). Samples are prepared in the wells by column (8 samples column 1, 16 samples columns 1 and 2, 24 samples columns 1, 2, and 3). See the [Illumina DNA Prep protocol](https://support.illumina.com/content/dam/illumina-support/documents/documentation/chemistry_documentation/illumina_prep/illumina-dna-prep-reference-guide-1000000025416-09.pdf) for more information about sample input requirements. + +Samples will end in columns 10 (for 8 samples), columns 10 and 11 (for 16 samples), and columns 10, 11, 12 (for 24 samples). + +The user can choose which steps of the protocol they want to run, or skip - see explanation of parameters below. + +**Plate Moving** +The Protocol requires manually transferring the sample plate between the Thermocycler and Magnet 3 times. It starts on the Thermocycler and needs to be moved to the Magnet for the post-Tagmentation washes, and then moved to the Thermocycler for PCR and then back to the Magnet for the post-PCR cleanup. In the script the two positions are handled as sample_plate_mag and sample_plate_thermo; during calibration use an empty plate of the same labware as the sample plate on the magnet position to allow calibration. + +Explanation of parameters below: +* `Number of samples`: 8 (column 1), 16 (column 1, 3), or 24 (column 1, 3, 5) samples (see above). +* `Do a dry run?`: Sets the `Use modules?` parameter to `No` (see below). Tips will be returned, incubation steps skipped, and mixes shortened. This parameter is for testing purposes. +* `Use modules?`: Runs the protocol without module steps (e.g. thermocycle steps such as incubation and PCR cycles, or the steps using the magbetic module). Will be automatically set to `Yes` if the `Do a dry run?` parameter is set to `Yes` +* `Tip reuse?`: Reuses tips for washing steps so that no tip refill is neccesary during the run. Recommended only for a 24x samples run. +* `Use tip offsets?`: Whether to use specific offsets for each tip type +* `Include tagmentation step in protocol run?`: Run the tagmentation step or skip it. +* `Run tagmentation incubation on the deck thermocycler?`: Run the tagmentation incubation step on the deck thermocycler or on an off-deck external thermocycler. +* `Run TSB step?`: Run the TSB/adapter ligation step or not +* `Run TSB incubation step on the deck thermocycler`: Whether to do the incubation on the on-deck thermocycler or off-deck on an external thermocycler +* `Run tagmentation wash with TWB step`: Run the bead washing steps with TWB +* `Run PCR cycle step`: Whether to run the PCR amplification step +* `Run PCR step on deck thermocycler?`: Run the PCR amplification on the on-deck thermocycler or on an external thermocycler +* `Run post PCR cleanup step`: Run or skip the post-PCR bead cleanup using AMPure beads +--- + +### Modules +* [Temperature Module (GEN2)](https://shop.opentrons.com/collections/hardware-modules/products/tempdeck) +* [Magnetic Module (GEN2)](https://shop.opentrons.com/collections/hardware-modules/products/magdeck) +* [Thermocycler Module](https://shop.opentrons.com/collections/hardware-modules/products/thermocycler-module) + +### Labware +* [Nest 96 well plate full skirt 100 µL](https://shop.opentrons.com/nest-0-1-ml-96-well-pcr-plate-full-skirt/) +* [Opentrons Tough 0.2 mL 96-Well PCR Plate, Full Skirt](https://shop.opentrons.com/tough-0.2-ml-96-well-pcr-plate-full-skirt/) +* [NEST 12-Well Reservoirs, 15 mL](https://shop.opentrons.com/nest-12-well-reservoirs-15-ml/) +* [Opentrons aluminum block set](https://shop.opentrons.com/aluminum-block-set/) + +### Pipettes +* [P300 multi-Channel (GEN2)](https://shop.opentrons.com/8-channel-electronic-pipette/) +* [P20 multi-Channel (GEN2)](https://shop.opentrons.com/8-channel-electronic-pipette/) + +**Tips** +* [Opentrons 20 µL filter tiprack](https://shop.opentrons.com/opentrons-20ul-filter-tips/) +* [Opentrons 200 µL filter tiprack](https://shop.opentrons.com/opentrons-200ul-filter-tips/) + +### Reagents +* [Illumina DNA Prep](https://www.illumina.com/products/by-type/sequencing-kits/library-prep-kits/nextera-dna-flex.html) + +--- + +### Deck Setup +![deck layout](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/bms-illumina/deck.png) + +Inital slot layout: +1. Magnetic module for the sample plate (Nest 96 well plate full skirt). +2. Reservoir: NEST 12-well reservoir 15 mL. This is substituted for a NEST 2 mL deep well plate if tip-reuse is on in order to minimize cross-contamination. See Reagent Setup section for information about the location of the reagents +3. Reagent plate 2: Temperature module with Bio-rad 200 µL plate on aluminum block. See Reagent Setup section for information about the location of the reagents +4. 20 µL filter tiprack +5. 200 µL filter tiprack +6. 200 µL filter tiprack +7. Sample plate on Thermocycler module with NEST 96 well plate full skirt 100 µL +8. Empty +9. 200 µL filter tiprack +10. Sample plate on Thermocycler module with NEST 96 well plate full (thermocycler uses two slots) +11. Empty + +### Reagent Setup +* Reservoir, slot 2: +![Reagent plate 1](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/bms-illumina/res_pic.png) +* Reagent plate on temperature module, slot 3: +![Reagent plate 2](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/sci-illumina-dna-prep/v3/reagent_plate2.jpg) + +--- + +### Protocol Steps +1. Prepare the thermocycler by setting the block temperature to 4 degrees, and the lid to 100 degrees. +2. Add tagmentation mix to the samples +3. User seals the plate and the protocol incubates the samples with the mix in the thermocycler, 55 degrees for 15 minutes. +4. The thermocycler opens, and the user removes the seal. +5. Add Tagmentation Stop Buffer to the samples. +6. Seal and incubate the mix at 37 degrees for 15 minutes. +7. User removes seal; remove the supernatant and wash the beads three times with Tagmentation Wash Buffer. +8. Amplification of DNA: Addition of PCR mix and addition of barcodes. +9. The protocol runs PCR protocol for 5 cycles. This takes 25 minutes to complete. The supernatant is transferred to columns 7, 9 and 11 depending on how many sample columns there are. +10. Post-PCR cleanup using AMPure beads. +11. The protocol performs two ethanol washes. +12. RSB (resuspension buffer) is added to the bead wells and the supernatant is transferred to the output columns (8, 10, and 12). + +### 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 +bms-illumina-dna-prep diff --git a/protocols/bms-illumina-dna-prep/fields.json b/protocols/bms-illumina-dna-prep/fields.json new file mode 100644 index 000000000..bcf994580 --- /dev/null +++ b/protocols/bms-illumina-dna-prep/fields.json @@ -0,0 +1,120 @@ +[ + { + "type": "dropDown", + "label": "Number of samples", + "name": "SAMPLES", + "options": [ + {"label": "24 samples", "value": "24x"}, + {"label": "16 samples", "value": "16x"}, + {"label": "8 samples", "value": "8x"} + ] + }, + { + "type": "dropDown", + "label": "Do a dry run?", + "name": "DRYRUN", + "options": [ + {"label": "No", "value": "NO"}, + {"label": "Yes", "value": "YES"} + ] + }, + { + "type": "dropDown", + "label": "Use modules?", + "name": "NOMODULES", + "options": [ + {"label": "Yes", "value": "NO"}, + {"label": "No", "value": "YES"} + ] + }, + { + "type": "dropDown", + "label": "Tip reuse?", + "name": "TIPREUSE", + "options": [ + { "label": "No", "value": "NO"}, + {"label": "Yes", "value": "YES"} + ] + }, + { + "type": "dropDown", + "label": "Offset?", + "name": "OFFSET", + "options": [ + { "label": "Yes", "value": "YES"}, + { "label": "No", "value": "NO"} + ] + }, + { + "type": "dropDown", + "label": "Include tagmentation step in protocol run?", + "name": "STEP_TAG", + "options": [ + { "label": "Include", "value": 1}, + { "label": "Skip", "value": 0} + ] + }, + { + "type": "dropDown", + "label": "Run tagmentation incubation on the deck thermocycler?", + "name": "STEP_TAGDECK", + "options": [ + { "label": "Yes", "value": 1}, + { "label": "No", "value": 0} + ] + }, + { + "type": "dropDown", + "label": "Run TSB step?", + "name": "STEP_TSB", + "options": [ + { "label": "Include", "value": 1}, + { "label": "Skip", "value": 0} + ] + }, + { + "type": "dropDown", + "label": "Run TSB incubation step on the deck thermocycler", + "name": "STEP_TSBDECK", + "options": [ + { "label": "Yes", "value": 1}, + { "label": "No", "value": 0} + ] + }, + { + "type": "dropDown", + "label": "Run tagmentation wash with TWB step", + "name": "STEP_WASH", + "options": [ + { "label": "Include", "value": 1}, + { "label": "Skip", "value": 0} + ] + }, + { + "type": "dropDown", + "label": "Run PCR cycle step", + "name": "STEP_PCR", + "options": [ + { "label": "Include", "value": 1}, + { "label": "Skip", "value": 0} + ] + }, + { + "type": "dropDown", + "label": "Run PCR step on deck thermocycler?", + "name": "STEP_PCRDECK", + "options": [ + { "label": "Yes", "value": 1}, + { "label": "No", "value": 0} + ] + }, + { + "type": "dropDown", + "label": "Run post PCR cleanup step", + "name": "STEP_POSTPCR", + "options": [ + { "label": "Include", "value": 1}, + { "label": "Skip", "value": 0} + ] + } +] diff --git a/protocols/bms-illumina-dna-prep/labware/armadillo_96_aluminumblock_200ul.json b/protocols/bms-illumina-dna-prep/labware/armadillo_96_aluminumblock_200ul.json new file mode 100644 index 000000000..410274c06 --- /dev/null +++ b/protocols/bms-illumina-dna-prep/labware/armadillo_96_aluminumblock_200ul.json @@ -0,0 +1,1128 @@ +{ + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ] + ], + "brand": { + "brand": "armadillo", + "brandId": [ + "12434" + ] + }, + "metadata": { + "displayName": "Armadillo 96 Aluminum Block 200 µL", + "displayCategory": "aluminumBlock", + "displayVolumeUnits": "µL", + "tags": [] + }, + "dimensions": { + "xDimension": 127.75, + "yDimension": 85.5, + "zDimension": 18.81 + }, + "wells": { + "A1": { + "depth": 14.95, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.5, + "x": 14.38, + "y": 74.25, + "z": 3.86 + }, + "B1": { + "depth": 14.95, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.5, + "x": 14.38, + "y": 65.25, + "z": 3.86 + }, + "C1": { + "depth": 14.95, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.5, + "x": 14.38, + "y": 56.25, + "z": 3.86 + }, + "D1": { + "depth": 14.95, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.5, + "x": 14.38, + "y": 47.25, + "z": 3.86 + }, + "E1": { + "depth": 14.95, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.5, + "x": 14.38, + "y": 38.25, + "z": 3.86 + }, + "F1": { + "depth": 14.95, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.5, + "x": 14.38, + "y": 29.25, + "z": 3.86 + }, + "G1": { + "depth": 14.95, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.5, + "x": 14.38, + "y": 20.25, + "z": 3.86 + }, + "H1": { + "depth": 14.95, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.5, + "x": 14.38, + "y": 11.25, + "z": 3.86 + }, + "A2": { + "depth": 14.95, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.5, + "x": 23.38, + "y": 74.25, + "z": 3.86 + }, + "B2": { + "depth": 14.95, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.5, + "x": 23.38, + "y": 65.25, + "z": 3.86 + }, + "C2": { + "depth": 14.95, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.5, + "x": 23.38, + "y": 56.25, + "z": 3.86 + }, + "D2": { + "depth": 14.95, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.5, + "x": 23.38, + "y": 47.25, + "z": 3.86 + }, + "E2": { + "depth": 14.95, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.5, + "x": 23.38, + "y": 38.25, + "z": 3.86 + }, + "F2": { + "depth": 14.95, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.5, + "x": 23.38, + "y": 29.25, + "z": 3.86 + }, + "G2": { + "depth": 14.95, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.5, + "x": 23.38, + "y": 20.25, + "z": 3.86 + }, + "H2": { + "depth": 14.95, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.5, + "x": 23.38, + "y": 11.25, + "z": 3.86 + }, + "A3": { + "depth": 14.95, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.5, + "x": 32.38, + "y": 74.25, + "z": 3.86 + }, + "B3": { + "depth": 14.95, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.5, + "x": 32.38, + "y": 65.25, + "z": 3.86 + }, + "C3": { + "depth": 14.95, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.5, + "x": 32.38, + "y": 56.25, + "z": 3.86 + }, + "D3": { + "depth": 14.95, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.5, + "x": 32.38, + "y": 47.25, + "z": 3.86 + }, + "E3": { + "depth": 14.95, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.5, + "x": 32.38, + "y": 38.25, + "z": 3.86 + }, + "F3": { + "depth": 14.95, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.5, + "x": 32.38, + "y": 29.25, + "z": 3.86 + }, + "G3": { + "depth": 14.95, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.5, + "x": 32.38, + "y": 20.25, + "z": 3.86 + }, + "H3": { + "depth": 14.95, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.5, + "x": 32.38, + "y": 11.25, + "z": 3.86 + }, + "A4": { + "depth": 14.95, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.5, + "x": 41.38, + "y": 74.25, + "z": 3.86 + }, + "B4": { + "depth": 14.95, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.5, + "x": 41.38, + "y": 65.25, + "z": 3.86 + }, + "C4": { + "depth": 14.95, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.5, + "x": 41.38, + "y": 56.25, + "z": 3.86 + }, + "D4": { + "depth": 14.95, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.5, + "x": 41.38, + "y": 47.25, + "z": 3.86 + }, + "E4": { + "depth": 14.95, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.5, + "x": 41.38, + "y": 38.25, + "z": 3.86 + }, + "F4": { + "depth": 14.95, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.5, + "x": 41.38, + "y": 29.25, + "z": 3.86 + }, + "G4": { + "depth": 14.95, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.5, + "x": 41.38, + "y": 20.25, + "z": 3.86 + }, + "H4": { + "depth": 14.95, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.5, + "x": 41.38, + "y": 11.25, + "z": 3.86 + }, + "A5": { + "depth": 14.95, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.5, + "x": 50.38, + "y": 74.25, + "z": 3.86 + }, + "B5": { + "depth": 14.95, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.5, + "x": 50.38, + "y": 65.25, + "z": 3.86 + }, + "C5": { + "depth": 14.95, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.5, + "x": 50.38, + "y": 56.25, + "z": 3.86 + }, + "D5": { + "depth": 14.95, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.5, + "x": 50.38, + "y": 47.25, + "z": 3.86 + }, + "E5": { + "depth": 14.95, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.5, + "x": 50.38, + "y": 38.25, + "z": 3.86 + }, + "F5": { + "depth": 14.95, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.5, + "x": 50.38, + "y": 29.25, + "z": 3.86 + }, + "G5": { + "depth": 14.95, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.5, + "x": 50.38, + "y": 20.25, + "z": 3.86 + }, + "H5": { + "depth": 14.95, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.5, + "x": 50.38, + "y": 11.25, + "z": 3.86 + }, + "A6": { + "depth": 14.95, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.5, + "x": 59.38, + "y": 74.25, + "z": 3.86 + }, + "B6": { + "depth": 14.95, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.5, + "x": 59.38, + "y": 65.25, + "z": 3.86 + }, + "C6": { + "depth": 14.95, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.5, + "x": 59.38, + "y": 56.25, + "z": 3.86 + }, + "D6": { + "depth": 14.95, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.5, + "x": 59.38, + "y": 47.25, + "z": 3.86 + }, + "E6": { + "depth": 14.95, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.5, + "x": 59.38, + "y": 38.25, + "z": 3.86 + }, + "F6": { + "depth": 14.95, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.5, + "x": 59.38, + "y": 29.25, + "z": 3.86 + }, + "G6": { + "depth": 14.95, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.5, + "x": 59.38, + "y": 20.25, + "z": 3.86 + }, + "H6": { + "depth": 14.95, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.5, + "x": 59.38, + "y": 11.25, + "z": 3.86 + }, + "A7": { + "depth": 14.95, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.5, + "x": 68.38, + "y": 74.25, + "z": 3.86 + }, + "B7": { + "depth": 14.95, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.5, + "x": 68.38, + "y": 65.25, + "z": 3.86 + }, + "C7": { + "depth": 14.95, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.5, + "x": 68.38, + "y": 56.25, + "z": 3.86 + }, + "D7": { + "depth": 14.95, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.5, + "x": 68.38, + "y": 47.25, + "z": 3.86 + }, + "E7": { + "depth": 14.95, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.5, + "x": 68.38, + "y": 38.25, + "z": 3.86 + }, + "F7": { + "depth": 14.95, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.5, + "x": 68.38, + "y": 29.25, + "z": 3.86 + }, + "G7": { + "depth": 14.95, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.5, + "x": 68.38, + "y": 20.25, + "z": 3.86 + }, + "H7": { + "depth": 14.95, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.5, + "x": 68.38, + "y": 11.25, + "z": 3.86 + }, + "A8": { + "depth": 14.95, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.5, + "x": 77.38, + "y": 74.25, + "z": 3.86 + }, + "B8": { + "depth": 14.95, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.5, + "x": 77.38, + "y": 65.25, + "z": 3.86 + }, + "C8": { + "depth": 14.95, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.5, + "x": 77.38, + "y": 56.25, + "z": 3.86 + }, + "D8": { + "depth": 14.95, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.5, + "x": 77.38, + "y": 47.25, + "z": 3.86 + }, + "E8": { + "depth": 14.95, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.5, + "x": 77.38, + "y": 38.25, + "z": 3.86 + }, + "F8": { + "depth": 14.95, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.5, + "x": 77.38, + "y": 29.25, + "z": 3.86 + }, + "G8": { + "depth": 14.95, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.5, + "x": 77.38, + "y": 20.25, + "z": 3.86 + }, + "H8": { + "depth": 14.95, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.5, + "x": 77.38, + "y": 11.25, + "z": 3.86 + }, + "A9": { + "depth": 14.95, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.5, + "x": 86.38, + "y": 74.25, + "z": 3.86 + }, + "B9": { + "depth": 14.95, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.5, + "x": 86.38, + "y": 65.25, + "z": 3.86 + }, + "C9": { + "depth": 14.95, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.5, + "x": 86.38, + "y": 56.25, + "z": 3.86 + }, + "D9": { + "depth": 14.95, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.5, + "x": 86.38, + "y": 47.25, + "z": 3.86 + }, + "E9": { + "depth": 14.95, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.5, + "x": 86.38, + "y": 38.25, + "z": 3.86 + }, + "F9": { + "depth": 14.95, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.5, + "x": 86.38, + "y": 29.25, + "z": 3.86 + }, + "G9": { + "depth": 14.95, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.5, + "x": 86.38, + "y": 20.25, + "z": 3.86 + }, + "H9": { + "depth": 14.95, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.5, + "x": 86.38, + "y": 11.25, + "z": 3.86 + }, + "A10": { + "depth": 14.95, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.5, + "x": 95.38, + "y": 74.25, + "z": 3.86 + }, + "B10": { + "depth": 14.95, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.5, + "x": 95.38, + "y": 65.25, + "z": 3.86 + }, + "C10": { + "depth": 14.95, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.5, + "x": 95.38, + "y": 56.25, + "z": 3.86 + }, + "D10": { + "depth": 14.95, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.5, + "x": 95.38, + "y": 47.25, + "z": 3.86 + }, + "E10": { + "depth": 14.95, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.5, + "x": 95.38, + "y": 38.25, + "z": 3.86 + }, + "F10": { + "depth": 14.95, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.5, + "x": 95.38, + "y": 29.25, + "z": 3.86 + }, + "G10": { + "depth": 14.95, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.5, + "x": 95.38, + "y": 20.25, + "z": 3.86 + }, + "H10": { + "depth": 14.95, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.5, + "x": 95.38, + "y": 11.25, + "z": 3.86 + }, + "A11": { + "depth": 14.95, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.5, + "x": 104.38, + "y": 74.25, + "z": 3.86 + }, + "B11": { + "depth": 14.95, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.5, + "x": 104.38, + "y": 65.25, + "z": 3.86 + }, + "C11": { + "depth": 14.95, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.5, + "x": 104.38, + "y": 56.25, + "z": 3.86 + }, + "D11": { + "depth": 14.95, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.5, + "x": 104.38, + "y": 47.25, + "z": 3.86 + }, + "E11": { + "depth": 14.95, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.5, + "x": 104.38, + "y": 38.25, + "z": 3.86 + }, + "F11": { + "depth": 14.95, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.5, + "x": 104.38, + "y": 29.25, + "z": 3.86 + }, + "G11": { + "depth": 14.95, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.5, + "x": 104.38, + "y": 20.25, + "z": 3.86 + }, + "H11": { + "depth": 14.95, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.5, + "x": 104.38, + "y": 11.25, + "z": 3.86 + }, + "A12": { + "depth": 14.95, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.5, + "x": 113.38, + "y": 74.25, + "z": 3.86 + }, + "B12": { + "depth": 14.95, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.5, + "x": 113.38, + "y": 65.25, + "z": 3.86 + }, + "C12": { + "depth": 14.95, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.5, + "x": 113.38, + "y": 56.25, + "z": 3.86 + }, + "D12": { + "depth": 14.95, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.5, + "x": 113.38, + "y": 47.25, + "z": 3.86 + }, + "E12": { + "depth": 14.95, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.5, + "x": 113.38, + "y": 38.25, + "z": 3.86 + }, + "F12": { + "depth": 14.95, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.5, + "x": 113.38, + "y": 29.25, + "z": 3.86 + }, + "G12": { + "depth": 14.95, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.5, + "x": 113.38, + "y": 20.25, + "z": 3.86 + }, + "H12": { + "depth": 14.95, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.5, + "x": 113.38, + "y": 11.25, + "z": 3.86 + } + }, + "groups": [ + { + "metadata": { + "wellBottomShape": "flat", + "displayCategory": "wellPlate" + }, + "wells": [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1", + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2", + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3", + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4", + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5", + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6", + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7", + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8", + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9", + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10", + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11", + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ] + } + ], + "parameters": { + "format": "irregular", + "quirks": [], + "isTiprack": false, + "isMagneticModuleCompatible": false, + "loadName": "armadillo_96_aluminumblock_200ul" + }, + "namespace": "custom_beta", + "version": 1, + "schemaVersion": 2, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + } +} \ No newline at end of file diff --git a/protocols/bms-illumina-dna-prep/onsite-bms-dna-prep.ot2.apiv2.py b/protocols/bms-illumina-dna-prep/onsite-bms-dna-prep.ot2.apiv2.py new file mode 100644 index 000000000..1876f9e89 --- /dev/null +++ b/protocols/bms-illumina-dna-prep/onsite-bms-dna-prep.ot2.apiv2.py @@ -0,0 +1,2121 @@ +# flake8: noqa + +from opentrons import protocol_api + +from opentrons import types + +import inspect + +metadata = { + 'protocolName': 'Illumina DNA Prep - BMS', + 'author': 'Opentrons ', + 'source': 'Protocol Library', + 'apiLevel': '2.14' +} +# I removed the right() function because it is never used +# settings +# SAMPLES = '24x' # 8x, 16x, or 24x +# YES or NO, DRYRUN = 'YES' will return tips, skip incubation times, +# shorten mix, for testing purposes +# DRYRUN = 'NO' +# YES or NO, NOMODULES = 'YES' will not require modules on the deck and will +# skip module steps, for testing purposes, if DRYRUN = 'YES', then NOMODULES +# will automatically set itself to 'NO' +# NOMODULES = 'NO' +# TIPREUSE = 'NO' +# YES or NO, Reusing tips on wash steps reduces tips needed, no tip refill +# needed, suggested only for 24x run with all steps + +# YES or NO, Sets whether to use protocol specific z offsets for each tip and +# labware or no offsets aside from defaults +# OFFSET = 'YES' + +# sections +# STEP_TAG = 1 # 1 is include, 0 is skip, steps with "DECK" are +# for reaction +# to take place with the on deck Thermocycler module +# This arrangement makes it possibly to set up and run only the first +# half, or to skips steps and resume if there is an Error. +# STEP_TAGDECK = 1 +# If non "DECK" steps are skipped, then TIPREUSE will automatically set +# itself to 'NO' in order to keep tip order correct. +# STEP_TSB = 1 +# STEP_TSBDECK = 1 +# STEP_WASH = 1 +# STEP_PCR = 1 +# STEP_PCRDECK = 1 +# STEP_POSTPCR = 1 + + +def run(protocol: protocol_api.ProtocolContext): + + global TIPREUSE + + [SAMPLES, + DRYRUN, + NOMODULES, + TIPREUSE, + OFFSET, + STEP_TAG, + STEP_TAGDECK, + STEP_TSB, + STEP_TSBDECK, + STEP_WASH, + STEP_PCR, + STEP_PCRDECK, + STEP_POSTPCR] = get_values( # noqa: F821 + "SAMPLES", + "DRYRUN", + "NOMODULES", + "TIPREUSE", + "OFFSET", + "STEP_TAG", + "STEP_TAGDECK", + "STEP_TSB", + "STEP_TSBDECK", + "STEP_WASH", + "STEP_PCR", + "STEP_PCRDECK", + "STEP_POSTPCR") + + STEPS = {STEP_TAG, STEP_TSB, STEP_WASH, STEP_PCR, STEP_POSTPCR} + simulating = False + real_temp = False + real_incubate_time = 0.01 + thermocycler_name = 'thermocycler' if simulating else 'thermocyclerModuleV2' + + if DRYRUN == 'YES': + protocol.comment("THIS IS A DRY RUN") + else: + protocol.comment("THIS IS A REACTION RUN") + NOMODULES = 'NO' + + if all(STEPS) is True: + if TIPREUSE == 'YES': + TIPREUSE = 'YES' + protocol.comment("TIP REUSING") + else: + TIPREUSE = 'NO' + protocol.comment("NO TIP REUSING") + + # labware + if NOMODULES == 'YES': + protocol.comment("THIS IS A NO MODULE RUN") + # <--- Actually an Eppendorf 96 well, same dimensions + mag_block = protocol.load_module('magnetic module gen2', '1') + # <--- Actually an Eppendorf 96 well, same dimensions + sample_plate_mag = mag_block.load_labware( + 'nest_96_wellplate_100ul_pcr_full_skirt') + if TIPREUSE == 'NO': + reservoir = protocol.load_labware('nest_12_reservoir_15ml', '2') + else: + reservoir = protocol.load_labware( + 'nest_96_wellplate_2ml_deep', '2') + + temp_block = protocol.load_module('temperature module gen2', '3') + reagent_plate = temp_block.load_labware( + 'armadillo_96_aluminumblock_200ul') + tiprack_20 = protocol.load_labware( + 'opentrons_96_filtertiprack_20ul', '4') + tiprack_200_1 = protocol.load_labware( + 'opentrons_96_filtertiprack_200ul', '5') + tiprack_200_2 = protocol.load_labware( + 'opentrons_96_filtertiprack_200ul', '6') + thermocycler = protocol.load_module(thermocycler_name) + sample_plate_thermo = thermocycler.load_labware( + 'nest_96_wellplate_100ul_pcr_full_skirt') + tiprack_200_3 = protocol.load_labware( + 'opentrons_96_filtertiprack_200ul', '9') + else: + protocol.comment("THIS IS A MODULE RUN") + mag_block = protocol.load_module('magnetic module gen2', '1') + # <--- Actually an Eppendorf 96 well, same dimensions + sample_plate_mag = mag_block.load_labware( + 'nest_96_wellplate_100ul_pcr_full_skirt') + if TIPREUSE == 'NO': + reservoir = protocol.load_labware('nest_12_reservoir_15ml', '2') + else: + reservoir = protocol.load_labware( + 'nest_96_wellplate_2ml_deep', '2') + temp_block = protocol.load_module('temperature module gen2', '3') + reagent_plate = temp_block.load_labware( + 'armadillo_96_aluminumblock_200ul') + tiprack_20 = protocol.load_labware( + 'opentrons_96_filtertiprack_20ul', '4') + tiprack_200_1 = protocol.load_labware( + 'opentrons_96_filtertiprack_200ul', '5') + tiprack_200_2 = protocol.load_labware( + 'opentrons_96_filtertiprack_200ul', '6') + thermocycler = protocol.load_module(thermocycler_name) + sample_plate_thermo = thermocycler.load_labware( + 'nest_96_wellplate_100ul_pcr_full_skirt') + tiprack_200_3 = protocol.load_labware( + 'opentrons_96_filtertiprack_200ul', '9') + + if TIPREUSE == 'YES': + protocol.comment("THIS PROTOCOL WILL REUSE TIPS FOR WASHES") + + # reagent - plate + TAG = reagent_plate.wells_by_name()['A1'] + TSB = reagent_plate.wells_by_name()['A2'] + PCR = reagent_plate.wells_by_name()['A3'] + Barcodes1 = reagent_plate.wells_by_name()['A7'] + Barcodes2 = reagent_plate.wells_by_name()['A8'] + Barcodes3 = reagent_plate.wells_by_name()['A9'] + + # offset + if TIPREUSE == 'NO': + p300_offset_Res = 2 + else: + p300_offset_Res = 3 + p300_offset_Thermo = 1 + p300_offset_Mag = 1 + # p300_offset_Deck = 0.3 + p300_offset_Temp = 0.8 + # p300_offset_Tube = 0 + # if TIPREUSE == 'NO': + # p20_offset_Res = 2 + # else: + # p20_offset_Res = 2 + p20_offset_Thermo = 1 + p20_offset_Mag = 1 + # p20_offset_Deck = 0.3 + p20_offset_Temp = 1 + # p20_offset_Tube = 0 + + # reagent - deepwell + if TIPREUSE == 'NO': + AMPure = reservoir['A1'] + water = reservoir['A2'] + EtOH_1 = reservoir['A4'] + EtOH_2 = reservoir['A4'] + EtOH_3 = reservoir['A4'] + RSB = reservoir['A6'] + TWB_1 = reservoir['A8'] + TWB_2 = reservoir['A8'] + TWB_3 = reservoir['A8'] + Liquid_trash = reservoir['A12'].bottom(p300_offset_Res) + else: + AMPure = reservoir['A1'] + EtOH_1 = reservoir['A4'] + EtOH_2 = reservoir['A3'] + EtOH_3 = reservoir['A2'] + RSB = reservoir['A6'] + TWB_1 = reservoir['A8'] + TWB_2 = reservoir['A9'] + TWB_3 = reservoir['A10'] + Liquid_trash = reservoir['A12'].bottom(p300_offset_Res) + + # pipette + if NOMODULES == 'NO': + p300 = protocol.load_instrument('p300_multi_gen2', 'left', tip_racks=[ + tiprack_200_1, tiprack_200_2, + tiprack_200_3]) + p20 = protocol.load_instrument( + 'p20_multi_gen2', 'right', tip_racks=[tiprack_20]) + else: + p300 = protocol.load_instrument('p300_multi_gen2', 'left', tip_racks=[ + tiprack_200_1, tiprack_200_2, + tiprack_200_3]) + p20 = protocol.load_instrument( + 'p20_multi_gen2', 'right', tip_racks=[tiprack_20]) + + def slow_tip_withdrawal(current_pipette, well_location, to_center=False): + + if to_center is False: + current_pipette.move_to(well_location.top(), speed=10) + + def pick_up(pip): + try: + pip.pick_up_tip() + except protocol_api.labware.OutOfTipsError: + protocol.pause(f"Replace empty tip racks for {pip}") + pip.reset_tipracks() + pip.pick_up_tip() + + # samples + # FIXME: This does not seem to be used + src_file_path = inspect.getfile(lambda: None) + protocol.comment(src_file_path) + + # tip and sample tracking + if SAMPLES == '8x': + protocol.comment("There are 8 Samples") + samplecolumns = 1 + TWB_washtip_1 = tiprack_200_1['A3'] + TWB_removetip_1 = tiprack_200_1['A4'] + W1_ETOH_washtip_1 = tiprack_200_1['A10'] + W1_ETOH_removetip_1 = tiprack_200_1['A6'] + elif SAMPLES == '16x': + protocol.comment("There are 16 Samples") + samplecolumns = 2 + TWB_washtip_1 = tiprack_200_1['A5'] + TWB_washtip_2 = tiprack_200_1['A6'] + TWB_removetip_1 = tiprack_200_1['A7'] + TWB_removetip_2 = tiprack_200_1['A8'] + W1_ETOH_washtip_1 = tiprack_200_2['A7'] + W1_ETOH_washtip_2 = tiprack_200_2['A8'] + W1_ETOH_removetip_1 = tiprack_200_2['A9'] + W1_ETOH_removetip_2 = tiprack_200_2['A10'] + elif SAMPLES == '24x': + protocol.comment("There are 24 Samples") + samplecolumns = 3 + TWB_washtip_1 = tiprack_200_1['A7'] + TWB_washtip_2 = tiprack_200_1['A8'] + TWB_washtip_3 = tiprack_200_1['A9'] + TWB_removetip_1 = tiprack_200_1['A10'] + TWB_removetip_2 = tiprack_200_1['A6'] + TWB_removetip_3 = tiprack_200_1['A12'] + W1_ETOH_washtip_1 = tiprack_200_3['A4'] + W1_ETOH_washtip_2 = tiprack_200_3['A5'] + W1_ETOH_washtip_3 = tiprack_200_3['A6'] + W1_ETOH_removetip_1 = tiprack_200_3['A7'] + W1_ETOH_removetip_2 = tiprack_200_3['A8'] + W1_ETOH_removetip_3 = tiprack_200_3['A9'] + else: + protocol.pause("ERROR?") + + # FIXME: Commented out variables are never used in the protocol + # positions + ########################################################################## + # sample_plate_thermo on the Thermocycler + # A1_p20_bead_side = sample_plate_thermo['A1'].center().move(types.Point( + # x=-1.8 * 0.50, y=0, z=p20_offset_Thermo - 5)) # Beads to the Right + # A1_p20_bead_top = sample_plate_thermo['A1'].center().move(types.Point( + # x=1.5, y=0, z=p20_offset_Thermo + 2)) # Beads to the Right + # A1_p20_bead_mid = sample_plate_thermo['A1'].center().move(types.Point( + # x=1, y=0, z=p20_offset_Thermo - 2)) # Beads to the Right + A1_p300_bead_side = sample_plate_thermo['A1'].center().move(types.Point( + x=-1, y=0, z=p300_offset_Thermo - 7.2)) # Beads to the Right + A1_p300_bead_top = sample_plate_thermo['A1'].center().move(types.Point( + x=1.30, y=0, z=p300_offset_Thermo - 1)) # Beads to the Right + A1_p300_bead_mid = sample_plate_thermo['A1'].center().move(types.Point( + x=0.80, y=0, z=p300_offset_Thermo - 4)) # Beads to the Right + A1_p300_loc1 = sample_plate_thermo['A1'].center().move(types.Point( + x=1.3 * 0.8, y=1.3 * 0.8, z=p300_offset_Thermo - 4)) + # Beads to the Right + A1_p300_loc2 = sample_plate_thermo['A1'].center().move(types.Point( + x=1.3, y=0, z=p300_offset_Thermo - 4)) # Beads to the Right + A1_p300_loc3 = sample_plate_thermo['A1'].center().move(types.Point( + x=1.3 * 0.8, y=-1.3 * 0.8, z=p300_offset_Thermo - 4)) + # Beads to the Right + # A3_p20_bead_side = sample_plate_thermo['A2'].center().move(types.Point( + # x=-1.8 * 0.50, y=0, z=p20_offset_Thermo - 5)) # Beads to the Right + # A3_p20_bead_top = sample_plate_thermo['A2'].center().move(types.Point( + # x=1.5, y=0, z=p20_offset_Thermo + 2)) # Beads to the Right + # A3_p20_bead_mid = sample_plate_thermo['A2'].center().move(types.Point( + # x=1, y=0, z=p20_offset_Thermo - 2)) # Beads to the Right + A3_p300_bead_side = sample_plate_thermo['A2'].center().move(types.Point( + x=0.50, y=0, z=p300_offset_Thermo - 7.2)) # Beads to the Right + A3_p300_bead_top = sample_plate_thermo['A2'].center().move(types.Point( + x=-1.30, y=0, z=p300_offset_Thermo - 1)) # Beads to the Right + A3_p300_bead_mid = sample_plate_thermo['A2'].center().move(types.Point( + x=-0.80, y=0, z=p300_offset_Thermo - 4)) # Beads to the Right + A3_p300_loc1 = sample_plate_thermo['A2'].center().move(types.Point( + x=-1.3 * 0.8, y=1.3 * 0.8, z=p300_offset_Thermo - 4)) + # Beads to the Right + A3_p300_loc2 = sample_plate_thermo['A2'].center().move(types.Point( + x=-1.3, y=0, z=p300_offset_Thermo - 4)) # Beads to the Right + A3_p300_loc3 = sample_plate_thermo['A2'].center().move(types.Point( + x=-1.3 * 0.8, y=-1.3 * 0.8, z=p300_offset_Thermo - 4)) + # Beads to the Right + # A5_p20_bead_side = sample_plate_thermo['A3'].center().move(types.Point( + # x=-1.8 * 0.50, y=0, z=p20_offset_Thermo - 5)) # Beads to the Right + # A5_p20_bead_top = sample_plate_thermo['A3'].center().move(types.Point( + # x=1.5, y=0, z=p20_offset_Thermo + 2)) # Beads to the Right + # A5_p20_bead_mid = sample_plate_thermo['A3'].center().move(types.Point( + # x=1, y=0, z=p20_offset_Thermo - 2)) # Beads to the Right + A5_p300_bead_side = sample_plate_thermo['A3'].center().move(types.Point( + x=-1, y=0, z=p300_offset_Thermo - 7.2)) # Beads to the Right + A5_p300_bead_top = sample_plate_thermo['A3'].center().move(types.Point( + x=1.30, y=0, z=p300_offset_Thermo - 1)) # Beads to the Right + A5_p300_bead_mid = sample_plate_thermo['A3'].center().move(types.Point( + x=0.80, y=0, z=p300_offset_Thermo - 4)) # Beads to the Right + A5_p300_loc1 = sample_plate_thermo['A3'].center().move(types.Point( + x=1.3 * 0.8, y=1.3 * 0.8, z=p300_offset_Thermo - 4)) + # Beads to the Right + A5_p300_loc2 = sample_plate_thermo['A3'].center().move(types.Point( + x=1.3, y=0, z=p300_offset_Thermo - 4)) # Beads to the Right + A5_p300_loc3 = sample_plate_thermo['A3'].center().move(types.Point( + x=1.3 * 0.8, y=-1.3 * 0.8, z=p300_offset_Thermo - 4)) + # Beads to the Right + ########################################################################## + + bypass = protocol.deck.position_for( + '11').move(types.Point(x=70, y=80, z=130)) + + # commands + if DRYRUN == 'NO': + protocol.comment("SETTING THERMO and TEMP BLOCK Temperature") + if real_temp: + thermocycler.set_block_temperature(4) + thermocycler.set_lid_temperature(100) + temp_block.set_temperature(4) +# temp_block.set_temperature(4) + thermocycler.open_lid() + + if STEP_TAG == 1: + protocol.comment('==============================================') + protocol.comment('--> TAGMENTATION') + protocol.comment('==============================================') + + protocol.comment('--> Adding Tagmentation Mix ') + if DRYRUN == 'NO': + TagVol = 20 + TagMixRep = 10 + TagMixVol = 40 + if DRYRUN == 'YES': + TagVol = 20 + TagMixRep = 1 + TagMixVol = 40 + if samplecolumns >= 1: # ---------------------------------------- + X = 'A1' + pick_up(p300) + p300.mix(3, 20, TAG.bottom(z=p300_offset_Temp), rate=0.5) + p300.aspirate(TagVol, TAG.bottom(z=p300_offset_Temp), rate=0.25) + p300.dispense(TagVol, sample_plate_thermo[X].bottom( + z=p300_offset_Thermo), rate=0.25) + p300.mix(TagMixRep, TagMixVol) + p300.move_to(sample_plate_thermo[X].top()) + protocol.delay(seconds=2) + p300.blow_out(sample_plate_thermo[X].top(z=-5)) + p300.drop_tip() if DRYRUN == 'NO' else p300.return_tip() + if samplecolumns >= 2: # ---------------------------------------- + X = 'A2' + pick_up(p300) + p300.mix(3, 20, TAG.bottom(z=p300_offset_Temp), rate=0.5) + p300.aspirate(TagVol, TAG.bottom(z=p300_offset_Temp), rate=0.25) + p300.dispense(TagVol, sample_plate_thermo[X].bottom( + z=p300_offset_Thermo), rate=0.25) + p300.mix(TagMixRep, TagMixVol) + p300.blow_out(sample_plate_thermo[X].top(z=-5)) + p300.move_to(bypass) + p300.drop_tip() if DRYRUN == 'NO' else p300.return_tip() + if samplecolumns >= 3: # ---------------------------------------- + X = 'A3' + pick_up(p300) + p300.mix(3, 20, TAG.bottom(z=p300_offset_Temp), rate=0.5) + p300.aspirate(TagVol, TAG.bottom(z=p300_offset_Temp), rate=0.25) + p300.dispense(TagVol, sample_plate_thermo[X].bottom( + z=p300_offset_Thermo), rate=0.25) + p300.mix(TagMixRep, TagMixVol) + p300.blow_out(sample_plate_thermo[X].top(z=-5)) + p300.move_to(bypass) + p300.drop_tip() if DRYRUN == 'NO' else p300.return_tip() + + if STEP_TAGDECK == 1: + if DRYRUN == 'NO': + ################################################################### + + thermocycler.close_lid() + profile_TAG = [ + {'temperature': 55, 'hold_time_minutes': 15} + ] + thermocycler.execute_profile( + steps=profile_TAG, repetitions=1, block_max_volume=50) + thermocycler.set_block_temperature(10) + ####################################################################### + thermocycler.open_lid() + else: + protocol.pause('Seal, Run ERAT (60min)') + + thermocycler.open_lid() + + if STEP_TSB == 1: + protocol.comment('==============================================') + protocol.comment('--> Adapter Ligation') + protocol.comment('==============================================') + + protocol.comment('--> Adding Tagmentation Stop Buffer') + if DRYRUN == 'NO': + if NOMODULES == 'NO': + TSBVol = 10 + TSBMixRep = 10 + TSBMixVol = 20 + else: + TSBVol = 10 + TSBMixRep = 10 + TSBMixVol = 10 + if DRYRUN == 'YES': + if NOMODULES == 'NO': + TSBVol = 10 + TSBMixRep = 1 + TSBMixVol = 20 + else: + TSBVol = 10 + TSBMixRep = 1 + TSBMixVol = 10 + if samplecolumns >= 1: # ---------------------------------------- + X = 'A1' + pick_up(p20) + p20.aspirate(TSBVol, TSB.bottom(z=p20_offset_Temp)) + p20.dispense(TSBVol, sample_plate_thermo[X].bottom( + z=p20_offset_Thermo)) + p20.mix(TSBMixRep, TSBMixVol) + p20.blow_out(sample_plate_thermo[X].top(z=-5)) + p20.drop_tip() if DRYRUN == 'NO' else p20.return_tip() + if samplecolumns >= 2: # ---------------------------------------- + X = 'A2' + p20.pick_up_tip() + p20.aspirate(TSBVol, TSB.bottom(z=p20_offset_Temp)) + p20.dispense(TSBVol, sample_plate_thermo[X].bottom( + z=p20_offset_Thermo)) + p20.mix(TSBMixRep, TSBMixVol) + p20.drop_tip() if DRYRUN == 'NO' else p20.return_tip() + if samplecolumns >= 3: # ---------------------------------------- + X = 'A3' + p20.pick_up_tip() + p20.aspirate(TSBVol, TSB.bottom(z=p20_offset_Temp)) + p20.dispense(TSBVol, sample_plate_thermo[X].bottom( + z=p20_offset_Thermo)) + p20.mix(TSBMixRep, TSBMixVol) + p20.drop_tip() if DRYRUN == 'NO' else p20.return_tip() + + if STEP_TSBDECK == 1: + if DRYRUN == 'NO': + ################################################################### + + thermocycler.close_lid() + profile_PTC = [ + {'temperature': 37, 'hold_time_minutes': 15} + ] + protocol.comment('Run PTC (15min)') + thermocycler.execute_profile( + steps=profile_PTC, repetitions=1, block_max_volume=60) + thermocycler.set_block_temperature(10) + ################################################################### + thermocycler.open_lid() + + + # FIXME: Commented out variables are never used in the protocol + # positions + ########################################################################## + # sample_plate_mag on the Mag Block + # A1_p20_bead_side = sample_plate_mag['A1'].center().move(types.Point( + # x=-1.8 * 0.50, y=0, z=p20_offset_Mag - 5)) # Beads to the Right + # A1_p20_bead_top = sample_plate_mag['A1'].center().move(types.Point( + # x=1.5, y=0, z=p20_offset_Mag + 2)) # Beads to the Right + # A1_p20_bead_mid = sample_plate_mag['A1'].center().move(types.Point( + # x=1, y=0, z=p20_offset_Mag - 2)) # Beads to the Right + A1_p300_bead_side = sample_plate_mag['A1'].center().move(types.Point( + x=-1, y=0, z=p300_offset_Mag - 7.6)) # Beads to the Right + A1_p300_bead_top = sample_plate_mag['A1'].center().move(types.Point( + x=1.30, y=0, z=p300_offset_Mag - 1)) # Beads to the Right + A1_p300_bead_mid = sample_plate_mag['A1'].center().move(types.Point( + x=0.80, y=0, z=p300_offset_Mag - 4)) # Beads to the Right + A1_p300_loc1 = sample_plate_mag['A1'].center().move(types.Point( + x=1.3 * 0.8, y=1.3 * 0.8, z=p300_offset_Mag - 4)) # Beads to the Right + A1_p300_loc2 = sample_plate_mag['A1'].center().move(types.Point( + x=1.3, y=0, z=p300_offset_Mag - 4)) # Beads to the Right + A1_p300_loc3 = sample_plate_mag['A1'].center().move(types.Point( + x=1.3 * 0.8, y=-1.3 * 0.8, z=p300_offset_Mag - 4)) + # Beads to the Right + # A3_p20_bead_side = sample_plate_mag['A2'].center().move(types.Point( + # x=-1.8 * 0.50, y=0, z=p20_offset_Mag - 5)) # Beads to the Right + # A3_p20_bead_top = sample_plate_mag['A2'].center().move(types.Point( + # x=1.5, y=0, z=p20_offset_Mag + 2)) # Beads to the Right + # A3_p20_bead_mid = sample_plate_mag['A2'].center().move(types.Point( + # x=1, y=0, z=p20_offset_Mag - 2)) # Beads to the Right + A3_p300_bead_side = sample_plate_mag['A2'].center().move(types.Point( + x=1, y=0, z=p300_offset_Mag - 7.6)) # Beads to the Right + A3_p300_bead_top = sample_plate_mag['A2'].center().move(types.Point( + x=-1.30, y=0, z=p300_offset_Mag - 1)) # Beads to the Right + A3_p300_bead_mid = sample_plate_mag['A2'].center().move(types.Point( + x=-0.80, y=0, z=p300_offset_Mag - 4)) # Beads to the Right + A3_p300_loc1 = sample_plate_mag['A2'].center().move(types.Point( + x=-1.3 * 0.8, y=1.3 * 0.8, z=p300_offset_Mag - 4)) # Beads to the Right + A3_p300_loc2 = sample_plate_mag['A2'].center().move(types.Point( + x=-1.3, y=0, z=p300_offset_Mag - 4)) # Beads to the Right + A3_p300_loc3 = sample_plate_mag['A2'].center().move(types.Point( + x=-1.3 * 0.8, y=-1.3 * 0.8, z=p300_offset_Mag - 4)) + # Beads to the Right + # A5_p20_bead_side = sample_plate_mag['A3'].center().move(types.Point( + # x=-1.8 * 0.50, y=0, z=p20_offset_Mag - 5)) # Beads to the Right + # A5_p20_bead_top = sample_plate_mag['A3'].center().move(types.Point( + # x=1.5, y=0, z=p20_offset_Mag + 2)) # Beads to the Right + # A5_p20_bead_mid = sample_plate_mag['A3'].center().move(types.Point( + # x=1, y=0, z=p20_offset_Mag - 2)) # Beads to the Right + A5_p300_bead_side = sample_plate_mag['A3'].center().move(types.Point( + x=-1, y=0, z=p300_offset_Mag - 7.6)) # Beads to the Right + A5_p300_bead_top = sample_plate_mag['A3'].center().move(types.Point( + x=1.30, y=0, z=p300_offset_Mag - 1)) # Beads to the Right + A5_p300_bead_mid = sample_plate_mag['A3'].center().move(types.Point( + x=0.80, y=0, z=p300_offset_Mag - 4)) # Beads to the Right + A5_p300_loc1 = sample_plate_mag['A3'].center().move(types.Point( + x=1.3 * 0.8, y=1.3 * 0.8, z=p300_offset_Mag - 4)) # Beads to the Right + A5_p300_loc2 = sample_plate_mag['A3'].center().move(types.Point( + x=1.3, y=0, z=p300_offset_Mag - 4)) # Beads to the Right + A5_p300_loc3 = sample_plate_mag['A3'].center().move(types.Point( + x=1.3 * 0.8, y=-1.3 * 0.8, z=p300_offset_Mag - 4)) + # Beads to the Right + # A7_p20_bead_side = sample_plate_mag['A4'].center().move(types.Point( + # x=-1.8 * 0.50, y=0, z=p20_offset_Mag - 5)) # Beads to the Right + # A7_p20_bead_top = sample_plate_mag['A4'].center().move(types.Point( + # x=1.5, y=0, z=p20_offset_Mag + 2)) # Beads to the Right + # A7_p20_bead_mid = sample_plate_mag['A4'].center().move(types.Point( + # x=1, y=0, z=p20_offset_Mag - 2)) # Beads to the Right + A7_p300_bead_side = sample_plate_mag['A4'].center().move(types.Point( + x=1, y=0, z=p300_offset_Mag - 7.6)) # Beads to the Right + A7_p300_bead_top = sample_plate_mag['A4'].center().move(types.Point( + x=-1.30, y=0, z=p300_offset_Mag - 1)) # Beads to the Right + # A7_p300_bead_mid = sample_plate_mag['A4'].center().move(types.Point( + # x=0.80, y=0, z=p300_offset_Mag - 4)) # Beads to the Right + A7_p300_loc1 = sample_plate_mag['A4'].center().move(types.Point( + x=-1.3 * 0.8, y=1.3 * 0.8, z=p300_offset_Mag - 4)) # Beads to the Right + A7_p300_loc2 = sample_plate_mag['A4'].center().move(types.Point( + x=-1.3, y=0, z=p300_offset_Mag - 4)) # Beads to the Right + A7_p300_loc3 = sample_plate_mag['A4'].center().move(types.Point( + x=-1.3 * 0.8, y=-1.3 * 0.8, z=p300_offset_Mag - 4)) + # Beads to the Right + # A9_p20_bead_side = sample_plate_mag['A5'].center().move(types.Point( + # x=-1.8 * 0.50, y=0, z=p20_offset_Mag - 5)) # Beads to the Right + # A9_p20_bead_top = sample_plate_mag['A5'].center().move(types.Point( + # x=1.5, y=0, z=p20_offset_Mag + 2)) # Beads to the Right + # A9_p20_bead_mid = sample_plate_mag['A5'].center().move(types.Point( + # x=1, y=0, z=p20_offset_Mag - 2)) # Beads to the Right + A9_p300_bead_side = sample_plate_mag['A5'].center().move(types.Point( + x=-1, y=0, z=p300_offset_Mag - 7.6)) # Beads to the Right + A9_p300_bead_top = sample_plate_mag['A5'].center().move(types.Point( + x=1.30, y=0, z=p300_offset_Mag - 1)) # Beads to the Right + # A9_p300_bead_mid = sample_plate_mag['A5'].center().move(types.Point( + # x=0.80, y=0, z=p300_offset_Mag - 4)) # Beads to the Right + A9_p300_loc1 = sample_plate_mag['A5'].center().move(types.Point( + x=1.3 * 0.8, y=1.3 * 0.8, z=p300_offset_Mag - 4)) # Beads to the Right + A9_p300_loc2 = sample_plate_mag['A5'].center().move(types.Point( + x=1.3, y=0, z=p300_offset_Mag - 4)) # Beads to the Right + A9_p300_loc3 = sample_plate_mag['A5'].center().move(types.Point( + x=1.3 * 0.8, y=-1.3 * 0.8, z=p300_offset_Mag - 4)) + # Beads to the Right + # A11_p20_bead_side = sample_plate_mag['A6'].center().move(types.Point( + # x=-1.8 * 0.50, y=0, z=p20_offset_Mag - 5)) # Beads to the Right + # A11_p20_bead_top = sample_plate_mag['A6'].center().move(types.Point( + # x=1.5, y=0, z=p20_offset_Mag + 2)) # Beads to the Right + # A11_p20_bead_mid = sample_plate_mag['A6'].center().move(types.Point( + # x=1, y=0, z=p20_offset_Mag - 2)) # Beads to the Right + A11_p300_bead_side = sample_plate_mag['A6'].center().move(types.Point( + x=1, y=0, z=p300_offset_Mag - 7.6)) # Beads to the Right + A11_p300_bead_top = sample_plate_mag['A6'].center().move(types.Point( + x=-1.30, y=0, z=p300_offset_Mag - 1)) # Beads to the Right + # A11_p300_bead_mid = sample_plate_mag['A6'].center().move(types.Point( + # x=0.80, y=0, z=p300_offset_Mag - 4)) # Beads to the Right + A11_p300_loc1 = sample_plate_mag['A6'].center().move(types.Point( + x=-1.3 * 0.8, y=1.3 * 0.8, z=p300_offset_Mag - 4)) # Beads to the Right + A11_p300_loc2 = sample_plate_mag['A6'].center().move(types.Point( + x=-1.3, y=0, z=p300_offset_Mag - 4)) # Beads to the Right + A11_p300_loc3 = sample_plate_mag['A6'].center().move(types.Point( + x=-1.3 * 0.8, y=-1.3 * 0.8, z=p300_offset_Mag - 4)) + + + + + + + # Beads to the Right + # A7_p20_bead_side = sample_plate_mag['A4'].center().move(types.Point( + # x=-1.8 * 0.50, y=0, z=p20_offset_Mag - 5)) # Beads to the Right + # A7_p20_bead_top = sample_plate_mag['A4'].center().move(types.Point( + # x=1.5, y=0, z=p20_offset_Mag + 2)) # Beads to the Right + # A7_p20_bead_mid = sample_plate_mag['A4'].center().move(types.Point( + # x=1, y=0, z=p20_offset_Mag - 2)) # Beads to the Right + XA7_p300_bead_side = sample_plate_mag['A7'].center().move(types.Point( + x=-1, y=0, z=p300_offset_Mag - 7.6)) # Beads to the Right + XA7_p300_bead_top = sample_plate_mag['A7'].center().move(types.Point( + x=1.30, y=0, z=p300_offset_Mag - 1)) # Beads to the Right + # A7_p300_bead_mid = sample_plate_mag['A7'].center().move(types.Point( + # x=0.80, y=0, z=p300_offset_Mag - 4)) # Beads to the Right + XA7_p300_loc1 = sample_plate_mag['A7'].center().move(types.Point( + x=1.3 * 0.8, y=1.3 * 0.8, z=p300_offset_Mag - 4)) # Beads to the Right + XA7_p300_loc2 = sample_plate_mag['A7'].center().move(types.Point( + x=1.3, y=0, z=p300_offset_Mag - 4)) # Beads to the Right + XA7_p300_loc3 = sample_plate_mag['A7'].center().move(types.Point( + x=1.3 * 0.8, y=-1.3 * 0.8, z=p300_offset_Mag - 4)) + # Beads to the Right + # A9_p20_bead_side = sample_plate_mag['A5'].center().move(types.Point( + # x=-1.8 * 0.50, y=0, z=p20_offset_Mag - 5)) # Beads to the Right + # A9_p20_bead_top = sample_plate_mag['A5'].center().move(types.Point( + # x=1.5, y=0, z=p20_offset_Mag + 2)) # Beads to the Right + # A9_p20_bead_mid = sample_plate_mag['A5'].center().move(types.Point( + # x=1, y=0, z=p20_offset_Mag - 2)) # Beads to the Right + XA9_p300_bead_side = sample_plate_mag['A8'].center().move(types.Point( + x=1, y=0, z=p300_offset_Mag - 7.6)) # Beads to the Right + XA9_p300_bead_top = sample_plate_mag['A8'].center().move(types.Point( + x=-1.30, y=0, z=p300_offset_Mag - 1)) # Beads to the Right + # A9_p300_bead_mid = sample_plate_mag['A8'].center().move(types.Point( + # x=0.80, y=0, z=p300_offset_Mag - 4)) # Beads to the Right + XA9_p300_loc1 = sample_plate_mag['A8'].center().move(types.Point( + x=-1.3 * 0.8, y=1.3 * 0.8, z=p300_offset_Mag - 4)) # Beads to the Right + XA9_p300_loc2 = sample_plate_mag['A8'].center().move(types.Point( + x=-1.3, y=0, z=p300_offset_Mag - 4)) # Beads to the Right + XA9_p300_loc3 = sample_plate_mag['A8'].center().move(types.Point( + x=-1.3 * 0.8, y=-1.3 * 0.8, z=p300_offset_Mag - 4)) + # Beads to the Right + # A11_p20_bead_side = sample_plate_mag['A6'].center().move(types.Point( + # x=-1.8 * 0.50, y=0, z=p20_offset_Mag - 5)) # Beads to the Right + # A11_p20_bead_top = sample_plate_mag['A6'].center().move(types.Point( + # x=1.5, y=0, z=p20_offset_Mag + 2)) # Beads to the Right + # A11_p20_bead_mid = sample_plate_mag['A6'].center().move(types.Point( + # x=1, y=0, z=p20_offset_Mag - 2)) # Beads to the Right + XA11_p300_bead_side = sample_plate_mag['A9'].center().move(types.Point( + x=-1, y=0, z=p300_offset_Mag - 7.6)) # Beads to the Right + XA11_p300_bead_top = sample_plate_mag['A9'].center().move(types.Point( + x=1.30, y=0, z=p300_offset_Mag - 1)) # Beads to the Right + # A11_p300_bead_mid = sample_plate_mag['A9'].center().move(types.Point( + # x=0.80, y=0, z=p300_offset_Mag - 4)) # Beads to the Right + XA11_p300_loc1 = sample_plate_mag['A9'].center().move(types.Point( + x=1.3 * 0.8, y=1.3 * 0.8, z=p300_offset_Mag - 4)) # Beads to the Right + XA11_p300_loc2 = sample_plate_mag['A9'].center().move(types.Point( + x=1.3, y=0, z=p300_offset_Mag - 4)) # Beads to the Right + XA11_p300_loc3 = sample_plate_mag['A9'].center().move(types.Point( + x=1.3 * 0.8, y=-1.3 * 0.8, z=p300_offset_Mag - 4)) + # Beads to the Right + ########################################################################## + + if STEP_WASH == 1: + protocol.pause("PLACE sample_plate on MAGNET") + protocol.comment('==============================================') + protocol.comment('--> TAGMENTATION WASH') + protocol.comment('==============================================') + + if DRYRUN == 'NO': + protocol.comment('MAGNET ENGAGE') + mag_block.engage(height_from_base=8.5) + protocol.delay(minutes=1) + mag_block.engage(height_from_base=7) + protocol.delay(minutes=1) + mag_block.engage(height_from_base=5) + protocol.delay(minutes=1) + + protocol.comment('--> Removing Supernatant') + RemoveSup = 90 + if samplecolumns >= 1: # ---------------------------------------- + X = 'A1' + pick_up(p300) + p300.move_to(sample_plate_mag[X].bottom(z=p300_offset_Mag + 1)) + p300.aspirate(RemoveSup - 30, rate=0.05) + p300.default_speed = 5 + if X == 'A1': + p300.move_to(A1_p300_bead_side) + if X == 'A2': + p300.move_to(A3_p300_bead_side) + if X == 'A3': + p300.move_to(A5_p300_bead_side) + protocol.delay(minutes=0.1) + p300.aspirate(20, rate=0.05) + p300.move_to(sample_plate_mag[X].bottom(z=p300_offset_Mag)) + protocol.delay(minutes=0.1) + p300.aspirate(10, rate=0.05) + p300.move_to(sample_plate_mag[X].top(z=2)) + p300.default_speed = 400 + p300.dispense(200, Liquid_trash) + p300.move_to(bypass) + p300.drop_tip() if DRYRUN == 'NO' else p300.return_tip() + if samplecolumns >= 2: # ---------------------------------------- + X = 'A2' + pick_up(p300) + p300.move_to(sample_plate_mag[X].bottom(z=p300_offset_Mag + 1)) + p300.aspirate(RemoveSup - 30, rate=0.05) + p300.default_speed = 5 + if X == 'A1': + p300.move_to(A1_p300_bead_side) + if X == 'A2': + p300.move_to(A3_p300_bead_side) + if X == 'A3': + p300.move_to(A5_p300_bead_side) + protocol.delay(minutes=0.1) + p300.aspirate(20, rate=0.05) + p300.move_to(sample_plate_mag[X].bottom(z=p300_offset_Mag)) + protocol.delay(minutes=0.1) + p300.aspirate(10, rate=0.05) + p300.move_to(sample_plate_mag[X].top(z=2)) + p300.default_speed = 400 + p300.dispense(200, Liquid_trash) + p300.move_to(bypass) + p300.drop_tip() if DRYRUN == 'NO' else p300.return_tip() + if samplecolumns >= 3: # ---------------------------------------- + X = 'A3' + pick_up(p300) + p300.move_to(sample_plate_mag[X].bottom(z=p300_offset_Mag + 1)) + p300.aspirate(RemoveSup - 30, rate=0.05) + p300.default_speed = 5 + if X == 'A1': + p300.move_to(A1_p300_bead_side) + if X == 'A2': + p300.move_to(A3_p300_bead_side) + if X == 'A3': + p300.move_to(A5_p300_bead_side) + protocol.delay(minutes=0.1) + p300.aspirate(20, rate=0.05) + p300.move_to(sample_plate_mag[X].bottom(z=p300_offset_Mag)) + protocol.delay(minutes=0.1) + p300.aspirate(10, rate=0.05) + p300.move_to(sample_plate_mag[X].top(z=2)) + p300.default_speed = 400 + p300.dispense(200, Liquid_trash) + p300.move_to(bypass) + p300.drop_tip() if DRYRUN == 'NO' else p300.return_tip() + + if DRYRUN == 'NO': + protocol.comment('MAGNET DISENGAGE') + mag_block.disengage() + + protocol.comment('--> Repeating 3 washes') + washreps = 3 + for wash in range(washreps): + protocol.comment('--> TWB Wash #' + str(wash + 1)) + if DRYRUN == 'NO': + TWBMixRep = 10 + TWBMixVol = 70 + if DRYRUN == 'YES': + TWBMixRep = 10 + TWBMixVol = 70 + if samplecolumns >= 1: # ---------------------------------------- + X = 'A1' + pick_up(p300)if TIPREUSE == 'NO' else \ + p300.pick_up_tip(TWB_washtip_1) + p300.aspirate(100, TWB_1.bottom(z=p300_offset_Res)) + if X == 'A1': + p300.move_to(A1_p300_bead_top) + if X == 'A2': + p300.move_to(A3_p300_bead_top) + if X == 'A3': + p300.move_to(A5_p300_bead_top) + p300.dispense(100, rate=0.75) + if X == 'A1': + p300.move_to(A1_p300_bead_mid) + if X == 'A2': + p300.move_to(A3_p300_bead_mid) + if X == 'A3': + p300.move_to(A5_p300_bead_mid) + p300.mix(TWBMixRep, TWBMixVol) + p300.move_to(sample_plate_mag[X].bottom(z=p300_offset_Mag)) + + p300.default_speed = 400 + p300.move_to(bypass) + if TIPREUSE == 'NO': + p300.drop_tip() if DRYRUN == 'NO' else p300.return_tip() + else: + p300.return_tip() + if samplecolumns >= 2: # ---------------------------------------- + X = 'A2' + pick_up(p300)if TIPREUSE == 'NO' else \ + p300.pick_up_tip(TWB_washtip_2) + p300.aspirate(100, TWB_2.bottom(z=p300_offset_Res)) + if X == 'A1': + p300.move_to(A1_p300_bead_top) + if X == 'A2': + p300.move_to(A3_p300_bead_top) + if X == 'A3': + p300.move_to(A5_p300_bead_top) + p300.dispense(100, rate=0.75) + if X == 'A1': + p300.move_to(A1_p300_bead_mid) + if X == 'A2': + p300.move_to(A3_p300_bead_mid) + if X == 'A3': + p300.move_to(A5_p300_bead_mid) + p300.mix(TWBMixRep, TWBMixVol) + p300.move_to(sample_plate_mag[X].bottom(z=p300_offset_Mag)) + + p300.default_speed = 400 + p300.move_to(bypass) + if TIPREUSE == 'NO': + p300.drop_tip() if DRYRUN == 'NO' else p300.return_tip() + else: + p300.return_tip() + if samplecolumns >= 3: # ---------------------------------------- + X = 'A3' + pick_up(p300)if TIPREUSE == 'NO' else \ + p300.pick_up_tip(TWB_washtip_3) + p300.aspirate(100, TWB_3.bottom(z=p300_offset_Res)) + if X == 'A1': + p300.move_to(A1_p300_bead_top) + if X == 'A2': + p300.move_to(A3_p300_bead_top) + if X == 'A3': + p300.move_to(A5_p300_bead_top) + p300.dispense(100, rate=0.75) + p300.default_speed = 5 + if X == 'A1': + p300.move_to(A1_p300_bead_mid) + if X == 'A2': + p300.move_to(A3_p300_bead_mid) + if X == 'A3': + p300.move_to(A5_p300_bead_mid) + p300.mix(TWBMixRep, TWBMixVol) + p300.move_to(sample_plate_mag[X].bottom(z=p300_offset_Mag)) + p300.default_speed = 400 + p300.move_to(bypass) + if TIPREUSE == 'NO': + p300.drop_tip() if DRYRUN == 'NO' else p300.return_tip() + else: + p300.return_tip() + + if DRYRUN == 'NO': + protocol.comment('MAGNET ENGAGE') + mag_block.engage(height_from_base=8.5) + protocol.delay(minutes=1) + mag_block.engage(height_from_base=7) + protocol.delay(minutes=1) + mag_block.engage(height_from_base=5) + protocol.delay(minutes=1) + + protocol.comment('--> Remove TWB Wash #' + str(wash + 1)) + RemoveSup = 110 + if samplecolumns >= 1: # ---------------------------------------- + X = 'A1' + pick_up(p300)if TIPREUSE == 'NO' else \ + p300.pick_up_tip(TWB_removetip_1) + p300.move_to(sample_plate_mag[X].bottom(z=p300_offset_Mag + 2)) + p300.aspirate(RemoveSup - 30, rate=0.05) + p300.default_speed = 5 + if X == 'A1': + p300.move_to(A1_p300_bead_side) + if X == 'A2': + p300.move_to(A3_p300_bead_side) + if X == 'A3': + p300.move_to(A5_p300_bead_side) + protocol.delay(minutes=0.1) + p300.aspirate(20, rate=0.05) + p300.move_to(sample_plate_mag[X].bottom(z=p300_offset_Mag)) + protocol.delay(minutes=0.1) + p300.aspirate(10, rate=0.05) + p300.move_to(sample_plate_mag[X].top(z=2)) + p300.default_speed = 400 + p300.dispense(200, Liquid_trash) + p300.move_to(bypass) + if TIPREUSE == 'NO': + p300.drop_tip() if DRYRUN == 'NO' else p300.return_tip() + else: + p300.return_tip() + if samplecolumns >= 2: # ---------------------------------------- + X = 'A2' + pick_up(p300)if TIPREUSE == 'NO' else \ + p300.pick_up_tip(TWB_removetip_2) + p300.move_to(sample_plate_mag[X].bottom(z=p300_offset_Mag + 2)) + p300.aspirate(RemoveSup - 30, rate=0.05) + p300.default_speed = 5 + if X == 'A1': + p300.move_to(A1_p300_bead_side) + if X == 'A2': + p300.move_to(A3_p300_bead_side) + if X == 'A3': + p300.move_to(A5_p300_bead_side) + protocol.delay(minutes=0.1) + p300.aspirate(20, rate=0.05) + p300.move_to(sample_plate_mag[X].bottom(z=p300_offset_Mag)) + protocol.delay(minutes=0.1) + p300.aspirate(10, rate=0.05) + p300.move_to(sample_plate_mag[X].top(z=2)) + p300.default_speed = 400 + p300.dispense(200, Liquid_trash) + p300.move_to(bypass) + if TIPREUSE == 'NO': + p300.drop_tip() if DRYRUN == 'NO' else p300.return_tip() + else: + p300.return_tip() + if samplecolumns >= 3: # ---------------------------------------- + X = 'A3' + pick_up(p300)if TIPREUSE == 'NO' else \ + p300.pick_up_tip(TWB_removetip_3) + p300.move_to(sample_plate_mag[X].bottom(z=p300_offset_Mag + 2)) + p300.aspirate(RemoveSup - 30, rate=0.05) + p300.default_speed = 5 + if X == 'A1': + p300.move_to(A1_p300_bead_side) + if X == 'A2': + p300.move_to(A3_p300_bead_side) + if X == 'A3': + p300.move_to(A5_p300_bead_side) + protocol.delay(minutes=0.1) + p300.aspirate(20, rate=0.05) + p300.move_to(sample_plate_mag[X].bottom(z=p300_offset_Mag)) + protocol.delay(minutes=0.1) + p300.aspirate(10, rate=0.05) + p300.move_to(sample_plate_mag[X].top(z=2)) + p300.default_speed = 400 + p300.dispense(200, Liquid_trash) + p300.move_to(bypass) + if TIPREUSE == 'NO': + p300.drop_tip() if DRYRUN == 'NO' else p300.return_tip() + else: + p300.return_tip() + + if DRYRUN == 'NO': + protocol.comment('MAGNET DISENGAGE') + mag_block.disengage() + + wash += 1 + + if DRYRUN == 'NO': + protocol.comment('MAGNET ENGAGE') + mag_block.engage(height_from_base=5) + + protocol.comment('--> Removing Residual Supernatant') + if samplecolumns >= 1: # ---------------------------------------- + X = 'A1' + pick_up(p300) + p300.move_to(sample_plate_mag[X].bottom(z=p300_offset_Mag)) + p300.aspirate(50, rate=0.25) + p300.move_to(bypass) + p300.drop_tip() if DRYRUN == 'NO' else p300.return_tip() + if samplecolumns >= 2: # ---------------------------------------- + X = 'A2' + pick_up(p300) + p300.move_to(sample_plate_mag[X].bottom(z=p300_offset_Mag)) + p300.aspirate(50, rate=0.25) + p300.move_to(bypass) + p300.drop_tip() if DRYRUN == 'NO' else p300.return_tip() + if samplecolumns >= 3: # ---------------------------------------- + X = 'A3' + pick_up(p300) + p300.move_to(sample_plate_mag[X].bottom(z=p300_offset_Mag)) + p300.aspirate(50, rate=0.25) + p300.move_to(bypass) + p300.drop_tip() if DRYRUN == 'NO' else p300.return_tip() + + if DRYRUN == 'NO': + mag_block.engage(height_from_base=3) + protocol.delay(minutes=0.5) + + protocol.comment('MAGNET DISENGAGE') + mag_block.disengage() + + if STEP_PCR == 1: + protocol.comment('==============================================') + protocol.comment('--> AMPLIFICATION') + protocol.comment('==============================================') + + protocol.comment('ADDING PCR') + if DRYRUN == 'NO': + PCRVol = 40 + PCRMixRep = 10 + PCRMixVol = 30 + if DRYRUN == 'YES': + PCRVol = 40 + PCRMixRep = 10 + PCRMixVol = 30 + if samplecolumns >= 1: # ---------------------------------------- + X = 'A1' + pick_up(p300) + p300.aspirate(PCRVol, PCR.bottom(p300_offset_Temp)) + if X == 'A1': + p300.move_to(A1_p300_loc1) + if X == 'A2': + p300.move_to(A3_p300_loc1) + if X == 'A3': + p300.move_to(A5_p300_loc1) + p300.dispense(PCRVol / 5, rate=0.75) + p300.default_speed = 5 + if X == 'A1': + p300.move_to(A1_p300_loc2) + if X == 'A2': + p300.move_to(A3_p300_loc2) + if X == 'A3': + p300.move_to(A5_p300_loc2) + p300.dispense(PCRVol / 5, rate=0.75) + if X == 'A1': + p300.move_to(A1_p300_loc3) + if X == 'A2': + p300.move_to(A3_p300_loc3) + if X == 'A3': + p300.move_to(A5_p300_loc3) + p300.dispense(PCRVol / 5, rate=0.75) + if X == 'A1': + p300.move_to(A1_p300_loc2) + if X == 'A2': + p300.move_to(A3_p300_loc2) + if X == 'A3': + p300.move_to(A5_p300_loc2) + p300.dispense(PCRVol / 5, rate=0.75) + if X == 'A1': + p300.move_to(A1_p300_loc1) + if X == 'A2': + p300.move_to(A3_p300_loc1) + if X == 'A3': + p300.move_to(A5_p300_loc1) + p300.dispense(PCRVol / 5, rate=0.75) + reps = 1 + for x in range(reps): + if X == 'A1': + p300.move_to(A1_p300_loc3) + if X == 'A2': + p300.move_to(A3_p300_loc3) + if X == 'A3': + p300.move_to(A5_p300_loc3) + p300.mix(PCRMixRep, PCRMixVol) + p300.move_to(sample_plate_mag[X].bottom(z=p300_offset_Mag)) + p300.mix(PCRMixRep, PCRMixVol) + p300.move_to(sample_plate_mag[X].top()) + protocol.delay(seconds=0.5) + p300.move_to(sample_plate_mag[X].center()) + p300.default_speed = 400 + p300.drop_tip() if DRYRUN == 'NO' else p300.return_tip() + if samplecolumns >= 2: # ---------------------------------------- + X = 'A2' + pick_up(p300) + p300.aspirate(PCRVol, PCR.bottom(p300_offset_Temp)) + if X == 'A1': + p300.move_to(A1_p300_loc1) + if X == 'A2': + p300.move_to(A3_p300_loc1) + if X == 'A3': + p300.move_to(A5_p300_loc1) + p300.dispense(PCRVol / 5, rate=0.75) + p300.default_speed = 5 + if X == 'A1': + p300.move_to(A1_p300_loc2) + if X == 'A2': + p300.move_to(A3_p300_loc2) + if X == 'A3': + p300.move_to(A5_p300_loc2) + p300.dispense(PCRVol / 5, rate=0.75) + if X == 'A1': + p300.move_to(A1_p300_loc3) + if X == 'A2': + p300.move_to(A3_p300_loc3) + if X == 'A3': + p300.move_to(A5_p300_loc3) + p300.dispense(PCRVol / 5, rate=0.75) + if X == 'A1': + p300.move_to(A1_p300_loc2) + if X == 'A2': + p300.move_to(A3_p300_loc2) + if X == 'A3': + p300.move_to(A5_p300_loc2) + p300.dispense(PCRVol / 5, rate=0.75) + if X == 'A1': + p300.move_to(A1_p300_loc1) + if X == 'A2': + p300.move_to(A3_p300_loc1) + if X == 'A3': + p300.move_to(A5_p300_loc1) + p300.dispense(PCRVol / 5, rate=0.75) + reps = 1 + for x in range(reps): + if X == 'A1': + p300.move_to(A1_p300_loc3) + if X == 'A2': + p300.move_to(A3_p300_loc3) + if X == 'A3': + p300.move_to(A5_p300_loc3) + p300.mix(PCRMixRep, PCRMixVol) + p300.move_to(sample_plate_mag[X].bottom(z=p300_offset_Mag)) + p300.mix(PCRMixRep, PCRMixVol) + p300.move_to(sample_plate_mag[X].top()) + protocol.delay(seconds=0.5) + p300.move_to(sample_plate_mag[X].center()) + p300.default_speed = 400 + p300.drop_tip() if DRYRUN == 'NO' else p300.return_tip() + if samplecolumns >= 3: # ---------------------------------------- + X = 'A3' + pick_up(p300) + p300.aspirate(PCRVol, PCR.bottom(p300_offset_Temp)) + if X == 'A1': + p300.move_to(A1_p300_loc1) + if X == 'A2': + p300.move_to(A3_p300_loc1) + if X == 'A3': + p300.move_to(A5_p300_loc1) + p300.dispense(PCRVol / 5, rate=0.75) + p300.default_speed = 5 + if X == 'A1': + p300.move_to(A1_p300_loc2) + if X == 'A2': + p300.move_to(A3_p300_loc2) + if X == 'A3': + p300.move_to(A5_p300_loc2) + p300.dispense(PCRVol / 5, rate=0.75) + if X == 'A1': + p300.move_to(A1_p300_loc3) + if X == 'A2': + p300.move_to(A3_p300_loc3) + if X == 'A3': + p300.move_to(A5_p300_loc3) + p300.dispense(PCRVol / 5, rate=0.75) + if X == 'A1': + p300.move_to(A1_p300_loc2) + if X == 'A2': + p300.move_to(A3_p300_loc2) + if X == 'A3': + p300.move_to(A5_p300_loc2) + p300.dispense(PCRVol / 5, rate=0.75) + if X == 'A1': + p300.move_to(A1_p300_loc1) + if X == 'A2': + p300.move_to(A3_p300_loc1) + if X == 'A3': + p300.move_to(A5_p300_loc1) + p300.dispense(PCRVol / 5, rate=0.75) + reps = 1 + for x in range(reps): + if X == 'A1': + p300.move_to(A1_p300_loc3) + if X == 'A2': + p300.move_to(A3_p300_loc3) + if X == 'A3': + p300.move_to(A5_p300_loc3) + p300.mix(PCRMixRep, PCRMixVol) + p300.move_to(sample_plate_mag[X].bottom(z=p300_offset_Mag)) + p300.mix(PCRMixRep, PCRMixVol) + p300.move_to(sample_plate_mag[X].top()) + protocol.delay(seconds=0.5) + p300.move_to(sample_plate_mag[X].center()) + p300.default_speed = 400 + p300.drop_tip() if DRYRUN == 'NO' else p300.return_tip() + + protocol.comment('--> Adding Barcodes') + BarcodeVol = 10 + BarcodeMixRep = 10 + BarcodeMixVol = 10 + if samplecolumns >= 1: # ---------------------------------------- + X = 'A1' + p20.pick_up_tip() + p20.aspirate(BarcodeVol, Barcodes1.bottom( + z=p20_offset_Temp), rate=0.25) + p20.dispense( + BarcodeVol, sample_plate_mag[X].bottom(z=p20_offset_Mag)) + p20.mix(BarcodeMixRep, BarcodeMixVol) + p20.drop_tip() if DRYRUN == 'NO' else p20.return_tip() + if samplecolumns >= 2: # ---------------------------------------- + X = 'A2' + p20.pick_up_tip() + p20.aspirate(BarcodeVol, Barcodes2.bottom( + z=p20_offset_Temp), rate=0.25) + p20.dispense( + BarcodeVol, sample_plate_mag[X].bottom(z=p20_offset_Mag)) + p20.mix(BarcodeMixRep, BarcodeMixVol) + p20.drop_tip() if DRYRUN == 'NO' else p20.return_tip() + if samplecolumns >= 3: # ---------------------------------------- + X = 'A3' + p20.pick_up_tip() + p20.aspirate(BarcodeVol, Barcodes3.bottom( + z=p20_offset_Temp), rate=0.25) + p20.dispense( + BarcodeVol, sample_plate_mag[X].bottom(z=p20_offset_Mag)) + p20.mix(BarcodeMixRep, BarcodeMixVol) + p20.drop_tip() if DRYRUN == 'NO' else p20.return_tip() + + if DRYRUN == 'NO': + protocol.pause("PLACE sample_plate on THERMO") + + if STEP_PCRDECK == 1: + ####################################################################### + protocol.comment('Seal, Run PCR (25min)') + + thermocycler.close_lid() + profile_PCR_1 = [ + {'temperature': 68, 'hold_time_minutes': 3}, + {'temperature': 98, 'hold_time_minutes': 3} + ] + thermocycler.execute_profile( + steps=profile_PCR_1, repetitions=1, block_max_volume=50) + profile_PCR_2 = [ + {'temperature': 98, 'hold_time_seconds': 45}, + {'temperature': 62, 'hold_time_seconds': 30}, + {'temperature': 68, 'hold_time_minutes': 2} + ] + thermocycler.execute_profile( + steps=profile_PCR_2, repetitions=5, block_max_volume=50) + profile_PCR_3 = [ + {'temperature': 68, 'hold_time_minutes': 1} + ] + thermocycler.execute_profile( + steps=profile_PCR_3, repetitions=1, block_max_volume=50) + thermocycler.set_block_temperature(4) + ####################################################################### + thermocycler.open_lid() + else: + protocol.comment('Seal, Run PCR (60min)') + + Liquid_trash = reservoir['A11'] + + if STEP_POSTPCR == 1: + protocol.pause("PLACE sample_plate on MAGNET") + protocol.comment('==============================================') + protocol.comment('--> CLEANUP') + protocol.comment('==============================================') + + if DRYRUN == 'NO': + protocol.comment('MAGNET ENGAGE') + mag_block.engage(height_from_base=8.5) + protocol.delay(minutes=1) + mag_block.engage(height_from_base=7) + protocol.delay(minutes=1) + mag_block.engage(height_from_base=5) + protocol.delay(minutes=1) + + protocol.comment('--> Transferring Supernatant') + TransferSup = 45 + if samplecolumns >= 1: # ---------------------------------------- + X = 'A1' + Y = 'A4' + pick_up(p300) + p300.aspirate( + TransferSup / 2, sample_plate_mag[X]. + bottom(z=p300_offset_Mag + 1), rate=0.05) + protocol.delay(seconds=0.1) + p300.aspirate( + TransferSup / 2, sample_plate_mag[X]. + bottom(z=p300_offset_Mag), rate=0.05) + p300.dispense( + TransferSup + 5, sample_plate_mag[Y].bottom(z=p300_offset_Mag)) + protocol.delay(seconds=0.1) + p300.blow_out(sample_plate_mag[Y].top(z=-5)) + p300.move_to(bypass) + p300.drop_tip() if DRYRUN == 'NO' else p300.return_tip() + if samplecolumns >= 2: # ---------------------------------------- + X = 'A2' + Y = 'A5' + pick_up(p300) + p300.aspirate( + TransferSup / 2, sample_plate_mag[X]. + bottom(z=p300_offset_Mag + 1), rate=0.05) + protocol.delay(seconds=0.1) + p300.aspirate( + TransferSup / 2, sample_plate_mag[X]. + bottom(z=p300_offset_Mag), rate=0.05) + p300.dispense( + TransferSup + 5, sample_plate_mag[Y].bottom(z=p300_offset_Mag)) + protocol.delay(seconds=0.1) + p300.blow_out(sample_plate_mag[Y].top(z=-5)) + p300.move_to(bypass) + p300.drop_tip() if DRYRUN == 'NO' else p300.return_tip() + if samplecolumns >= 3: # ---------------------------------------- + X = 'A3' + Y = 'A6' + pick_up(p300) + p300.aspirate( + TransferSup / 2, sample_plate_mag[X]. + bottom(z=p300_offset_Mag + 1), rate=0.05) + protocol.delay(seconds=0.1) + p300.aspirate( + TransferSup / 2, sample_plate_mag[X].bottom(z=p300_offset_Mag), + rate=0.05) + p300.dispense( + TransferSup + 5, sample_plate_mag[Y].bottom(z=p300_offset_Mag)) + protocol.delay(seconds=0.1) + p300.blow_out(sample_plate_mag[Y].top(z=-5)) + p300.move_to(bypass) + p300.drop_tip() if DRYRUN == 'NO' else p300.return_tip() + + if DRYRUN == 'NO': + protocol.comment('MAGNET DISENGAGE') + mag_block.disengage() + + protocol.comment('--> ADDING WATER') + for column in sample_plate_mag.rows()[0][3:6][:samplecolumns]: + pick_up(p300) + p300.aspirate(40, water) + p300.dispense(40, column) + p300.mix(5, 60, column) + p300.blow_out(column.top()) + p300.drop_tip() + + protocol.comment('--> ADDING AMPure (0.8x)') + AMPureVol = 45 + AMPureMixRep = 20 + AMPureMixVol = 100 + if samplecolumns >= 1: # ---------------------------------------- + X = 'A4' + pick_up(p300) + p300.mix(10, AMPureVol + 10, AMPure.bottom(z=p300_offset_Res)) + p300.aspirate(AMPureVol, AMPure.bottom( + z=p300_offset_Res), rate=0.25) + slow_tip_withdrawal(p300, AMPure) + p300.dispense(AMPureVol, sample_plate_mag[X].bottom( + z=p300_offset_Mag), rate=0.25) + p300.move_to(sample_plate_mag[X].bottom(z=p300_offset_Mag)) + p300.mix(AMPureMixRep, AMPureMixVol) + p300.blow_out(sample_plate_mag[X].top(z=-5)) + p300.move_to(bypass) + p300.drop_tip() if DRYRUN == 'NO' else p300.return_tip() + if samplecolumns >= 2: # ---------------------------------------- + X = 'A5' + pick_up(p300) + p300.mix(3, AMPureVol + 10, AMPure.bottom(z=p300_offset_Res)) + p300.aspirate(AMPureVol, AMPure.bottom( + z=p300_offset_Res), rate=0.25) + slow_tip_withdrawal(p300, AMPure) + p300.dispense(AMPureVol, sample_plate_mag[X].bottom( + z=p300_offset_Mag), rate=0.25) + p300.move_to(sample_plate_mag[X].bottom(z=p300_offset_Mag)) + p300.mix(AMPureMixRep, AMPureMixVol) + p300.blow_out(sample_plate_mag[X].top(z=-5)) + p300.move_to(bypass) + p300.drop_tip() if DRYRUN == 'NO' else p300.return_tip() + if samplecolumns >= 3: # ---------------------------------------- + X = 'A6' + pick_up(p300) + p300.mix(3, AMPureVol + 10, AMPure.bottom(z=p300_offset_Res)) + p300.aspirate(AMPureVol, AMPure.bottom( + z=p300_offset_Res), rate=0.25) + slow_tip_withdrawal(p300, AMPure) + p300.dispense(AMPureVol, sample_plate_mag[X].bottom( + z=p300_offset_Mag), rate=0.25) + p300.move_to(sample_plate_mag[X].bottom(z=p300_offset_Mag)) + p300.mix(AMPureMixRep, AMPureMixVol) + p300.blow_out(sample_plate_mag[X].top(z=-5)) + p300.move_to(bypass) + p300.drop_tip() if DRYRUN == 'NO' else p300.return_tip() + + if DRYRUN == 'NO': + protocol.delay(minutes=5*real_incubate_time) + + protocol.comment('MAGNET ENGAGE') + mag_block.engage(height_from_base=8.5) + protocol.delay(minutes=1) + mag_block.engage(height_from_base=7.5) + protocol.delay(minutes=1) + mag_block.engage(height_from_base=7) + protocol.delay(minutes=1) + mag_block.engage(height_from_base=6) + protocol.delay(minutes=1) + mag_block.engage(height_from_base=5) + protocol.delay(minutes=1) + + protocol.comment('--> TRANSFERRING SUPERNAT TO NEW COLUMNS 7, 8, 9') + TransferSup = 125 + if samplecolumns >= 1: # ---------------------------------------- + X = 'A4' + Y = 'A7' + pick_up(p300) + p300.aspirate( + TransferSup / 2, sample_plate_mag[X]. + bottom(z=p300_offset_Mag + 1), rate=0.05) + protocol.delay(seconds=0.1) + p300.aspirate( + TransferSup / 2, sample_plate_mag[X]. + bottom(z=p300_offset_Mag), rate=0.05) + p300.dispense( + TransferSup + 5, sample_plate_mag[Y].bottom(z=p300_offset_Mag)) + protocol.delay(seconds=0.1) + p300.blow_out(sample_plate_mag[Y].top(z=-5)) + p300.move_to(bypass) + p300.drop_tip() if DRYRUN == 'NO' else p300.return_tip() + if samplecolumns >= 2: # ---------------------------------------- + X = 'A5' + Y = 'A8' + pick_up(p300) + p300.aspirate( + TransferSup / 2, sample_plate_mag[X]. + bottom(z=p300_offset_Mag + 1), rate=0.05) + protocol.delay(seconds=0.1) + p300.aspirate( + TransferSup / 2, sample_plate_mag[X]. + bottom(z=p300_offset_Mag), rate=0.05) + p300.dispense( + TransferSup + 5, sample_plate_mag[Y].bottom(z=p300_offset_Mag)) + protocol.delay(seconds=0.1) + p300.blow_out(sample_plate_mag[Y].top(z=-5)) + p300.move_to(bypass) + p300.drop_tip() if DRYRUN == 'NO' else p300.return_tip() + if samplecolumns >= 3: # ---------------------------------------- + X = 'A6' + Y = 'A9' + pick_up(p300) + p300.aspirate( + TransferSup / 2, sample_plate_mag[X]. + bottom(z=p300_offset_Mag + 1), rate=0.05) + protocol.delay(seconds=0.1) + p300.aspirate( + TransferSup / 2, sample_plate_mag[X].bottom(z=p300_offset_Mag), + rate=0.05) + p300.dispense( + TransferSup + 5, sample_plate_mag[Y].bottom(z=p300_offset_Mag)) + protocol.delay(seconds=0.1) + p300.blow_out(sample_plate_mag[Y].top(z=-5)) + p300.move_to(bypass) + p300.drop_tip() if DRYRUN == 'NO' else p300.return_tip() + + mag_block.disengage() + + protocol.comment('--> ADDING AMPure (0.8x)') + AMPureVol = 15 + AMPureMixRep = 20 + AMPureMixVol = 120 + if samplecolumns >= 1: # ---------------------------------------- + X = 'A7' + pick_up(p300) + p300.mix(10, 100, AMPure.bottom(z=p300_offset_Res)) + p300.aspirate(AMPureVol, AMPure.bottom( + z=p300_offset_Res), rate=0.25) + slow_tip_withdrawal(p300, AMPure) + p300.dispense(AMPureVol, sample_plate_mag[X].bottom( + z=p300_offset_Mag), rate=0.25) + p300.move_to(sample_plate_mag[X].bottom(z=p300_offset_Mag)) + p300.mix(AMPureMixRep, AMPureMixVol) + p300.blow_out(sample_plate_mag[X].top(z=-5)) + p300.move_to(bypass) + p300.drop_tip() if DRYRUN == 'NO' else p300.return_tip() + if samplecolumns >= 2: # ---------------------------------------- + X = 'A8' + pick_up(p300) + p300.mix(3, 100, AMPure.bottom(z=p300_offset_Res)) + p300.aspirate(AMPureVol, AMPure.bottom( + z=p300_offset_Res), rate=0.25) + slow_tip_withdrawal(p300, AMPure) + p300.dispense(AMPureVol, sample_plate_mag[X].bottom( + z=p300_offset_Mag), rate=0.25) + p300.move_to(sample_plate_mag[X].bottom(z=p300_offset_Mag)) + p300.mix(AMPureMixRep, AMPureMixVol) + p300.blow_out(sample_plate_mag[X].top(z=-5)) + p300.move_to(bypass) + p300.drop_tip() if DRYRUN == 'NO' else p300.return_tip() + if samplecolumns >= 3: # ---------------------------------------- + X = 'A9' + pick_up(p300) + p300.mix(3, 100, AMPure.bottom(z=p300_offset_Res)) + p300.aspirate(AMPureVol, AMPure.bottom( + z=p300_offset_Res), rate=0.25) + slow_tip_withdrawal(p300, AMPure) + p300.dispense(AMPureVol, sample_plate_mag[X].bottom( + z=p300_offset_Mag), rate=0.25) + p300.move_to(sample_plate_mag[X].bottom(z=p300_offset_Mag)) + p300.mix(AMPureMixRep, AMPureMixVol) + p300.blow_out(sample_plate_mag[X].top(z=-5)) + p300.move_to(bypass) + p300.drop_tip() if DRYRUN == 'NO' else p300.return_tip() + + if DRYRUN == 'NO': + protocol.delay(minutes=5*real_incubate_time) + + protocol.comment('MAGNET ENGAGE') + mag_block.engage(height_from_base=8.5) + protocol.delay(minutes=1) + mag_block.engage(height_from_base=7.5) + protocol.delay(minutes=1) + mag_block.engage(height_from_base=7) + protocol.delay(minutes=1) + mag_block.engage(height_from_base=6) + protocol.delay(minutes=1) + mag_block.engage(height_from_base=5) + protocol.delay(minutes=1) + + protocol.comment('--> Removing Supernatant...') + RemoveSup = 140 + if samplecolumns >= 1: # ---------------------------------------- + X = 'A7' + pick_up(p300) + p300.move_to(sample_plate_mag[X].bottom(z=p300_offset_Mag + 2)) + p300.aspirate(RemoveSup - 30, rate=0.1) + p300.default_speed = 5 + if X == 'A7': + p300.move_to(XA7_p300_bead_side) + if X == 'A8': + p300.move_to(XA9_p300_bead_side) + if X == 'A9': + p300.move_to(XA11_p300_bead_side) + protocol.delay(minutes=0.1) + p300.aspirate(20, rate=0.05) + p300.move_to(sample_plate_mag[X].bottom(z=p300_offset_Mag)) + protocol.delay(minutes=0.1) + p300.aspirate(10, rate=0.05) + p300.move_to(sample_plate_mag[X].top(z=2)) + p300.default_speed = 400 + p300.dispense(200, Liquid_trash) + p300.move_to(Liquid_trash.top(z=5)) + protocol.delay(minutes=0.1) + p300.blow_out() + p300.move_to(bypass) + p300.drop_tip() if DRYRUN == 'NO' else p300.return_tip() + if samplecolumns >= 2: # ---------------------------------------- + X = 'A8' + pick_up(p300) + p300.move_to(sample_plate_mag[X].bottom(z=p300_offset_Mag + 2)) + p300.aspirate(RemoveSup - 30, rate=0.1) + p300.default_speed = 5 + if X == 'A7': + p300.move_to(XA7_p300_bead_side) + if X == 'A8': + p300.move_to(XA9_p300_bead_side) + if X == 'A9': + p300.move_to(XA11_p300_bead_side) + protocol.delay(minutes=0.1) + p300.aspirate(20, rate=0.05) + p300.move_to(sample_plate_mag[X].bottom(z=p300_offset_Mag)) + protocol.delay(minutes=0.1) + p300.aspirate(10, rate=0.05) + p300.move_to(sample_plate_mag[X].top(z=2)) + p300.default_speed = 400 + p300.dispense(200, Liquid_trash) + p300.move_to(Liquid_trash.top(z=5)) + protocol.delay(minutes=0.1) + p300.blow_out() + p300.move_to(bypass) + p300.drop_tip() if DRYRUN == 'NO' else p300.return_tip() + if samplecolumns >= 3: # ---------------------------------------- + X = 'A9' + pick_up(p300) + p300.move_to(sample_plate_mag[X].bottom(z=p300_offset_Mag + 2)) + p300.aspirate(RemoveSup - 30, rate=0.1) + p300.default_speed = 5 + if X == 'A7': + p300.move_to(XA7_p300_bead_side) + if X == 'A8': + p300.move_to(XA9_p300_bead_side) + if X == 'A9': + p300.move_to(XA11_p300_bead_side) + protocol.delay(minutes=0.1) + p300.aspirate(20, rate=0.05) + p300.move_to(sample_plate_mag[X].bottom(z=p300_offset_Mag)) + protocol.delay(minutes=0.1) + p300.aspirate(10, rate=0.05) + p300.move_to(sample_plate_mag[X].top(z=2)) + p300.default_speed = 400 + p300.dispense(200, Liquid_trash) + p300.move_to(Liquid_trash.top(z=5)) + protocol.delay(minutes=0.1) + p300.blow_out() + p300.move_to(bypass) + p300.drop_tip() if DRYRUN == 'NO' else p300.return_tip() + + protocol.comment('--> Repeating 2 washes') + washreps = 2 + for wash in range(washreps): + protocol.comment('--> ETOH Wash #' + str(wash + 1)) + ETOHMaxVol = 150 + WASHNUM = 1 + if samplecolumns >= 1: # ---------------------------------------- + X = 'A7' + if TIPREUSE == 'NO': + pick_up(p300) + elif WASHNUM == 1: + p300.pick_up_tip(W1_ETOH_washtip_1) + elif WASHNUM == 2: + pass # # FIXME: W2_ETOH_washtip_1 is never defined + # p300.pick_up_tip(W2_ETOH_washtip_1) + p300.aspirate(ETOHMaxVol, EtOH_1.bottom(z=p300_offset_Res)) + if X == 'A7': + p300.move_to(XA7_p300_bead_side) + if X == 'A8': + p300.move_to(XA9_p300_bead_side) + if X == 'A9': + p300.move_to(XA11_p300_bead_side) + p300.dispense(ETOHMaxVol - 50, rate=0.5) + p300.move_to(sample_plate_mag[X].center()) + p300.dispense(50, rate=0.5) + p300.move_to(sample_plate_mag[X].top(z=2)) + p300.default_speed = 5 + p300.move_to(sample_plate_mag[X].top(z=-2)) + protocol.delay(minutes=0.1) + p300.blow_out(sample_plate_mag[X].top()) + p300.default_speed = 400 + p300.drop_tip() if DRYRUN == 'NO' else p300.return_tip() + if samplecolumns >= 2: # ---------------------------------------- + X = 'A8' + if TIPREUSE == 'NO': + pick_up(p300) + elif WASHNUM == 1: + p300.pick_up_tip(W1_ETOH_washtip_2) + elif WASHNUM == 2: + pass + # FIXME: W2_ETOH_washtip_2 is never defined + # p300.pick_up_tip(W2_ETOH_washtip_2) + p300.aspirate(ETOHMaxVol, EtOH_2.bottom(z=p300_offset_Res)) + if X == 'A7': + p300.move_to(XA7_p300_bead_side) + if X == 'A8': + p300.move_to(XA9_p300_bead_side) + if X == 'A9': + p300.move_to(XA11_p300_bead_side) + p300.dispense(ETOHMaxVol - 50, rate=0.5) + p300.move_to(sample_plate_mag[X].center()) + p300.dispense(50, rate=0.5) + p300.move_to(sample_plate_mag[X].top(z=2)) + p300.default_speed = 5 + p300.move_to(sample_plate_mag[X].top(z=-2)) + protocol.delay(minutes=0.1) + p300.blow_out(sample_plate_mag[X].top()) + p300.default_speed = 400 + p300.drop_tip() if DRYRUN == 'NO' else p300.return_tip() + if samplecolumns >= 3: # ---------------------------------------- + X = 'A9' + if TIPREUSE == 'NO': + pick_up(p300) + elif WASHNUM == 1: + p300.pick_up_tip(W1_ETOH_washtip_3) + elif WASHNUM == 2: + pass + # FIXME: W2_ETOH_washtip_3 is undefined + # p300.pick_up_tip(W2_ETOH_washtip_3) + p300.aspirate(ETOHMaxVol, EtOH_3.bottom(z=p300_offset_Res)) + if X == 'A7': + p300.move_to(XA7_p300_bead_side) + if X == 'A8': + p300.move_to(XA9_p300_bead_side) + if X == 'A9': + p300.move_to(XA11_p300_bead_side) + p300.dispense(ETOHMaxVol - 50, rate=0.5) + p300.move_to(sample_plate_mag[X].center()) + p300.dispense(50, rate=0.5) + p300.move_to(sample_plate_mag[X].top(z=2)) + p300.default_speed = 5 + p300.move_to(sample_plate_mag[X].top(z=-2)) + protocol.delay(minutes=0.1) + p300.blow_out(sample_plate_mag[X].top()) + p300.default_speed = 400 + p300.drop_tip() if DRYRUN == 'NO' else p300.return_tip() + protocol.delay(minutes=0.5) + + protocol.comment('--> Remove ETOH Wash #' + str(wash + 1)) + if samplecolumns >= 1: # ---------------------------------------- + X = 'A7' + if TIPREUSE == 'NO': + pick_up(p300) + elif WASHNUM == 1: + p300.pick_up_tip(W1_ETOH_removetip_1) + elif WASHNUM == 2: + pass + # FIXME: W2_ETOH_removetip_1 is never defined + # p300.pick_up_tip(W2_ETOH_removetip_1) + p300.move_to(sample_plate_mag[X].bottom(z=p300_offset_Mag + 2)) + p300.aspirate(ETOHMaxVol, rate=0.1) + p300.default_speed = 5 + if X == 'A7': + p300.move_to(XA7_p300_bead_side) + if X == 'A8': + p300.move_to(XA9_p300_bead_side) + if X == 'A9': + p300.move_to(XA11_p300_bead_side) + protocol.delay(minutes=0.1) + p300.aspirate(200 - ETOHMaxVol, rate=0.1) + p300.default_speed = 400 + p300.dispense(200, Liquid_trash) + p300.move_to(Liquid_trash.top(z=5)) + protocol.delay(minutes=0.12) + p300.blow_out() + p300.drop_tip() if DRYRUN == 'NO' else p300.return_tip() + if samplecolumns >= 2: # ---------------------------------------- + X = 'A8' + if TIPREUSE == 'NO': + pick_up(p300) + elif WASHNUM == 1: + p300.pick_up_tip(W1_ETOH_removetip_2) + elif WASHNUM == 2: + pass + # FIXME: W2_ETOH_removetip_2 is never defined + # p300.pick_up_tip(W2_ETOH_removetip_2) + p300.move_to(sample_plate_mag[X].bottom(z=p300_offset_Mag + 2)) + p300.aspirate(ETOHMaxVol, rate=0.1) + p300.default_speed = 5 + if X == 'A7': + p300.move_to(XA7_p300_bead_side) + if X == 'A8': + p300.move_to(XA9_p300_bead_side) + if X == 'A9': + p300.move_to(XA11_p300_bead_side) + protocol.delay(minutes=0.1) + p300.aspirate(200 - ETOHMaxVol, rate=0.1) + p300.default_speed = 400 + p300.dispense(200, Liquid_trash) + p300.move_to(Liquid_trash.top(z=5)) + protocol.delay(minutes=0.12) + p300.blow_out() + p300.drop_tip() if DRYRUN == 'NO' else p300.return_tip() + if samplecolumns >= 3: # ---------------------------------------- + X = 'A9' + if TIPREUSE == 'NO': + pick_up(p300) + elif WASHNUM == 1: + p300.pick_up_tip(W1_ETOH_removetip_3) + elif WASHNUM == 2: + pass + # FIXME: W2_ETOH_removetip_3 is never defined + # p300.pick_up_tip(W2_ETOH_removetip_3) + p300.move_to(sample_plate_mag[X].bottom(z=p300_offset_Mag + 2)) + p300.aspirate(ETOHMaxVol, rate=0.1) + p300.default_speed = 5 + if X == 'A7': + p300.move_to(XA7_p300_bead_side) + if X == 'A8': + p300.move_to(XA9_p300_bead_side) + if X == 'A9': + p300.move_to(XA11_p300_bead_side) + protocol.delay(minutes=0.1) + p300.aspirate(200 - ETOHMaxVol, rate=0.1) + p300.default_speed = 400 + p300.dispense(200, Liquid_trash) + p300.move_to(Liquid_trash.top(z=5)) + protocol.delay(minutes=0.12) + p300.blow_out() + p300.drop_tip() if DRYRUN == 'NO' else p300.return_tip() + wash += 1 + + if DRYRUN == 'NO': + protocol.delay(minutes=5*real_incubate_time) + + protocol.comment('--> Removing Residual ETOH') + if samplecolumns >= 1: # ---------------------------------------- + X = 'A7' + p20.pick_up_tip() + p20.move_to(sample_plate_mag[X].bottom(z=p20_offset_Mag)) + p20.aspirate(20, rate=0.1)if NOMODULES == 'NO' else p20.aspirate( + 10, rate=0.25) + p20.move_to(bypass) + p20.drop_tip() if DRYRUN == 'NO' else p20.return_tip() + if samplecolumns >= 2: # ---------------------------------------- + X = 'A8' + p20.pick_up_tip() + p20.move_to(sample_plate_mag[X].bottom(z=p20_offset_Mag)) + p20.aspirate(20, rate=0.1)if NOMODULES == 'NO' else p20.aspirate( + 10, rate=0.25) + p20.move_to(bypass) + p20.drop_tip() if DRYRUN == 'NO' else p20.return_tip() + if samplecolumns >= 3: # ---------------------------------------- + X = 'A9' + p20.pick_up_tip() + p20.move_to(sample_plate_mag[X].bottom(z=p20_offset_Mag)) + p20.aspirate(20, rate=0.1)if NOMODULES == 'NO' else p20.aspirate( + 10, rate=0.25) + p20.move_to(bypass) + p20.drop_tip() if DRYRUN == 'NO' else p20.return_tip() + + if DRYRUN == 'NO': + mag_block.engage(height_from_base=6) + protocol.comment('AIR DRY') + protocol.delay(minutes=0.5) + + protocol.comment('MAGNET DISENGAGE') + mag_block.disengage() + + protocol.comment('--> Adding RSB') + RSBVol = 35 + RSBMixRep = 5 + RSBMixVol = 25 + if samplecolumns >= 1: # ---------------------------------------- + X = 'A7' + pick_up(p300) + p300.aspirate(RSBVol, RSB.bottom(p300_offset_Res)) + if X == 'A7': + p300.move_to(XA7_p300_loc1) + if X == 'A8': + p300.move_to(XA9_p300_loc1) + if X == 'A9': + p300.move_to(XA11_p300_loc1) + p300.dispense(RSBVol / 5, rate=0.75) + p300.default_speed = 5 + if X == 'A7': + p300.move_to(XA7_p300_loc2) + if X == 'A8': + p300.move_to(XA9_p300_loc2) + if X == 'A9': + p300.move_to(XA11_p300_loc2) + p300.dispense(RSBVol / 5, rate=0.75) + if X == 'A7': + p300.move_to(XA7_p300_loc3) + if X == 'A8': + p300.move_to(XA9_p300_loc3) + if X == 'A9': + p300.move_to(XA11_p300_loc3) + p300.dispense(RSBVol / 5, rate=0.75) + if X == 'A7': + p300.move_to(XA7_p300_loc2) + if X == 'A8': + p300.move_to(XA9_p300_loc2) + if X == 'A9': + p300.move_to(XA11_p300_loc2) + p300.dispense(RSBVol / 5, rate=0.75) + if X == 'A7': + p300.move_to(XA7_p300_loc1) + if X == 'A8': + p300.move_to(XA9_p300_loc1) + if X == 'A9': + p300.move_to(XA11_p300_loc1) + p300.dispense(RSBVol / 5, rate=0.75) + reps = 5 + for x in range(reps): + p300.move_to(sample_plate_mag[X].bottom(z=p300_offset_Mag)) + p300.aspirate(RSBVol, rate=0.5) + if X == 'A7': + p300.move_to(XA7_p300_bead_top) + if X == 'A8': + p300.move_to(XA9_p300_bead_top) + if X == 'A9': + p300.move_to(XA11_p300_bead_top) + p300.dispense(RSBVol, rate=1) + reps = 3 + # for x in range(reps): + # if X == 'A7': + # p300.move_to(XA7_p300_loc2) + # if X == 'A8': + # p300.move_to(XA9_p300_loc2) + # if X == 'A9': + # p300.move_to(XA11_p300_loc2) + # p300.mix(RSBMixRep, RSBMixVol) + # if X == 'A7': + # p300.move_to(XA7_p300_loc1) + # if X == 'A8': + # p300.move_to(XA9_p300_loc1) + # if X == 'A9': + # p300.move_to(XA11_p300_loc1) + # p300.mix(RSBMixRep, RSBMixVol) + # if X == 'A7': + # p300.move_to(XA7_p300_loc2) + # if X == 'A8': + # p300.move_to(XA9_p300_loc2) + # if X == 'A9': + # p300.move_to(XA11_p300_loc2) + # p300.mix(RSBMixRep, RSBMixVol) + # if X == 'A7': + # p300.move_to(XA7_p300_loc3) + # if X == 'A8': + # p300.move_to(XA9_p300_loc3) + # if X == 'A9': + # p300.move_to(XA11_p300_loc3) + p300.mix(RSBMixRep, RSBMixVol, sample_plate_mag.wells_by_name()[X]) + # p300.move_to(Xsample_plate_mag.wells_by_name() + # [X].bottom(z=p300_offset_Mag)) + p300.mix(RSBMixRep, RSBMixVol, sample_plate_mag.wells_by_name()[X]) + p300.move_to(sample_plate_mag.wells_by_name()[X].top()) + protocol.delay(seconds=0.5) + p300.move_to(sample_plate_mag.wells_by_name()[X].center()) + p300.default_speed = 400 + if TIPREUSE == 'NO': + p300.drop_tip() if DRYRUN == 'NO' else p300.return_tip() + else: + p300.return_tip() + if samplecolumns >= 2: # ---------------------------------------- + X = 'A8' + pick_up(p300) + p300.aspirate(RSBVol, RSB.bottom(p300_offset_Res)) + if X == 'A7': + p300.move_to(XA7_p300_loc1) + if X == 'A8': + p300.move_to(XA9_p300_loc1) + if X == 'A9': + p300.move_to(XA11_p300_loc1) + p300.dispense(RSBVol / 5, rate=0.75) + p300.default_speed = 5 + if X == 'A7': + p300.move_to(XA7_p300_loc2) + if X == 'A8': + p300.move_to(XA9_p300_loc2) + if X == 'A9': + p300.move_to(XA11_p300_loc2) + p300.dispense(RSBVol / 5, rate=0.75) + if X == 'A7': + p300.move_to(XA7_p300_loc3) + if X == 'A8': + p300.move_to(XA9_p300_loc3) + if X == 'A9': + p300.move_to(XA11_p300_loc3) + p300.dispense(RSBVol / 5, rate=0.75) + if X == 'A7': + p300.move_to(XA7_p300_loc2) + if X == 'A8': + p300.move_to(XA9_p300_loc2) + if X == 'A9': + p300.move_to(XA11_p300_loc2) + p300.dispense(RSBVol / 5, rate=0.75) + if X == 'A7': + p300.move_to(XA7_p300_loc1) + if X == 'A8': + p300.move_to(XA9_p300_loc1) + if X == 'A9': + p300.move_to(XA11_p300_loc1) + p300.dispense(RSBVol / 5, rate=0.75) + reps = 5 + # for x in range(reps): + # p300.move_to(sample_plate_mag[X].bottom(z=p300_offset_Mag)) + # p300.aspirate(RSBVol, rate=0.5) + # if X == 'A7': + # p300.move_to(XA7_p300_bead_top) + # if X == 'A8': + # p300.move_to(XA9_p300_bead_top) + # if X == 'A9': + # p300.move_to(XA11_p300_bead_top) + # p300.dispense(RSBVol, rate=1) + # reps = 3 + # for x in range(reps): + # if X == 'A7': + # p300.move_to(XA7_p300_loc2) + # if X == 'A8': + # p300.move_to(XA9_p300_loc2) + # if X == 'A9': + # p300.move_to(XA11_p300_loc2) + # p300.mix(RSBMixRep, RSBMixVol) + # if X == 'A7': + # p300.move_to(XA7_p300_loc1) + # if X == 'A8': + # p300.move_to(XA9_p300_loc1) + # if X == 'A9': + # p300.move_to(XA11_p300_loc1) + # p300.mix(RSBMixRep, RSBMixVol) + # if X == 'A7': + # p300.move_to(XA7_p300_loc2) + # if X == 'A8': + # p300.move_to(XA9_p300_loc2) + # if X == 'A9': + # p300.move_to(XA11_p300_loc2) + # p300.mix(RSBMixRep, RSBMixVol) + # if X == 'A7': + # p300.move_to(XA7_p300_loc3) + # if X == 'A8': + # p300.move_to(XA9_p300_loc3) + # if X == 'A9': + # p300.move_to(XA11_p300_loc3) + p300.mix(RSBMixRep, RSBMixVol, sample_plate_mag.wells_by_name()[X]) + # p300.move_to(Xsample_plate_mag.wells_by_name() + # [X].bottom(z=p300_offset_Mag)) + p300.mix(RSBMixRep, RSBMixVol, sample_plate_mag.wells_by_name()[X]) + p300.move_to(sample_plate_mag.wells_by_name()[X].top()) + protocol.delay(seconds=0.5) + p300.move_to(sample_plate_mag.wells_by_name()[X].center()) + p300.default_speed = 400 + if TIPREUSE == 'NO': + p300.drop_tip() if DRYRUN == 'NO' else p300.return_tip() + else: + p300.return_tip() + if samplecolumns >= 3: # ---------------------------------------- + X = 'A9' + pick_up(p300) + p300.aspirate(RSBVol, RSB.bottom(p300_offset_Res)) + if X == 'A7': + p300.move_to(XA7_p300_loc1) + if X == 'A8': + p300.move_to(XA9_p300_loc1) + if X == 'A9': + p300.move_to(XA11_p300_loc1) + p300.dispense(RSBVol / 5, rate=0.75) + p300.default_speed = 5 + if X == 'A7': + p300.move_to(XA7_p300_loc2) + if X == 'A8': + p300.move_to(XA9_p300_loc2) + if X == 'A9': + p300.move_to(XA11_p300_loc2) + p300.dispense(RSBVol / 5, rate=0.75) + if X == 'A7': + p300.move_to(XA7_p300_loc3) + if X == 'A8': + p300.move_to(XA9_p300_loc3) + if X == 'A9': + p300.move_to(XA11_p300_loc3) + p300.dispense(RSBVol / 5, rate=0.75) + if X == 'A7': + p300.move_to(XA7_p300_loc2) + if X == 'A8': + p300.move_to(XA9_p300_loc2) + if X == 'A9': + p300.move_to(XA11_p300_loc2) + p300.dispense(RSBVol / 5, rate=0.75) + if X == 'A7': + p300.move_to(XA7_p300_loc1) + if X == 'A8': + p300.move_to(XA9_p300_loc1) + if X == 'A9': + p300.move_to(XA11_p300_loc1) + p300.dispense(RSBVol / 5, rate=0.75) + reps = 1 + # for x in range(reps): + # p300.move_to(sample_plate_mag[X].bottom(z=p300_offset_Mag)) + # p300.aspirate(RSBVol, rate=0.5) + # if X == 'A7': + # p300.move_to(XA7_p300_bead_top) + # if X == 'A8': + # p300.move_to(XA9_p300_bead_top) + # if X == 'A9': + # p300.move_to(XA11_p300_bead_top) + # p300.dispense(RSBVol, rate=1) + # reps = 1 + # for x in range(reps): + # if X == 'A7': + # p300.move_to(XA7_p300_loc2) + # if X == 'A8': + # p300.move_to(XA9_p300_loc2) + # if X == 'A9': + # p300.move_to(XA11_p300_loc2) + # p300.mix(RSBMixRep, RSBMixVol) + # if X == 'A7': + # p300.move_to(XA7_p300_loc1) + # if X == 'A8': + # p300.move_to(XA9_p300_loc1) + # if X == 'A9': + # p300.move_to(XA11_p300_loc1) + # p300.mix(RSBMixRep, RSBMixVol) + # if X == 'A7': + # p300.move_to(XA7_p300_loc2) + # if X == 'A8': + # p300.move_to(XA9_p300_loc2) + # if X == 'A9': + # p300.move_to(XA11_p300_loc2) + # p300.mix(RSBMixRep, RSBMixVol) + # if X == 'A7': + # p300.move_to(XA7_p300_loc3) + # if X == 'A8': + # p300.move_to(XA9_p300_loc3) + # if X == 'A9': + # p300.move_to(XA11_p300_loc3) + p300.mix(RSBMixRep, RSBMixVol, sample_plate_mag.wells_by_name()[X]) + # p300.move_to(sample_plate_mag.wells_by_name() + # [X].bottom(z=p300_offset_Mag)) + p300.mix(RSBMixRep, RSBMixVol, sample_plate_mag.wells_by_name()[X]) + p300.move_to(sample_plate_mag.wells_by_name()[X].top()) + protocol.delay(seconds=0.5) + p300.move_to(sample_plate_mag.wells_by_name()[X].center()) + p300.default_speed = 400 + if TIPREUSE == 'NO': + p300.drop_tip() if DRYRUN == 'NO' else p300.return_tip() + else: + p300.return_tip() + + if DRYRUN == 'NO': + protocol.delay(minutes=5*real_incubate_time) + + protocol.comment('MAGNET ENGAGE') + mag_block.engage(height_from_base=5) + + protocol.delay(minutes=4) + + protocol.comment('--> Transferring Supernatant') + + if NOMODULES == 'NO': + TransferSup = 30 + else: + TransferSup = 20 + if samplecolumns >= 1: # ---------------------------------------- + X = 'A7' + Y = 'A10' + p20.pick_up_tip() + p20.move_to(sample_plate_mag[X].bottom(z=p20_offset_Mag)) + p20.aspirate(TransferSup / 2, rate=0.25) + p20.dispense( + TransferSup / 2, sample_plate_mag[Y].bottom(z=p20_offset_Mag)) + p20.move_to(sample_plate_mag[X].bottom(z=p20_offset_Mag)) + p20.aspirate(TransferSup / 2, rate=0.25) + p20.dispense( + TransferSup / 2, sample_plate_mag[Y].bottom(z=p20_offset_Mag)) + p20.move_to(bypass) + p20.drop_tip() if DRYRUN == 'NO' else p20.return_tip() + if samplecolumns >= 2: # ---------------------------------------- + X = 'A8' + Y = 'A11' + p20.pick_up_tip() + p20.move_to(sample_plate_mag[X].bottom(z=p20_offset_Mag)) + p20.aspirate(TransferSup / 2, rate=0.25) + p20.dispense( + TransferSup / 2, sample_plate_mag[Y].bottom(z=p20_offset_Mag)) + p20.move_to(sample_plate_mag[X].bottom(z=p20_offset_Mag)) + p20.aspirate(TransferSup / 2, rate=0.25) + p20.dispense( + TransferSup / 2, sample_plate_mag[Y].bottom(z=p20_offset_Mag)) + p20.move_to(bypass) + p20.drop_tip() if DRYRUN == 'NO' else p20.return_tip() + if samplecolumns >= 3: # ---------------------------------------- + X = 'A9' + Y = 'A12' + p20.pick_up_tip() + p20.move_to(sample_plate_mag[X].bottom(z=p20_offset_Mag)) + p20.aspirate(TransferSup / 2, rate=0.25) + p20.dispense( + TransferSup / 2, sample_plate_mag[Y].bottom(z=p20_offset_Mag)) + p20.move_to(sample_plate_mag[X].bottom(z=p20_offset_Mag)) + p20.aspirate(TransferSup / 2, rate=0.25) + p20.dispense( + TransferSup / 2, sample_plate_mag[Y].bottom(z=p20_offset_Mag)) + p20.move_to(bypass) + p20.drop_tip() if DRYRUN == 'NO' else p20.return_tip() + + if DRYRUN == 'NO': + protocol.comment('MAGNET DISENGAGE') + mag_block.disengage()