From e6bf5b615e605d5ba5869addaaa47d49dcf3866f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9Cramifarawi=E2=80=9D?= <“rami.farawi@opentrons.com”> Date: Wed, 13 Dec 2023 12:19:03 -0500 Subject: [PATCH] adding banners to protocols which will be converted to new pl --- protoBuilds/274d2a/README.json | 2 +- protoBuilds/3359a5/README.json | 2 +- protoBuilds/Opentrons_Logo/README.json | 2 +- protoBuilds/cherrypicking/README.json | 2 +- .../README.json | 6 +- protoBuilds/dinosaur/README.json | 2 +- .../README.json | 2 +- .../README.json | 2 +- .../README.json | 2 +- .../README.json | 2 +- .../README.json | 2 +- .../README.json | 2 +- .../README.json | 2 +- protoBuilds/normalization/README.json | 2 +- .../README.json | 2 +- .../README.json | 2 +- protoBuilds/pcr_prep_part_1/README.json | 2 +- protoBuilds/pcr_prep_part_2/README.json | 2 +- .../sci-macherey-nagel-nucleomag/README.json | 8 +- .../sci-mag-bind-blood-tissue-kit/README.json | 8 +- .../sci-omegabiotek-extraction-fa/README.json | 40 + .../README.json | 2 +- .../sci-omegabiotek-magbind/README.json | 2 +- .../README.json | 6 +- .../sci-zymo-directzol-magbead/README.json | 2 +- protoBuilds/swift-2s-turbo-pt1/README.json | 2 +- protoBuilds/swift-fully-automated/README.json | 2 +- protocols/274d2a/README.md | 77 + protocols/274d2a/cherrypicking.ot2.apiv2.py | 125 + protocols/274d2a/fields.json | 45 + .../greinerbioone_96_wellplate_200ul.json | 1127 +++++ .../labware/sarstedt_384_wellplate_40ul.json | 4319 +++++++++++++++++ protocols/3359a5/README.md | 63 + protocols/3359a5/cherrypicking.ot2.apiv2.py | 69 + protocols/3359a5/fields.json | 31 + .../Opentrons_Logo.ot2.apiv2.py | 73 + protocols/Opentrons_Logo/README.md | 64 + protocols/Opentrons_Logo/fields.json | 55 + protocols/cherrypicking/README.md | 70 + .../cherrypicking/cherrypicking.ot2.apiv2.py | 98 + protocols/cherrypicking/fields.json | 49 + .../customizable_serial_dilution_ot2/.feature | 0 .../README.md | 78 + .../customizable_serial_dilution.ot2.apiv2.py | 126 + .../fields.json | 98 + protocols/dinosaur/README.md | 61 + protocols/dinosaur/dinosaur.ot2.apiv2.py | 44 + protocols/dinosaur/fields.json | 31 + .../.feature | 0 .../README.md | 56 + .../fields.json | 26 + ...teraXT_dna_library_prep_part1.ot2.apiv2.py | 87 + .../README.md | 111 + .../fields.json | 68 + ...teraXT_dna_library_prep_part2.ot2.apiv2.py | 164 + .../README.md | 99 + .../fields.json | 107 + ...lutionplate_ubottom_by_macherey_nagel.json | 1127 +++++ .../96_squarewell_block_macherey_nagel.json | 1223 +++++ ...gel-nucleo-mag-dna-microbiome.ot2.apiv2.py | 595 +++ .../README.md | 93 + .../fields.json | 77 + ...lutionplate_ubottom_by_macherey_nagel.json | 1127 +++++ .../96_squarewell_block_macherey_nagel.json | 1223 +++++ ...herey-nagel-nucleomag-cleanup.ot2.apiv2.py | 477 ++ .../README.md | 98 + .../fields.json | 107 + ...lutionplate_ubottom_by_macherey_nagel.json | 1127 +++++ .../96_squarewell_block_macherey_nagel.json | 1223 +++++ ...erey-nagel-nucleomag-dna-food.ot2.apiv2.py | 595 +++ .../macherey-nagel-nucleomag-tissue/README.md | 98 + .../fields.json | 101 + ...lutionplate_ubottom_by_macherey_nagel.json | 1127 +++++ .../96_squarewell_block_macherey_nagel.json | 1223 +++++ ...cherey-nagel-nucleomag-tissue.ot2.apiv2.py | 589 +++ .../macherey-nagel-nucleomag-virus/README.md | 97 + .../fields.json | 101 + ...lutionplate_ubottom_by_macherey_nagel.json | 1127 +++++ .../96_squarewell_block_macherey_nagel.json | 1223 +++++ ...acherey-nagel-nucleomag-virus.ot2.apiv2.py | 589 +++ protocols/normalization/README.md | 77 + protocols/normalization/fields.json | 74 + .../normalization/normalization.ot2.apiv2.py | 79 + .../.feature | 0 .../README.md | 80 + .../dna_purification.ot2.apiv2.py | 142 + .../fields.json | 81 + .../.feature | 0 .../README.md | 83 + .../fields.json | 72 + .../omegaMagBind.ot2.apiv2.py | 191 + protocols/pcr_prep_part_1/README.md | 95 + protocols/pcr_prep_part_1/fields.json | 85 + .../pcr_prep-part1.ot2.apiv2.py | 110 + protocols/pcr_prep_part_2/README.md | 55 + protocols/pcr_prep_part_2/fields.json | 48 + .../pcr_prep-part2.ot2.apiv2.py | 92 + .../sci-macherey-nagel-nucleomag/README.md | 96 + .../sci-macherey-nagel-nucleomag/fields.json | 128 + .../sci-macherey-nagel-nucleomag.ot2.apiv2.py | 415 ++ .../sci-mag-bind-blood-tissue-kit/README.md | 96 + .../sci-mag-bind-blood-tissue-kit/fields.json | 110 + ...sci-mag-bind-blood-tissue-kit.ot2.apiv2.py | 456 ++ .../.hide-from-search | 0 .../sci-omegabiotek-extraction-fa/README.md | 99 + .../sci-omegabiotek-extraction-fa/fields.json | 65 + ...sci-omegabiotek-extraction-fa.ot2.apiv2.py | 405 ++ .../README.md | 116 + .../fields.json | 114 + ...gabiotek-magbind-total-rna-96.ot2.apiv2.py | 613 +++ protocols/sci-omegabiotek-magbind/README.md | 92 + protocols/sci-omegabiotek-magbind/fields.json | 47 + .../sci-omegabiotek-magbind.ot2.apiv2.py | 372 ++ .../README.md | 97 + .../fields.json | 111 + ...ga-magazorb-dna-mini-prep-kit.ot2.apiv2.py | 486 ++ .../sci-zymo-directzol-magbead/README.md | 104 + .../sci-zymo-directzol-magbead/fields.json | 65 + .../sci-zymo-directzol-magbead.ot2.apiv2.py | 505 ++ protocols/swift-2s-turbo-pt1/.feature | 0 protocols/swift-2s-turbo-pt1/README.md | 124 + protocols/swift-2s-turbo-pt1/fields.json | 24 + .../swift-2s-turbo-pt1.ot2.apiv2.py | 157 + protocols/swift-fully-automated/README.md | 136 + protocols/swift-fully-automated/fields.json | 71 + ...wift-2s-turbo-fully-automated.ot2.apiv2.py | 427 ++ 126 files changed, 29759 insertions(+), 36 deletions(-) create mode 100644 protocols/274d2a/README.md create mode 100644 protocols/274d2a/cherrypicking.ot2.apiv2.py create mode 100644 protocols/274d2a/fields.json create mode 100644 protocols/274d2a/labware/greinerbioone_96_wellplate_200ul.json create mode 100644 protocols/274d2a/labware/sarstedt_384_wellplate_40ul.json create mode 100644 protocols/3359a5/README.md create mode 100644 protocols/3359a5/cherrypicking.ot2.apiv2.py create mode 100644 protocols/3359a5/fields.json create mode 100644 protocols/Opentrons_Logo/Opentrons_Logo.ot2.apiv2.py create mode 100644 protocols/Opentrons_Logo/README.md create mode 100644 protocols/Opentrons_Logo/fields.json create mode 100644 protocols/cherrypicking/README.md create mode 100644 protocols/cherrypicking/cherrypicking.ot2.apiv2.py create mode 100644 protocols/cherrypicking/fields.json create mode 100644 protocols/customizable_serial_dilution_ot2/.feature create mode 100644 protocols/customizable_serial_dilution_ot2/README.md create mode 100644 protocols/customizable_serial_dilution_ot2/customizable_serial_dilution.ot2.apiv2.py create mode 100644 protocols/customizable_serial_dilution_ot2/fields.json create mode 100644 protocols/dinosaur/README.md create mode 100644 protocols/dinosaur/dinosaur.ot2.apiv2.py create mode 100644 protocols/dinosaur/fields.json create mode 100644 protocols/illumina-nextera-XT-library-prep-part1/.feature create mode 100644 protocols/illumina-nextera-XT-library-prep-part1/README.md create mode 100644 protocols/illumina-nextera-XT-library-prep-part1/fields.json create mode 100644 protocols/illumina-nextera-XT-library-prep-part1/nexteraXT_dna_library_prep_part1.ot2.apiv2.py create mode 100644 protocols/illumina-nextera-XT-library-prep-part2/README.md create mode 100644 protocols/illumina-nextera-XT-library-prep-part2/fields.json create mode 100644 protocols/illumina-nextera-XT-library-prep-part2/nexteraXT_dna_library_prep_part2.ot2.apiv2.py create mode 100644 protocols/macherey-nagel-nucleomag-DNA-microbiome/README.md create mode 100644 protocols/macherey-nagel-nucleomag-DNA-microbiome/fields.json create mode 100644 protocols/macherey-nagel-nucleomag-DNA-microbiome/labware/96_elutionplate_ubottom_by_macherey_nagel.json create mode 100644 protocols/macherey-nagel-nucleomag-DNA-microbiome/labware/96_squarewell_block_macherey_nagel.json create mode 100644 protocols/macherey-nagel-nucleomag-DNA-microbiome/macherey-nagel-nucleo-mag-dna-microbiome.ot2.apiv2.py create mode 100644 protocols/macherey-nagel-nucleomag-clean-up/README.md create mode 100644 protocols/macherey-nagel-nucleomag-clean-up/fields.json create mode 100644 protocols/macherey-nagel-nucleomag-clean-up/labware/96_elutionplate_ubottom_by_macherey_nagel.json create mode 100644 protocols/macherey-nagel-nucleomag-clean-up/labware/96_squarewell_block_macherey_nagel.json create mode 100644 protocols/macherey-nagel-nucleomag-clean-up/macherey-nagel-nucleomag-cleanup.ot2.apiv2.py create mode 100644 protocols/macherey-nagel-nucleomag-dna-food/README.md create mode 100644 protocols/macherey-nagel-nucleomag-dna-food/fields.json create mode 100644 protocols/macherey-nagel-nucleomag-dna-food/labware/96_elutionplate_ubottom_by_macherey_nagel.json create mode 100644 protocols/macherey-nagel-nucleomag-dna-food/labware/96_squarewell_block_macherey_nagel.json create mode 100644 protocols/macherey-nagel-nucleomag-dna-food/macherey-nagel-nucleomag-dna-food.ot2.apiv2.py create mode 100644 protocols/macherey-nagel-nucleomag-tissue/README.md create mode 100644 protocols/macherey-nagel-nucleomag-tissue/fields.json create mode 100644 protocols/macherey-nagel-nucleomag-tissue/labware/96_elutionplate_ubottom_by_macherey_nagel.json create mode 100644 protocols/macherey-nagel-nucleomag-tissue/labware/96_squarewell_block_macherey_nagel.json create mode 100644 protocols/macherey-nagel-nucleomag-tissue/macherey-nagel-nucleomag-tissue.ot2.apiv2.py create mode 100644 protocols/macherey-nagel-nucleomag-virus/README.md create mode 100644 protocols/macherey-nagel-nucleomag-virus/fields.json create mode 100644 protocols/macherey-nagel-nucleomag-virus/labware/96_elutionplate_ubottom_by_macherey_nagel.json create mode 100644 protocols/macherey-nagel-nucleomag-virus/labware/96_squarewell_block_macherey_nagel.json create mode 100644 protocols/macherey-nagel-nucleomag-virus/macherey-nagel-nucleomag-virus.ot2.apiv2.py create mode 100644 protocols/normalization/README.md create mode 100644 protocols/normalization/fields.json create mode 100644 protocols/normalization/normalization.ot2.apiv2.py create mode 100644 protocols/nucleic_acid_purification_with_magnetic_beads/.feature create mode 100644 protocols/nucleic_acid_purification_with_magnetic_beads/README.md create mode 100644 protocols/nucleic_acid_purification_with_magnetic_beads/dna_purification.ot2.apiv2.py create mode 100644 protocols/nucleic_acid_purification_with_magnetic_beads/fields.json create mode 100644 protocols/omega_biotek_magbind_totalpure_NGS/.feature create mode 100644 protocols/omega_biotek_magbind_totalpure_NGS/README.md create mode 100644 protocols/omega_biotek_magbind_totalpure_NGS/fields.json create mode 100644 protocols/omega_biotek_magbind_totalpure_NGS/omegaMagBind.ot2.apiv2.py create mode 100644 protocols/pcr_prep_part_1/README.md create mode 100644 protocols/pcr_prep_part_1/fields.json create mode 100644 protocols/pcr_prep_part_1/pcr_prep-part1.ot2.apiv2.py create mode 100644 protocols/pcr_prep_part_2/README.md create mode 100644 protocols/pcr_prep_part_2/fields.json create mode 100644 protocols/pcr_prep_part_2/pcr_prep-part2.ot2.apiv2.py create mode 100644 protocols/sci-macherey-nagel-nucleomag/README.md create mode 100644 protocols/sci-macherey-nagel-nucleomag/fields.json create mode 100644 protocols/sci-macherey-nagel-nucleomag/sci-macherey-nagel-nucleomag.ot2.apiv2.py create mode 100644 protocols/sci-mag-bind-blood-tissue-kit/README.md create mode 100644 protocols/sci-mag-bind-blood-tissue-kit/fields.json create mode 100644 protocols/sci-mag-bind-blood-tissue-kit/sci-mag-bind-blood-tissue-kit.ot2.apiv2.py create mode 100644 protocols/sci-omegabiotek-extraction-fa/.hide-from-search create mode 100644 protocols/sci-omegabiotek-extraction-fa/README.md create mode 100644 protocols/sci-omegabiotek-extraction-fa/fields.json create mode 100644 protocols/sci-omegabiotek-extraction-fa/sci-omegabiotek-extraction-fa.ot2.apiv2.py create mode 100644 protocols/sci-omegabiotek-magbind-total-rna-96/README.md create mode 100644 protocols/sci-omegabiotek-magbind-total-rna-96/fields.json create mode 100644 protocols/sci-omegabiotek-magbind-total-rna-96/sci-omegabiotek-magbind-total-rna-96.ot2.apiv2.py create mode 100644 protocols/sci-omegabiotek-magbind/README.md create mode 100644 protocols/sci-omegabiotek-magbind/fields.json create mode 100644 protocols/sci-omegabiotek-magbind/sci-omegabiotek-magbind.ot2.apiv2.py create mode 100644 protocols/sci-promega-magazorb-dna-mini-prep-kit/README.md create mode 100644 protocols/sci-promega-magazorb-dna-mini-prep-kit/fields.json create mode 100644 protocols/sci-promega-magazorb-dna-mini-prep-kit/sci-promega-magazorb-dna-mini-prep-kit.ot2.apiv2.py create mode 100644 protocols/sci-zymo-directzol-magbead/README.md create mode 100644 protocols/sci-zymo-directzol-magbead/fields.json create mode 100644 protocols/sci-zymo-directzol-magbead/sci-zymo-directzol-magbead.ot2.apiv2.py create mode 100644 protocols/swift-2s-turbo-pt1/.feature create mode 100644 protocols/swift-2s-turbo-pt1/README.md create mode 100644 protocols/swift-2s-turbo-pt1/fields.json create mode 100644 protocols/swift-2s-turbo-pt1/swift-2s-turbo-pt1.ot2.apiv2.py create mode 100644 protocols/swift-fully-automated/README.md create mode 100644 protocols/swift-fully-automated/fields.json create mode 100644 protocols/swift-fully-automated/swift-2s-turbo-fully-automated.ot2.apiv2.py diff --git a/protoBuilds/274d2a/README.json b/protoBuilds/274d2a/README.json index 450990cdcf..15d626fac0 100644 --- a/protoBuilds/274d2a/README.json +++ b/protoBuilds/274d2a/README.json @@ -8,7 +8,7 @@ "description": "\nCherrypicking, or hit-picking, is a key component of many workflows from high-throughput screening to microbial transfections. With this protocol, you can easily select specific wells in any labware without worrying about missing or selecting the wrong well. Just upload your properly formatted CSV file (keep scrolling for an example), customize your parameters, and download your ready-to-run protocol.\n\n\nTo purchase tips, reagents, or pipettes, please visit our online store or contact our sales team at info@opentrons.com\n\nOpentrons OT-2\nOpentrons OT-2 Run App (Version 3.15.0 or later)\nOpentrons Single-Channel Pipette and corresponding Tips\nMicroplates (96-well or 384-well)\n\nFor more detailed information on compatible labware, please visit our Labware Library.\n\n\nLabware will be loaded automatically by specifying the labware loadname and labware slot in the .csv file. All available empty slots will be filled with the necessary tipracks, and the user will be prompted to refill the tipracks if all are emptied in the middle of the protocol.\nCSV Format\nYour cherrypicking transfers must be saved as a comma separated value (.csv) file type. Your CSV must contain values corresponding to volumes in microliters (\u03bcL). Note that the header line (first row of the .csv file) should also be included!\nHere's an example of how a short cherrypicking protocol should be properly formatted:\nNew Tip,Source Labware,Source Slot,Source Well,Source Aspiration Height Above Bottom (in mm),Dest Labware,Dest Slot,Dest Well,Dest Dispense Height Above Bottom (in mm),Volume (in ul)\nyes,agilent_1_reservoir_290ml,1,A1,1,nest_96_wellplate_100ul_pcr_full_skirt,4,A11,2,1\n,nest_12_reservoir_15ml,2,A1,1,corning_384_wellplate_112ul_flat,5,B11,2,3\nyes,nest_1_reservoir_195ml,3,A1,1,corning_384_wellplate_112ul_flat,5,A12,2,7\nIn the above example, 1\u03bcL will be transferred from 1mm above the bottom of well A1 in an Agilent 1-well 290ml reservoir (slot 1) to well A11 in the destination NEST 96-well plate 100\u00b5l (slot 4) with a new tip. After this, 3\u03bcL will be transferred from 1mm above the bottom of well A1 in a NEST 12-well 15ml reservoir (slot 2) to well A5 in the destination NEST 96-well plate 100\u00b5l (slot 5) with the same tip. Last, 7\u03bcL will be transferred from 1mm above the bottom of well A1 in a NEST 1-well 195ml reservoir (slot 3) to well H12 in the destination NEST 96-well plate 100\u00b5l (slot 5) with a new tip.\nIf you\u2019d like to follow our template, you can make a copy of this spreadsheet, fill out your values, and export as CSV for use with this protocol.\nUsing the customizations fields, below set up your protocol.\n Transfer .csv File: Upload the .csv file containing your well locations, volumes, and source plate (optional).\n Pipette Model: Select which pipette you will use for this protocol.\n Pipette Mount: Specify which mount your single-channel pipette is on (left or right)\n Tip Type: Specify whether you want to use filter tips.\n* Tip Usage Strategy: Specify whether you'd like to use a new tip for each transfer, or keep the same tip throughout the protocol.", "internal": "274d2a", "markdown": { - "author": "[Opentrons](https://opentrons.com/)\n\n***Opentrons has launched a new Protocol Library. You should use the [new page for this protocol](library.opentrons.com/p/274d2a). This page won\u2019t be available after January 31st, 2024.***\n\n", + "author": "[Opentrons](https://opentrons.com/)\n\n# Opentrons has launched a new Protocol Library. You should use the [new page for this protocol](library.opentrons.com/p/274d2a). This page won\u2019t be available after January 31st, 2024.\n\n", "categories": "* Sample Prep\n\t* Cherrypicking\n\n", "description": "![Cherrypicking Example](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/cherrypicking/cherrypicking_example.png)\n\nCherrypicking, or hit-picking, is a key component of many workflows from high-throughput screening to microbial transfections. With this protocol, you can easily select specific wells in any labware without worrying about missing or selecting the wrong well. Just upload your properly formatted CSV file (keep scrolling for an example), customize your parameters, and download your ready-to-run protocol.\n\n---\n![Materials Needed](https://s3.amazonaws.com/opentrons-protocol-library-website/custom-README-images/001-General+Headings/materials.png)\n\nTo purchase tips, reagents, or pipettes, please visit our [online store](https://shop.opentrons.com/) or contact our sales team at [info@opentrons.com](mailto:info@opentrons.com)\n\n* [Opentrons OT-2](https://shop.opentrons.com/collections/ot-2-robot/products/ot-2)\n* [Opentrons OT-2 Run App (Version 3.15.0 or later)](https://opentrons.com/ot-app/)\n* [Opentrons Single-Channel Pipette](https://shop.opentrons.com/collections/ot-2-pipettes) and corresponding [Tips](https://shop.opentrons.com/collections/opentrons-tips)\n* [Microplates (96-well or 384-well)](https://labware.opentrons.com/?category=wellPlate)\n\nFor more detailed information on compatible labware, please visit our [Labware Library](https://labware.opentrons.com/).\n\n\n\n---\n![Setup](https://s3.amazonaws.com/opentrons-protocol-library-website/custom-README-images/001-General+Headings/Setup.png)\n\nLabware will be loaded automatically by specifying the labware loadname and labware slot in the .csv file. All available empty slots will be filled with the necessary [tipracks](https://shop.opentrons.com/collections/opentrons-tips), and the user will be prompted to refill the tipracks if all are emptied in the middle of the protocol.\n\n**CSV Format**\n\nYour cherrypicking transfers must be saved as a comma separated value (.csv) file type. Your CSV must contain values corresponding to volumes in microliters (\u03bcL). Note that the header line (first row of the .csv file) should also be included!\n\nHere's an example of how a short cherrypicking protocol should be properly formatted:\n\n```\nNew Tip,Source Labware,Source Slot,Source Well,Source Aspiration Height Above Bottom (in mm),Dest Labware,Dest Slot,Dest Well,Dest Dispense Height Above Bottom (in mm),Volume (in ul)\nyes,agilent_1_reservoir_290ml,1,A1,1,nest_96_wellplate_100ul_pcr_full_skirt,4,A11,2,1\n,nest_12_reservoir_15ml,2,A1,1,corning_384_wellplate_112ul_flat,5,B11,2,3\nyes,nest_1_reservoir_195ml,3,A1,1,corning_384_wellplate_112ul_flat,5,A12,2,7\n```\n\nIn the above example, 1\u03bcL will be transferred from 1mm above the bottom of well A1 in an Agilent 1-well 290ml reservoir (slot 1) to well A11 in the destination NEST 96-well plate 100\u00b5l (slot 4) with a new tip. After this, 3\u03bcL will be transferred from 1mm above the bottom of well A1 in a NEST 12-well 15ml reservoir (slot 2) to well A5 in the destination NEST 96-well plate 100\u00b5l (slot 5) with the same tip. Last, 7\u03bcL will be transferred from 1mm above the bottom of well A1 in a NEST 1-well 195ml reservoir (slot 3) to well H12 in the destination NEST 96-well plate 100\u00b5l (slot 5) with a new tip.\n\nIf you\u2019d like to follow our template, you can make a copy of [this spreadsheet](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/274d2a/ex.csv), fill out your values, and export as CSV for use with this protocol.\n\nUsing the customizations fields, below set up your protocol.\n* Transfer .csv File: Upload the .csv file containing your well locations, volumes, and source plate (optional).\n* Pipette Model: Select which pipette you will use for this protocol.\n* Pipette Mount: Specify which mount your single-channel pipette is on (left or right)\n* Tip Type: Specify whether you want to use filter tips.\n* Tip Usage Strategy: Specify whether you'd like to use a new tip for each transfer, or keep the same tip throughout the protocol.\n\n\n", "internal": "274d2a\n", diff --git a/protoBuilds/3359a5/README.json b/protoBuilds/3359a5/README.json index 29f6e3fd5e..eebe858773 100644 --- a/protoBuilds/3359a5/README.json +++ b/protoBuilds/3359a5/README.json @@ -10,7 +10,7 @@ "internal": "3359a5", "labware": "\nAny verified labware found in our Labware Library\n", "markdown": { - "author": "[Opentrons](https://opentrons.com/)\n\n***Opentrons has launched a new Protocol Library. You should use the [new page for this protocol](library.opentrons.com/p/3359a5). This page won\u2019t be available after January 31st, 2024.***\n\n", + "author": "[Opentrons](https://opentrons.com/)\n\n# Opentrons has launched a new Protocol Library. You should use the [new page for this protocol](library.opentrons.com/p/3359a5). This page won\u2019t be available after January 31st, 2024.\n\n", "categories": "* Featured\n\t* Cherrypicking\n\n", "deck-setup": "Example Deck Setup - this is variable depending on the .csv uploaded.\n![deck layout](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/3359a5/Screen+Shot+2021-04-29+at+2.45.06+PM.png)\n\n\n---\n\n", "description": "With this protocol, your robot can perform multiple well-to-well liquid transfers using a single-channel pipette by parsing through a user-defined .csv file. The protocol can use Opentrons GEN1 or GEN2 pipettes.\n\nThis particular cherrypicking protocol allows you to specify the source plate labware and slot number, as well as the aspiration height above the bottom of the well (in mm). Appropriate tip racks will be placed in every slot that isn't already populated with a source or destination labware.\n\n\nExplanation of complex parameters below:\n* `Pipette Type`: Specify which single channel pipette you will be using for this protocol.\n* `input .csv file`: Here, you should upload a .csv file formatted in the [following way](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/3359a5/template.csv) being sure to include the header line. Refer to our [Labware Library](https://labware.opentrons.com/?category=wellPlate) to copy API names for labware to include in the `source_labware` and `destination_labware` columns of the .csv.\n\n---\n\n", diff --git a/protoBuilds/Opentrons_Logo/README.json b/protoBuilds/Opentrons_Logo/README.json index 88d613ad06..287771bfa1 100644 --- a/protoBuilds/Opentrons_Logo/README.json +++ b/protoBuilds/Opentrons_Logo/README.json @@ -8,7 +8,7 @@ "description": "This is a demo protocol that will help you to get more familiar with your new OT-2! All you need is some food dye, a 96-well plate, and a 12-row trough or tube rack with 1.5mL or 2mL tubes. Your robot will pipette the Opentrons logo into your plate and you'll be ready to go!\n\n\nTo purchase tips, reagents, or pipettes, please visit our online store or contact our sales team at info@opentrons.com\n\nOpentrons OT-2\nOpentrons OT-2 Run App (Version 3.15.0 or later)\nOpentrons Single-Channel Pipette and corresponding Tips\n96-Well Microplate\n12-Row Trough or Tube Rack with 1.5mL/2mL Tubes\nWater and Food Dye (Two Colors)\n\nFor more detailed information on compatible labware, please visit our Labware Library.\n\n\nFor this demo protocol, you need a clean, empty 96-well plate (where the Opentrons logo will be created) and either a 12-row trough or 1.5mL/2mL tubes in a tube rack to store the water and food dye solution.\nIf using a 12-row trough, the two food dye solutions should be stored in column 1 and column 2. If using the tube rack, dye 1 should be stored in 'A1' & 'B1' and dye 2 should be stored in 'C1' & 'D1'.\nUsing the customization fields below, set up your protocol.\n Pipette Model: Select which pipette you will use for this protocol.\n Pipette Mount: Specify which mount your single-channel pipette is on (left or right)\n Destination Plate Type: Select which (destination) plate you will use for this protocol.\n Dye Labware Type: Select which (source) labware you will use for this protocol.", "internal": "Demo Protocol 1", "markdown": { - "author": "[Opentrons](https://opentrons.com/)\n\n***Opentrons has launched a new Protocol Library. You should use the [new page for this protocol](library.opentrons.com/p/opentrons_logo). This page won\u2019t be available after January 31st, 2024.***\n\n", + "author": "[Opentrons](https://opentrons.com/)\n\n# Opentrons has launched a new Protocol Library. You should use the [new page for this protocol](library.opentrons.com/p/opentrons_logo). This page won\u2019t be available after January 31st, 2024.\n\n", "categories": "* Getting Started\n\t* Opentrons Logo\n\n", "description": "This is a demo protocol that will help you to get more familiar with your new OT-2! All you need is some food dye, a 96-well plate, and a 12-row trough or tube rack with 1.5mL or 2mL tubes. Your robot will pipette the Opentrons logo into your plate and you'll be ready to go!\n\n---\n![Materials Needed](https://s3.amazonaws.com/opentrons-protocol-library-website/custom-README-images/001-General+Headings/materials.png)\n\nTo purchase tips, reagents, or pipettes, please visit our [online store](https://shop.opentrons.com/) or contact our sales team at [info@opentrons.com](mailto:info@opentrons.com)\n\n* [Opentrons OT-2](https://shop.opentrons.com/collections/ot-2-robot/products/ot-2)\n* [Opentrons OT-2 Run App (Version 3.15.0 or later)](https://opentrons.com/ot-app/)\n* [Opentrons Single-Channel Pipette](https://shop.opentrons.com/collections/ot-2-pipettes) and corresponding [Tips](https://shop.opentrons.com/collections/opentrons-tips)\n* [96-Well Microplate](https://labware.opentrons.com/?category=wellPlate)\n* [12-Row Trough](https://labware.opentrons.com/?category=reservoir) or [Tube Rack with 1.5mL/2mL Tubes](https://labware.opentrons.com/?category=tubeRack)\n* Water and Food Dye (Two Colors)\n\nFor more detailed information on compatible labware, please visit our [Labware Library](https://labware.opentrons.com/).\n\n\n---\n![Setup](https://s3.amazonaws.com/opentrons-protocol-library-website/custom-README-images/001-General+Headings/Setup.png)\n\nFor this demo protocol, you need a clean, empty 96-well plate (where the Opentrons logo will be created) and either a 12-row trough or 1.5mL/2mL tubes in a tube rack to store the water and food dye solution.\n\nIf using a 12-row trough, the two food dye solutions should be stored in column 1 and column 2. If using the tube rack, dye 1 should be stored in 'A1' & 'B1' and dye 2 should be stored in 'C1' & 'D1'.\n\nUsing the customization fields below, set up your protocol.\n* Pipette Model: Select which pipette you will use for this protocol.\n* Pipette Mount: Specify which mount your single-channel pipette is on (left or right)\n* Destination Plate Type: Select which (destination) plate you will use for this protocol.\n* Dye Labware Type: Select which (source) labware you will use for this protocol.\n\n\n", "internal": "Demo Protocol 1\n", diff --git a/protoBuilds/cherrypicking/README.json b/protoBuilds/cherrypicking/README.json index 5ff2182e3e..7c1c639621 100644 --- a/protoBuilds/cherrypicking/README.json +++ b/protoBuilds/cherrypicking/README.json @@ -10,7 +10,7 @@ "internal": "cherrypicking", "labware": "\nAny verified labware found in our Labware Library\n", "markdown": { - "author": "[Opentrons](https://opentrons.com/)\n\n***Opentrons has launched a new Protocol Library. You should use the [new page for this protocol](library.opentrons.com/p/cherrypicking). This page won\u2019t be available after January 31st, 2024.***\n\n", + "author": "[Opentrons](https://opentrons.com/)\n\n# Opentrons has launched a new Protocol Library. You should use the [new page for this protocol](library.opentrons.com/p/cherrypicking). This page won\u2019t be available after January 31st, 2024.\n\n", "categories": "* Featured\n\t* Cherrypicking\n\n", "deck-setup": "* Example deck setup - tip racks loaded onto remining slots.\n![deck layout](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/cherrypicking/Screen+Shot+2021-04-29+at+3.10.02+PM.png)\n\n---\n\n", "description": "\nOur most robust cherrypicking protocol. Specify aspiration height, labware, pipette, as well as source and destination wells with this all inclusive cherrypicking protocol.\n\n![Cherrypicking Example](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/cherrypicking/cherrypicking_example.png)\n\nExplanation of complex parameters below:\n\n* `input .csv file`: Here, you should upload a .csv file formatted in the [following way](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/1211/example.csv), making sure to include headers in your csv file. Refer to our [Labware Library](https://labware.opentrons.com/?category=wellPlate) to copy API names for labware to include in the `Source Labware` and `Dest Labware` columns of the .csv.\n* `Pipette Model`: Select which pipette you will use for this protocol.\n* `Pipette Mount`: Specify which mount your single-channel pipette is on (left or right)\n* `Tip Type`: Specify whether you want to use filter tips.\n* `Tip Usage Strategy`: Specify whether you'd like to use a new tip for each transfer, or keep the same tip throughout the protocol.\n\n\n\n---\n\n\n", diff --git a/protoBuilds/customizable_serial_dilution_ot2/README.json b/protoBuilds/customizable_serial_dilution_ot2/README.json index c270b298e6..097aa89be1 100644 --- a/protoBuilds/customizable_serial_dilution_ot2/README.json +++ b/protoBuilds/customizable_serial_dilution_ot2/README.json @@ -8,13 +8,13 @@ "description": "With this protocol, you can do a simple serial dilution across a 96-well plate using either a single-channel or 8-channel pipette. This can be useful for everything from creating a simple standard curve to a concentration-limiting dilution. For more information (including data from the Opentrons Lab and other considerations), please see our Technical Note.\n\n\n\nExample Setup\nThis protocol uses the inputs you define for \"Dilution Factor\" and \"Total Mixing Volume\" to automatically infer the necessary transfer volume for each dilution across your plate. For a 1 in 3 dilution series across an entire plate, as seen above:\n-- Start with your samples/reagents in Column 1 of your plate. In this example, you would pre-add 150 uL of concentrated sample to the first column of your 96-well plate.\n-- Define a Total Mixing Volume of 150uL, a Dilution Factor of 3, and set Number of Dilutions = 11.\n-- Your OT-2 will add 100uL of diluent to each empty well in your plate. Then it will transfer 50uL from Column 1 between each well/column in the plate.\n-- \"Total mixing volume\" = transfer volume + diluent volume.\n\n\n\n-- Opentrons OT-2\n-- Opentrons OT-2 Run App (Version 3.19 or later)\n-- Opentrons Tips for selected Opentrons Pipette\n-- 12-Row, Automation-Friendly Trough\n-- 96-Well Plate (found in our Labware Library)\n-- Diluent (Pre-loaded in row 1 of trough)\n-- Samples/Standards (Pre-loaded in Column 1 of a standard 96-well plate)", "internal": "Customizable Serial Dilution, v2", "markdown": { - "author": "[Opentrons](https://opentrons.com/)\n\n***Opentrons has launched a new Protocol Library. You should use the [new page for this protocol](library.opentrons.com/p/customizable_serial_dilution_ot2). This page won\u2019t be available after January 31st, 2024.***\n\n", + "author": "[Opentrons](https://opentrons.com/)\n\n# Opentrons has launched a new Protocol Library. You should use the [new page for this protocol](library.opentrons.com/p/customizable_serial_dilution_ot2). This page won\u2019t be available after January 31st, 2024.\n\n", "categories": "* Featured\n * Serial Dilution\n\n", - "description": "With this protocol, you can do a simple serial dilution across a 96-well plate using either a single-channel or 8-channel pipette. This can be useful for everything from creating a simple standard curve to a concentration-limiting dilution. For more information (including data from the Opentrons Lab and other considerations), please see our [Technical Note](https://s3.amazonaws.com/opentrons-protocol-library-website/Technical+Notes/Serial+Dilution+OT2+Technical+Note.pdf).\n\n---\n\n---\n\n![serial dilution](https://s3.amazonaws.com/opentrons-protocol-library-website/custom-README-images/customizable-serial-dilution/Customizable+Serial+Dilution+Illustration+LATEST+VERSION.jpg)\n\n***Example Setup***\n\nThis protocol uses the inputs you define for \"***Dilution Factor***\" and \"***Total Mixing Volume***\" to automatically infer the necessary transfer volume for each dilution across your plate. For a 1 in 3 dilution series across an entire plate, as seen above:\n\n-- Start with your samples/reagents in Column 1 of your plate. In this example, you would pre-add 150 uL of concentrated sample to the first column of your 96-well plate.\n\n-- Define a ***Total Mixing Volume*** of 150uL, a ***Dilution Factor*** of 3, and set ***Number of Dilutions*** = 11.\n\n-- Your OT-2 will add 100uL of diluent to each empty well in your plate. Then it will transfer 50uL from Column 1 between each well/column in the plate.\n\n-- \"***Total mixing volume***\" = transfer volume + diluent volume.\n\n---\n\n---\n\n\n![Materials Needed](https://s3.amazonaws.com/opentrons-protocol-library-website/custom-README-images/customizable-serial-dilution/materials.png)\n\n-- [Opentrons OT-2](http://opentrons.com/ot-2)\n\n-- [Opentrons OT-2 Run App (Version 3.19 or later)](http://opentrons.com/ot-app)\n\n-- [Opentrons Tips](https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-300ul-tips-racks-9-600-tips) for selected Opentrons Pipette\n\n-- [12-Row, Automation-Friendly Trough](https://shop.opentrons.com/nest-12-well-reservoirs-15-ml/)\n\n-- [96-Well Plate](https://shop.opentrons.com/nest-96-well-plate-flat/) (found in our [Labware Library](https://labware.opentrons.com/?category=wellPlate))\n\n-- Diluent (Pre-loaded in row 1 of trough)\n\n-- Samples/Standards (Pre-loaded in Column 1 of a standard 96-well plate)\n\n", + "description": "With this protocol, you can do a simple serial dilution across a 96-well plate using either a single-channel or 8-channel pipette. This can be useful for everything from creating a simple standard curve to a concentration-limiting dilution. For more information (including data from the Opentrons Lab and other considerations), please see our [Technical Note](https://s3.amazonaws.com/opentrons-protocol-library-website/Technical+Notes/Serial+Dilution+OT2+Technical+Note.pdf).\n\n---\n\n---\n\n![serial dilution](https://s3.amazonaws.com/opentrons-protocol-library-website/custom-README-images/customizable-serial-dilution/Customizable+Serial+Dilution+Illustration+LATEST+VERSION.jpg)\n\nExample Setup\n\nThis protocol uses the inputs you define for \"Dilution Factor\" and \"Total Mixing Volume\" to automatically infer the necessary transfer volume for each dilution across your plate. For a 1 in 3 dilution series across an entire plate, as seen above:\n\n-- Start with your samples/reagents in Column 1 of your plate. In this example, you would pre-add 150 uL of concentrated sample to the first column of your 96-well plate.\n\n-- Define a Total Mixing Volume of 150uL, a Dilution Factor of 3, and set Number of Dilutions = 11.\n\n-- Your OT-2 will add 100uL of diluent to each empty well in your plate. Then it will transfer 50uL from Column 1 between each well/column in the plate.\n\n-- \"Total mixing volume\" = transfer volume + diluent volume.\n\n---\n\n---\n\n\n![Materials Needed](https://s3.amazonaws.com/opentrons-protocol-library-website/custom-README-images/customizable-serial-dilution/materials.png)\n\n-- [Opentrons OT-2](http://opentrons.com/ot-2)\n\n-- [Opentrons OT-2 Run App (Version 3.19 or later)](http://opentrons.com/ot-app)\n\n-- [Opentrons Tips](https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-300ul-tips-racks-9-600-tips) for selected Opentrons Pipette\n\n-- [12-Row, Automation-Friendly Trough](https://shop.opentrons.com/nest-12-well-reservoirs-15-ml/)\n\n-- [96-Well Plate](https://shop.opentrons.com/nest-96-well-plate-flat/) (found in our [Labware Library](https://labware.opentrons.com/?category=wellPlate))\n\n-- Diluent (Pre-loaded in row 1 of trough)\n\n-- Samples/Standards (Pre-loaded in Column 1 of a standard 96-well plate)\n\n", "internal": "Customizable Serial Dilution, v2\n", "notes": "Please reference our [Technical Note](https://s3.amazonaws.com/opentrons-protocol-library-website/Technical+Notes/Serial+Dilution+OT2+Technical+Note.pdf) for more information about the expected output of this protocol, in addition to expanded sample data from the Opentrons lab.\n\nWe understand that there are limitations to the use of this protocol, and we plan to make improvements soon. In the meantime, if you'd like to request a more complex dilution workflow, please use our [Protocol Development Request Form](https://opentrons-protocol-dev.paperform.co/). You can also download this Python file and modify it using our [API Documentation](https://docs.opentrons.com/). For additional questions about this protocol, please email .\n\n", "preview": "Perform a simple serial dilution across a 96-well plate using either a single-channel or multichannel pipette. This can be useful for everything from creating a simple standard curve to a concentration-limiting dilution.\n\n", - "process": "1. Choose the pipette you want to use from the dropdown menu above and which side it is installed on the OT-2\n2. Set your dilution factor.\n ***Example:*** If you want a 1:2 ratio of sample to total reaction volume, you would set your dilution factor to 2.\n3. Set your number of dilutions (max is 11, 10 if using blank)\n4. Set your total mixing volume. (Total mixing volume = transfer volume + diluent volume). Be careful to make sure this number does not exceed the volume capacity of your plate. To see how this number is used, scroll to the example above.\n5. Set whether a blank will be made or not. The blank will be added to the first available column in the plate.\n ***NOTE:*** 10 dilutions is the max allowed when using a blank\n6. Set your tip reuse strategy.\n ***Note:*** This defaults to no tip changes; adjust only if you want to change tips between each well.\n7. Set your air gap, if desired. This will add a specified amount of air into the tip after aspiration\n8. Download your customized OT-2 Serial Dilution protocol using the blue \"Download\" button.\n9. Upload into the Opentrons Run App and follow the instructions there to set up your deck and proceed to run!\n10. Make sure to add diluent to the first row of your 12-row trough and load your desired samples/standards into column 1 of your plate before running your protocol in the run app!\n\n", + "process": "1. Choose the pipette you want to use from the dropdown menu above and which side it is installed on the OT-2\n2. Set your dilution factor.\n Example: If you want a 1:2 ratio of sample to total reaction volume, you would set your dilution factor to 2.\n3. Set your number of dilutions (max is 11, 10 if using blank)\n4. Set your total mixing volume. (Total mixing volume = transfer volume + diluent volume). Be careful to make sure this number does not exceed the volume capacity of your plate. To see how this number is used, scroll to the example above.\n5. Set whether a blank will be made or not. The blank will be added to the first available column in the plate.\n NOTE: 10 dilutions is the max allowed when using a blank\n6. Set your tip reuse strategy.\n Note: This defaults to no tip changes; adjust only if you want to change tips between each well.\n7. Set your air gap, if desired. This will add a specified amount of air into the tip after aspiration\n8. Download your customized OT-2 Serial Dilution protocol using the blue \"Download\" button.\n9. Upload into the Opentrons Run App and follow the instructions there to set up your deck and proceed to run!\n10. Make sure to add diluent to the first row of your 12-row trough and load your desired samples/standards into column 1 of your plate before running your protocol in the run app!\n\n", "title": "Customizable Serial Dilution for OT-2" }, "notes": "Please reference our Technical Note for more information about the expected output of this protocol, in addition to expanded sample data from the Opentrons lab.\nWe understand that there are limitations to the use of this protocol, and we plan to make improvements soon. In the meantime, if you'd like to request a more complex dilution workflow, please use our Protocol Development Request Form. You can also download this Python file and modify it using our API Documentation. For additional questions about this protocol, please email support@opentrons.com.", diff --git a/protoBuilds/dinosaur/README.json b/protoBuilds/dinosaur/README.json index 99139caf7c..3288a5d041 100644 --- a/protoBuilds/dinosaur/README.json +++ b/protoBuilds/dinosaur/README.json @@ -8,7 +8,7 @@ "description": "Draw a picture of a dinosaur (Stegosaurus!) on a 96 well plate using food coloring.\n\n\n\n\nOpentrons 300uL Tips\nOpentrons 200uL Filter Tips\nBio-Rad 96 Well Plate 200 uL PCR\nNEST 96 Well Plate 100 uL PCR Full Skirt\nCorning 96 Well Plate 360 \u00b5L Flat\nNEST 96 Well Plate 200 \u00b5L Flat\nP300 Single Channel GEN2\n\nFor more detailed information on compatible labware, please visit our Labware Library.\n\n\nDeck Setup\n\nProtocol Steps\n\nDistribute 50 uL of green solution to all the necessary wells.\nDistribute 50 uL of blue solution to all the necessary wells.\nEnjoy the dinosaur!\n", "internal": "dinosaur", "markdown": { - "author": "[Opentrons](https://opentrons.com/)\n\n***Opentrons has launched a new Protocol Library. You should use the [new page for this protocol](library.opentrons.com/p/dinosaur). This page won\u2019t be available after January 31st, 2024.***\n\n", + "author": "[Opentrons](https://opentrons.com/)\n\n# Opentrons has launched a new Protocol Library. You should use the [new page for this protocol](library.opentrons.com/p/dinosaur). This page won\u2019t be available after January 31st, 2024.\n\n", "categories": "* Getting Started\n\t* Dinosaur\n\n", "description": "Draw a picture of a dinosaur (Stegosaurus!) on a 96 well plate using food coloring.\n\n![Dinosaur](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/dinosaur/dinosaur_result.png)\n\n---\n![Materials Needed](https://s3.amazonaws.com/opentrons-protocol-library-website/custom-README-images/001-General+Headings/materials.png)\n\n* [Opentrons 300uL Tips](https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-200ul-filter-tips)\n* [Opentrons 200uL Filter Tips](https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-200ul-filter-tips)\n* [Bio-Rad 96 Well Plate 200 uL PCR](https://labware.opentrons.com/biorad_96_wellplate_200ul_pcr/)\n* [NEST 96 Well Plate 100 uL PCR Full Skirt](https://labware.opentrons.com/nest_96_wellplate_100ul_pcr_full_skirt/)\n* [Corning 96 Well Plate 360 \u00b5L Flat](https://labware.opentrons.com/corning_96_wellplate_360ul_flat/)\n* [NEST 96 Well Plate 200 \u00b5L Flat](https://labware.opentrons.com/nest_96_wellplate_200ul_flat/)\n* [P300 Single Channel GEN2](https://shop.opentrons.com/collections/ot-2-robot/products/single-channel-electronic-pipette?variant=5984549109789)\n\nFor more detailed information on compatible labware, please visit our [Labware Library](https://labware.opentrons.com/).\n\n---\n![Setup](https://s3.amazonaws.com/opentrons-protocol-library-website/custom-README-images/001-General+Headings/Setup.png)\n\n**Deck Setup**\n![Deck Layout](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/dinosaur/dinosaur_deck_layout.png)\n\n\n**Protocol Steps**\n\n1. Distribute 50 uL of green solution to all the necessary wells.\n2. Distribute 50 uL of blue solution to all the necessary wells.\n3. Enjoy the dinosaur!\n\n", "internal": "dinosaur", diff --git a/protoBuilds/illumina-nextera-XT-library-prep-part1/README.json b/protoBuilds/illumina-nextera-XT-library-prep-part1/README.json index a7509e7f1e..6cf58e15e2 100644 --- a/protoBuilds/illumina-nextera-XT-library-prep-part1/README.json +++ b/protoBuilds/illumina-nextera-XT-library-prep-part1/README.json @@ -8,7 +8,7 @@ "description": "Part 1 of 4: Tagment Genomic DNA and Amplify Libraries\nLinks:\n Part 1: Tagment and Amplify\n Part 2: Clean Up Libraries\n Part 3: Normalize Libraries\n Part 4: Pool Libraries\nWith this protocol, your robot can perform the Nextera XT DNA Library Prep Kit protocol described by the Illumina Reference Guide.\nThis is part 1 of the protocol, which includes the steps (1) Tagment Genomic DNA and (2) Amplify Libraries.\nThe tagmentation step uses Nextera transposase to fragment DNA into sizes suitable for sequencing, and then tags the DNA with adapter sequences. The library amplification step increases the yield of the tagmented DNA using PCR. PCR adds the Index 1 (i7), Index 2 (i5), and full adapter sequences to the tagmented DNA from the previous step. This protocol assumes you are taking your plate off the OT-2 and thermocycling on a stand-alone PCR machine according to the Illumina Reference Guide.\nAfter the two steps carried out in this protocol, you can safely stop work and return to it at a later point. If you are stopping, seal the plate and store at 2\u00b0C to 8\u00b0C for up to 2 days.", "internal": "bU7eUGEh\n872", "markdown": { - "author": "[Opentrons](https://opentrons.com/)\n\n***Opentrons has launched a new Protocol Library. You should use the [new page for this protocol](library.opentrons.com/p/illumina-nextera-xt-library-prep-part1). This page won\u2019t be available after January 31st, 2024.***\n\n", + "author": "[Opentrons](https://opentrons.com/)\n\n# Opentrons has launched a new Protocol Library. You should use the [new page for this protocol](library.opentrons.com/p/illumina-nextera-xt-library-prep-part1). This page won\u2019t be available after January 31st, 2024.\n\n", "categories": "* Featured\n * NGS Library Prep: Illumina Nextera XT\n\n", "description": "Part 1 of 4: Tagment Genomic DNA and Amplify Libraries\n\nLinks:\n* [Part 1: Tagment and Amplify](http://protocols.opentrons.com/protocol/illumina-nextera-XT-library-prep-part1)\n* [Part 2: Clean Up Libraries](http://protocols.opentrons.com/protocol/illumina-nextera-XT-library-prep-part2)\n* [Part 3: Normalize Libraries](http://protocols.opentrons.com/protocol/illumina-nextera-XT-library-prep-part3)\n* [Part 4: Pool Libraries](http://protocols.opentrons.com/protocol/illumina-nextera-XT-library-prep-part4)\n\nWith this protocol, your robot can perform the Nextera XT DNA Library Prep Kit protocol described by the [Illumina Reference Guide](https://support.illumina.com/content/dam/illumina-support/documents/documentation/chemistry_documentation/samplepreps_nextera/nextera-xt/nextera-xt-library-prep-reference-guide-15031942-06.pdf).\n\nThis is part 1 of the protocol, which includes the steps (1) Tagment Genomic DNA and (2) Amplify Libraries.\n\nThe tagmentation step uses Nextera transposase to fragment DNA into sizes suitable for sequencing, and then tags the DNA with adapter sequences. The library amplification step increases the yield of the tagmented DNA using PCR. PCR adds the Index 1 (i7), Index 2 (i5), and full adapter sequences to the tagmented DNA from the previous step. This protocol assumes you are taking your plate off the OT-2 and thermocycling on a stand-alone PCR machine according to the [Illumina Reference Guide](https://support.illumina.com/content/dam/illumina-support/documents/documentation/chemistry_documentation/samplepreps_nextera/nextera-xt/nextera-xt-library-prep-reference-guide-15031942-05.pdf).\n\nAfter the two steps carried out in this protocol, you can safely stop work and return to it at a later point. If you are stopping, seal the plate and store at 2\u00b0C to 8\u00b0C for up to 2 days.\n\n", "internal": "bU7eUGEh\n872\n", diff --git a/protoBuilds/illumina-nextera-XT-library-prep-part2/README.json b/protoBuilds/illumina-nextera-XT-library-prep-part2/README.json index 3633857451..39a8116c07 100644 --- a/protoBuilds/illumina-nextera-XT-library-prep-part2/README.json +++ b/protoBuilds/illumina-nextera-XT-library-prep-part2/README.json @@ -8,7 +8,7 @@ "description": "Part 2 of 4: Clean Up Libraries\nLinks:\n Part 1: Tagment and Amplify\n Part 2: Clean Up Libraries\n Part 3: Normalize Libraries\n Part 4: Pool Libraries\nWith this protocol, your robot can perform the Nextera XT DNA Library Prep Kit protocol describe by the Illumina Reference Guide.\nThis is Part 2 of the protocol, which consists of just step (3) of the overall process: clean up libraries. This step uses AMPure XP beads to purify the library DNA and remove short library fragments after the previous step, library amplification.\nAfter this step, it is safe to stop the workflow and return to it at a later point. If you are stopping, seal the plate and store at -15\u00b0C to -25\u00b0C for up to seven days.\n\n\nTo purchase tips, reagents, or pipettes, please visit our online store or contact our sales team at info@opentrons.com\n\nOpentrons OT-2\nOpentrons OT-2 Run App (Version 3.15.0 or later)\nOpentrons P300 or P50 Pipette (Single or 8-Channel) and corresponding Tips\nOpentrons Magnetic Module\nBio-Rad 96-Well Plate, 200\u03bcl containing samples from Part 1\nBio-Rad 96-Well Plate, 200\u03bcl, clean and empty (x2)\nUSA Scientific 12-Channel Reservoir\nNextera XT DNA Library Prep Kit\n\nFor more detailed information on compatible labware, please visit our Labware Library.\n\n\nThis protocol requires specific labware in a specific set-up.\nSlot 1: Bio-Rad Plate (clean and empty); final elution will be transferred to this plate.\nSlot 2: USA Scientific 12-Channel Reservoir\n A1: Resuspension Buffer\n A2: AMPure XP Beads\n A3: 80% Ethanol\n A4: 80% Ethanol (if needed)\n A5: 80% Ethanol (if needed)\n A9: Liquid Waste\n A10: Liquid Waste\n A11: Liquid Waste\n* A12: Liquid Waste\nSlot 4: Magnetic Module with Bio-Rad Plate (clean and empty)\nSlot 5: Bio-Rad Plate containing samples from Part 1\nSlot 6: Opentrons Tip Rack\nSlot 7: Opentrons Tip Rack\nSlot 8: Opentrons Tip Rack\n* Note: If your protocol requires more tips due to the parameters you set, you will need to fill subsequent slots with tip racks.\nUsing the customization fields below, set up your protocol.\n Pipette Model: Select which pipette (P50/P300; Single/8-Channel) you will use for this protocol.\n Pipette Mount: Specify which mount your single-channel pipette is on (left or right).\n Magnetic Module Gen: Specify which Magnetic Module is in use\n Number of Samples: Select the number of samples (1-96) to be run in the protocol.\n Initial Product Volume (\u00b5l): Select the starting volume of PCR product to be used in the protocol.\n Bead Ratio: Select the bead ratio. 1.8 is recommended for small (300-500 bp) inputs, and 0.6 is recommended for larger (>500 bp) samples. Please see documentation for more information.\n Resuspension Buffer Volume (\u00b5L): Specify how much Resuspension Buffer is added to the wells.\n Final PCR Product Volume (\u00b5L): Specify the final elution volume to be transferred.\n* Dry Time (minutes): Specify how long (in minutes) you would like to let the beads dry after the wash steps and before adding the resuspension buffer.", "internal": "bU7eUGEh\n872", "markdown": { - "author": "[Opentrons](https://opentrons.com/)\n\n***Opentrons has launched a new Protocol Library. You should use the [new page for this protocol](library.opentrons.com/p/illumina-nextera-xt-library-prep-part2). This page won\u2019t be available after January 31st, 2024.***\n\n", + "author": "[Opentrons](https://opentrons.com/)\n\n# Opentrons has launched a new Protocol Library. You should use the [new page for this protocol](library.opentrons.com/p/illumina-nextera-xt-library-prep-part2). This page won\u2019t be available after January 31st, 2024.\n\n", "categories": "* Featured\n * NGS Library Prep: Illumina Nextera XT\n\n", "description": "Part 2 of 4: Clean Up Libraries\n\nLinks:\n* [Part 1: Tagment and Amplify](http://protocols.opentrons.com/protocol/illumina-nextera-XT-library-prep-part1)\n* [Part 2: Clean Up Libraries](http://protocols.opentrons.com/protocol/illumina-nextera-XT-library-prep-part2)\n* [Part 3: Normalize Libraries](http://protocols.opentrons.com/protocol/illumina-nextera-XT-library-prep-part3)\n* [Part 4: Pool Libraries](http://protocols.opentrons.com/protocol/illumina-nextera-XT-library-prep-part4)\n\nWith this protocol, your robot can perform the Nextera XT DNA Library Prep Kit protocol describe by the [Illumina Reference Guide](https://support.illumina.com/content/dam/illumina-support/documents/documentation/chemistry_documentation/samplepreps_nextera/nextera-xt/nextera-xt-library-prep-reference-guide-15031942-06.pdf).\n\nThis is Part 2 of the protocol, which consists of just step (3) of the overall process: clean up libraries. This step uses AMPure XP beads to purify the library DNA and remove short library fragments after the previous step, library amplification.\n\nAfter this step, it is safe to stop the workflow and return to it at a later point. If you are stopping, seal the plate and store at -15\u00b0C to -25\u00b0C for up to seven days.\n\n---\n![Materials Needed](https://s3.amazonaws.com/opentrons-protocol-library-website/custom-README-images/001-General+Headings/materials.png)\n\nTo purchase tips, reagents, or pipettes, please visit our [online store](https://shop.opentrons.com/) or contact our sales team at [info@opentrons.com](mailto:info@opentrons.com)\n\n* [Opentrons OT-2](https://shop.opentrons.com/collections/ot-2-robot/products/ot-2)\n* [Opentrons OT-2 Run App (Version 3.15.0 or later)](https://opentrons.com/ot-app/)\n* [Opentrons P300 or P50 Pipette (Single or 8-Channel)](https://shop.opentrons.com/collections/ot-2-pipettes) and corresponding [Tips](https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-300ul-tips)\n* [Opentrons Magnetic Module](https://shop.opentrons.com/collections/hardware-modules/products/magdeck)\n* [Bio-Rad 96-Well Plate, 200\u03bcl](https://labware.opentrons.com/biorad_96_wellplate_200ul_pcr) containing samples from [Part 1](http://protocols.opentrons.com/protocol/illumina-nextera-XT-library-prep-part1)\n* [Bio-Rad 96-Well Plate, 200\u03bcl](https://labware.opentrons.com/biorad_96_wellplate_200ul_pcr), clean and empty (x2)\n* [USA Scientific 12-Channel Reservoir](https://labware.opentrons.com/usascientific_12_reservoir_22ml?category=reservoir)\n* [Nextera XT DNA Library Prep Kit](https://www.illumina.com/products/by-type/sequencing-kits/library-prep-kits/nextera-xt-dna.html)\n\nFor more detailed information on compatible labware, please visit our [Labware Library](https://labware.opentrons.com/).\n\n\n---\n![Setup](https://s3.amazonaws.com/opentrons-protocol-library-website/custom-README-images/001-General+Headings/Setup.png)\n\nThis protocol requires specific labware in a specific set-up.\n\nSlot 1: [Bio-Rad Plate](https://labware.opentrons.com/biorad_96_wellplate_200ul_pcr?category=wellPlate) (clean and empty); final elution will be transferred to this plate.\n\nSlot 2: [USA Scientific 12-Channel Reservoir](https://labware.opentrons.com/usascientific_12_reservoir_22ml?category=reservoir)\n* A1: Resuspension Buffer\n* A2: AMPure XP Beads\n* A3: 80% Ethanol\n* A4: 80% Ethanol (if needed)\n* A5: 80% Ethanol (if needed)\n* A9: Liquid Waste\n* A10: Liquid Waste\n* A11: Liquid Waste\n* A12: Liquid Waste\n\nSlot 4: [Magnetic Module](https://shop.opentrons.com/collections/hardware-modules/products/magdeck) with [Bio-Rad Plate](https://labware.opentrons.com/biorad_96_wellplate_200ul_pcr?category=wellPlate) (clean and empty)\n\nSlot 5: [Bio-Rad Plate](https://labware.opentrons.com/biorad_96_wellplate_200ul_pcr) containing samples from [Part 1](http://protocols.opentrons.com/protocol/illumina-nextera-XT-library-prep-part1)\n\nSlot 6: [Opentrons Tip Rack](https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-300ul-tips)\n\nSlot 7: [Opentrons Tip Rack](https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-300ul-tips)\n\nSlot 8: [Opentrons Tip Rack](https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-300ul-tips)\n* Note: If your protocol requires more tips due to the parameters you set, you will need to fill subsequent slots with tip racks.\n\n\nUsing the customization fields below, set up your protocol.\n* Pipette Model: Select which pipette (P50/P300; Single/8-Channel) you will use for this protocol.\n* Pipette Mount: Specify which mount your single-channel pipette is on (left or right).\n* Magnetic Module Gen: Specify which Magnetic Module is in use\n* Number of Samples: Select the number of samples (1-96) to be run in the protocol.\n* Initial Product Volume (\u00b5l): Select the starting volume of PCR product to be used in the protocol.\n* Bead Ratio: Select the bead ratio. 1.8 is recommended for small (300-500 bp) inputs, and 0.6 is recommended for larger (>500 bp) samples. Please see [documentation](https://support.illumina.com/content/dam/illumina-support/documents/documentation/chemistry_documentation/samplepreps_nextera/nextera-xt/nextera-xt-library-prep-reference-guide-15031942-05.pdf) for more information.\n* Resuspension Buffer Volume (\u00b5L): Specify how much Resuspension Buffer is added to the wells.\n* Final PCR Product Volume (\u00b5L): Specify the final elution volume to be transferred.\n* Dry Time (minutes): Specify how long (in minutes) you would like to let the beads dry after the wash steps and before adding the resuspension buffer.\n\n\n\n\n\n", "internal": "bU7eUGEh\n872\n", diff --git a/protoBuilds/macherey-nagel-nucleomag-DNA-microbiome/README.json b/protoBuilds/macherey-nagel-nucleomag-DNA-microbiome/README.json index f34788f18c..fcd22f2e03 100644 --- a/protoBuilds/macherey-nagel-nucleomag-DNA-microbiome/README.json +++ b/protoBuilds/macherey-nagel-nucleomag-DNA-microbiome/README.json @@ -17,7 +17,7 @@ "internal": "macherey-nagal-nucleomag-dna-microbiome\n", "labware": "* Macherey Nagel 96 Well Square Well Block\n* Macherey Nagel 96 Well Elution Plate U-bottom\n* [Opentrons 96 Tip Rack 300 \u00b5L](https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-300ul-tips)\n* [Opentrons 24 Tube Rack with Generic 2 mL Screwcap](https://shop.opentrons.com/collections/opentrons-tips/products/tube-rack-set-1)\n* [USA Scientific 12 Well Reservoir 22 mL #1061-8150](https://www.usascientific.com/12-channel-automation-reservoir.aspx)\n* [Opentrons 96 Tip Rack 1000 \u00b5L](https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-1000ul-tips)\n* [Agilent 1 Well Reservoir 290 mL #201252-100](https://www.agilent.com/store/en_US/Prod-201252-100/201252-100)\n\n\n", "modules": "* [Opentrons Magnetic Module (GEN2)](https://shop.opentrons.com/magnetic-module-gen2/)\n\n\n", - "partner": "[Opentrons](https://opentrons.com/)\n\n\n***Opentrons has launched a new Protocol Library. You should use the [new page for this protocol](library.opentrons.com/p/macherey-nagel-nucleomag-dna-microbiome). This page won\u2019t be available after January 31st, 2024.***\n\n", + "partner": "[Opentrons](https://opentrons.com/)\n\n\n# Opentrons has launched a new Protocol Library. You should use the [new page for this protocol](library.opentrons.com/p/macherey-nagel-nucleomag-dna-microbiome). This page won\u2019t be available after January 31st, 2024.\n\n", "pipettes": "* [Opentrons P300 8 Channel Electronic Pipette (GEN2)](https://shop.opentrons.com/8-channel-electronic-pipette/)\n* [Opentrons P1000 Single Channel Electronic Pipette (GEN2)](https://shop.opentrons.com/single-channel-electronic-pipette-p20/)\n\n\n", "protocol-steps": "1. Binding Step\n2. Wash 1\n3. Wash 2\n4. Wash 3\n5. Wash 4\n6. Delay for drying\n7. Elution\n
\n
\n* Note\nThe default values for all volumes, incubation times and mix repetitions were pretested and validated.\nWe do not recommend to change them. If you still decide to change them please scale all volumes proportionally.\nFor change recommendations please contact automation-bio@mn-net.de\n
\n
\n\n**Process**\n1. Input your protocol parameters below.\n2. Download your protocol and unzip if needed.\n3. Upload your custom labware to the [OT App](https://opentrons.com/ot-app) by navigating to `More` > `Custom Labware` > `Add Labware`, and selecting your labware files (.json extensions) if needed.\n4. Upload your protocol file (.py extension) to the [OT App](https://opentrons.com/ot-app) in the `Protocol` tab.\n5. Set up your deck according to the deck map.\n6. Calibrate your labware, tiprack and pipette using the OT App. For calibration tips, check out our [support articles](https://support.opentrons.com/en/collections/1559720-guide-for-getting-started-with-the-ot-2).\n7. Hit \"Run\".\n
\n
\n**Additional Notes**\n
\nIf you have any questions about this protocol, please contact the Protocol Development Team by filling out the [Troubleshooting Survey](https://protocol-troubleshooting.paperform.co/).\n
\n**Disclaimer**: MACHEREY-NAGEL GmbH & Co. KG makes every effort to include accurate and up-to-date information within this publication; however, it is possible that omissions or errors might have occurred. MACHEREY-NAGEL GmbH & Co. KG cannot, therefore, make any representations or warranties, expressed or implied, as to the accuracy or completeness of the information provided in this publication. Changes in this publication can be made at any time without notice. For technical details and detailed procedures of the specifications provided in this document please contact your MACHEREY-NAGEL representative. This publication may contain reference to applications and products which are not available in all markets. Please check with your local sales representative.\nAll mentioned trademarks are protected by law. All used names and denotations can be brands, trademarks, or registered labels of their respective owner \u2013 also if they are not special denotation. To mention products and brands is only a kind of information (i.e., it does not offend against trademarks and brands and can not be seen as a kind of recommendation or assessment). Reference herein to any specific commercial product, process, or service by trade name, trademark, manufacturer, or otherwise, does not necessarily constitute or imply its endorsement, recommendation, or support by MACHEREY-NAGEL GmbH & Co. KG or Opentrons. Any views or opinions expressed herein by the authors' do not necessarily state or reflect those of MACHEREY-NAGEL or the Eppendorf AG. NucleoMag\u00ae is a registered trademark of MACHEREY-NAGEL GmbH & Co. KG, D\u00fcren, Germany. Opentrons OT-2 is a device from Opentrons, New York, USA.\n
\n* The Download links includes all Protocols in their respective subfolders as well as the .json files for the two labware files.\n\n\n", "reagent-setup": "![reagents](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/macherey-nagel-dna-microbiome/reag_microbiome.png)\n\n\n", diff --git a/protoBuilds/macherey-nagel-nucleomag-clean-up/README.json b/protoBuilds/macherey-nagel-nucleomag-clean-up/README.json index b6b96269ef..5f2da7d8d3 100644 --- a/protoBuilds/macherey-nagel-nucleomag-clean-up/README.json +++ b/protoBuilds/macherey-nagel-nucleomag-clean-up/README.json @@ -17,7 +17,7 @@ "internal": "macherey-nagel-nucleomag-clean-up\n", "labware": "* 96 Well PCR Plate\n* [Opentrons 96 Tip Rack 300 \u00b5L](https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-300ul-tips)\n* [Opentrons 24 Tube Rack with Generic 2 mL Screwcap](https://shop.opentrons.com/collections/opentrons-tips/products/tube-rack-set-1)\n* [USA Scientific 12 Well Reservoir 22 mL #1061-8150](https://www.usascientific.com/12-channel-automation-reservoir.aspx)\n* [Opentrons 96 Tip Rack 1000 \u00b5L](https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-1000ul-tips)\n* 96 Deepwell Plate 2mL\n* [Agilent 1 Well Reservoir 290 mL #201252-100](https://www.agilent.com/store/en_US/Prod-201252-100/201252-100)\n\n\n", "modules": "* [Opentrons Magnetic Module (GEN2)](https://shop.opentrons.com/magnetic-module-gen2/)\n\n\n", - "partner": "[Opentrons](https://opentrons.com/)\n\n\n***Opentrons has launched a new Protocol Library. You should use the [new page for this protocol](library.opentrons.com/p/macherey-nagel-nucleomag-clean-up). This page won\u2019t be available after January 31st, 2024.***\n\n", + "partner": "[Opentrons](https://opentrons.com/)\n\n\n# Opentrons has launched a new Protocol Library. You should use the [new page for this protocol](library.opentrons.com/p/macherey-nagel-nucleomag-clean-up). This page won\u2019t be available after January 31st, 2024.\n\n", "pipettes": "* [Opentrons P300 8 Channel Electronic Pipette (GEN2)](https://shop.opentrons.com/8-channel-electronic-pipette/)\n\n\n", "protocol-steps": "1. Binding\n2. Wash 1\n3. Wash 2\n4. Elution\n
\n
\n* Note\nThe default values for all volumes, incubation times and mix repetitions were pretested and validated.\nWe do not recommend to change them. If you still decide to change them please scale all volumes proportionally.\nFor change recommendations please contact automation-bio@mn-net.de\n
\n
\n\n**Process**\n1. Input your protocol parameters below.\n2. Download your protocol and unzip if needed.\n3. Upload your custom labware to the [OT App](https://opentrons.com/ot-app) by navigating to `More` > `Custom Labware` > `Add Labware`, and selecting your labware files (.json extensions) if needed.\n4. Upload your protocol file (.py extension) to the [OT App](https://opentrons.com/ot-app) in the `Protocol` tab.\n5. Set up your deck according to the deck map.\n6. Calibrate your labware, tiprack and pipette using the OT App. For calibration tips, check out our [support articles](https://support.opentrons.com/en/collections/1559720-guide-for-getting-started-with-the-ot-2).\n7. Hit \"Run\".\n
\n
\n**Additional Notes**\n
\nIf you have any questions about this protocol, please contact the Protocol Development Team by filling out the [Troubleshooting Survey](https://protocol-troubleshooting.paperform.co/).\n
\n**Disclaimer**: MACHEREY-NAGEL GmbH & Co. KG makes every effort to include accurate and up-to-date information within this publication; however, it is possible that omissions or errors might have occurred. MACHEREY-NAGEL GmbH & Co. KG cannot, therefore, make any representations or warranties, expressed or implied, as to the accuracy or completeness of the information provided in this publication. Changes in this publication can be made at any time without notice. For technical details and detailed procedures of the specifications provided in this document please contact your MACHEREY-NAGEL representative. This publication may contain reference to applications and products which are not available in all markets. Please check with your local sales representative.\nAll mentioned trademarks are protected by law. All used names and denotations can be brands, trademarks, or registered labels of their respective owner \u2013 also if they are not special denotation. To mention products and brands is only a kind of information (i.e., it does not offend against trademarks and brands and can not be seen as a kind of recommendation or assessment). Reference herein to any specific commercial product, process, or service by trade name, trademark, manufacturer, or otherwise, does not necessarily constitute or imply its endorsement, recommendation, or support by MACHEREY-NAGEL GmbH & Co. KG or Opentrons. Any views or opinions expressed herein by the authors' do not necessarily state or reflect those of MACHEREY-NAGEL or the Eppendorf AG. NucleoMag\u00ae is a registered trademark of MACHEREY-NAGEL GmbH & Co. KG, D\u00fcren, Germany. Opentrons OT-2 is a device from Opentrons, New York, USA.\n
\n* The Download links includes all Protocols in their respective subfolders as well as the .json files for the two labware files.\n\n\n", "reagent-setup": "![reagents](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/macherey-nagel/mn-ngs-reagents.png)\n\n\n", diff --git a/protoBuilds/macherey-nagel-nucleomag-dna-food/README.json b/protoBuilds/macherey-nagel-nucleomag-dna-food/README.json index 46b4beb0e8..08f4849c4c 100644 --- a/protoBuilds/macherey-nagel-nucleomag-dna-food/README.json +++ b/protoBuilds/macherey-nagel-nucleomag-dna-food/README.json @@ -17,7 +17,7 @@ "internal": "macherey-nagal-nucleomag-dna-food\n", "labware": "* Macherey Nagel 96 Well Square Well Block\n* Macherey Nagel 96 Well Elution Plate U-bottom\n* [Opentrons 96 Tip Rack 300 \u00b5L](https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-300ul-tips)\n* [Opentrons 24 Tube Rack with Generic 2 mL Screwcap](https://shop.opentrons.com/collections/opentrons-tips/products/tube-rack-set-1)\n* [USA Scientific 12 Well Reservoir 22 mL #1061-8150](https://www.usascientific.com/12-channel-automation-reservoir.aspx)\n* [Opentrons 96 Tip Rack 1000 \u00b5L](https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-1000ul-tips)\n* [Agilent 1 Well Reservoir 290 mL #201252-100](https://www.agilent.com/store/en_US/Prod-201252-100/201252-100)\n\n\n", "modules": "* [Opentrons Magnetic Module (GEN2)](https://shop.opentrons.com/magnetic-module-gen2/)\n\n\n", - "partner": "[Opentrons](https://opentrons.com/)\n\n\n***Opentrons has launched a new Protocol Library. You should use the [new page for this protocol](library.opentrons.com/p/macherey-nagel-nucleomag-dna-food). This page won\u2019t be available after January 31st, 2024.***\n\n", + "partner": "[Opentrons](https://opentrons.com/)\n\n\n# Opentrons has launched a new Protocol Library. You should use the [new page for this protocol](library.opentrons.com/p/macherey-nagel-nucleomag-dna-food). This page won\u2019t be available after January 31st, 2024.\n\n", "pipettes": "* [Opentrons P300 8 Channel Electronic Pipette (GEN2)](https://shop.opentrons.com/8-channel-electronic-pipette/)\n* [Opentrons P1000 Single Channel Electronic Pipette (GEN2)](https://shop.opentrons.com/single-channel-electronic-pipette-p20/)\n\n\n", "protocol-steps": "1. Binding Step\n2. Wash 1\n3. Wash 2\n4. Wash 3\n5. Delay for drying\n6. Elution\n
\n
\n* Note\nThe default values for all volumes, incubation times and mix repetitions were pretested and validated.\nWe do not recommend to change them. If you still decide to change them please scale all volumes proportionally.\nFor change recommendations please contact automation-bio@mn-net.de\n
\n
\n\n**Process**\n1. Input your protocol parameters below.\n2. Download your protocol and unzip if needed.\n3. Upload your custom labware to the [OT App](https://opentrons.com/ot-app) by navigating to `More` > `Custom Labware` > `Add Labware`, and selecting your labware files (.json extensions) if needed.\n4. Upload your protocol file (.py extension) to the [OT App](https://opentrons.com/ot-app) in the `Protocol` tab.\n5. Set up your deck according to the deck map.\n6. Calibrate your labware, tiprack and pipette using the OT App. For calibration tips, check out our [support articles](https://support.opentrons.com/en/collections/1559720-guide-for-getting-started-with-the-ot-2).\n7. Hit \"Run\".\n
\n
\n**Additional Notes**\n
\nIf you have any questions about this protocol, please contact the Protocol Development Team by filling out the [Troubleshooting Survey](https://protocol-troubleshooting.paperform.co/).\n
\n**Disclaimer**: MACHEREY-NAGEL GmbH & Co. KG makes every effort to include accurate and up-to-date information within this publication; however, it is possible that omissions or errors might have occurred. MACHEREY-NAGEL GmbH & Co. KG cannot, therefore, make any representations or warranties, expressed or implied, as to the accuracy or completeness of the information provided in this publication. Changes in this publication can be made at any time without notice. For technical details and detailed procedures of the specifications provided in this document please contact your MACHEREY-NAGEL representative. This publication may contain reference to applications and products which are not available in all markets. Please check with your local sales representative.\nAll mentioned trademarks are protected by law. All used names and denotations can be brands, trademarks, or registered labels of their respective owner \u2013 also if they are not special denotation. To mention products and brands is only a kind of information (i.e., it does not offend against trademarks and brands and can not be seen as a kind of recommendation or assessment). Reference herein to any specific commercial product, process, or service by trade name, trademark, manufacturer, or otherwise, does not necessarily constitute or imply its endorsement, recommendation, or support by MACHEREY-NAGEL GmbH & Co. KG or Opentrons. Any views or opinions expressed herein by the authors' do not necessarily state or reflect those of MACHEREY-NAGEL or the Eppendorf AG. NucleoMag\u00ae is a registered trademark of MACHEREY-NAGEL GmbH & Co. KG, D\u00fcren, Germany. Opentrons OT-2 is a device from Opentrons, New York, USA.\n
\n* The Download links includes all Protocols in their respective subfolders as well as the .json files for the two labware files.\n\n\n", "reagent-setup": "![reagents](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/macherey-nagel-dna-food/line56reagents.png)\n\n\n", diff --git a/protoBuilds/macherey-nagel-nucleomag-tissue/README.json b/protoBuilds/macherey-nagel-nucleomag-tissue/README.json index 4dcab4f77a..60dc3c03e9 100644 --- a/protoBuilds/macherey-nagel-nucleomag-tissue/README.json +++ b/protoBuilds/macherey-nagel-nucleomag-tissue/README.json @@ -17,7 +17,7 @@ "internal": "macherey-nagel-nucleomag-tissue\n", "labware": "* Macherey Nagel 96 Well Square Well Block\n* Macherey Nagel 96 Well Elution Plate U-bottom\n* [Opentrons 96 Tip Rack 300 \u00b5L](https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-300ul-tips)\n* [Opentrons 24 Tube Rack with Generic 2 mL Screwcap](https://shop.opentrons.com/collections/opentrons-tips/products/tube-rack-set-1)\n* [USA Scientific 12 Well Reservoir 22 mL #1061-8150](https://www.usascientific.com/12-channel-automation-reservoir.aspx)\n* [Opentrons 96 Tip Rack 1000 \u00b5L](https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-1000ul-tips)\n* [Agilent 1 Well Reservoir 290 mL #201252-100](https://www.agilent.com/store/en_US/Prod-201252-100/201252-100)\n\n\n", "modules": "* [Opentrons Magnetic Module (GEN2)](https://shop.opentrons.com/magnetic-module-gen2/)\n\n\n", - "partner": "[Opentrons](https://opentrons.com/)\n\n\n***Opentrons has launched a new Protocol Library. You should use the [new page for this protocol](library.opentrons.com/p/macherey-nagel-nucleomag-tissue). This page won\u2019t be available after January 31st, 2024.***\n\n", + "partner": "[Opentrons](https://opentrons.com/)\n\n\n# Opentrons has launched a new Protocol Library. You should use the [new page for this protocol](library.opentrons.com/p/macherey-nagel-nucleomag-tissue). This page won\u2019t be available after January 31st, 2024.\n\n", "pipettes": "* [Opentrons P300 8 Channel Electronic Pipette (GEN2)](https://shop.opentrons.com/8-channel-electronic-pipette/)\n* [Opentrons P1000 Single Channel Electronic Pipette (GEN2)](https://shop.opentrons.com/single-channel-electronic-pipette-p20/)\n\n\n", "protocol-steps": "1. Binding Step\n2. Wash 1\n3. Wash 2\n4. Wash 3\n5. Delay for drying\n6. Elution\n
\n
\n* Note\nThe default values for all volumes, incubation times and mix repetitions were pretested and validated.\nWe do not recommend to change them. If you still decide to change them please scale all volumes proportionally.\nFor change recommendations please contact automation-bio@mn-net.de\n
\n
\n\n**Process**\n1. Input your protocol parameters below.\n2. Download your protocol and unzip if needed.\n3. Upload your custom labware to the [OT App](https://opentrons.com/ot-app) by navigating to `More` > `Custom Labware` > `Add Labware`, and selecting your labware files (.json extensions) if needed.\n4. Upload your protocol file (.py extension) to the [OT App](https://opentrons.com/ot-app) in the `Protocol` tab.\n5. Set up your deck according to the deck map.\n6. Calibrate your labware, tiprack and pipette using the OT App. For calibration tips, check out our [support articles](https://support.opentrons.com/en/collections/1559720-guide-for-getting-started-with-the-ot-2).\n7. Hit \"Run\".\n
\n
\n**Additional Notes**\n
\nIf you have any questions about this protocol, please contact the Protocol Development Team by filling out the [Troubleshooting Survey](https://protocol-troubleshooting.paperform.co/).\n
\n**Disclaimer**: MACHEREY-NAGEL GmbH & Co. KG makes every effort to include accurate and up-to-date information within this publication; however, it is possible that omissions or errors might have occurred. MACHEREY-NAGEL GmbH & Co. KG cannot, therefore, make any representations or warranties, expressed or implied, as to the accuracy or completeness of the information provided in this publication. Changes in this publication can be made at any time without notice. For technical details and detailed procedures of the specifications provided in this document please contact your MACHEREY-NAGEL representative. This publication may contain reference to applications and products which are not available in all markets. Please check with your local sales representative.\nAll mentioned trademarks are protected by law. All used names and denotations can be brands, trademarks, or registered labels of their respective owner \u2013 also if they are not special denotation. To mention products and brands is only a kind of information (i.e., it does not offend against trademarks and brands and can not be seen as a kind of recommendation or assessment). Reference herein to any specific commercial product, process, or service by trade name, trademark, manufacturer, or otherwise, does not necessarily constitute or imply its endorsement, recommendation, or support by MACHEREY-NAGEL GmbH & Co. KG or Opentrons. Any views or opinions expressed herein by the authors' do not necessarily state or reflect those of MACHEREY-NAGEL or the Eppendorf AG. NucleoMag\u00ae is a registered trademark of MACHEREY-NAGEL GmbH & Co. KG, D\u00fcren, Germany. Opentrons OT-2 is a device from Opentrons, New York, USA.\n
\n* The Download links includes all Protocols in their respective subfolders as well as the .json files for the two labware files.\n\n\n", "reagent-setup": "![reagents](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/macherey-nagel-nucleomag-tissue/reag_tissue.png)\n\n\n", diff --git a/protoBuilds/macherey-nagel-nucleomag-virus/README.json b/protoBuilds/macherey-nagel-nucleomag-virus/README.json index d5fef902fb..7848f86eca 100644 --- a/protoBuilds/macherey-nagel-nucleomag-virus/README.json +++ b/protoBuilds/macherey-nagel-nucleomag-virus/README.json @@ -17,7 +17,7 @@ "internal": "macherey-nagel-nucleomag-virus\n", "labware": "* Macherey Nagel 96 Well Square Well Block\n* Macherey Nagel 96 Well Elution Plate U-bottom\n* [Opentrons 96 Tip Rack 300 \u00b5L](https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-300ul-tips)\n* [Opentrons 24 Tube Rack with Generic 2 mL Screwcap](https://shop.opentrons.com/collections/opentrons-tips/products/tube-rack-set-1)\n* [USA Scientific 12 Well Reservoir 22 mL #1061-8150](https://www.usascientific.com/12-channel-automation-reservoir.aspx)\n* [Opentrons 96 Tip Rack 1000 \u00b5L](https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-1000ul-tips)\n* [Agilent 1 Well Reservoir 290 mL #201252-100](https://www.agilent.com/store/en_US/Prod-201252-100/201252-100)\n\n\n", "modules": "* [Opentrons Magnetic Module (GEN2)](https://shop.opentrons.com/magnetic-module-gen2/)\n\n\n", - "partner": "[Opentrons](https://opentrons.com/)\n\n\n***Opentrons has launched a new Protocol Library. You should use the [new page for this protocol](library.opentrons.com/p/macherey-nagel-nucleomag-virus). This page won\u2019t be available after January 31st, 2024.***\n\n", + "partner": "[Opentrons](https://opentrons.com/)\n\n\n# Opentrons has launched a new Protocol Library. You should use the [new page for this protocol](library.opentrons.com/p/macherey-nagel-nucleomag-virus). This page won\u2019t be available after January 31st, 2024.\n\n", "pipettes": "* [Opentrons P300 8 Channel Electronic Pipette (GEN2)](https://shop.opentrons.com/8-channel-electronic-pipette/)\n* [Opentrons P1000 Single Channel Electronic Pipette (GEN2)](https://shop.opentrons.com/single-channel-electronic-pipette-p20/)\n\n\n", "protocol-steps": "1. Binding Step\n2. Wash 1\n3. Wash 2\n4. Delay for drying\n5. Elution\n
\n
\n* Note\nThe default values for all volumes, incubation times and mix repetitions were pretested and validated.\nWe do not recommend to change them. If you still decide to change them please scale all volumes proportionally.\nFor change recommendations please contact automation-bio@mn-net.de\n
\n
\n\n**Process**\n1. Input your protocol parameters below.\n2. Download your protocol and unzip if needed.\n3. Upload your custom labware to the [OT App](https://opentrons.com/ot-app) by navigating to `More` > `Custom Labware` > `Add Labware`, and selecting your labware files (.json extensions) if needed.\n4. Upload your protocol file (.py extension) to the [OT App](https://opentrons.com/ot-app) in the `Protocol` tab.\n5. Set up your deck according to the deck map.\n6. Calibrate your labware, tiprack and pipette using the OT App. For calibration tips, check out our [support articles](https://support.opentrons.com/en/collections/1559720-guide-for-getting-started-with-the-ot-2).\n7. Hit \"Run\".\n
\n
\n**Additional Notes**\n
\nIf you have any questions about this protocol, please contact the Protocol Development Team by filling out the [Troubleshooting Survey](https://protocol-troubleshooting.paperform.co/).\n
\n**Disclaimer**: MACHEREY-NAGEL GmbH & Co. KG makes every effort to include accurate and up-to-date information within this publication; however, it is possible that omissions or errors might have occurred. MACHEREY-NAGEL GmbH & Co. KG cannot, therefore, make any representations or warranties, expressed or implied, as to the accuracy or completeness of the information provided in this publication. Changes in this publication can be made at any time without notice. For technical details and detailed procedures of the specifications provided in this document please contact your MACHEREY-NAGEL representative. This publication may contain reference to applications and products which are not available in all markets. Please check with your local sales representative.\nAll mentioned trademarks are protected by law. All used names and denotations can be brands, trademarks, or registered labels of their respective owner \u2013 also if they are not special denotation. To mention products and brands is only a kind of information (i.e., it does not offend against trademarks and brands and can not be seen as a kind of recommendation or assessment). Reference herein to any specific commercial product, process, or service by trade name, trademark, manufacturer, or otherwise, does not necessarily constitute or imply its endorsement, recommendation, or support by MACHEREY-NAGEL GmbH & Co. KG or Opentrons. Any views or opinions expressed herein by the authors' do not necessarily state or reflect those of MACHEREY-NAGEL or the Eppendorf AG. NucleoMag\u00ae is a registered trademark of MACHEREY-NAGEL GmbH & Co. KG, D\u00fcren, Germany. Opentrons OT-2 is a device from Opentrons, New York, USA.\n
\n* The Download links includes all Protocols in their respective subfolders as well as the .json files for the two labware files.\n\n\n", "reagent-setup": "![reagents](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/macherey-nagel-nucleomag-virus/Screen+Shot+2022-11-02+at+11.27.24+AM.png)\n\n\n", diff --git a/protoBuilds/normalization/README.json b/protoBuilds/normalization/README.json index bd61e44cb8..67d790df1d 100644 --- a/protoBuilds/normalization/README.json +++ b/protoBuilds/normalization/README.json @@ -8,7 +8,7 @@ "description": "\nConcentration normalization is a key component of many genomic and proteomic applications, such as NGS library prep. With this protocol, you can easily normalize the concentrations of samples in a 96 or 384 microwell plate without worrying about missing a well or adding the wrong volume. Just upload your properly formatted CSV file (keep scrolling for an example), customize your parameters, and download your ready-to-run protocol.\n\n\nTo purchase tips, reagents, or pipettes, please visit our online store or contact our sales team at info@opentrons.com\n\nOpentrons OT-2\nOpentrons OT-2 Run App (Version 3.15.0 or later)\nOpentrons Single-Channel Pipette and corresponding Tips\nSamples in a compatible plate (96-well or 384-well)\nAutomation-friendly reservoir\nDiluent\n\nFor more detailed information on compatible labware, please visit our Labware Library.\n\n\nCSV Format\nYour file must be saved as a comma separated value (.csv) file type. Your CSV must contain values corresponding to volumes in microliters (\u03bcL). It should be formatted in \u201clandscape\u201d orientation, with the value corresponding to well A1 in the upper left-hand corner of the value list.\n\nIn this example, 40\u03bcL will be added to A1, 41\u03bcL will be added to well B1, and so on.\nIf you\u2019d like to follow our template, you can make a copy of this spreadsheet, fill out your values, and export as CSV from there.\nNote about CSV: All values corresponding to wells in the CSV must have a value (zero (0) is a valid value and nothing will be transferred to the corresponding well(s)). Additionally, the CSV can be formatted in \"portrait\" orientation. In portrait orientation, the bottom left corner is treated as A1 and the top right corner would correspond to the furthest well from A1 (H12 in a 96-well plate).\nUsing the customization fields below, set up your protocol.\n Volumes CSV: Upload the CSV (.csv) containing your diluent volumes.\n Pipette Model: Select which pipette you will use for this protocol.\n Pipette Mount: Specify which mount your single-channel pipette is on (left or right)\n Plate Type: Select which (destination) plate you will use for this protocol.\n Reservoir Type: Select which (source) reservoir you will use for this protocol.\n Filter Tips: Specify whether you want to use filter tips.\n* Tip Usage Strategy: Specify whether you'd like to use a new tip for each transfer, or keep the same tip throughout the protocol.", "internal": "normalization", "markdown": { - "author": "[Opentrons](https://opentrons.com/)\n\n***Opentrons has launched a new Protocol Library. You should use the [new page for this protocol](library.opentrons.com/p/normalization). This page won\u2019t be available after January 31st, 2024.***\n\n", + "author": "[Opentrons](https://opentrons.com/)\n\n# Opentrons has launched a new Protocol Library. You should use the [new page for this protocol](library.opentrons.com/p/normalization). This page won\u2019t be available after January 31st, 2024.\n\n", "categories": "* Featured\n\t* Normalization\n\n", "description": "![Normalization Example](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/normalization/normalization_example.png)\n\nConcentration normalization is a key component of many genomic and proteomic applications, such as NGS library prep. With this protocol, you can easily normalize the concentrations of samples in a 96 or 384 microwell plate without worrying about missing a well or adding the wrong volume. Just upload your properly formatted CSV file (keep scrolling for an example), customize your parameters, and download your ready-to-run protocol.\n\n\n---\n![Materials Needed](https://s3.amazonaws.com/opentrons-protocol-library-website/custom-README-images/001-General+Headings/materials.png)\n\nTo purchase tips, reagents, or pipettes, please visit our [online store](https://shop.opentrons.com/) or contact our sales team at [info@opentrons.com](mailto:info@opentrons.com)\n\n* [Opentrons OT-2](https://shop.opentrons.com/collections/ot-2-robot/products/ot-2)\n* [Opentrons OT-2 Run App (Version 3.15.0 or later)](https://opentrons.com/ot-app/)\n* [Opentrons Single-Channel Pipette](https://shop.opentrons.com/collections/ot-2-pipettes) and corresponding [Tips](https://shop.opentrons.com/collections/opentrons-tips)\n* [Samples in a compatible plate (96-well or 384-well)](https://labware.opentrons.com/?category=wellPlate)\n* [Automation-friendly reservoir](https://labware.opentrons.com/?category=reservoir)\n* Diluent\n\nFor more detailed information on compatible labware, please visit our [Labware Library](https://labware.opentrons.com/).\n\n\n---\n![Setup](https://s3.amazonaws.com/opentrons-protocol-library-website/custom-README-images/001-General+Headings/Setup.png)\n\n**CSV Format**\n\nYour file must be saved as a comma separated value (.csv) file type. Your CSV must contain values corresponding to volumes in microliters (\u03bcL). It should be formatted in \u201clandscape\u201d orientation, with the value corresponding to well A1 in the upper left-hand corner of the value list.\n\n![Normalization CSV](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/normalization/normalization_csv.png)\n\nIn this example, 40\u03bcL will be added to A1, 41\u03bcL will be added to well B1, and so on.\n\nIf you\u2019d like to follow our template, you can make a copy of [this spreadsheet](https://opentrons-protocol-library-website.s3.amazonaws.com/Technical+Notes/normalization/Opentrons+Normalization+Template.xlsx), fill out your values, and export as CSV from there.\n\n*Note about CSV*: All values corresponding to wells in the CSV must have a value (zero (0) is a valid value and nothing will be transferred to the corresponding well(s)). Additionally, the CSV can be formatted in \"portrait\" orientation. In portrait orientation, the bottom left corner is treated as A1 and the top right corner would correspond to the furthest well from A1 (H12 in a 96-well plate).\n\nUsing the customization fields below, set up your protocol.\n* Volumes CSV: Upload the CSV (.csv) containing your diluent volumes.\n* Pipette Model: Select which pipette you will use for this protocol.\n* Pipette Mount: Specify which mount your single-channel pipette is on (left or right)\n* Plate Type: Select which (destination) plate you will use for this protocol.\n* Reservoir Type: Select which (source) reservoir you will use for this protocol.\n* Filter Tips: Specify whether you want to use filter tips.\n* Tip Usage Strategy: Specify whether you'd like to use a new tip for each transfer, or keep the same tip throughout the protocol.\n\n\n\n", "internal": "normalization\n", diff --git a/protoBuilds/nucleic_acid_purification_with_magnetic_beads/README.json b/protoBuilds/nucleic_acid_purification_with_magnetic_beads/README.json index a542c7a5eb..c57db9346b 100644 --- a/protoBuilds/nucleic_acid_purification_with_magnetic_beads/README.json +++ b/protoBuilds/nucleic_acid_purification_with_magnetic_beads/README.json @@ -8,7 +8,7 @@ "description": "With this protocol, you can perform high-quality nucleic acid purifications using magnetic beads and the Opentrons Magnetic Module. This protocol contains flexible parameters that you can customize for many different magnetic bead and nucleic acid types. Use this setup to rapidly iterate and optimize your magbead-based workflows!\nYou can use any magnetic beads you prefer with this protocol, but we have included some reagent recommendations in the Materials Needed section below to help you get started. For more detailed information on how to use this protocol, please see our Technical Note.\n\n\n\n-- Opentrons OT-2\n-- Opentrons Magnetic Module\n-- Opentrons OT-2 Run App (Version 3.1.2 or later)\n-- 200uL or 300 uL Tiprack (Opentrons tips suggested)\n-- 12-row automation-friendly trough\n-- BioRad HardShell 96-Well PCR Plate\n-- Magnetic Beads (Looking for a kit? We recommend trying Omega Bio-tek Mag-Bind\u00ae TotalPure NGS)\n-- Ethanol\n-- Elution Buffer (Typically 10 mM Tris pH 8.0, TE Buffer, or nuclease-free water)\n\n\n\nUsing the customization fields below, set up your protocol as follows:\n\nPipette: Specify your pipette. We recommend using a p50 or p300 multi- or single-channel.\nPipette Mount: Specify which mount (left or right) your pipette is on.\nSample number: Customize the number of samples to run per protocol. A multiple of 8 is recommended when you are using a multichannel pipette.\nSample volume: Specify the starting volume (in uL) of the input sample.\nBead Ratio: Customize the ratio of beads for left or right side size-selection of fragments. The default bead ratio is 1.8x the input sample volume.\nElution Volume: Specify the final volume (in uL) to elute the purified nucleic acid. The Opentrons MagDeck supports elution volumes above 10 \u00b5L.\nIncubation Time: Specify the amount of time (in minutes) that the bead solution and input sample interact.\nSettling Time: Specify the amount of time (in minutes) needed to pellet the beads. Higher volumes may require a longer settling time.\nDrying Time: Specify the drying time (in minutes) needed after wash steps.\n\n\n", "internal": "Nucleic Acid Purification, v1", "markdown": { - "author": "[Opentrons](https://opentrons.com/)\n\n***Opentrons has launched a new Protocol Library. You should use the [new page for this protocol](library.opentrons.com/p/nucleic_acid_purification_with_magnetic_beads). This page won\u2019t be available after January 31st, 2024.***\n\n", + "author": "[Opentrons](https://opentrons.com/)\n\n# Opentrons has launched a new Protocol Library. You should use the [new page for this protocol](library.opentrons.com/p/nucleic_acid_purification_with_magnetic_beads). This page won\u2019t be available after January 31st, 2024.\n\n", "categories": "* Featured\n * Nucleic Acid Purification with Magnetic Beads (Universal)\n\n", "description": "With this protocol, you can perform high-quality nucleic acid purifications using magnetic beads and the [Opentrons Magnetic Module](https://shop.opentrons.com/products/magdeck]). This protocol contains flexible parameters that you can customize for many different magnetic bead and nucleic acid types. Use this setup to rapidly iterate and optimize your magbead-based workflows!\n\nYou can use any magnetic beads you prefer with this protocol, but we have included some reagent recommendations in the **Materials Needed** section below to help you get started. For more detailed information on how to use this protocol, please see our [Technical Note](https://s3.amazonaws.com/opentrons-protocol-library-website/Technical+Notes/Nucleic+Acid+Purification+with+Magnetic+Module+OT2+Technical+Note.pdf).\n\n---\n\n---\n\n![Materials Needed](https://s3.amazonaws.com/opentrons-protocol-library-website/custom-README-images/customizable-serial-dilution/materials.png)\n\n-- [Opentrons OT-2](http://opentrons.com/ot-2)\n\n-- [Opentrons Magnetic Module](https://shop.opentrons.com/products/magdeck?_ga=2.171718441.823190023.1542396855-403439593.1535387376)\n\n-- [Opentrons OT-2 Run App (Version 3.1.2 or later)](http://opentrons.com/ot-app)\n\n-- 200uL or 300 uL Tiprack ([Opentrons tips suggested](https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-300ul-tips-racks-9-600-tips))\n\n-- [12-row automation-friendly trough](https://www.usascientific.com/12-channel-automation-reservoir.aspx)\n\n-- [BioRad HardShell 96-Well PCR Plate](http://www.bio-rad.com/en-us/sku/hsp9601-hard-shell-96-well-pcr-plates-low-profile-thin-wall-skirted-white-clear?ID=hsp9601)\n\n-- Magnetic Beads (Looking for a kit? We recommend trying [Omega Bio-tek Mag-Bind\u00ae TotalPure NGS](https://shop.opentrons.com/products/mag-bind-total-pure-ngs))\n\n-- Ethanol\n\n-- Elution Buffer (Typically 10 mM Tris pH 8.0, TE Buffer, or nuclease-free water)\n\n---\n\n---\n\n![Setup](https://s3.amazonaws.com/opentrons-protocol-library-website/custom-README-images/001-General+Headings/Setup.png)\n\nUsing the customization fields below, set up your protocol as follows:\n\n * **Pipette:** Specify your pipette. We recommend using a p50 or p300 multi- or single-channel.\n * **Pipette Mount:** Specify which mount (left or right) your pipette is on.\n * **Sample number:** Customize the number of samples to run per protocol. A multiple of 8 is recommended when you are using a multichannel pipette.\n * **Sample volume:** Specify the starting volume (in uL) of the input sample.\n * **Bead Ratio:** Customize the ratio of beads for left or right side size-selection of fragments. *The default bead ratio is 1.8x the input sample volume.*\n * **Elution Volume:** Specify the final volume (in uL) to elute the purified nucleic acid. *The Opentrons MagDeck supports elution volumes above 10 \u00b5L.*\n * **Incubation Time:** Specify the amount of time (in minutes) that the bead solution and input sample interact.\n * **Settling Time:** Specify the amount of time (in minutes) needed to pellet the beads. *Higher volumes may require a longer settling time.*\n * **Drying Time:** Specify the drying time (in minutes) needed after wash steps.\n\n---\n\n---\n\n", "internal": "Nucleic Acid Purification, v1\n\n", diff --git a/protoBuilds/omega_biotek_magbind_totalpure_NGS/README.json b/protoBuilds/omega_biotek_magbind_totalpure_NGS/README.json index 80a878f805..075e4650e1 100644 --- a/protoBuilds/omega_biotek_magbind_totalpure_NGS/README.json +++ b/protoBuilds/omega_biotek_magbind_totalpure_NGS/README.json @@ -13,7 +13,7 @@ "description": "![Omega Bio-tek](https://s3.amazonaws.com/opentrons-protocol-library-website/custom-README-images/001-General+Headings/Omega+Logo.png)\n\nWith this protocol, you can perform high-quality nucleic acid purifications using [Omega Bio-tek Mag-Bind\u00ae TotalPure NGS](https://shop.opentrons.com/products/mag-bind-total-pure-ngs) magnetic beads and the [Opentrons Magnetic Module](https://shop.opentrons.com/products/magdeck). This setup yields high quality PCR product and other nucleic acids without the use of centrifugation or vacuum separation.\n\nThis kit is widely used in NGS cleanup for its affordability and simplicity. It is also well-adapted for nucleic acid size selection by varying bead ratios for the isolation of a wide array of fragment sizes. For more detailed information on how to use this protocol, please see our [Application Note](https://s3.amazonaws.com/opentrons-protocol-library-website/Technical+Notes/Omega_Application_Note.pdf).\n\nPlease note this protocol is currently being updated.\n\n---\n\n---\n\n![Materials Needed](https://s3.amazonaws.com/opentrons-protocol-library-website/custom-README-images/001-General+Headings/materials.png)\n\nTo purchase tips, reagents, or our Magnetic Module, please [visit our online store](https://shop.opentrons.com/) or contact our Sales team at .\n\n * [Omega Bio-tek Mag-Bind\u00ae TotalPure NGS Kit](https://shop.opentrons.com/products/mag-bind-total-pure-ngs)\n * [Opentrons OT-2](http://opentrons.com/ot-2)\n * [Opentrons Magnetic Module](https://shop.opentrons.com/products/magdeck)\n * [Opentrons OT-2 Run App (Version 3.1.2 or later)](http://opentrons.com/ot-app)\n * 200uL or 300 uL Tiprack ([Opentrons tips suggested](https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-300ul-tips-racks-9-600-tips))\n * [12-row automation-friendly trough](https://shop.opentrons.com/collections/verified-labware/products/nest-12-well-reservoir-15-ml)\n * [BioRad HardShell 96-Well PCR Plates](http://www.bio-rad.com/en-us/sku/hsp9601-hard-shell-96-well-pcr-plates-low-profile-thin-wall-skirted-white-clear?ID=hsp9601)\n * Ethanol\n * Elution Buffer (Typically 10 mM Tris pH 8.0, TE Buffer, or nuclease-free water)\n\n---\n\n---\n\n\n![Setup](https://s3.amazonaws.com/opentrons-protocol-library-website/custom-README-images/001-General+Headings/Setup.png)\n\nUsing the customization fields below, set up your protocol as follows:\n\n * **Pipette:** Specify your pipette. We recommend using a p50 or p300 multi- or single-channel.\n * **Pipette Mount:** Specify which mount (left or right) your pipette is on.\n * **Sample number:** Customize the number of samples to run per protocol. A multiple of 8 is recommended when you are using a multichannel pipette.\n * **Sample volume:** Specify the starting volume (in uL) of the input sample.\n * **Bead Ratio:** Customize the ratio of beads for left or right side size-selection of fragments. *The default bead ratio is 1.8x the input sample volume.*\n * **Elution Volume:** Specify the final volume (in uL) to elute the purified nucleic acid. *The Opentrons MagDeck supports elution volumes above 10 \u00b5L.*\n\nMake sure to add reagents to your labware before placing it on the deck! You can see where to place your reagents below.\n\n![Labware setup](https://s3.amazonaws.com/opentrons-protocol-library-website/custom-README-images/Nucleic+Acid+Purification/Nucleic+Acid+Purification+with+Magnetic+Beads+-+Reagent+Start+Position.png)\n\n---\n\n---\n\n", "internal": "Omega Nucleic Acid Purification, v2\n\n", "notes": "Please reference our [Application Note](https://s3.amazonaws.com/opentrons-protocol-library-website/Technical+Notes/Omega_Application_Note.pdf) for more information about the expected output of this protocol, in addition to expanded sample data from the Opentrons and Omega Bio-tek labs.\n\nIf you'd like to request a more complex purification workflow, please use our [Protocol Development Request Form](https://opentrons-protocol-dev.paperform.co/). You can also download the Python file from this page and modify it using our [API Documentation](https://docs.opentrons.com/). For additional questions about this protocol, please email .\n\nIf you are interested in purchasing the Opentrons Magnetic Module or trying out the Omega Bio-tek Mag-Bind\u00ae beads, please contact our Sales Team at to learn more!\n\n", - "partner": "[Omega Bio-tek](http://omegabiotek.com/store/)\n\n***Opentrons has launched a new Protocol Library. You should use the [new page for this protocol](library.opentrons.com/p/omega_biotek_magbind_totalpure_ngs). This page won\u2019t be available after January 31st, 2024.***\n\n", + "partner": "[Omega Bio-tek](http://omegabiotek.com/store/)\n\n# Opentrons has launched a new Protocol Library. You should use the [new page for this protocol](library.opentrons.com/p/omega_biotek_magbind_totalpure_ngs). This page won\u2019t be available after January 31st, 2024.\n\n", "preview": "With this protocol, you can perform high-quality nucleic acid purifications using the [Opentrons Magnetic Module](https://shop.opentrons.com/products/magdeck) and [Omega Bio-tek Mag-Bind\u00ae TotalPure NGS](https://shop.opentrons.com/products/mag-bind-total-pure-ngs) magnetic beads. This kit is widely used in NGS cleanup for its affordability and simplicity. You can select specific sizes of nucleic acids by varying the bead-to-DNA ratio across a wide array of fragment sizes. For reagent and module purchasing details contact .\n", "process": "1. Select all desired settings according to the \"Setup\" section above to create your customized protocol.\n2. Download your customized OT-2 protocol using the blue \"Download\" button.\n3. Upload your protocol file into the Opentrons Run App and follow the instructions there to set up your deck and proceed to run!\n4. Make sure to add reagents to your labware before placing it on the deck! You can see where to place your reagents in the \"Setup\" section above.\n\n", "title": "NGS Cleanup and Size Selection with Omega Bio-tek Mag-Bind\u00ae TotalPure NGS" diff --git a/protoBuilds/pcr_prep_part_1/README.json b/protoBuilds/pcr_prep_part_1/README.json index 5cf15992a3..56f14fc17c 100644 --- a/protoBuilds/pcr_prep_part_1/README.json +++ b/protoBuilds/pcr_prep_part_1/README.json @@ -10,7 +10,7 @@ "internal": "OT-2 PCR Prep v2", "labware": "\n4-in-1 Tube Rack Set\n12-well Trough\n", "markdown": { - "author": "[Opentrons (verified)](https://opentrons.com/)\n\n***Opentrons has launched a new Protocol Library. You should use the [new page for this protocol](library.opentrons.com/p/pcr_prep_part_1). This page won\u2019t be available after January 31st, 2024.***\n\n", + "author": "[Opentrons (verified)](https://opentrons.com/)\n\n# Opentrons has launched a new Protocol Library. You should use the [new page for this protocol](library.opentrons.com/p/pcr_prep_part_1). This page won\u2019t be available after January 31st, 2024.\n\n", "categories": "* PCR\n * Mastermix Assembly\n\n", "deck-setup": "* Slot 1: Option of Opentrons tuberack/tube combo 1, or none\n* Slot 2: Option of Opentrons tuberack/tube combo 2, or none\n* Slot 3: Choice of Opentrons labware library 12-well reservoir\n![deck layout](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/pcr_prep_part_1/deck.jpg)\n\n", "description": "Part 1 of 2: Master Mix Assembly\n\nLinks:\n* [Part 1: Master Mix Assembly](./pcr_prep_part_1)\n* [Part 2: Master Mix Distribution and DNA Transfer](./pcr_prep_part_2)\n\nThis protocol allows your robot to create a master mix solution using any reagents stored in one or two different types of tube racks, or reservoir well A2 to A12. The master mix will be created in well A1 of the trough. The ingredient information will be provided as a CSV file. See Additional Notes for more details.\n\nParameters:\n* `right pipette type`: Which single channel pipette to use in the right mount\n* `left pipette type`: Which single channel pipette to use in the left mount\n* `Filter or regular tips`: Use filter tips or non-filtered.\n* `Tuberack 1`: Tuberack 1 for reagents (optional)\n* `Tuberack 2`: Tuberack 2 for reagents (optional)\n* `12-well reservoir`: 12 well reservoir for mastermix target and optionally reagents in well A2-A12\n* `master mix .csv file`: Input csv file (see format below)\n\n---\n\n", diff --git a/protoBuilds/pcr_prep_part_2/README.json b/protoBuilds/pcr_prep_part_2/README.json index 9e48a7dfaa..aab56fd4b2 100644 --- a/protoBuilds/pcr_prep_part_2/README.json +++ b/protoBuilds/pcr_prep_part_2/README.json @@ -8,7 +8,7 @@ "description": "Part 2 of 2: Master Mix Distribution and DNA Transfer\nLinks:\n Part 1: Master Mix Assembly\n Part 2: Master Mix Distribution and DNA Transfer\nThis protocol allows your robot to distribute a master mix solution from well A1 of a trough to PCR strips. Robot will then transfer DNA samples to the master mix solution.\n\nYou will need:\n 12-channel reservoir\n 96-well PCR plate", "internal": "OT-2 PCR Prep v2", "markdown": { - "author": "[Opentrons (verified)](https://opentrons.com/)\n\n***Opentrons has launched a new Protocol Library. You should use the [new page for this protocol](library.opentrons.com/p/pcr_prep_part_2). This page won\u2019t be available after January 31st, 2024.***\n\n", + "author": "[Opentrons (verified)](https://opentrons.com/)\n\n# Opentrons has launched a new Protocol Library. You should use the [new page for this protocol](library.opentrons.com/p/pcr_prep_part_2). This page won\u2019t be available after January 31st, 2024.\n\n", "categories": "* PCR\n * PCR Prep\n\n", "description": "Part 2 of 2: Master Mix Distribution and DNA Transfer\n\nLinks:\n* [Part 1: Master Mix Assembly](./pcr_prep_part_1)\n* [Part 2: Master Mix Distribution and DNA Transfer](./pcr_prep_part_2)\n\n\nThis protocol allows your robot to distribute a master mix solution from well A1 of a trough to PCR strips. Robot will then transfer DNA samples to the master mix solution.\n\n---\n\nYou will need:\n* [12-channel reservoir](https://www.usascientific.com/12-channel-automation-reservoir.aspx)\n* [96-well PCR plate](https://www.bio-rad.com/en-us/sku/hsp9601-hard-shell-96-well-pcr-plates-low-profile-thin-wall-skirted-white-clear?ID=hsp9601)\n\n", "internal": "OT-2 PCR Prep v2\n", diff --git a/protoBuilds/sci-macherey-nagel-nucleomag/README.json b/protoBuilds/sci-macherey-nagel-nucleomag/README.json index 601cc9e331..63be472b59 100644 --- a/protoBuilds/sci-macherey-nagel-nucleomag/README.json +++ b/protoBuilds/sci-macherey-nagel-nucleomag/README.json @@ -6,15 +6,15 @@ ] }, "deck-setup": "\nTip rack on Slot 4 is used for tip parking if selected.\n\n", - "description": "Your OT-2 can fully automate the entire NucleoMag\u00ae Virus Viral DNA/RNA Isolation.\nResults of the Opentrons Science team's internal testing of this protocol on the OT-2 are shown below:\n\nExplanation of complex parameters below:\n Number of samples: Specify the number of samples this run (1-96 and divisible by 8, i.e. whole columns at a time).\n Deepwell type: Specify which well plate will be mounted on the magnetic module.\n Reservoir Type: Specify which reservoir will be employed.\n Starting Volume: Specify starting volume of sample (ul).\n* `: Specify the volume of binding buffer to use (ul).\n*Elution Volume: Specify elution volume (ul).\n*Park Tips: Specify whether to park tips or drop tips.\n*P300 Multi Channel Pipette Mount`: Specify whether the P300 multi channel pipette will be on the left or right mount.\n", + "description": "Your OT-2 can fully automate the entire NucleoMag\u00ae Virus Viral DNA/RNA Isolation.\nResults of the Opentrons Science team's internal testing of this protocol on the OT-2 are shown below:\n\nExplanation of complex parameters below:\n Number of samples: Specify the number of samples this run (1-96 and divisible by 8, i.e. whole columns at a time).\n Deepwell type: Specify which well plate will be mounted on the magnetic module.\n Reservoir Type: Specify which reservoir will be employed.\n Starting Volume: Specify starting volume of sample (ul).\n Binding Buffer Volume: Specify the volume of binding buffer to use (ul).\n Elution Volume: Specify elution volume (ul).\n Park Tips: Specify whether to park tips or drop tips.\n P300 Multi Channel Pipette Mount: Specify whether the P300 multi channel pipette will be on the left or right mount.\n", "internal": "sci-promega-magazorb-dna-mini-prep-kit", "labware": "\nNEST 96 Wellplate 2mL\nUSA Scientific 96 Wellplate 2.4mL\nNEST 12 Reservoir 15mL\nUSA Scientific 12 Reservoir 22mL\nOpentrons 200uL Filter Tips\nOpentrons 96 Aluminum block Nest Wellplate 100ul\n", "markdown": { - "author": "[Opentrons (verified)](https://opentrons.com/)\n\n***Opentrons has launched a new Protocol Library. You should use the [new page for this protocol](library.opentrons.com/p/sci-macherey-nagel-nucleomag). This page won\u2019t be available after January 31st, 2024.***\n\n", + "author": "[Opentrons (verified)](https://opentrons.com/)\n\n# Opentrons has launched a new Protocol Library. You should use the [new page for this protocol](library.opentrons.com/p/sci-macherey-nagel-nucleomag). This page won\u2019t be available after January 31st, 2024.\n\n", "categories": "* Nucleic Acid Extraction & Purification\n\t* DNA Extraction\n\n", "deck-setup": "\n* Tip rack on Slot 4 is used for tip parking if selected.\n\n![deck layout](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/sci-macherey-nagel-nucleomag/nucleomag-virus-isolation.png)\n\n", - "description": "Your OT-2 can fully automate the entire NucleoMag\u00ae Virus Viral DNA/RNA Isolation.\nResults of the Opentrons Science team's internal testing of this protocol on the OT-2 are shown below:\n\n![results](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/sci-macherey-nagel-nucleomag/NucleoMag+Virus+Viral+DNA%3ARNA+Isolation-results.png)\n\nExplanation of complex parameters below:\n* `Number of samples`: Specify the number of samples this run (1-96 and divisible by 8, i.e. whole columns at a time).\n* `Deepwell type`: Specify which well plate will be mounted on the magnetic module.\n* `Reservoir Type`: Specify which reservoir will be employed.\n* `Starting Volume`: Specify starting volume of sample (ul).\n* ``: Specify the volume of binding buffer to use (ul).\n* `Elution Volume`: Specify elution volume (ul).\n* `Park Tips`: Specify whether to park tips or drop tips.\n* `P300 Multi Channel Pipette Mount`: Specify whether the P300 multi channel pipette will be on the left or right mount.\n\n---\n\n", - "internal": "sci-promega-magazorb-dna-mini-prep-kit", + "description": "Your OT-2 can fully automate the entire NucleoMag\u00ae Virus Viral DNA/RNA Isolation.\nResults of the Opentrons Science team's internal testing of this protocol on the OT-2 are shown below:\n\n![results](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/sci-macherey-nagel-nucleomag/NucleoMag+Virus+Viral+DNA%3ARNA+Isolation-results.png)\n\nExplanation of complex parameters below:\n* `Number of samples`: Specify the number of samples this run (1-96 and divisible by 8, i.e. whole columns at a time).\n* `Deepwell type`: Specify which well plate will be mounted on the magnetic module.\n* `Reservoir Type`: Specify which reservoir will be employed.\n* `Starting Volume`: Specify starting volume of sample (ul).\n* `Binding Buffer Volume`: Specify the volume of binding buffer to use (ul).\n* `Elution Volume`: Specify elution volume (ul).\n* `Park Tips`: Specify whether to park tips or drop tips.\n* `P300 Multi Channel Pipette Mount`: Specify whether the P300 multi channel pipette will be on the left or right mount.\n\n---\n\n", + "internal": "sci-promega-magazorb-dna-mini-prep-kit\n", "labware": "* [NEST 96 Wellplate 2mL](https://shop.opentrons.com/collections/lab-plates/products/nest-0-2-ml-96-well-deep-well-plate-v-bottom)\n* [USA Scientific 96 Wellplate 2.4mL](https://labware.opentrons.com/?category=wellPlate)\n* [NEST 12 Reservoir 15mL](https://shop.opentrons.com/collections/reservoirs/products/nest-12-well-reservoir-15-ml)\n* [USA Scientific 12 Reservoir 22mL](https://labware.opentrons.com/?category=reservoir)\n* [Opentrons 200uL Filter Tips](https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-200ul-filter-tips)\n* [Opentrons 96 Aluminum block Nest Wellplate 100ul](https://labware.opentrons.com/opentrons_96_aluminumblock_nest_wellplate_100ul?category=aluminumBlock)\n\n", "modules": "* [Magnetic Module (GEN2)](https://shop.opentrons.com/collections/hardware-modules/products/magdeck)\n\n", "notes": "If you have any questions about this protocol, please contact the Protocol Development Team by filling out the [Troubleshooting Survey](https://protocol-troubleshooting.paperform.co/).\n\n", diff --git a/protoBuilds/sci-mag-bind-blood-tissue-kit/README.json b/protoBuilds/sci-mag-bind-blood-tissue-kit/README.json index f4b5070a14..1e5bdf5ce2 100644 --- a/protoBuilds/sci-mag-bind-blood-tissue-kit/README.json +++ b/protoBuilds/sci-mag-bind-blood-tissue-kit/README.json @@ -6,15 +6,15 @@ ] }, "deck-setup": "\nTip rack on Slot 4 is used for tip parking if selected.\n\n", - "description": "Your OT-2 can fully automate the entire Mag-Bind\u00ae Blood & Tissue DNA HDQ 96 Kit.\nResults of the Opentrons Science team's internal testing of this protocol on the OT-2 are shown below:\n\nExplanation of complex parameters below:\n Number of samples: Specify the number of samples this run (1-96 and divisible by 8, i.e. whole columns at a time).\n Deepwell type: Specify which well plate will be mounted on the magnetic module.\n Reservoir Type: Specify which reservoir will be employed.\n Starting Volume: Specify starting volume of sample (ul).\n* `: Specify the volume of binding buffer to use (ul).\n*Elution Volume: Specify elution volume (ul).\n*Park Tips: Specify whether to park tips or drop tips.\n*P300 Multi Channel Pipette Mount`: Specify whether the P300 multi channel pipette will be on the left or right mount.\n", + "description": "Your OT-2 can fully automate the entire Mag-Bind\u00ae Blood & Tissue DNA HDQ 96 Kit.\nResults of the Opentrons Science team's internal testing of this protocol on the OT-2 are shown below:\n\nExplanation of complex parameters below:\n Number of samples: Specify the number of samples this run (1-96 and divisible by 8, i.e. whole columns at a time).\n Deepwell type: Specify which well plate will be mounted on the magnetic module.\n Reservoir Type: Specify which reservoir will be employed.\n Starting Volume: Specify starting volume of sample (ul).\n Binding Buffer Volume: Specify the volume of binding buffer to use (ul).\n Elution Volume: Specify elution volume (ul).\n Park Tips: Specify whether to park tips or drop tips.\n P300 Multi Channel Pipette Mount: Specify whether the P300 multi channel pipette will be on the left or right mount.\n", "internal": "sci-mag-bind-blood-tissue-kit", "labware": "\nNEST 96 Wellplate 2mL\nUSA Scientific 96 Wellplate 2.4mL\nNEST 12 Reservoir 15mL\nUSA Scientific 12 Reservoir 22mL\nOpentrons 200uL Filter Tips\nOpentrons 96 Aluminum block Nest Wellplate 100ul\n", "markdown": { - "author": "[Opentrons (verified)](https://opentrons.com/)\n\n***Opentrons has launched a new Protocol Library. You should use the [new page for this protocol](library.opentrons.com/p/sci-mag-bind-blood-tissue-kit). This page won\u2019t be available after January 31st, 2024.***\n\n", + "author": "[Opentrons (verified)](https://opentrons.com/)\n\n# Opentrons has launched a new Protocol Library. You should use the [new page for this protocol](library.opentrons.com/p/sci-mag-bind-blood-tissue-kit). This page won\u2019t be available after January 31st, 2024.\n\n", "categories": "* Nucleic Acid Extraction & Purification\n\t* DNA Extraction\n\n", "deck-setup": "\n* Tip rack on Slot 4 is used for tip parking if selected.\n\n![deck layout](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/sci-mag-bind-blood-tissue-kit/sci-mag-bind-blood-tissue-kit.png)\n\n", - "description": "Your OT-2 can fully automate the entire Mag-Bind\u00ae Blood & Tissue DNA HDQ 96 Kit.\nResults of the Opentrons Science team's internal testing of this protocol on the OT-2 are shown below:\n\n![results](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/sci-mag-bind-blood-tissue-kit/sci-mag-bind-blood-tissue-kit-results.png)\n\nExplanation of complex parameters below:\n* `Number of samples`: Specify the number of samples this run (1-96 and divisible by 8, i.e. whole columns at a time).\n* `Deepwell type`: Specify which well plate will be mounted on the magnetic module.\n* `Reservoir Type`: Specify which reservoir will be employed.\n* `Starting Volume`: Specify starting volume of sample (ul).\n* ``: Specify the volume of binding buffer to use (ul).\n* `Elution Volume`: Specify elution volume (ul).\n* `Park Tips`: Specify whether to park tips or drop tips.\n* `P300 Multi Channel Pipette Mount`: Specify whether the P300 multi channel pipette will be on the left or right mount.\n\n---\n\n", - "internal": "sci-mag-bind-blood-tissue-kit", + "description": "Your OT-2 can fully automate the entire Mag-Bind\u00ae Blood & Tissue DNA HDQ 96 Kit.\nResults of the Opentrons Science team's internal testing of this protocol on the OT-2 are shown below:\n\n![results](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/sci-mag-bind-blood-tissue-kit/sci-mag-bind-blood-tissue-kit-results.png)\n\nExplanation of complex parameters below:\n* `Number of samples`: Specify the number of samples this run (1-96 and divisible by 8, i.e. whole columns at a time).\n* `Deepwell type`: Specify which well plate will be mounted on the magnetic module.\n* `Reservoir Type`: Specify which reservoir will be employed.\n* `Starting Volume`: Specify starting volume of sample (ul).\n* `Binding Buffer Volume`: Specify the volume of binding buffer to use (ul).\n* `Elution Volume`: Specify elution volume (ul).\n* `Park Tips`: Specify whether to park tips or drop tips.\n* `P300 Multi Channel Pipette Mount`: Specify whether the P300 multi channel pipette will be on the left or right mount.\n\n---\n\n", + "internal": "sci-mag-bind-blood-tissue-kit\n", "labware": "* [NEST 96 Wellplate 2mL](https://shop.opentrons.com/collections/lab-plates/products/nest-0-2-ml-96-well-deep-well-plate-v-bottom)\n* [USA Scientific 96 Wellplate 2.4mL](https://labware.opentrons.com/?category=wellPlate)\n* [NEST 12 Reservoir 15mL](https://shop.opentrons.com/collections/reservoirs/products/nest-12-well-reservoir-15-ml)\n* [USA Scientific 12 Reservoir 22mL](https://labware.opentrons.com/?category=reservoir)\n* [Opentrons 200uL Filter Tips](https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-200ul-filter-tips)\n* [Opentrons 96 Aluminum block Nest Wellplate 100ul](https://labware.opentrons.com/opentrons_96_aluminumblock_nest_wellplate_100ul?category=aluminumBlock)\n\n", "modules": "* [Magnetic Module (GEN2)](https://shop.opentrons.com/collections/hardware-modules/products/magdeck)\n\n", "notes": "If you have any questions about this protocol, please contact the Protocol Development Team by filling out the [Troubleshooting Survey](https://protocol-troubleshooting.paperform.co/).\n\n", diff --git a/protoBuilds/sci-omegabiotek-extraction-fa/README.json b/protoBuilds/sci-omegabiotek-extraction-fa/README.json index e69de29bb2..85ad17bc52 100644 --- a/protoBuilds/sci-omegabiotek-extraction-fa/README.json +++ b/protoBuilds/sci-omegabiotek-extraction-fa/README.json @@ -0,0 +1,40 @@ +{ + "author": "Opentrons (verified)\nOpentrons has launched a new Protocol Library. You should use the new page for this protocol. This page won\u2019t be available after January 31st, 2024.", + "categories": { + "Nucleic Acid Extraction & Purification": [ + "RNA Extraction" + ] + }, + "deck-setup": "", + "description": "After lysing samples, your OT-2 can fully automate the entire Omega Bio-tek Mag-Bind\u00ae Blood & Tissue DNA HDQ 96 Kit. Buffer systems tailored specifically for each type of starting material are added to samples to undergo lysis. Samples are then mixed with HDQ Binding Buffer and Mag-Bind\u00ae Particles HDQ to bind magnetic beads to DNA. DNA is eluted in the Elution Buffer after rapid wash steps.\nResults of the Opentrons Science team's internal testing of this protocol on the OT-2 are shown below: \n\nExplanation of complex parameters below:\n Number of samples: Specify the number of samples this run (1-96 and divisible by 8, i.e. whole columns at a time).\n Deepwell type: Specify which well plate will be mounted on the magnetic module.\n Reservoir Type: Specify which reservoir will be employed.\n Starting Volume: Specify starting volume of sample (ul).\n Elution Volume: Specify elution volume (ul).\n Park Tips: Specify whether to park tips or drop tips.\n Mag Deck Generation: Specify whether GEN1 or GEN2 magnetic module will be used.\n P300 Multi Channel Pipette Mount: Specify whether the P300 multi channel pipette will be on the left or right mount.\n", + "internal": "sci-omegabiotek-extraction", + "labware": "\nNEST 96 Wellplate 2mL\nUSA Scientific 96 Wellplate 2.4mL\nNEST 12 Reservoir 15mL\nUSA Scientific 12 Reservoir 22mL\nOpentrons 96 tiprack 300ul\nOpentrons 96 Aluminum block Nest Wellplate 100ul\n", + "markdown": { + "author": "[Opentrons (verified)](https://opentrons.com/)\n\n# Opentrons has launched a new Protocol Library. You should use the [new page for this protocol](library.opentrons.com/p/sci-omegabiotek-extraction-fa). This page won\u2019t be available after January 31st, 2024.\n\n", + "categories": "* Nucleic Acid Extraction & Purification\n\t* RNA Extraction\n\n", + "deck-setup": "\n![deck layout](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/sci-omegabiotek-extraction/Screen+Shot+2021-06-29+at+5.29.44+PM.png)\n\n", + "description": "After lysing samples, your OT-2 can fully automate the entire Omega Bio-tek Mag-Bind\u00ae Blood & Tissue DNA HDQ 96 Kit. Buffer systems tailored specifically for each type of starting material are added to samples to undergo lysis. Samples are then mixed with HDQ Binding Buffer and Mag-Bind\u00ae Particles HDQ to bind magnetic beads to DNA. DNA is eluted in the Elution Buffer after rapid wash steps.\n\nResults of the Opentrons Science team's internal testing of this protocol on the OT-2 are shown below: \n\n![results](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/sci-omegabiotek-extraction/Screen+Shot+2021-06-29+at+2.44.45+PM.png)\n\nExplanation of complex parameters below:\n* `Number of samples`: Specify the number of samples this run (1-96 and divisible by 8, i.e. whole columns at a time).\n* `Deepwell type`: Specify which well plate will be mounted on the magnetic module.\n* `Reservoir Type`: Specify which reservoir will be employed.\n* `Starting Volume`: Specify starting volume of sample (ul).\n* `Elution Volume`: Specify elution volume (ul).\n* `Park Tips`: Specify whether to park tips or drop tips.\n* `Mag Deck Generation`: Specify whether GEN1 or GEN2 magnetic module will be used.\n* `P300 Multi Channel Pipette Mount`: Specify whether the P300 multi channel pipette will be on the left or right mount.\n\n\n---\n\n", + "internal": "sci-omegabiotek-extraction\n", + "labware": "* [NEST 96 Wellplate 2mL](https://shop.opentrons.com/collections/lab-plates/products/nest-0-2-ml-96-well-deep-well-plate-v-bottom)\n* [USA Scientific 96 Wellplate 2.4mL](https://labware.opentrons.com/?category=wellPlate)\n* [NEST 12 Reservoir 15mL](https://shop.opentrons.com/collections/reservoirs/products/nest-12-well-reservoir-15-ml)\n* [USA Scientific 12 Reservoir 22mL](https://labware.opentrons.com/?category=reservoir)\n* [Opentrons 96 tiprack 300ul](https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-300ul-tips)\n* [Opentrons 96 Aluminum block Nest Wellplate 100ul](https://labware.opentrons.com/opentrons_96_aluminumblock_nest_wellplate_100ul?category=aluminumBlock)\n\n", + "modules": "* [Magnetic Module (GEN2)](https://shop.opentrons.com/collections/hardware-modules/products/magdeck)\n\n\n", + "notes": "If you have any questions about this protocol, please contact the Protocol Development Team by filling out the [Troubleshooting Survey](https://protocol-troubleshooting.paperform.co/).\n\n", + "pipettes": "* [P300 Multi Channel Pipette](https://shop.opentrons.com/collections/ot-2-robot/products/8-channel-electronic-pipette)\n\n", + "process": "1. Input your protocol parameters above.\n2. Download your protocol and unzip if needed.\n3. Upload your custom labware to the [OT App](https://opentrons.com/ot-app) by navigating to `More` > `Custom Labware` > `Add Labware`, and selecting your labware files (.json extensions) if needed.\n4. Upload your protocol file (.py extension) to the [OT App](https://opentrons.com/ot-app) in the `Protocol` tab.\n5. Set up your deck according to the deck map.\n6. Calibrate your labware, tiprack and pipette using the OT App. For calibration tips, check out our [support articles](https://support.opentrons.com/en/collections/1559720-guide-for-getting-started-with-the-ot-2).\n7. Hit 'Run'.\n\n", + "protocol-steps": "1. Binding buffer is mixed\n2. Binding buffer added to samples\n3. Binding buffer and sample mixed\n4. Samples will be mixed with parked tips\n5. Engage magnetic module\n6. Incubate 7 minutes\n7. Remove supernatant\n8. Wash with wash buffer 1 and mix\n9. Engage magnetic module\n10. Delay 7 minutes\n11. Remove supernatant\n12. Disengage magnet\n13. Repeat steps 8-11 with wash buffer 2 and 3\n14. Elution solution added to sample and mixed\n15. Delay 5 minutes for elution\n16. Elute added to aluminum block\n\n", + "reagent-setup": "\n* Reservoir 1: Slot 2\n\n![reservoir 1](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/sci-omegabiotek-extraction/Screen+Shot+2021-06-29+at+2.36.37+PM.png)\n\n* Reservoir 2: Slot 3\n\n![reservoir 2](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/sci-omegabiotek-extraction/Screen+Shot+2021-06-29+at+2.36.45+PM.png)\n\n---\n\n", + "reagents": "* [Omega Bio-tek](https://www.omegabiotek.com/product/mag-bind-hdq-blood-dna-96-kit/?cn-reloaded=1)\n\n---\n\n", + "title": "Mag-Bind\u00ae Blood & Tissue DNA HDQ 96 Kit (Fully Automated)" + }, + "modules": [ + "Magnetic Module (GEN2)" + ], + "notes": "If you have any questions about this protocol, please contact the Protocol Development Team by filling out the Troubleshooting Survey.", + "pipettes": "\nP300 Multi Channel Pipette\n", + "process": "\nInput your protocol parameters above.\nDownload your protocol and unzip if needed.\nUpload your custom labware to the OT App by navigating to More > Custom Labware > Add Labware, and selecting your labware files (.json extensions) if needed.\nUpload your protocol file (.py extension) to the OT App in the Protocol tab.\nSet up your deck according to the deck map.\nCalibrate your labware, tiprack and pipette using the OT App. For calibration tips, check out our support articles.\nHit 'Run'.\n", + "protocol-steps": "\nBinding buffer is mixed\nBinding buffer added to samples\nBinding buffer and sample mixed\nSamples will be mixed with parked tips\nEngage magnetic module\nIncubate 7 minutes\nRemove supernatant\nWash with wash buffer 1 and mix\nEngage magnetic module\nDelay 7 minutes\nRemove supernatant\nDisengage magnet\nRepeat steps 8-11 with wash buffer 2 and 3\nElution solution added to sample and mixed\nDelay 5 minutes for elution\nElute added to aluminum block\n", + "reagent-setup": "\nReservoir 1: Slot 2\n\n\n\nReservoir 2: Slot 3\n\n\n", + "reagents": [ + "Omega Bio-tek" + ], + "title": "Mag-Bind\u00ae Blood & Tissue DNA HDQ 96 Kit (Fully Automated)" +} \ No newline at end of file diff --git a/protoBuilds/sci-omegabiotek-magbind-total-rna-96/README.json b/protoBuilds/sci-omegabiotek-magbind-total-rna-96/README.json index dcff40d8ef..80df1ecf89 100644 --- a/protoBuilds/sci-omegabiotek-magbind-total-rna-96/README.json +++ b/protoBuilds/sci-omegabiotek-magbind-total-rna-96/README.json @@ -10,7 +10,7 @@ "internal": "sci-omegabiotek-magbind-total-rna-96", "labware": "\nNEST 96 Wellplate 2mL\nUSA Scientific 96 Wellplate 2.4mL\nNEST 12 Reservoir 15mL\nUSA Scientific 12 Reservoir 22mL\nOpentrons 96 tiprack 300ul\nOpentrons 96 Aluminum block Nest Wellplate 100ul\n", "markdown": { - "author": "[Opentrons (verified)](https://opentrons.com/)\n\n***Opentrons has launched a new Protocol Library. You should use the [new page for this protocol](library.opentrons.com/p/sci-omegabiotek-magbind-total-rna-96). This page won\u2019t be available after January 31st, 2024.***\n\n", + "author": "[Opentrons (verified)](https://opentrons.com/)\n\n# Opentrons has launched a new Protocol Library. You should use the [new page for this protocol](library.opentrons.com/p/sci-omegabiotek-magbind-total-rna-96). This page won\u2019t be available after January 31st, 2024.\n\n", "categories": "* Nucleic Acid Extraction & Purification\n\t* RNA Extraction\n\n", "deck-setup": "\n![deck layout](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/528c16/Screen+Shot+2022-03-11+at+3.25.12+PM.png)\n\nSaliva: add 200uL of saliva\n\nBacteria culture: spin down 200uL of culture, wash once in PBS, resuspend in 200uL of chilled PBS\n\n200uL of sample + 200uL of lysis buffer. Mix thoroughly, add to deep well plate\n\nDnase 1 treatment: 49uL of buffer + 1uL of DNAse 1 per sample.\n![reagents](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/528c16/Screen+Shot+2022-03-11+at+3.25.34+PM.png)\n\n![reagent volumes](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/528c16/Screen+Shot+2022-03-11+at+3.26.29+PM.png)\n\n---\n\n", "description": "Your OT-2 can automate the Mag-Bind\u00ae Viral DNA/RNA 96 Kit. Please see the kit description below found on the [kit website](https://www.omegabiotek.com/product/mag-bind-total-rna-96-kit/):\n\n\"The Mag-Bind\u00ae Total RNA 96 Kit provides a novel technology for total RNA isolation. This kit allows the rapid and reliable isolation of high-quality total cellular RNA and viral RNA from a wide variety of cells and tissues. Unlike column-based systems, the binding of nucleic acids to magnetic particles occurs in solution resulting in increased binding kinetics and binding efficiency. Particles are also completely re-suspended during the wash steps of the purification protocol, which improves the removal of contaminants and increases nucleic acid purity. Mag-Bind\u00ae Total RNA 96 Kit procedure can be fully automated with most robotic workstations.\"\n\nResults of the Opentrons Science team's internal testing of this protocol on the OT-2 are shown below: \n\n![results](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/sci-omegabiotek-magbind-total-rna-96/Screen+Shot+2021-08-09+at+4.10.56+PM.png)\n\n![results](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/sci-omegabiotek-magbind-total-rna-96/Screen+Shot+2021-08-09+at+4.11.10+PM.png)\n\n\n\nExplanation of complex parameters below:\n* `Number of samples`: Specify the number of samples this run (1-96 and divisible by 8, i.e. whole columns at a time).\n* `Deepwell type`: Specify which well plate will be mounted on the magnetic module.\n* `Reservoir Type`: Specify which reservoir will be employed.\n* `Starting Volume`: Specify starting volume of sample (ul).\n* `Binding Buffer Volume`: Specify binding buffer volume (ul).\n* `Wash Volumes`: Specify each of the three wash volumes (ul).\n* `Elution Volume`: Specify elution volume (ul).\n* `Settling Time`: Specify settling time for beads (minutes).\n* `Mag Deck Generation`: Specify whether GEN1 or GEN2 magnetic module will be used.\n* `Park Tips`: Specify whether to park tips or drop tips.\n* `Track Tips`: Specify whether to track tips between runs (starting with fresh tips or pick up from last runs tips).\n* `Flash`: Specify whether to flash OT-2 lights when the protocol runs out of tips, prompting the user to replenish tips.\n* `P300 Multi Channel Pipette Mount`: Specify whether the P300 multi channel pipette will be on the left or right mount.\n\n\n---\n\n", diff --git a/protoBuilds/sci-omegabiotek-magbind/README.json b/protoBuilds/sci-omegabiotek-magbind/README.json index 5458a603f7..9713283f28 100644 --- a/protoBuilds/sci-omegabiotek-magbind/README.json +++ b/protoBuilds/sci-omegabiotek-magbind/README.json @@ -10,7 +10,7 @@ "internal": "sci-omegabiotek-magbind", "labware": "\nNEST 96 Wellplate 2mL\nNEST 1 Reservoir 195mL\nNEST 12 Reservoir 15mL\nOpentrons 96 tiprack 300ul\nOpentrons 96 Aluminum block Nest Wellplate 100ul\n", "markdown": { - "author": "[Opentrons (verified)](https://opentrons.com/)\n\n***Opentrons has launched a new Protocol Library. You should use the [new page for this protocol](library.opentrons.com/p/sci-omegabiotek-magbind). This page won\u2019t be available after January 31st, 2024.***\n\n", + "author": "[Opentrons (verified)](https://opentrons.com/)\n\n# Opentrons has launched a new Protocol Library. You should use the [new page for this protocol](library.opentrons.com/p/sci-omegabiotek-magbind). This page won\u2019t be available after January 31st, 2024.\n\n", "categories": "* Nucleic Acid Extraction & Purification\n\t* RNA Extraction\n\n", "deck-setup": "Tip rack on Slot 5 is used for tip parking if selected. If not tip parking, place [200ul Opentrons Filter Tip Rack](https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-200ul-filter-tips) in Slot 5.\n![deck layout](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/sci-omegabiotek-magbind/Screen+Shot+2021-08-09+at+11.44.26+AM.png)\n\n", "description": "Your OT-2 can automate the Mag-Bind\u00ae Viral DNA/RNA 96 Kit. Please see the kit description below found on the [kit website]((https://www.omegabiotek.com/product/mag-bind-viral-dna-rna-96-kit/):\n\n\"Mag-Bind\u00ae Viral DNA/RNA Kit is designed for the rapid and reliable isolation of viral RNA and viral DNA from serum, swabs, plasma, saliva, and other body fluids. The Mag-Bind\u00ae magnetic beads technology enables purification of high-quality nucleic acids that are free of proteins, nucleases, and other impurities. In addition to easily being adapted with automated systems, this procedure can also be scaled up or down depending on the amount of starting sample. The purified nucleic acids are ready for direct use in downstream applications such as amplification or other enzymatic reactions.\"\n\nResults of the Opentrons Science team's internal testing of this protocol on the OT-2 are shown below: \n\n![results](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/sci-omegabiotek-magbind/Screen+Shot+2021-08-09+at+11.16.53+AM.png)\n\nExplanation of complex parameters below:\n* `Number of samples`: Specify the number of samples this run (1-96 and divisible by 8, i.e. whole columns at a time).\n* `Starting Volume`: Specify starting volume of sample (ul).\n* `Elution Volume`: Specify elution volume (ul).\n* `Park Tips`: Specify whether to park tips or drop tips.\n* `Mag Deck Generation`: Specify whether GEN1 or GEN2 magnetic module will be used.\n* `P300 Multi Channel Pipette Mount`: Specify whether the P300 multi channel pipette will be on the left or right mount.\n\n\n---\n\n", diff --git a/protoBuilds/sci-promega-magazorb-dna-mini-prep-kit/README.json b/protoBuilds/sci-promega-magazorb-dna-mini-prep-kit/README.json index 099dac92de..29da383070 100644 --- a/protoBuilds/sci-promega-magazorb-dna-mini-prep-kit/README.json +++ b/protoBuilds/sci-promega-magazorb-dna-mini-prep-kit/README.json @@ -6,14 +6,14 @@ ] }, "deck-setup": "\nTip rack on Slot 4 is used for tip parking if selected.\n\n", - "description": "Your OT-2 can fully automate the entire Promega MagaZorb\u00ae DNA Mini-Prep Kit.\nResults of the Opentrons Science team's internal testing of this protocol on the OT-2 are shown below: \n\nExplanation of complex parameters below:\n Number of samples: Specify the number of samples this run (1-96 and divisible by 8, i.e. whole columns at a time).\n Deepwell type: Specify which well plate will be mounted on the magnetic module.\n Reservoir Type: Specify which reservoir will be employed.\n Starting Volume: Specify starting volume of sample (ul).\n* `: Specify the volume of binding buffer to use (ul).\n*Elution Volume: Specify elution volume (ul).\n*Park Tips: Specify whether to park tips or drop tips.\n*P300 Multi Channel Pipette Mount`: Specify whether the P300 multi channel pipette will be on the left or right mount.\n", + "description": "Your OT-2 can fully automate the entire Promega MagaZorb\u00ae DNA Mini-Prep Kit.\nResults of the Opentrons Science team's internal testing of this protocol on the OT-2 are shown below: \n\nExplanation of complex parameters below:\n Number of samples: Specify the number of samples this run (1-96 and divisible by 8, i.e. whole columns at a time).\n Deepwell type: Specify which well plate will be mounted on the magnetic module.\n Reservoir Type: Specify which reservoir will be employed.\n Starting Volume: Specify starting volume of sample (ul).\n Binding buffer volume: Specify the volume of binding buffer to use (ul).\n Elution Volume: Specify elution volume (ul).\n Park Tips: Specify whether to park tips or drop tips.\n P300 Multi Channel Pipette Mount: Specify whether the P300 multi channel pipette will be on the left or right mount.\n", "internal": "sci-promega-magazorb-dna-mini-prep-kit", "labware": "\nNEST 96 Wellplate 2mL\nUSA Scientific 96 Wellplate 2.4mL\nNEST 12 Reservoir 15mL\nUSA Scientific 12 Reservoir 22mL\nOpentrons 200uL Filter Tips\nOpentrons 96 Aluminum block Nest Wellplate 100ul\n", "markdown": { - "author": "[Opentrons (verified)](https://opentrons.com/)\n\n***Opentrons has launched a new Protocol Library. You should use the [new page for this protocol](library.opentrons.com/p/sci-promega-magazorb-dna-mini-prep-kit). This page won\u2019t be available after January 31st, 2024.***\n\n", + "author": "[Opentrons (verified)](https://opentrons.com/)\n\n# Opentrons has launched a new Protocol Library. You should use the [new page for this protocol](library.opentrons.com/p/sci-promega-magazorb-dna-mini-prep-kit). This page won\u2019t be available after January 31st, 2024.\n\n", "categories": "* Nucleic Acid Extraction & Purification\n\t* DNA Extraction\n\n", "deck-setup": "\n* Tip rack on Slot 4 is used for tip parking if selected.\n\n![deck layout](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/sci-promega-magazorb-dna-mini-prep-kit/promega-extraction-layout.png)\n\n", - "description": "Your OT-2 can fully automate the entire Promega MagaZorb\u00ae DNA Mini-Prep Kit.\nResults of the Opentrons Science team's internal testing of this protocol on the OT-2 are shown below: \n\n![results](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/sci-promega-magazorb-dna-mini-prep-kit/promega-magazordb-results.png)\n\nExplanation of complex parameters below:\n* `Number of samples`: Specify the number of samples this run (1-96 and divisible by 8, i.e. whole columns at a time).\n* `Deepwell type`: Specify which well plate will be mounted on the magnetic module.\n* `Reservoir Type`: Specify which reservoir will be employed.\n* `Starting Volume`: Specify starting volume of sample (ul).\n* ``: Specify the volume of binding buffer to use (ul).\n* `Elution Volume`: Specify elution volume (ul).\n* `Park Tips`: Specify whether to park tips or drop tips.\n* `P300 Multi Channel Pipette Mount`: Specify whether the P300 multi channel pipette will be on the left or right mount.\n\n\n---\n\n", + "description": "Your OT-2 can fully automate the entire Promega MagaZorb\u00ae DNA Mini-Prep Kit.\nResults of the Opentrons Science team's internal testing of this protocol on the OT-2 are shown below: \n\n![results](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/sci-promega-magazorb-dna-mini-prep-kit/promega-magazordb-results.png)\n\nExplanation of complex parameters below:\n* `Number of samples`: Specify the number of samples this run (1-96 and divisible by 8, i.e. whole columns at a time).\n* `Deepwell type`: Specify which well plate will be mounted on the magnetic module.\n* `Reservoir Type`: Specify which reservoir will be employed.\n* `Starting Volume`: Specify starting volume of sample (ul).\n* `Binding buffer volume`: Specify the volume of binding buffer to use (ul).\n* `Elution Volume`: Specify elution volume (ul).\n* `Park Tips`: Specify whether to park tips or drop tips.\n* `P300 Multi Channel Pipette Mount`: Specify whether the P300 multi channel pipette will be on the left or right mount.\n\n\n---\n\n", "internal": "sci-promega-magazorb-dna-mini-prep-kit\n", "labware": "* [NEST 96 Wellplate 2mL](https://shop.opentrons.com/collections/lab-plates/products/nest-0-2-ml-96-well-deep-well-plate-v-bottom)\n* [USA Scientific 96 Wellplate 2.4mL](https://labware.opentrons.com/?category=wellPlate)\n* [NEST 12 Reservoir 15mL](https://shop.opentrons.com/collections/reservoirs/products/nest-12-well-reservoir-15-ml)\n* [USA Scientific 12 Reservoir 22mL](https://labware.opentrons.com/?category=reservoir)\n* [Opentrons 200uL Filter Tips](https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-200ul-filter-tips)\n* [Opentrons 96 Aluminum block Nest Wellplate 100ul](https://labware.opentrons.com/opentrons_96_aluminumblock_nest_wellplate_100ul?category=aluminumBlock)\n\n", "modules": "* [Magnetic Module (GEN2)](https://shop.opentrons.com/collections/hardware-modules/products/magdeck)\n\n", diff --git a/protoBuilds/sci-zymo-directzol-magbead/README.json b/protoBuilds/sci-zymo-directzol-magbead/README.json index 6c393c39a5..f904402cc7 100644 --- a/protoBuilds/sci-zymo-directzol-magbead/README.json +++ b/protoBuilds/sci-zymo-directzol-magbead/README.json @@ -10,7 +10,7 @@ "internal": "sci-zymo-directzol-magbead", "labware": "\nNEST 96 Wellplate 2mL\nUSA Scientific 96 Wellplate 2.4mL\nNEST 12 Reservoir 15mL\nUSA Scientific 12 Reservoir 22mL\nOpentrons 200uL Filter Tips\nOpentrons 96 Aluminum block Nest Wellplate 100ul\n", "markdown": { - "author": "[Opentrons (verified)](https://opentrons.com/)\n\n***Opentrons has launched a new Protocol Library. You should use the [new page for this protocol](library.opentrons.com/p/sci-zymo-directzol-magbead). This page won\u2019t be available after January 31st, 2024.***\n\n", + "author": "[Opentrons (verified)](https://opentrons.com/)\n\n# Opentrons has launched a new Protocol Library. You should use the [new page for this protocol](library.opentrons.com/p/sci-zymo-directzol-magbead). This page won\u2019t be available after January 31st, 2024.\n\n", "categories": "* Nucleic Acid Extraction & Purification\n\t* RNA Extraction\n\n", "deck-setup": "\n* Tip rack on Slot 4 is used for tip parking if selected.\n\n![deck layout](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/sci-zymo-directzol-magbead/Screen+Shot+2021-07-27+at+11.06.38+AM.png)\n\n", "description": "Your OT-2 can fully automate the entire Zymo Research Direct-zol\u2122-96 MagBead RNA Kit.\nResults of the Opentrons Science team's internal testing of this protocol on the OT-2 are shown below: \n\n![results](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/sci-zymo-directzol-magbead/Screen+Shot+2021-07-27+at+11.12.53+AM.png)\n\n![results](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/sci-zymo-directzol-magbead/Screen+Shot+2021-07-27+at+11.13.04+AM.png)\n\nExplanation of complex parameters below:\n* `Number of samples`: Specify the number of samples this run (1-96 and divisible by 8, i.e. whole columns at a time).\n* `Deepwell type`: Specify which well plate will be mounted on the magnetic module.\n* `Reservoir Type`: Specify which reservoir will be employed.\n* `Starting Volume`: Specify starting volume of sample (ul).\n* `Elution Volume`: Specify elution volume (ul).\n* `Park Tips`: Specify whether to park tips or drop tips.\n* `Mag Deck Generation`: Specify whether GEN1 or GEN2 magnetic module will be used.\n* `P300 Multi Channel Pipette Mount`: Specify whether the P300 multi channel pipette will be on the left or right mount.\n\n\n---\n\n", diff --git a/protoBuilds/swift-2s-turbo-pt1/README.json b/protoBuilds/swift-2s-turbo-pt1/README.json index 02f5801c9c..805fb2b0fb 100644 --- a/protoBuilds/swift-2s-turbo-pt1/README.json +++ b/protoBuilds/swift-2s-turbo-pt1/README.json @@ -13,7 +13,7 @@ "description": "![Swift Biosciences](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/swift-2s-protocol/swift_logo.jpg)\n\nPart 1 of 3: Enzymatic Prep & Ligation\n\n\nWith this protocol, your [OT-2](https://shop.opentrons.com/collections/ot-2-robot/products/ot-2) can perform the [Swift 2S Turbo DNA Library Kit](https://swiftbiosci.com/swift-2s-turbo-dna-library-kits/). For more information about the Swift 2S Turbo Kit and the [Swift 2S Turbo Unique Dual Indexing Primer Kit](https://shop.opentrons.com/products/swift-2s-turbo-unique-dual-indexing-primer-kit-96-rxns?_pos=1&_sid=f1fb599e7&_ss=r) on the OT-2, please see our Application Note here: [Rapid high quality next generation sequencing library preparation with Swift 2S Turbo DNA Library Kits on the Opentrons OT-2](https://opentrons-landing-img.s3.amazonaws.com/bundles/swift_automated_ngs_application_note.pdf)\n\n\nIn this part of the protocol, your OT-2 will complete the enzymatic prep portion and the initial steps of the ligation portion prior to adding your samples to a thermocycler, as described in the [Swift 2S Turbo Kit Guide](https://swiftbiosci.com/wp-content/uploads/2019/11/PRT-001-2S-Turbo-DNA-Library-Kit-Rev-1.pdf).\n\n\nAt the completion of this step, you will add your samples to the thermocycler. Once the thermocycler step is complete, continue with [Part 2 of the protocol](https://protocols.opentrons.com/protocol/swift-2s-turbo-pt2).\n\n\nLinks:\n* [Part 1: Enzymatic Prep & Ligation](https://protocols.opentrons.com/protocol/swift-2s-turbo-pt1)\n* [Part 2: Ligation Clean-Up & PCR Prep](https://protocols.opentrons.com/protocol/swift-2s-turbo-pt2)\n* [Part 3: Final Clean-Up](https://protocols.opentrons.com/protocol/swift-2s-turbo-pt3)\n\n\n\n**Note:** This workflow replaces the Reagent K2 in the Enzymatic Prep Master Mix with Reagent DE in order to reduce the risk of over fragmentation. For more information, please see [this note.](https://swiftbiosci.com/wp-content/uploads/2019/12/PRT-022-Swift-Deceleration-Module-Rev-1.pdf)\n\n---\n![Materials Needed](https://s3.amazonaws.com/opentrons-protocol-library-website/custom-README-images/001-General+Headings/materials.png)\n\nTo purchase consumables, labware, or pipettes, please visit our [online store](https://shop.opentrons.com/) or contact our sales team at [info@opentrons.com](mailto:info@opentrons.com)\n\n\n**Attention**: You can now purchase all of the consumables needed to run this protocol by [clicking here](https://shop.opentrons.com/products/ngs-library-prep-workstation-consumables-refill).\n\n* [Opentrons OT-2](https://shop.opentrons.com/collections/ot-2-robot/products/ot-2)\n* [Opentrons OT-2 Run App (Version 3.15.0 or later)](https://opentrons.com/ot-app/)\n* [Swift 2S Turbo DNA Library Kit](https://swiftbiosci.com/swift-2s-turbo-dna-library-kits/)\n* [Swift 2S Turbo Unique Dual Indexing Primer Kit](https://shop.opentrons.com/products/swift-2s-turbo-unique-dual-indexing-primer-kit-96-rxns?_pos=1&_sid=f1fb599e7&_ss=r)\n* [Omega Mag-Bind TotalPure NGS Kit](https://shop.opentrons.com/collections/verified-reagents/products/mag-bind-total-pure-ngs)\n* [Opentrons Temperature Module with Aluminum Block Set](https://shop.opentrons.com/collections/hardware-modules/products/tempdeck)\n* [Opentrons Magnetic Module](https://shop.opentrons.com/collections/hardware-modules/products/magdeck)\n* [Opentrons P20 Single-Channel Pipette](https://shop.opentrons.com/collections/ot-2-pipettes/products/single-channel-electronic-pipette) or Opentrons P50 Single-Channel Pipette*\n* [Opentrons P300 Multi-Channel Pipette](https://shop.opentrons.com/collections/ot-2-robot/products/8-channel-electronic-pipette)\n* [Opentrons Tips](https://shop.opentrons.com/collections/opentrons-tips)\n* [NEST 96-Well PCR Plate](https://shop.opentrons.com/collections/lab-plates/products/nest-0-1-ml-96-well-pcr-plate-full-skirt)\n* [NEST 12-Well Reservoir, 15mL](https://shop.opentrons.com/collections/reservoirs/products/nest-12-well-reservoir-15-ml)\n* [NEST 2mL Tubes](https://shop.opentrons.com/collections/tubes/products/nest-2-0-ml-sample-vial)\n* Samples, resuspended in Low EDTA TE, bringing the total volume to 16\u00b5L\n* PCR Strip(s), *optional*\n\n\n\\*Opentrons now sells the P20 Single-Channel Pipette in place of the P50 Single-Channel Pipette. If you have the P50 Single-Channel Pipette, you can use it for this protocol.\n\n\nFull setup for the entire protocol:\n\n![Full Deck Layout](https://s3.amazonaws.com/opentrons-protocol-library-website/custom-README-images/swift-2s-protocol/deck_layout_names.png)\n\n![Layout of Reagents](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/swift-2s-protocol/labware_layout.jpeg)\n\n\n\n\n---\n![Setup](https://s3.amazonaws.com/opentrons-protocol-library-website/custom-README-images/001-General+Headings/Setup.png)\n\n\n*Specific to Part 1 of 3*\n\n\nSlot 1: [NEST 96-Well PCR Plate](https://shop.opentrons.com/collections/lab-plates/products/nest-0-1-ml-96-well-pcr-plate-full-skirt) (or PCR Strips) on top of [96-Well Aluminum Block](https://shop.opentrons.com/collections/racks-and-adapters/products/aluminum-block-set) with samples\n* 8 Samples: Column 1\n* 16 Samples: Columns 1 & 2\n* 24 Samples: Columns 1, 2, & 3\n\nSlot 3: [Opentrons Temperature Module with 24-Well Aluminum Block](https://shop.opentrons.com/collections/hardware-modules/products/tempdeck) and [NEST 2mL Tubes](https://shop.opentrons.com/collections/tubes/products/nest-2-0-ml-sample-vial) with master mixes (for more information on master mixes, [click here](https://opentrons-protocol-library-website.s3.amazonaws.com/Technical+Notes/swift-2s-turbo-pt1/Swift+2S+Turbo+Master+Mix+Volumes.xlsx))\n* A1: Enzymatic Prep Master Mix\n* A2: Ligation Master Mix\n* A3: (**used in Part 2**) PCR Master Mix\n* B1: (**used in Part 2**) Indexing Reagent 1 (in original container); loaded sequentially (Reagent 2 - B2; Reagent 3 - B3...)\n\n\nSlot 5: [Opentrons Tips](https://shop.opentrons.com/collections/opentrons-tips)\n\n\n\n\n__Using the customizations fields, below set up your protocol.__\n* **Pipette and Tip Type**: Select which pipette (P50 Single-Channel or P20 Single-Channel) and corresponding tips to be used for this protocol. **The pipette should be attached to the left mount.**\n* **Number of Samples**: Specify the number of samples (8, 16 or 24) you'd like to run.\n\n\n\n\n", "internal": "Swift-2S-Turbo-pt1\n", "notes": "If you have any questions about this protocol, please contact the Protocol Development Team by filling out the [Troubleshooting Survey](https://protocol-troubleshooting.paperform.co/).\n\n", - "partner": "[Swift Biosciences](https://swiftbiosci.com/)\n\n***Opentrons has launched a new Protocol Library. You should use the [new page for this protocol](library.opentrons.com/p/swift-2s-turbo-pt1). This page won\u2019t be available after January 31st, 2024.***\n\n", + "partner": "[Swift Biosciences](https://swiftbiosci.com/)\n\n# Opentrons has launched a new Protocol Library. You should use the [new page for this protocol](library.opentrons.com/p/swift-2s-turbo-pt1). This page won\u2019t be available after January 31st, 2024.\n\n", "process": "\n1. Input your protocol parameters.\n2. Download your protocol.\n3. Upload your protocol into the [OT App](https://opentrons.com/ot-app).\n4. Set up your deck according to the deck map.\n5. 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).\n6. Hit \"Run\".\n\n", "robot": "* [OT-2](https://opentrons.com/ot-2)\n\n", "title": "Swift 2S Turbo DNA Library Kit Protocol: Part 1/3 - Enzymatic Prep & Ligation" diff --git a/protoBuilds/swift-fully-automated/README.json b/protoBuilds/swift-fully-automated/README.json index df8d2dab71..249d2e11fe 100644 --- a/protoBuilds/swift-fully-automated/README.json +++ b/protoBuilds/swift-fully-automated/README.json @@ -13,7 +13,7 @@ "description": "![Swift Biosciences](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/swift-2s-protocol/swift_logo.jpg)\n\n\nWith this protocol, your [OT-2](https://shop.opentrons.com/collections/ot-2-robot/products/ot-2) can **fully automate** the entire [Swift 2S Turbo DNA Library Kit](https://swiftbiosci.com/swift-2s-turbo-dna-library-kits/). Simply press start and your OT-2 can automate this entire workflow without any hands-on requirement - from enzymatic prep to sequence ready libraries! Up to 16 libraries can be prepared in under 3 hours.\n\n\nFor more information about the Swift 2S Turbo Kit and the [Swift 2S Turbo Unique Dual Indexing Primer Kit](https://shop.opentrons.com/products/swift-2s-turbo-unique-dual-indexing-primer-kit-96-rxns?_pos=1&_sid=f1fb599e7&_ss=r) on the OT-2, please see our Application Note here: [Rapid high quality next generation sequencing library preparation with Swift 2S Turbo DNA Library Kits on the Opentrons OT-2](https://opentrons-landing-img.s3.amazonaws.com/bundles/swift_automated_ngs_application_note.pdf)
\n
\n**Update (April 12, 2021)**: This protocol has been updated to fix an issue with the final elution destination when selecting 16 samples.
\n**Update (April 13, 2021)**: This protocol has been updated to accommodate the GEN2 Magnetic Module and fix an issue when using 200\u00b5L filter tips.
\n**Update (September 2, 2021)**: This protocol has been updated to allow for the [GEN2 P300 8-Channel Pipette](https://shop.opentrons.com/collections/ot-2-robot/products/8-channel-electronic-pipette) and has fixed an issue when using 16 samples that caused the 8-channel pipette to go to the wrong source wells during step 1220.\n\n\n---\n![Materials Needed](https://s3.amazonaws.com/opentrons-protocol-library-website/custom-README-images/001-General+Headings/materials.png)\n\nTo purchase consumables, labware, or pipettes, please visit our [online store](https://shop.opentrons.com/) or contact our sales team at [info@opentrons.com](mailto:info@opentrons.com)\n\n\n**Attention**: You can now purchase all of the consumables needed to run this protocol by [clicking here](https://shop.opentrons.com/products/ngs-library-prep-workstation-consumables-refill).\n\n* [Opentrons OT-2](https://shop.opentrons.com/collections/ot-2-robot/products/ot-2)\n* [Opentrons OT-2 Run App (Version 3.15.0 or later)](https://opentrons.com/ot-app/)\n* [Swift 2S Turbo DNA Library Kit](https://swiftbiosci.com/swift-2s-turbo-dna-library-kits/)\n* [Swift 2S Turbo Unique Dual Indexing Primer Kit](https://shop.opentrons.com/products/swift-2s-turbo-unique-dual-indexing-primer-kit-96-rxns?_pos=1&_sid=f1fb599e7&_ss=r)\n* [Omega Mag-Bind TotalPure NGS Kit](https://shop.opentrons.com/collections/verified-reagents/products/mag-bind-total-pure-ngs)\n* [Opentrons Thermocycler Module](https://shop.opentrons.com/collections/hardware-modules/products/thermocycler-module)\n* [Opentrons Temperature Module with Aluminum Block Set](https://shop.opentrons.com/collections/hardware-modules/products/tempdeck)\n* [Opentrons Magnetic Module](https://shop.opentrons.com/collections/hardware-modules/products/magdeck)\n* [Opentrons P20 Single-Channel Pipette](https://shop.opentrons.com/collections/ot-2-pipettes/products/single-channel-electronic-pipette) or Opentrons P50 Single-Channel Pipette*\n* [Opentrons P300 Multi-Channel Pipette](https://shop.opentrons.com/collections/ot-2-robot/products/8-channel-electronic-pipette)\n* [Opentrons Tips](https://shop.opentrons.com/collections/opentrons-tips)\n* [NEST 96-Well PCR Plate](https://shop.opentrons.com/collections/lab-plates/products/nest-0-1-ml-96-well-pcr-plate-full-skirt)\n* [NEST 12-Well Reservoir, 15mL](https://shop.opentrons.com/collections/reservoirs/products/nest-12-well-reservoir-15-ml)\n* [NEST 2mL Tubes](https://shop.opentrons.com/collections/tubes/products/nest-2-0-ml-sample-vial)\n* Samples, resuspended in Low EDTA TE, bringing the total volume to 19.5\u00b5L\n\n\n\n\\*Opentrons now sells the P20 Single-Channel Pipette in place of the P50 Single-Channel Pipette. If you have the P50 Single-Channel Pipette, you can use it for this protocol.\n\n\nFull setup for the entire protocol:\n\n![Full Deck Layout](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/swift-2s-protocol/swift-fa-layout.png)\n\n![Layout of Reagents](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/swift-2s-protocol/swift-fa-labware.jpeg)\n\n\n\n\n---\n![Setup](https://s3.amazonaws.com/opentrons-protocol-library-website/custom-README-images/001-General+Headings/Setup.png)\n\n\nSlot 1: [NEST 96-Well PCR Plate](https://shop.opentrons.com/collections/lab-plates/products/nest-0-1-ml-96-well-pcr-plate-full-skirt) on [Opentrons Magnetic Module](https://shop.opentrons.com/collections/hardware-modules/products/magdeck)\n\n\nSlot 2: [NEST 12-Well Reservoir](https://shop.opentrons.com/collections/reservoirs/products/nest-12-well-reservoir-15-ml) with Reagents\n* A2: Magnetic Beads; recommended volume: 3-4mL\n* A3: 80% Ethanol Solution, Freshly Prepared; recommended volume: 9-10mL\n* A4: 80% Ethanol Solution, Freshly Prepared (if running 16 samples); recommended volume: 9-10mL\n* A6: Low EDTA TE Buffer; recommended volume: 3mL\n\n\nSlot 3: [Opentrons Temperature Module with 24-Well Aluminum Block](https://shop.opentrons.com/collections/hardware-modules/products/tempdeck) and [NEST 2mL Tubes](https://shop.opentrons.com/collections/tubes/products/nest-2-0-ml-sample-vial) with master mixes (for more information on master mixes, [click here](https://opentrons-protocol-library-website.s3.amazonaws.com/Technical+Notes/swift-fully-automated/Swift+2s+Turbo+Fully+Automated+MasterMix+Volumes.xlsx)) and indices (if automating index addition)\n* A1: Enzymatic Prep Master Mix\n* A2: Ligation Master Mix\n* A3: PCR Master Mix\n* B1: Indexing Reagent 1 (in original container); loaded sequentially (Reagent 2 - B2; Reagent 3 - B3...)\n\n\nSlot 4: [Opentrons Tips for Single-Channel Pipette](https://shop.opentrons.com/collections/opentrons-tips)\n\n\nSlot 5: [Opentrons Tips for P300 8-Channel Pipette](https://shop.opentrons.com/collections/opentrons-tips)\n\n\nSlot 6: [Opentrons Tips for P300 8-Channel Pipette](https://shop.opentrons.com/collections/opentrons-tips)\n\n\nSlot 9: [Opentrons Tips for P300 8-Channel Pipette](https://shop.opentrons.com/collections/opentrons-tips)\n\n\n\nSlot 7/8/10/11: [Opentrons Thermocycler Module](https://shop.opentrons.com/collections/hardware-modules/products/thermocycler-module) with samples in a [NEST 96-Well PCR Plate](https://shop.opentrons.com/collections/lab-plates/products/nest-0-1-ml-96-well-pcr-plate-full-skirt)\n* 8 Samples: Column 1\n* 16 Samples: Columns 1 & 2\n\n\n\n__Using the customizations fields, below set up your protocol.__\n* **Number of Samples**: Specify the number of samples (8 or 16) you'd like to run.\n* **Pipette and Tip Type**: Select which pipette (P50 Single-Channel or P20 Single-Channel) and corresponding tips to be used for this protocol. **The pipette should be attached to the left mount.**\n* **P300 8-Channel Pipette Tip Type**: Select which tips (Filter/Non-Filter) for P300 8-Channel Pipette\n* **Automate Indexing**: Specify whether the indices should be added to the samples with the OT-2, or manually.\n* **Number of PCR Cycles**: See suggested cycles [here](https://opentrons-protocol-library-website.s3.amazonaws.com/Technical+Notes/swift-fully-automated/Swift+Fully+Automated+-+PCR+Cycles+Recommendation.xlsx). See Swift 2S Turbo manual for more detailed information.\n* **Fragmentation Time**: Fragmentation time varies depending on *1)* Lot number of the kit and *2)* whether the desired insert size is 200bp or 350bp. Please refer to the manual and Lot number on your kit for more information.\n\n\n\n**Note**: The final 20\u00b5L elution will be transferred to Column 3 if running 8 samples or Columns 5 & 6 if running 16 samples of the PCR plate on the Thermocycler\n\n", "internal": "swift-fully-automated\n", "notes": "If you have any questions about this protocol, please contact the Protocol Development Team by filling out the [Troubleshooting Survey](https://protocol-troubleshooting.paperform.co/).\n\n", - "partner": "[Swift Biosciences](https://swiftbiosci.com/)\n\n***Opentrons has launched a new Protocol Library. You should use the [new page for this protocol](library.opentrons.com/p/swift-fully-automated). This page won\u2019t be available after January 31st, 2024.***\n\n", + "partner": "[Swift Biosciences](https://swiftbiosci.com/)\n\n# Opentrons has launched a new Protocol Library. You should use the [new page for this protocol](library.opentrons.com/p/swift-fully-automated). This page won\u2019t be available after January 31st, 2024.\n\n", "process": "\n1. Input your protocol parameters.\n2. Download your protocol.\n3. Upload your protocol into the [OT App](https://opentrons.com/ot-app).\n4. Set up your deck according to the deck map.\n5. 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).\n6. Hit \"Run\".\n\n", "robot": "* [OT-2](https://opentrons.com/ot-2)\n\n", "title": "Swift 2S Turbo DNA Library Kit Protocol: Fully Automated" diff --git a/protocols/274d2a/README.md b/protocols/274d2a/README.md new file mode 100644 index 0000000000..42bd7a2a41 --- /dev/null +++ b/protocols/274d2a/README.md @@ -0,0 +1,77 @@ +# Cherrypicking + +### Author +[Opentrons](https://opentrons.com/) + +# Opentrons has launched a new Protocol Library. You should use the [new page for this protocol](library.opentrons.com/p/274d2a). This page won’t be available after January 31st, 2024. + +## Categories +* Sample Prep + * Cherrypicking + +## Description +![Cherrypicking Example](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/cherrypicking/cherrypicking_example.png) + +Cherrypicking, or hit-picking, is a key component of many workflows from high-throughput screening to microbial transfections. With this protocol, you can easily select specific wells in any labware without worrying about missing or selecting the wrong well. Just upload your properly formatted CSV file (keep scrolling for an example), customize your parameters, and download your ready-to-run protocol. + +--- +![Materials Needed](https://s3.amazonaws.com/opentrons-protocol-library-website/custom-README-images/001-General+Headings/materials.png) + +To purchase tips, reagents, or pipettes, please visit our [online store](https://shop.opentrons.com/) or contact our sales team at [info@opentrons.com](mailto:info@opentrons.com) + +* [Opentrons OT-2](https://shop.opentrons.com/collections/ot-2-robot/products/ot-2) +* [Opentrons OT-2 Run App (Version 3.15.0 or later)](https://opentrons.com/ot-app/) +* [Opentrons Single-Channel Pipette](https://shop.opentrons.com/collections/ot-2-pipettes) and corresponding [Tips](https://shop.opentrons.com/collections/opentrons-tips) +* [Microplates (96-well or 384-well)](https://labware.opentrons.com/?category=wellPlate) + +For more detailed information on compatible labware, please visit our [Labware Library](https://labware.opentrons.com/). + + + +--- +![Setup](https://s3.amazonaws.com/opentrons-protocol-library-website/custom-README-images/001-General+Headings/Setup.png) + +Labware will be loaded automatically by specifying the labware loadname and labware slot in the .csv file. All available empty slots will be filled with the necessary [tipracks](https://shop.opentrons.com/collections/opentrons-tips), and the user will be prompted to refill the tipracks if all are emptied in the middle of the protocol. + +**CSV Format** + +Your cherrypicking transfers must be saved as a comma separated value (.csv) file type. Your CSV must contain values corresponding to volumes in microliters (μL). Note that the header line (first row of the .csv file) should also be included! + +Here's an example of how a short cherrypicking protocol should be properly formatted: + +``` +New Tip,Source Labware,Source Slot,Source Well,Source Aspiration Height Above Bottom (in mm),Dest Labware,Dest Slot,Dest Well,Dest Dispense Height Above Bottom (in mm),Volume (in ul) +yes,agilent_1_reservoir_290ml,1,A1,1,nest_96_wellplate_100ul_pcr_full_skirt,4,A11,2,1 +,nest_12_reservoir_15ml,2,A1,1,corning_384_wellplate_112ul_flat,5,B11,2,3 +yes,nest_1_reservoir_195ml,3,A1,1,corning_384_wellplate_112ul_flat,5,A12,2,7 +``` + +In the above example, 1μL will be transferred from 1mm above the bottom of well A1 in an Agilent 1-well 290ml reservoir (slot 1) to well A11 in the destination NEST 96-well plate 100µl (slot 4) with a new tip. After this, 3μL will be transferred from 1mm above the bottom of well A1 in a NEST 12-well 15ml reservoir (slot 2) to well A5 in the destination NEST 96-well plate 100µl (slot 5) with the same tip. Last, 7μL will be transferred from 1mm above the bottom of well A1 in a NEST 1-well 195ml reservoir (slot 3) to well H12 in the destination NEST 96-well plate 100µl (slot 5) with a new tip. + +If you’d like to follow our template, you can make a copy of [this spreadsheet](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/274d2a/ex.csv), fill out your values, and export as CSV for use with this protocol. + +Using the customizations fields, below set up your protocol. +* Transfer .csv File: Upload the .csv file containing your well locations, volumes, and source plate (optional). +* Pipette Model: Select which pipette you will use for this protocol. +* Pipette Mount: Specify which mount your single-channel pipette is on (left or right) +* Tip Type: Specify whether you want to use filter tips. +* Tip Usage Strategy: Specify whether you'd like to use a new tip for each transfer, or keep the same tip throughout the protocol. + + +### Robot +* [OT-2](https://opentrons.com/ot-2) + +## Process + +1. Create your CSV file according to our instructions. +2. Upload your CSV and select all desired settings according to the “Setup” section above to customize your protocol run. +3. Download your customized OT-2 protocol using the blue “Download” button, located above the deckmap. +4. Upload your protocol into the Opentrons App and follow the instructions there to set up your deck, calibrate your labware, and proceed to run. +5. Make sure to add samples to your labware before placing them on the deck! Your source plate should contain the samples you want to pick. + +### Additional Notes + +If you’d like to request a protocol supporting multiple destination plates or require other changes to this script, please fill out our [Protocol Request Form](https://opentrons-protocol-dev.paperform.co/). You can also modify the Python file directly by following our [API Documentation](https://docs.opentrons.com/v2/). If you’d like to chat with an automation engineer about changes, please contact us at [protocols@opentrons.com](mailto:protocols@opentrons.com). + +###### Internal +274d2a diff --git a/protocols/274d2a/cherrypicking.ot2.apiv2.py b/protocols/274d2a/cherrypicking.ot2.apiv2.py new file mode 100644 index 0000000000..2ac3b9acd8 --- /dev/null +++ b/protocols/274d2a/cherrypicking.ot2.apiv2.py @@ -0,0 +1,125 @@ +metadata = { + 'protocolName': 'Cherrypicking', + 'author': 'Nick ', + 'source': 'Custom Protocol Request', + 'apiLevel': '2.9' +} + + +def run(ctx): + + [pipette_type, pipette_mount, tip_type, + transfer_csv] = get_values( # noqa: F821 + "pipette_type", "pipette_mount", "tip_type", "transfer_csv") + + tiprack_map = { + 'p10_single': { + 'standard': 'opentrons_96_tiprack_10ul', + 'filter': 'opentrons_96_filtertiprack_20ul' + }, + 'p50_single': { + 'standard': 'opentrons_96_tiprack_300ul', + 'filter': 'opentrons_96_filtertiprack_200ul' + }, + 'p300_single': { + 'standard': 'opentrons_96_tiprack_300ul', + 'filter': 'opentrons_96_filtertiprack_200ul' + }, + 'p1000_single': { + 'standard': 'opentrons_96_tiprack_1000ul', + 'filter': 'opentrons_96_filtertiprack_1000ul' + }, + 'p20_single_gen2': { + 'standard': 'opentrons_96_tiprack_20ul', + 'filter': 'opentrons_96_filtertiprack_20ul' + }, + 'p300_single_gen2': { + 'standard': 'opentrons_96_tiprack_300ul', + 'filter': 'opentrons_96_filtertiprack_200ul' + }, + 'p1000_single_gen2': { + 'standard': 'opentrons_96_tiprack_1000ul', + 'filter': 'opentrons_96_filtertiprack_1000ul' + }, + 'p10_multi': { + 'standard': 'opentrons_96_tiprack_10ul', + 'filter': 'opentrons_96_filtertiprack_20ul' + }, + 'p50_multi': { + 'standard': 'opentrons_96_tiprack_300ul', + 'filter': 'opentrons_96_filtertiprack_200ul' + }, + 'p300_multi': { + 'standard': 'opentrons_96_tiprack_300ul', + 'filter': 'opentrons_96_filtertiprack_200ul' + }, + 'p20_multi_gen2': { + 'standard': 'opentrons_96_tiprack_20ul', + 'filter': 'opentrons_96_filtertiprack_20ul' + }, + 'p300_multi_gen2': { + 'standard': 'opentrons_96_tiprack_300ul', + 'filter': 'opentrons_96_filtertiprack_200ul' + } + } + + # load labware + transfer_info = [[val.strip().lower() for val in line.split(',')] + for line in transfer_csv.splitlines() + if line.split(',')[1].strip()][1:] + for line in transfer_info: + s_lw, s_slot, d_lw, d_slot = line[1:3] + line[5:7] + for slot, lw in zip([s_slot, d_slot], [s_lw, d_lw]): + if not int(slot) in ctx.loaded_labwares: + ctx.load_labware(lw.lower(), slot) + + # load tipracks in remaining slots + tiprack_type = tiprack_map[pipette_type][tip_type] + tipracks = [] + for slot in range(1, 13): + if slot not in ctx.loaded_labwares: + tipracks.append(ctx.load_labware(tiprack_type, str(slot))) + + # load pipette + pip = ctx.load_instrument(pipette_type, pipette_mount, tip_racks=tipracks) + + tip_count = 0 + tip_max = len(tipracks*96) + + def pick_up(): + nonlocal tip_count + if tip_count == tip_max: + ctx.pause('Please refill tipracks before resuming.') + pip.reset_tipracks() + tip_count = 0 + pip.pick_up_tip() + tip_count += 1 + + def parse_well(well): + letter = well[0] + number = well[1:] + return letter.upper() + str(int(number)) + + for line in transfer_info: + [new_tip, _, s_slot, s_well, s_h, _, d_slot, d_well, d_h, + vol] = line[:10] + if pip.type == 'multi' and ( + parse_well(s_well)[0] not in 'AB' + or parse_well(d_well)[0] not in 'AB'): + ctx.pause('Warning: attempting to use multi-channel pipette on \ +rows other than row A.') + source = ctx.loaded_labwares[ + int(s_slot)].wells_by_name()[parse_well(s_well)].bottom(float(s_h)) + dest = ctx.loaded_labwares[ + int(d_slot)].wells_by_name()[parse_well(d_well)].bottom(float(d_h)) + + if new_tip: + if new_tip.lower()[0] == 'y': + if pip.has_tip: + pip.drop_tip() + pick_up() + + pip.transfer(float(vol), source, dest, new_tip='never') + + if pip.has_tip: + pip.drop_tip() diff --git a/protocols/274d2a/fields.json b/protocols/274d2a/fields.json new file mode 100644 index 0000000000..d180cc2ce3 --- /dev/null +++ b/protocols/274d2a/fields.json @@ -0,0 +1,45 @@ +[ + { + "type": "textFile", + "label": "Transfer .csv File", + "name": "transfer_csv", + "default": "New Tip,Source Labware,Source Slot,Source Well,Source Aspiration Height Above Bottom (in mm),Dest Labware,Dest Slot,Dest Well,Dest Dispense Height Above Bottom (in mm),Volume (in ul)\nyes,agilent_1_reservoir_290ml,1,A1,1,corning_384_wellplate_112ul_flat,4,B11,2,1\n,nest_12_reservoir_15ml,2,A1,1,nest_96_wellplate_2ml_deep,5,A5,2,3\nyes,nest_1_reservoir_195ml,3,A1,1,nest_96_wellplate_2ml_deep,5,A12,2,7" + }, + { + "type": "dropDown", + "label": "Pipette Model", + "name": "pipette_type", + "options": [ + {"label": "P20 Multi (GEN 2)", "value": "p20_multi_gen2"}, + {"label": "P10 Single (GEN 1)", "value": "p10_single"}, + {"label": "P50 Single (GEN 1)", "value": "p50_single"}, + {"label": "P300 Single (GEN 1)", "value": "p300_single"}, + {"label": "P1000 Single (GEN 1)", "value": "p1000_single"}, + {"label": "P20 Single (GEN 2)", "value": "p20_single_gen2"}, + {"label": "P300 Single (GEN 2)", "value": "p300_single_gen2"}, + {"label": "P1000 Single (GEN 2)", "value": "p1000_single_gen2"}, + {"label": "P10 Multi (GEN 1)", "value": "p10_multi"}, + {"label": "P50 Multi (GEN 1)", "value": "p50_multi"}, + {"label": "P300 Multi (GEN 1)", "value": "p300_multi"}, + {"label": "P300 Multi (GEN 2)", "value": "p300_multi_gen2"} + ] + }, + { + "type": "dropDown", + "label": "Pipette Mount", + "name": "pipette_mount", + "options": [ + {"label": "right", "value": "right"}, + {"label": "left", "value": "left"} + ] + }, + { + "type": "dropDown", + "label": "Tip Type", + "name": "tip_type", + "options": [ + {"label": "standard", "value": "standard"}, + {"label": "filter", "value": "filter"} + ] + } +] diff --git a/protocols/274d2a/labware/greinerbioone_96_wellplate_200ul.json b/protocols/274d2a/labware/greinerbioone_96_wellplate_200ul.json new file mode 100644 index 0000000000..eacba21fda --- /dev/null +++ b/protocols/274d2a/labware/greinerbioone_96_wellplate_200ul.json @@ -0,0 +1,1127 @@ +{ + "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": "Greiner Bio-One", + "brandId": [ + "652290" + ] + }, + "metadata": { + "displayName": "Greiner Bio-One 96 Well Plate 200 µL", + "displayCategory": "wellPlate", + "displayVolumeUnits": "µL", + "tags": [] + }, + "dimensions": { + "xDimension": 127.98, + "yDimension": 85.85, + "zDimension": 21.08 + }, + "wells": { + "A1": { + "depth": 20.65, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.56, + "x": 13.49, + "y": 74.42, + "z": 0.43 + }, + "B1": { + "depth": 20.65, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.56, + "x": 13.49, + "y": 65.42, + "z": 0.43 + }, + "C1": { + "depth": 20.65, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.56, + "x": 13.49, + "y": 56.42, + "z": 0.43 + }, + "D1": { + "depth": 20.65, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.56, + "x": 13.49, + "y": 47.42, + "z": 0.43 + }, + "E1": { + "depth": 20.65, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.56, + "x": 13.49, + "y": 38.42, + "z": 0.43 + }, + "F1": { + "depth": 20.65, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.56, + "x": 13.49, + "y": 29.42, + "z": 0.43 + }, + "G1": { + "depth": 20.65, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.56, + "x": 13.49, + "y": 20.42, + "z": 0.43 + }, + "H1": { + "depth": 20.65, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.56, + "x": 13.49, + "y": 11.42, + "z": 0.43 + }, + "A2": { + "depth": 20.65, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.56, + "x": 22.49, + "y": 74.42, + "z": 0.43 + }, + "B2": { + "depth": 20.65, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.56, + "x": 22.49, + "y": 65.42, + "z": 0.43 + }, + "C2": { + "depth": 20.65, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.56, + "x": 22.49, + "y": 56.42, + "z": 0.43 + }, + "D2": { + "depth": 20.65, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.56, + "x": 22.49, + "y": 47.42, + "z": 0.43 + }, + "E2": { + "depth": 20.65, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.56, + "x": 22.49, + "y": 38.42, + "z": 0.43 + }, + "F2": { + "depth": 20.65, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.56, + "x": 22.49, + "y": 29.42, + "z": 0.43 + }, + "G2": { + "depth": 20.65, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.56, + "x": 22.49, + "y": 20.42, + "z": 0.43 + }, + "H2": { + "depth": 20.65, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.56, + "x": 22.49, + "y": 11.42, + "z": 0.43 + }, + "A3": { + "depth": 20.65, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.56, + "x": 31.49, + "y": 74.42, + "z": 0.43 + }, + "B3": { + "depth": 20.65, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.56, + "x": 31.49, + "y": 65.42, + "z": 0.43 + }, + "C3": { + "depth": 20.65, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.56, + "x": 31.49, + "y": 56.42, + "z": 0.43 + }, + "D3": { + "depth": 20.65, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.56, + "x": 31.49, + "y": 47.42, + "z": 0.43 + }, + "E3": { + "depth": 20.65, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.56, + "x": 31.49, + "y": 38.42, + "z": 0.43 + }, + "F3": { + "depth": 20.65, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.56, + "x": 31.49, + "y": 29.42, + "z": 0.43 + }, + "G3": { + "depth": 20.65, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.56, + "x": 31.49, + "y": 20.42, + "z": 0.43 + }, + "H3": { + "depth": 20.65, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.56, + "x": 31.49, + "y": 11.42, + "z": 0.43 + }, + "A4": { + "depth": 20.65, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.56, + "x": 40.49, + "y": 74.42, + "z": 0.43 + }, + "B4": { + "depth": 20.65, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.56, + "x": 40.49, + "y": 65.42, + "z": 0.43 + }, + "C4": { + "depth": 20.65, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.56, + "x": 40.49, + "y": 56.42, + "z": 0.43 + }, + "D4": { + "depth": 20.65, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.56, + "x": 40.49, + "y": 47.42, + "z": 0.43 + }, + "E4": { + "depth": 20.65, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.56, + "x": 40.49, + "y": 38.42, + "z": 0.43 + }, + "F4": { + "depth": 20.65, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.56, + "x": 40.49, + "y": 29.42, + "z": 0.43 + }, + "G4": { + "depth": 20.65, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.56, + "x": 40.49, + "y": 20.42, + "z": 0.43 + }, + "H4": { + "depth": 20.65, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.56, + "x": 40.49, + "y": 11.42, + "z": 0.43 + }, + "A5": { + "depth": 20.65, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.56, + "x": 49.49, + "y": 74.42, + "z": 0.43 + }, + "B5": { + "depth": 20.65, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.56, + "x": 49.49, + "y": 65.42, + "z": 0.43 + }, + "C5": { + "depth": 20.65, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.56, + "x": 49.49, + "y": 56.42, + "z": 0.43 + }, + "D5": { + "depth": 20.65, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.56, + "x": 49.49, + "y": 47.42, + "z": 0.43 + }, + "E5": { + "depth": 20.65, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.56, + "x": 49.49, + "y": 38.42, + "z": 0.43 + }, + "F5": { + "depth": 20.65, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.56, + "x": 49.49, + "y": 29.42, + "z": 0.43 + }, + "G5": { + "depth": 20.65, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.56, + "x": 49.49, + "y": 20.42, + "z": 0.43 + }, + "H5": { + "depth": 20.65, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.56, + "x": 49.49, + "y": 11.42, + "z": 0.43 + }, + "A6": { + "depth": 20.65, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.56, + "x": 58.49, + "y": 74.42, + "z": 0.43 + }, + "B6": { + "depth": 20.65, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.56, + "x": 58.49, + "y": 65.42, + "z": 0.43 + }, + "C6": { + "depth": 20.65, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.56, + "x": 58.49, + "y": 56.42, + "z": 0.43 + }, + "D6": { + "depth": 20.65, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.56, + "x": 58.49, + "y": 47.42, + "z": 0.43 + }, + "E6": { + "depth": 20.65, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.56, + "x": 58.49, + "y": 38.42, + "z": 0.43 + }, + "F6": { + "depth": 20.65, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.56, + "x": 58.49, + "y": 29.42, + "z": 0.43 + }, + "G6": { + "depth": 20.65, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.56, + "x": 58.49, + "y": 20.42, + "z": 0.43 + }, + "H6": { + "depth": 20.65, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.56, + "x": 58.49, + "y": 11.42, + "z": 0.43 + }, + "A7": { + "depth": 20.65, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.56, + "x": 67.49, + "y": 74.42, + "z": 0.43 + }, + "B7": { + "depth": 20.65, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.56, + "x": 67.49, + "y": 65.42, + "z": 0.43 + }, + "C7": { + "depth": 20.65, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.56, + "x": 67.49, + "y": 56.42, + "z": 0.43 + }, + "D7": { + "depth": 20.65, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.56, + "x": 67.49, + "y": 47.42, + "z": 0.43 + }, + "E7": { + "depth": 20.65, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.56, + "x": 67.49, + "y": 38.42, + "z": 0.43 + }, + "F7": { + "depth": 20.65, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.56, + "x": 67.49, + "y": 29.42, + "z": 0.43 + }, + "G7": { + "depth": 20.65, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.56, + "x": 67.49, + "y": 20.42, + "z": 0.43 + }, + "H7": { + "depth": 20.65, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.56, + "x": 67.49, + "y": 11.42, + "z": 0.43 + }, + "A8": { + "depth": 20.65, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.56, + "x": 76.49, + "y": 74.42, + "z": 0.43 + }, + "B8": { + "depth": 20.65, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.56, + "x": 76.49, + "y": 65.42, + "z": 0.43 + }, + "C8": { + "depth": 20.65, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.56, + "x": 76.49, + "y": 56.42, + "z": 0.43 + }, + "D8": { + "depth": 20.65, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.56, + "x": 76.49, + "y": 47.42, + "z": 0.43 + }, + "E8": { + "depth": 20.65, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.56, + "x": 76.49, + "y": 38.42, + "z": 0.43 + }, + "F8": { + "depth": 20.65, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.56, + "x": 76.49, + "y": 29.42, + "z": 0.43 + }, + "G8": { + "depth": 20.65, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.56, + "x": 76.49, + "y": 20.42, + "z": 0.43 + }, + "H8": { + "depth": 20.65, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.56, + "x": 76.49, + "y": 11.42, + "z": 0.43 + }, + "A9": { + "depth": 20.65, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.56, + "x": 85.49, + "y": 74.42, + "z": 0.43 + }, + "B9": { + "depth": 20.65, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.56, + "x": 85.49, + "y": 65.42, + "z": 0.43 + }, + "C9": { + "depth": 20.65, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.56, + "x": 85.49, + "y": 56.42, + "z": 0.43 + }, + "D9": { + "depth": 20.65, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.56, + "x": 85.49, + "y": 47.42, + "z": 0.43 + }, + "E9": { + "depth": 20.65, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.56, + "x": 85.49, + "y": 38.42, + "z": 0.43 + }, + "F9": { + "depth": 20.65, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.56, + "x": 85.49, + "y": 29.42, + "z": 0.43 + }, + "G9": { + "depth": 20.65, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.56, + "x": 85.49, + "y": 20.42, + "z": 0.43 + }, + "H9": { + "depth": 20.65, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.56, + "x": 85.49, + "y": 11.42, + "z": 0.43 + }, + "A10": { + "depth": 20.65, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.56, + "x": 94.49, + "y": 74.42, + "z": 0.43 + }, + "B10": { + "depth": 20.65, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.56, + "x": 94.49, + "y": 65.42, + "z": 0.43 + }, + "C10": { + "depth": 20.65, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.56, + "x": 94.49, + "y": 56.42, + "z": 0.43 + }, + "D10": { + "depth": 20.65, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.56, + "x": 94.49, + "y": 47.42, + "z": 0.43 + }, + "E10": { + "depth": 20.65, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.56, + "x": 94.49, + "y": 38.42, + "z": 0.43 + }, + "F10": { + "depth": 20.65, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.56, + "x": 94.49, + "y": 29.42, + "z": 0.43 + }, + "G10": { + "depth": 20.65, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.56, + "x": 94.49, + "y": 20.42, + "z": 0.43 + }, + "H10": { + "depth": 20.65, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.56, + "x": 94.49, + "y": 11.42, + "z": 0.43 + }, + "A11": { + "depth": 20.65, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.56, + "x": 103.49, + "y": 74.42, + "z": 0.43 + }, + "B11": { + "depth": 20.65, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.56, + "x": 103.49, + "y": 65.42, + "z": 0.43 + }, + "C11": { + "depth": 20.65, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.56, + "x": 103.49, + "y": 56.42, + "z": 0.43 + }, + "D11": { + "depth": 20.65, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.56, + "x": 103.49, + "y": 47.42, + "z": 0.43 + }, + "E11": { + "depth": 20.65, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.56, + "x": 103.49, + "y": 38.42, + "z": 0.43 + }, + "F11": { + "depth": 20.65, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.56, + "x": 103.49, + "y": 29.42, + "z": 0.43 + }, + "G11": { + "depth": 20.65, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.56, + "x": 103.49, + "y": 20.42, + "z": 0.43 + }, + "H11": { + "depth": 20.65, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.56, + "x": 103.49, + "y": 11.42, + "z": 0.43 + }, + "A12": { + "depth": 20.65, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.56, + "x": 112.49, + "y": 74.42, + "z": 0.43 + }, + "B12": { + "depth": 20.65, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.56, + "x": 112.49, + "y": 65.42, + "z": 0.43 + }, + "C12": { + "depth": 20.65, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.56, + "x": 112.49, + "y": 56.42, + "z": 0.43 + }, + "D12": { + "depth": 20.65, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.56, + "x": 112.49, + "y": 47.42, + "z": 0.43 + }, + "E12": { + "depth": 20.65, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.56, + "x": 112.49, + "y": 38.42, + "z": 0.43 + }, + "F12": { + "depth": 20.65, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.56, + "x": 112.49, + "y": 29.42, + "z": 0.43 + }, + "G12": { + "depth": 20.65, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.56, + "x": 112.49, + "y": 20.42, + "z": 0.43 + }, + "H12": { + "depth": 20.65, + "totalLiquidVolume": 200, + "shape": "circular", + "diameter": 5.56, + "x": 112.49, + "y": 11.42, + "z": 0.43 + } + }, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "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": "greinerbioone_96_wellplate_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/274d2a/labware/sarstedt_384_wellplate_40ul.json b/protocols/274d2a/labware/sarstedt_384_wellplate_40ul.json new file mode 100644 index 0000000000..d98ff272f0 --- /dev/null +++ b/protocols/274d2a/labware/sarstedt_384_wellplate_40ul.json @@ -0,0 +1,4319 @@ +{ + "ordering": [ + [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1", + "I1", + "J1", + "K1", + "L1", + "M1", + "N1", + "O1", + "P1" + ], + [ + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2", + "I2", + "J2", + "K2", + "L2", + "M2", + "N2", + "O2", + "P2" + ], + [ + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3", + "I3", + "J3", + "K3", + "L3", + "M3", + "N3", + "O3", + "P3" + ], + [ + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4", + "I4", + "J4", + "K4", + "L4", + "M4", + "N4", + "O4", + "P4" + ], + [ + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5", + "I5", + "J5", + "K5", + "L5", + "M5", + "N5", + "O5", + "P5" + ], + [ + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6", + "I6", + "J6", + "K6", + "L6", + "M6", + "N6", + "O6", + "P6" + ], + [ + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7", + "I7", + "J7", + "K7", + "L7", + "M7", + "N7", + "O7", + "P7" + ], + [ + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8", + "I8", + "J8", + "K8", + "L8", + "M8", + "N8", + "O8", + "P8" + ], + [ + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9", + "I9", + "J9", + "K9", + "L9", + "M9", + "N9", + "O9", + "P9" + ], + [ + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10", + "I10", + "J10", + "K10", + "L10", + "M10", + "N10", + "O10", + "P10" + ], + [ + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11", + "I11", + "J11", + "K11", + "L11", + "M11", + "N11", + "O11", + "P11" + ], + [ + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12", + "I12", + "J12", + "K12", + "L12", + "M12", + "N12", + "O12", + "P12" + ], + [ + "A13", + "B13", + "C13", + "D13", + "E13", + "F13", + "G13", + "H13", + "I13", + "J13", + "K13", + "L13", + "M13", + "N13", + "O13", + "P13" + ], + [ + "A14", + "B14", + "C14", + "D14", + "E14", + "F14", + "G14", + "H14", + "I14", + "J14", + "K14", + "L14", + "M14", + "N14", + "O14", + "P14" + ], + [ + "A15", + "B15", + "C15", + "D15", + "E15", + "F15", + "G15", + "H15", + "I15", + "J15", + "K15", + "L15", + "M15", + "N15", + "O15", + "P15" + ], + [ + "A16", + "B16", + "C16", + "D16", + "E16", + "F16", + "G16", + "H16", + "I16", + "J16", + "K16", + "L16", + "M16", + "N16", + "O16", + "P16" + ], + [ + "A17", + "B17", + "C17", + "D17", + "E17", + "F17", + "G17", + "H17", + "I17", + "J17", + "K17", + "L17", + "M17", + "N17", + "O17", + "P17" + ], + [ + "A18", + "B18", + "C18", + "D18", + "E18", + "F18", + "G18", + "H18", + "I18", + "J18", + "K18", + "L18", + "M18", + "N18", + "O18", + "P18" + ], + [ + "A19", + "B19", + "C19", + "D19", + "E19", + "F19", + "G19", + "H19", + "I19", + "J19", + "K19", + "L19", + "M19", + "N19", + "O19", + "P19" + ], + [ + "A20", + "B20", + "C20", + "D20", + "E20", + "F20", + "G20", + "H20", + "I20", + "J20", + "K20", + "L20", + "M20", + "N20", + "O20", + "P20" + ], + [ + "A21", + "B21", + "C21", + "D21", + "E21", + "F21", + "G21", + "H21", + "I21", + "J21", + "K21", + "L21", + "M21", + "N21", + "O21", + "P21" + ], + [ + "A22", + "B22", + "C22", + "D22", + "E22", + "F22", + "G22", + "H22", + "I22", + "J22", + "K22", + "L22", + "M22", + "N22", + "O22", + "P22" + ], + [ + "A23", + "B23", + "C23", + "D23", + "E23", + "F23", + "G23", + "H23", + "I23", + "J23", + "K23", + "L23", + "M23", + "N23", + "O23", + "P23" + ], + [ + "A24", + "B24", + "C24", + "D24", + "E24", + "F24", + "G24", + "H24", + "I24", + "J24", + "K24", + "L24", + "M24", + "N24", + "O24", + "P24" + ] + ], + "brand": { + "brand": "Sarstedt", + "brandId": [ + "72.1984.202" + ] + }, + "metadata": { + "displayName": "Sarstedt 384 Well Plate 40 µL", + "displayCategory": "wellPlate", + "displayVolumeUnits": "µL", + "tags": [] + }, + "dimensions": { + "xDimension": 127.8, + "yDimension": 85.5, + "zDimension": 9.65 + }, + "wells": { + "A1": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 12.12, + "y": 76.52, + "z": 1.95 + }, + "B1": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 12.12, + "y": 72.02, + "z": 1.95 + }, + "C1": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 12.12, + "y": 67.52, + "z": 1.95 + }, + "D1": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 12.12, + "y": 63.02, + "z": 1.95 + }, + "E1": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 12.12, + "y": 58.52, + "z": 1.95 + }, + "F1": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 12.12, + "y": 54.02, + "z": 1.95 + }, + "G1": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 12.12, + "y": 49.52, + "z": 1.95 + }, + "H1": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 12.12, + "y": 45.02, + "z": 1.95 + }, + "I1": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 12.12, + "y": 40.52, + "z": 1.95 + }, + "J1": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 12.12, + "y": 36.02, + "z": 1.95 + }, + "K1": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 12.12, + "y": 31.52, + "z": 1.95 + }, + "L1": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 12.12, + "y": 27.02, + "z": 1.95 + }, + "M1": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 12.12, + "y": 22.52, + "z": 1.95 + }, + "N1": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 12.12, + "y": 18.02, + "z": 1.95 + }, + "O1": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 12.12, + "y": 13.52, + "z": 1.95 + }, + "P1": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 12.12, + "y": 9.02, + "z": 1.95 + }, + "A2": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 16.62, + "y": 76.52, + "z": 1.95 + }, + "B2": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 16.62, + "y": 72.02, + "z": 1.95 + }, + "C2": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 16.62, + "y": 67.52, + "z": 1.95 + }, + "D2": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 16.62, + "y": 63.02, + "z": 1.95 + }, + "E2": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 16.62, + "y": 58.52, + "z": 1.95 + }, + "F2": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 16.62, + "y": 54.02, + "z": 1.95 + }, + "G2": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 16.62, + "y": 49.52, + "z": 1.95 + }, + "H2": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 16.62, + "y": 45.02, + "z": 1.95 + }, + "I2": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 16.62, + "y": 40.52, + "z": 1.95 + }, + "J2": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 16.62, + "y": 36.02, + "z": 1.95 + }, + "K2": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 16.62, + "y": 31.52, + "z": 1.95 + }, + "L2": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 16.62, + "y": 27.02, + "z": 1.95 + }, + "M2": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 16.62, + "y": 22.52, + "z": 1.95 + }, + "N2": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 16.62, + "y": 18.02, + "z": 1.95 + }, + "O2": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 16.62, + "y": 13.52, + "z": 1.95 + }, + "P2": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 16.62, + "y": 9.02, + "z": 1.95 + }, + "A3": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 21.12, + "y": 76.52, + "z": 1.95 + }, + "B3": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 21.12, + "y": 72.02, + "z": 1.95 + }, + "C3": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 21.12, + "y": 67.52, + "z": 1.95 + }, + "D3": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 21.12, + "y": 63.02, + "z": 1.95 + }, + "E3": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 21.12, + "y": 58.52, + "z": 1.95 + }, + "F3": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 21.12, + "y": 54.02, + "z": 1.95 + }, + "G3": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 21.12, + "y": 49.52, + "z": 1.95 + }, + "H3": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 21.12, + "y": 45.02, + "z": 1.95 + }, + "I3": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 21.12, + "y": 40.52, + "z": 1.95 + }, + "J3": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 21.12, + "y": 36.02, + "z": 1.95 + }, + "K3": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 21.12, + "y": 31.52, + "z": 1.95 + }, + "L3": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 21.12, + "y": 27.02, + "z": 1.95 + }, + "M3": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 21.12, + "y": 22.52, + "z": 1.95 + }, + "N3": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 21.12, + "y": 18.02, + "z": 1.95 + }, + "O3": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 21.12, + "y": 13.52, + "z": 1.95 + }, + "P3": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 21.12, + "y": 9.02, + "z": 1.95 + }, + "A4": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 25.62, + "y": 76.52, + "z": 1.95 + }, + "B4": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 25.62, + "y": 72.02, + "z": 1.95 + }, + "C4": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 25.62, + "y": 67.52, + "z": 1.95 + }, + "D4": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 25.62, + "y": 63.02, + "z": 1.95 + }, + "E4": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 25.62, + "y": 58.52, + "z": 1.95 + }, + "F4": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 25.62, + "y": 54.02, + "z": 1.95 + }, + "G4": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 25.62, + "y": 49.52, + "z": 1.95 + }, + "H4": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 25.62, + "y": 45.02, + "z": 1.95 + }, + "I4": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 25.62, + "y": 40.52, + "z": 1.95 + }, + "J4": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 25.62, + "y": 36.02, + "z": 1.95 + }, + "K4": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 25.62, + "y": 31.52, + "z": 1.95 + }, + "L4": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 25.62, + "y": 27.02, + "z": 1.95 + }, + "M4": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 25.62, + "y": 22.52, + "z": 1.95 + }, + "N4": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 25.62, + "y": 18.02, + "z": 1.95 + }, + "O4": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 25.62, + "y": 13.52, + "z": 1.95 + }, + "P4": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 25.62, + "y": 9.02, + "z": 1.95 + }, + "A5": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 30.12, + "y": 76.52, + "z": 1.95 + }, + "B5": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 30.12, + "y": 72.02, + "z": 1.95 + }, + "C5": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 30.12, + "y": 67.52, + "z": 1.95 + }, + "D5": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 30.12, + "y": 63.02, + "z": 1.95 + }, + "E5": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 30.12, + "y": 58.52, + "z": 1.95 + }, + "F5": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 30.12, + "y": 54.02, + "z": 1.95 + }, + "G5": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 30.12, + "y": 49.52, + "z": 1.95 + }, + "H5": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 30.12, + "y": 45.02, + "z": 1.95 + }, + "I5": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 30.12, + "y": 40.52, + "z": 1.95 + }, + "J5": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 30.12, + "y": 36.02, + "z": 1.95 + }, + "K5": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 30.12, + "y": 31.52, + "z": 1.95 + }, + "L5": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 30.12, + "y": 27.02, + "z": 1.95 + }, + "M5": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 30.12, + "y": 22.52, + "z": 1.95 + }, + "N5": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 30.12, + "y": 18.02, + "z": 1.95 + }, + "O5": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 30.12, + "y": 13.52, + "z": 1.95 + }, + "P5": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 30.12, + "y": 9.02, + "z": 1.95 + }, + "A6": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 34.62, + "y": 76.52, + "z": 1.95 + }, + "B6": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 34.62, + "y": 72.02, + "z": 1.95 + }, + "C6": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 34.62, + "y": 67.52, + "z": 1.95 + }, + "D6": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 34.62, + "y": 63.02, + "z": 1.95 + }, + "E6": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 34.62, + "y": 58.52, + "z": 1.95 + }, + "F6": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 34.62, + "y": 54.02, + "z": 1.95 + }, + "G6": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 34.62, + "y": 49.52, + "z": 1.95 + }, + "H6": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 34.62, + "y": 45.02, + "z": 1.95 + }, + "I6": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 34.62, + "y": 40.52, + "z": 1.95 + }, + "J6": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 34.62, + "y": 36.02, + "z": 1.95 + }, + "K6": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 34.62, + "y": 31.52, + "z": 1.95 + }, + "L6": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 34.62, + "y": 27.02, + "z": 1.95 + }, + "M6": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 34.62, + "y": 22.52, + "z": 1.95 + }, + "N6": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 34.62, + "y": 18.02, + "z": 1.95 + }, + "O6": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 34.62, + "y": 13.52, + "z": 1.95 + }, + "P6": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 34.62, + "y": 9.02, + "z": 1.95 + }, + "A7": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 39.12, + "y": 76.52, + "z": 1.95 + }, + "B7": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 39.12, + "y": 72.02, + "z": 1.95 + }, + "C7": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 39.12, + "y": 67.52, + "z": 1.95 + }, + "D7": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 39.12, + "y": 63.02, + "z": 1.95 + }, + "E7": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 39.12, + "y": 58.52, + "z": 1.95 + }, + "F7": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 39.12, + "y": 54.02, + "z": 1.95 + }, + "G7": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 39.12, + "y": 49.52, + "z": 1.95 + }, + "H7": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 39.12, + "y": 45.02, + "z": 1.95 + }, + "I7": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 39.12, + "y": 40.52, + "z": 1.95 + }, + "J7": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 39.12, + "y": 36.02, + "z": 1.95 + }, + "K7": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 39.12, + "y": 31.52, + "z": 1.95 + }, + "L7": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 39.12, + "y": 27.02, + "z": 1.95 + }, + "M7": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 39.12, + "y": 22.52, + "z": 1.95 + }, + "N7": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 39.12, + "y": 18.02, + "z": 1.95 + }, + "O7": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 39.12, + "y": 13.52, + "z": 1.95 + }, + "P7": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 39.12, + "y": 9.02, + "z": 1.95 + }, + "A8": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 43.62, + "y": 76.52, + "z": 1.95 + }, + "B8": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 43.62, + "y": 72.02, + "z": 1.95 + }, + "C8": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 43.62, + "y": 67.52, + "z": 1.95 + }, + "D8": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 43.62, + "y": 63.02, + "z": 1.95 + }, + "E8": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 43.62, + "y": 58.52, + "z": 1.95 + }, + "F8": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 43.62, + "y": 54.02, + "z": 1.95 + }, + "G8": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 43.62, + "y": 49.52, + "z": 1.95 + }, + "H8": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 43.62, + "y": 45.02, + "z": 1.95 + }, + "I8": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 43.62, + "y": 40.52, + "z": 1.95 + }, + "J8": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 43.62, + "y": 36.02, + "z": 1.95 + }, + "K8": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 43.62, + "y": 31.52, + "z": 1.95 + }, + "L8": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 43.62, + "y": 27.02, + "z": 1.95 + }, + "M8": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 43.62, + "y": 22.52, + "z": 1.95 + }, + "N8": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 43.62, + "y": 18.02, + "z": 1.95 + }, + "O8": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 43.62, + "y": 13.52, + "z": 1.95 + }, + "P8": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 43.62, + "y": 9.02, + "z": 1.95 + }, + "A9": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 48.12, + "y": 76.52, + "z": 1.95 + }, + "B9": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 48.12, + "y": 72.02, + "z": 1.95 + }, + "C9": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 48.12, + "y": 67.52, + "z": 1.95 + }, + "D9": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 48.12, + "y": 63.02, + "z": 1.95 + }, + "E9": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 48.12, + "y": 58.52, + "z": 1.95 + }, + "F9": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 48.12, + "y": 54.02, + "z": 1.95 + }, + "G9": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 48.12, + "y": 49.52, + "z": 1.95 + }, + "H9": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 48.12, + "y": 45.02, + "z": 1.95 + }, + "I9": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 48.12, + "y": 40.52, + "z": 1.95 + }, + "J9": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 48.12, + "y": 36.02, + "z": 1.95 + }, + "K9": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 48.12, + "y": 31.52, + "z": 1.95 + }, + "L9": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 48.12, + "y": 27.02, + "z": 1.95 + }, + "M9": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 48.12, + "y": 22.52, + "z": 1.95 + }, + "N9": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 48.12, + "y": 18.02, + "z": 1.95 + }, + "O9": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 48.12, + "y": 13.52, + "z": 1.95 + }, + "P9": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 48.12, + "y": 9.02, + "z": 1.95 + }, + "A10": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 52.62, + "y": 76.52, + "z": 1.95 + }, + "B10": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 52.62, + "y": 72.02, + "z": 1.95 + }, + "C10": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 52.62, + "y": 67.52, + "z": 1.95 + }, + "D10": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 52.62, + "y": 63.02, + "z": 1.95 + }, + "E10": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 52.62, + "y": 58.52, + "z": 1.95 + }, + "F10": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 52.62, + "y": 54.02, + "z": 1.95 + }, + "G10": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 52.62, + "y": 49.52, + "z": 1.95 + }, + "H10": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 52.62, + "y": 45.02, + "z": 1.95 + }, + "I10": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 52.62, + "y": 40.52, + "z": 1.95 + }, + "J10": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 52.62, + "y": 36.02, + "z": 1.95 + }, + "K10": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 52.62, + "y": 31.52, + "z": 1.95 + }, + "L10": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 52.62, + "y": 27.02, + "z": 1.95 + }, + "M10": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 52.62, + "y": 22.52, + "z": 1.95 + }, + "N10": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 52.62, + "y": 18.02, + "z": 1.95 + }, + "O10": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 52.62, + "y": 13.52, + "z": 1.95 + }, + "P10": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 52.62, + "y": 9.02, + "z": 1.95 + }, + "A11": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 57.12, + "y": 76.52, + "z": 1.95 + }, + "B11": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 57.12, + "y": 72.02, + "z": 1.95 + }, + "C11": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 57.12, + "y": 67.52, + "z": 1.95 + }, + "D11": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 57.12, + "y": 63.02, + "z": 1.95 + }, + "E11": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 57.12, + "y": 58.52, + "z": 1.95 + }, + "F11": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 57.12, + "y": 54.02, + "z": 1.95 + }, + "G11": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 57.12, + "y": 49.52, + "z": 1.95 + }, + "H11": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 57.12, + "y": 45.02, + "z": 1.95 + }, + "I11": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 57.12, + "y": 40.52, + "z": 1.95 + }, + "J11": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 57.12, + "y": 36.02, + "z": 1.95 + }, + "K11": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 57.12, + "y": 31.52, + "z": 1.95 + }, + "L11": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 57.12, + "y": 27.02, + "z": 1.95 + }, + "M11": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 57.12, + "y": 22.52, + "z": 1.95 + }, + "N11": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 57.12, + "y": 18.02, + "z": 1.95 + }, + "O11": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 57.12, + "y": 13.52, + "z": 1.95 + }, + "P11": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 57.12, + "y": 9.02, + "z": 1.95 + }, + "A12": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 61.62, + "y": 76.52, + "z": 1.95 + }, + "B12": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 61.62, + "y": 72.02, + "z": 1.95 + }, + "C12": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 61.62, + "y": 67.52, + "z": 1.95 + }, + "D12": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 61.62, + "y": 63.02, + "z": 1.95 + }, + "E12": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 61.62, + "y": 58.52, + "z": 1.95 + }, + "F12": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 61.62, + "y": 54.02, + "z": 1.95 + }, + "G12": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 61.62, + "y": 49.52, + "z": 1.95 + }, + "H12": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 61.62, + "y": 45.02, + "z": 1.95 + }, + "I12": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 61.62, + "y": 40.52, + "z": 1.95 + }, + "J12": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 61.62, + "y": 36.02, + "z": 1.95 + }, + "K12": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 61.62, + "y": 31.52, + "z": 1.95 + }, + "L12": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 61.62, + "y": 27.02, + "z": 1.95 + }, + "M12": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 61.62, + "y": 22.52, + "z": 1.95 + }, + "N12": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 61.62, + "y": 18.02, + "z": 1.95 + }, + "O12": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 61.62, + "y": 13.52, + "z": 1.95 + }, + "P12": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 61.62, + "y": 9.02, + "z": 1.95 + }, + "A13": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 66.12, + "y": 76.52, + "z": 1.95 + }, + "B13": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 66.12, + "y": 72.02, + "z": 1.95 + }, + "C13": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 66.12, + "y": 67.52, + "z": 1.95 + }, + "D13": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 66.12, + "y": 63.02, + "z": 1.95 + }, + "E13": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 66.12, + "y": 58.52, + "z": 1.95 + }, + "F13": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 66.12, + "y": 54.02, + "z": 1.95 + }, + "G13": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 66.12, + "y": 49.52, + "z": 1.95 + }, + "H13": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 66.12, + "y": 45.02, + "z": 1.95 + }, + "I13": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 66.12, + "y": 40.52, + "z": 1.95 + }, + "J13": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 66.12, + "y": 36.02, + "z": 1.95 + }, + "K13": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 66.12, + "y": 31.52, + "z": 1.95 + }, + "L13": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 66.12, + "y": 27.02, + "z": 1.95 + }, + "M13": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 66.12, + "y": 22.52, + "z": 1.95 + }, + "N13": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 66.12, + "y": 18.02, + "z": 1.95 + }, + "O13": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 66.12, + "y": 13.52, + "z": 1.95 + }, + "P13": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 66.12, + "y": 9.02, + "z": 1.95 + }, + "A14": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 70.62, + "y": 76.52, + "z": 1.95 + }, + "B14": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 70.62, + "y": 72.02, + "z": 1.95 + }, + "C14": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 70.62, + "y": 67.52, + "z": 1.95 + }, + "D14": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 70.62, + "y": 63.02, + "z": 1.95 + }, + "E14": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 70.62, + "y": 58.52, + "z": 1.95 + }, + "F14": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 70.62, + "y": 54.02, + "z": 1.95 + }, + "G14": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 70.62, + "y": 49.52, + "z": 1.95 + }, + "H14": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 70.62, + "y": 45.02, + "z": 1.95 + }, + "I14": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 70.62, + "y": 40.52, + "z": 1.95 + }, + "J14": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 70.62, + "y": 36.02, + "z": 1.95 + }, + "K14": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 70.62, + "y": 31.52, + "z": 1.95 + }, + "L14": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 70.62, + "y": 27.02, + "z": 1.95 + }, + "M14": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 70.62, + "y": 22.52, + "z": 1.95 + }, + "N14": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 70.62, + "y": 18.02, + "z": 1.95 + }, + "O14": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 70.62, + "y": 13.52, + "z": 1.95 + }, + "P14": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 70.62, + "y": 9.02, + "z": 1.95 + }, + "A15": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 75.12, + "y": 76.52, + "z": 1.95 + }, + "B15": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 75.12, + "y": 72.02, + "z": 1.95 + }, + "C15": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 75.12, + "y": 67.52, + "z": 1.95 + }, + "D15": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 75.12, + "y": 63.02, + "z": 1.95 + }, + "E15": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 75.12, + "y": 58.52, + "z": 1.95 + }, + "F15": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 75.12, + "y": 54.02, + "z": 1.95 + }, + "G15": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 75.12, + "y": 49.52, + "z": 1.95 + }, + "H15": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 75.12, + "y": 45.02, + "z": 1.95 + }, + "I15": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 75.12, + "y": 40.52, + "z": 1.95 + }, + "J15": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 75.12, + "y": 36.02, + "z": 1.95 + }, + "K15": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 75.12, + "y": 31.52, + "z": 1.95 + }, + "L15": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 75.12, + "y": 27.02, + "z": 1.95 + }, + "M15": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 75.12, + "y": 22.52, + "z": 1.95 + }, + "N15": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 75.12, + "y": 18.02, + "z": 1.95 + }, + "O15": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 75.12, + "y": 13.52, + "z": 1.95 + }, + "P15": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 75.12, + "y": 9.02, + "z": 1.95 + }, + "A16": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 79.62, + "y": 76.52, + "z": 1.95 + }, + "B16": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 79.62, + "y": 72.02, + "z": 1.95 + }, + "C16": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 79.62, + "y": 67.52, + "z": 1.95 + }, + "D16": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 79.62, + "y": 63.02, + "z": 1.95 + }, + "E16": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 79.62, + "y": 58.52, + "z": 1.95 + }, + "F16": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 79.62, + "y": 54.02, + "z": 1.95 + }, + "G16": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 79.62, + "y": 49.52, + "z": 1.95 + }, + "H16": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 79.62, + "y": 45.02, + "z": 1.95 + }, + "I16": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 79.62, + "y": 40.52, + "z": 1.95 + }, + "J16": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 79.62, + "y": 36.02, + "z": 1.95 + }, + "K16": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 79.62, + "y": 31.52, + "z": 1.95 + }, + "L16": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 79.62, + "y": 27.02, + "z": 1.95 + }, + "M16": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 79.62, + "y": 22.52, + "z": 1.95 + }, + "N16": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 79.62, + "y": 18.02, + "z": 1.95 + }, + "O16": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 79.62, + "y": 13.52, + "z": 1.95 + }, + "P16": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 79.62, + "y": 9.02, + "z": 1.95 + }, + "A17": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 84.12, + "y": 76.52, + "z": 1.95 + }, + "B17": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 84.12, + "y": 72.02, + "z": 1.95 + }, + "C17": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 84.12, + "y": 67.52, + "z": 1.95 + }, + "D17": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 84.12, + "y": 63.02, + "z": 1.95 + }, + "E17": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 84.12, + "y": 58.52, + "z": 1.95 + }, + "F17": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 84.12, + "y": 54.02, + "z": 1.95 + }, + "G17": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 84.12, + "y": 49.52, + "z": 1.95 + }, + "H17": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 84.12, + "y": 45.02, + "z": 1.95 + }, + "I17": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 84.12, + "y": 40.52, + "z": 1.95 + }, + "J17": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 84.12, + "y": 36.02, + "z": 1.95 + }, + "K17": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 84.12, + "y": 31.52, + "z": 1.95 + }, + "L17": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 84.12, + "y": 27.02, + "z": 1.95 + }, + "M17": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 84.12, + "y": 22.52, + "z": 1.95 + }, + "N17": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 84.12, + "y": 18.02, + "z": 1.95 + }, + "O17": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 84.12, + "y": 13.52, + "z": 1.95 + }, + "P17": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 84.12, + "y": 9.02, + "z": 1.95 + }, + "A18": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 88.62, + "y": 76.52, + "z": 1.95 + }, + "B18": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 88.62, + "y": 72.02, + "z": 1.95 + }, + "C18": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 88.62, + "y": 67.52, + "z": 1.95 + }, + "D18": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 88.62, + "y": 63.02, + "z": 1.95 + }, + "E18": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 88.62, + "y": 58.52, + "z": 1.95 + }, + "F18": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 88.62, + "y": 54.02, + "z": 1.95 + }, + "G18": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 88.62, + "y": 49.52, + "z": 1.95 + }, + "H18": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 88.62, + "y": 45.02, + "z": 1.95 + }, + "I18": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 88.62, + "y": 40.52, + "z": 1.95 + }, + "J18": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 88.62, + "y": 36.02, + "z": 1.95 + }, + "K18": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 88.62, + "y": 31.52, + "z": 1.95 + }, + "L18": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 88.62, + "y": 27.02, + "z": 1.95 + }, + "M18": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 88.62, + "y": 22.52, + "z": 1.95 + }, + "N18": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 88.62, + "y": 18.02, + "z": 1.95 + }, + "O18": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 88.62, + "y": 13.52, + "z": 1.95 + }, + "P18": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 88.62, + "y": 9.02, + "z": 1.95 + }, + "A19": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 93.12, + "y": 76.52, + "z": 1.95 + }, + "B19": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 93.12, + "y": 72.02, + "z": 1.95 + }, + "C19": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 93.12, + "y": 67.52, + "z": 1.95 + }, + "D19": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 93.12, + "y": 63.02, + "z": 1.95 + }, + "E19": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 93.12, + "y": 58.52, + "z": 1.95 + }, + "F19": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 93.12, + "y": 54.02, + "z": 1.95 + }, + "G19": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 93.12, + "y": 49.52, + "z": 1.95 + }, + "H19": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 93.12, + "y": 45.02, + "z": 1.95 + }, + "I19": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 93.12, + "y": 40.52, + "z": 1.95 + }, + "J19": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 93.12, + "y": 36.02, + "z": 1.95 + }, + "K19": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 93.12, + "y": 31.52, + "z": 1.95 + }, + "L19": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 93.12, + "y": 27.02, + "z": 1.95 + }, + "M19": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 93.12, + "y": 22.52, + "z": 1.95 + }, + "N19": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 93.12, + "y": 18.02, + "z": 1.95 + }, + "O19": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 93.12, + "y": 13.52, + "z": 1.95 + }, + "P19": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 93.12, + "y": 9.02, + "z": 1.95 + }, + "A20": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 97.62, + "y": 76.52, + "z": 1.95 + }, + "B20": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 97.62, + "y": 72.02, + "z": 1.95 + }, + "C20": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 97.62, + "y": 67.52, + "z": 1.95 + }, + "D20": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 97.62, + "y": 63.02, + "z": 1.95 + }, + "E20": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 97.62, + "y": 58.52, + "z": 1.95 + }, + "F20": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 97.62, + "y": 54.02, + "z": 1.95 + }, + "G20": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 97.62, + "y": 49.52, + "z": 1.95 + }, + "H20": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 97.62, + "y": 45.02, + "z": 1.95 + }, + "I20": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 97.62, + "y": 40.52, + "z": 1.95 + }, + "J20": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 97.62, + "y": 36.02, + "z": 1.95 + }, + "K20": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 97.62, + "y": 31.52, + "z": 1.95 + }, + "L20": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 97.62, + "y": 27.02, + "z": 1.95 + }, + "M20": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 97.62, + "y": 22.52, + "z": 1.95 + }, + "N20": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 97.62, + "y": 18.02, + "z": 1.95 + }, + "O20": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 97.62, + "y": 13.52, + "z": 1.95 + }, + "P20": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 97.62, + "y": 9.02, + "z": 1.95 + }, + "A21": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 102.12, + "y": 76.52, + "z": 1.95 + }, + "B21": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 102.12, + "y": 72.02, + "z": 1.95 + }, + "C21": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 102.12, + "y": 67.52, + "z": 1.95 + }, + "D21": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 102.12, + "y": 63.02, + "z": 1.95 + }, + "E21": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 102.12, + "y": 58.52, + "z": 1.95 + }, + "F21": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 102.12, + "y": 54.02, + "z": 1.95 + }, + "G21": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 102.12, + "y": 49.52, + "z": 1.95 + }, + "H21": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 102.12, + "y": 45.02, + "z": 1.95 + }, + "I21": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 102.12, + "y": 40.52, + "z": 1.95 + }, + "J21": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 102.12, + "y": 36.02, + "z": 1.95 + }, + "K21": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 102.12, + "y": 31.52, + "z": 1.95 + }, + "L21": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 102.12, + "y": 27.02, + "z": 1.95 + }, + "M21": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 102.12, + "y": 22.52, + "z": 1.95 + }, + "N21": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 102.12, + "y": 18.02, + "z": 1.95 + }, + "O21": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 102.12, + "y": 13.52, + "z": 1.95 + }, + "P21": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 102.12, + "y": 9.02, + "z": 1.95 + }, + "A22": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 106.62, + "y": 76.52, + "z": 1.95 + }, + "B22": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 106.62, + "y": 72.02, + "z": 1.95 + }, + "C22": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 106.62, + "y": 67.52, + "z": 1.95 + }, + "D22": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 106.62, + "y": 63.02, + "z": 1.95 + }, + "E22": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 106.62, + "y": 58.52, + "z": 1.95 + }, + "F22": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 106.62, + "y": 54.02, + "z": 1.95 + }, + "G22": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 106.62, + "y": 49.52, + "z": 1.95 + }, + "H22": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 106.62, + "y": 45.02, + "z": 1.95 + }, + "I22": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 106.62, + "y": 40.52, + "z": 1.95 + }, + "J22": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 106.62, + "y": 36.02, + "z": 1.95 + }, + "K22": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 106.62, + "y": 31.52, + "z": 1.95 + }, + "L22": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 106.62, + "y": 27.02, + "z": 1.95 + }, + "M22": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 106.62, + "y": 22.52, + "z": 1.95 + }, + "N22": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 106.62, + "y": 18.02, + "z": 1.95 + }, + "O22": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 106.62, + "y": 13.52, + "z": 1.95 + }, + "P22": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 106.62, + "y": 9.02, + "z": 1.95 + }, + "A23": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 111.12, + "y": 76.52, + "z": 1.95 + }, + "B23": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 111.12, + "y": 72.02, + "z": 1.95 + }, + "C23": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 111.12, + "y": 67.52, + "z": 1.95 + }, + "D23": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 111.12, + "y": 63.02, + "z": 1.95 + }, + "E23": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 111.12, + "y": 58.52, + "z": 1.95 + }, + "F23": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 111.12, + "y": 54.02, + "z": 1.95 + }, + "G23": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 111.12, + "y": 49.52, + "z": 1.95 + }, + "H23": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 111.12, + "y": 45.02, + "z": 1.95 + }, + "I23": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 111.12, + "y": 40.52, + "z": 1.95 + }, + "J23": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 111.12, + "y": 36.02, + "z": 1.95 + }, + "K23": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 111.12, + "y": 31.52, + "z": 1.95 + }, + "L23": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 111.12, + "y": 27.02, + "z": 1.95 + }, + "M23": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 111.12, + "y": 22.52, + "z": 1.95 + }, + "N23": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 111.12, + "y": 18.02, + "z": 1.95 + }, + "O23": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 111.12, + "y": 13.52, + "z": 1.95 + }, + "P23": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 111.12, + "y": 9.02, + "z": 1.95 + }, + "A24": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 115.62, + "y": 76.52, + "z": 1.95 + }, + "B24": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 115.62, + "y": 72.02, + "z": 1.95 + }, + "C24": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 115.62, + "y": 67.52, + "z": 1.95 + }, + "D24": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 115.62, + "y": 63.02, + "z": 1.95 + }, + "E24": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 115.62, + "y": 58.52, + "z": 1.95 + }, + "F24": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 115.62, + "y": 54.02, + "z": 1.95 + }, + "G24": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 115.62, + "y": 49.52, + "z": 1.95 + }, + "H24": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 115.62, + "y": 45.02, + "z": 1.95 + }, + "I24": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 115.62, + "y": 40.52, + "z": 1.95 + }, + "J24": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 115.62, + "y": 36.02, + "z": 1.95 + }, + "K24": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 115.62, + "y": 31.52, + "z": 1.95 + }, + "L24": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 115.62, + "y": 27.02, + "z": 1.95 + }, + "M24": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 115.62, + "y": 22.52, + "z": 1.95 + }, + "N24": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 115.62, + "y": 18.02, + "z": 1.95 + }, + "O24": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 115.62, + "y": 13.52, + "z": 1.95 + }, + "P24": { + "depth": 7.7, + "totalLiquidVolume": 40, + "shape": "circular", + "diameter": 3.2, + "x": 115.62, + "y": 9.02, + "z": 1.95 + } + }, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1", + "I1", + "J1", + "K1", + "L1", + "M1", + "N1", + "O1", + "P1", + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2", + "I2", + "J2", + "K2", + "L2", + "M2", + "N2", + "O2", + "P2", + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3", + "I3", + "J3", + "K3", + "L3", + "M3", + "N3", + "O3", + "P3", + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4", + "I4", + "J4", + "K4", + "L4", + "M4", + "N4", + "O4", + "P4", + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5", + "I5", + "J5", + "K5", + "L5", + "M5", + "N5", + "O5", + "P5", + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6", + "I6", + "J6", + "K6", + "L6", + "M6", + "N6", + "O6", + "P6", + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7", + "I7", + "J7", + "K7", + "L7", + "M7", + "N7", + "O7", + "P7", + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8", + "I8", + "J8", + "K8", + "L8", + "M8", + "N8", + "O8", + "P8", + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9", + "I9", + "J9", + "K9", + "L9", + "M9", + "N9", + "O9", + "P9", + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10", + "I10", + "J10", + "K10", + "L10", + "M10", + "N10", + "O10", + "P10", + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11", + "I11", + "J11", + "K11", + "L11", + "M11", + "N11", + "O11", + "P11", + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12", + "I12", + "J12", + "K12", + "L12", + "M12", + "N12", + "O12", + "P12", + "A13", + "B13", + "C13", + "D13", + "E13", + "F13", + "G13", + "H13", + "I13", + "J13", + "K13", + "L13", + "M13", + "N13", + "O13", + "P13", + "A14", + "B14", + "C14", + "D14", + "E14", + "F14", + "G14", + "H14", + "I14", + "J14", + "K14", + "L14", + "M14", + "N14", + "O14", + "P14", + "A15", + "B15", + "C15", + "D15", + "E15", + "F15", + "G15", + "H15", + "I15", + "J15", + "K15", + "L15", + "M15", + "N15", + "O15", + "P15", + "A16", + "B16", + "C16", + "D16", + "E16", + "F16", + "G16", + "H16", + "I16", + "J16", + "K16", + "L16", + "M16", + "N16", + "O16", + "P16", + "A17", + "B17", + "C17", + "D17", + "E17", + "F17", + "G17", + "H17", + "I17", + "J17", + "K17", + "L17", + "M17", + "N17", + "O17", + "P17", + "A18", + "B18", + "C18", + "D18", + "E18", + "F18", + "G18", + "H18", + "I18", + "J18", + "K18", + "L18", + "M18", + "N18", + "O18", + "P18", + "A19", + "B19", + "C19", + "D19", + "E19", + "F19", + "G19", + "H19", + "I19", + "J19", + "K19", + "L19", + "M19", + "N19", + "O19", + "P19", + "A20", + "B20", + "C20", + "D20", + "E20", + "F20", + "G20", + "H20", + "I20", + "J20", + "K20", + "L20", + "M20", + "N20", + "O20", + "P20", + "A21", + "B21", + "C21", + "D21", + "E21", + "F21", + "G21", + "H21", + "I21", + "J21", + "K21", + "L21", + "M21", + "N21", + "O21", + "P21", + "A22", + "B22", + "C22", + "D22", + "E22", + "F22", + "G22", + "H22", + "I22", + "J22", + "K22", + "L22", + "M22", + "N22", + "O22", + "P22", + "A23", + "B23", + "C23", + "D23", + "E23", + "F23", + "G23", + "H23", + "I23", + "J23", + "K23", + "L23", + "M23", + "N23", + "O23", + "P23", + "A24", + "B24", + "C24", + "D24", + "E24", + "F24", + "G24", + "H24", + "I24", + "J24", + "K24", + "L24", + "M24", + "N24", + "O24", + "P24" + ] + } + ], + "parameters": { + "format": "384Standard", + "quirks": [], + "isTiprack": false, + "isMagneticModuleCompatible": false, + "loadName": "sarstedt_384_wellplate_40ul" + }, + "namespace": "custom_beta", + "version": 1, + "schemaVersion": 2, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + } +} diff --git a/protocols/3359a5/README.md b/protocols/3359a5/README.md new file mode 100644 index 0000000000..d75b7566cb --- /dev/null +++ b/protocols/3359a5/README.md @@ -0,0 +1,63 @@ +# Cherrypicking with Defined Aspiration Heights + +### Author +[Opentrons](https://opentrons.com/) + +# Opentrons has launched a new Protocol Library. You should use the [new page for this protocol](library.opentrons.com/p/3359a5). This page won’t be available after January 31st, 2024. + +## Categories +* Featured + * Cherrypicking + +## Description +With this protocol, your robot can perform multiple well-to-well liquid transfers using a single-channel pipette by parsing through a user-defined .csv file. The protocol can use Opentrons GEN1 or GEN2 pipettes. + +This particular cherrypicking protocol allows you to specify the source plate labware and slot number, as well as the aspiration height above the bottom of the well (in mm). Appropriate tip racks will be placed in every slot that isn't already populated with a source or destination labware. + + +Explanation of complex parameters below: +* `Pipette Type`: Specify which single channel pipette you will be using for this protocol. +* `input .csv file`: Here, you should upload a .csv file formatted in the [following way](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/3359a5/template.csv) being sure to include the header line. Refer to our [Labware Library](https://labware.opentrons.com/?category=wellPlate) to copy API names for labware to include in the `source_labware` and `destination_labware` columns of the .csv. + +--- + +### Labware +* Any verified labware found in our [Labware Library](https://labware.opentrons.com/?category=wellPlate) + +### Pipettes +* [P20 Single GEN2 Pipette](https://opentrons.com/pipettes/) +* [P300 Single GEN2 Pipette](https://opentrons.com/pipettes/) +* [P1000 Single GEN2 Pipette](https://opentrons.com/pipettes/) +* P10 Single GEN1 Pipette +* P50 Single GEN1 Pipette +* P300 Single GEN1 Pipette +* P1000 Single GEN1 Pipette + +--- + +### Deck Setup +Example Deck Setup - this is variable depending on the .csv uploaded. +![deck layout](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/3359a5/Screen+Shot+2021-04-29+at+2.45.06+PM.png) + + +--- + +### Protocol Steps +1. Pipette will aspirate a user-specified volume at the designated labware and well according to the imported csv file. Slot is also specified, as well as aspiration height from the bottom of the well. +2. Pipette will dispense this volume into user-specified labware and well according to the imported csv file. Slot is also specified. +3. Steps 1 and 2 repeated over the duration of the CSV. + +### 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 +3359a5 diff --git a/protocols/3359a5/cherrypicking.ot2.apiv2.py b/protocols/3359a5/cherrypicking.ot2.apiv2.py new file mode 100644 index 0000000000..ed23aa543e --- /dev/null +++ b/protocols/3359a5/cherrypicking.ot2.apiv2.py @@ -0,0 +1,69 @@ +metadata = { + 'protocolName': 'Cherrypicking', + 'author': 'Nick ', + 'source': 'Custom Protocol Request', + 'apiLevel': '2.3' +} + + +def run(ctx): + + pipette_type, pipette_mount, transfer_csv = get_values( # noqa: F821 + "pipette_type", "pipette_mount", "transfer_csv") + + tiprack_map = { + 'p10_single': 'opentrons_96_tiprack_10ul', + 'p50_single': 'opentrons_96_tiprack_300ul', + 'p300_single_gen1': 'opentrons_96_tiprack_300ul', + 'p1000_single_gen1': 'opentrons_96_tiprack_1000ul', + 'p20_single_gen2': 'opentrons_96_tiprack_20ul', + 'p300_single_gen2': 'opentrons_96_tiprack_300ul', + 'p1000_single_gen2': 'opentrons_96_tiprack_1000ul' + } + + # load labware + transfer_info = [[val.strip().lower() for val in line.split(',')] + for line in transfer_csv.splitlines() + if line.split(',')[0].strip()][1:] + for line in transfer_info: + s_lw, s_slot, d_lw, d_slot = line[:2] + line[4:6] + for slot, lw in zip([s_slot, d_slot], [s_lw, d_lw]): + if not int(slot) in ctx.loaded_labwares: + ctx.load_labware(lw.lower(), slot) + + # load tipracks in remaining slots + tiprack_type = tiprack_map[pipette_type] + tipracks = [] + for slot in range(1, 13): + if slot not in ctx.loaded_labwares: + tipracks.append(ctx.load_labware(tiprack_type, str(slot))) + + # load pipette + pip = ctx.load_instrument(pipette_type, pipette_mount, tip_racks=tipracks) + + tip_count = 0 + tip_max = len(tipracks*96) + + def pick_up(): + nonlocal tip_count + if tip_count == tip_max: + ctx.pause('Please refill tipracks before resuming.') + pip.reset_tipracks() + tip_count = 0 + pip.pick_up_tip() + tip_count += 1 + + def parse_well(well): + letter = well[0] + number = well[1:] + return letter.upper() + str(int(number)) + + for line in transfer_info: + _, s_slot, s_well, h, _, d_slot, d_well, vol = line[:8] + source = ctx.loaded_labwares[ + int(s_slot)].wells_by_name()[parse_well(s_well)].bottom(float(h)) + dest = ctx.loaded_labwares[ + int(d_slot)].wells_by_name()[parse_well(d_well)] + pick_up() + pip.transfer(float(vol), source, dest, new_tip='never') + pip.drop_tip() diff --git a/protocols/3359a5/fields.json b/protocols/3359a5/fields.json new file mode 100644 index 0000000000..3d574ddf37 --- /dev/null +++ b/protocols/3359a5/fields.json @@ -0,0 +1,31 @@ +[ + { + "type": "dropDown", + "label": "pipette type", + "name": "pipette_type", + "options": [ + {"label": "P20 Single (GEN 2)", "value": "p20_single_gen2"}, + {"label": "P10 Single (GEN 1)", "value": "p10_single"}, + {"label": "P50 Single (GEN 1)", "value": "p50_single"}, + {"label": "P300 Single (GEN 1)", "value": "p300_single_gen1"}, + {"label": "P1000 Single (GEN 1)", "value": "p1000_single_gen1"}, + {"label": "P300 Single (GEN 2)", "value": "p300_single_gen2"}, + {"label": "P1000 Single (GEN 2)", "value": "p1000_single_gen2"} + ] + }, + { + "type": "dropDown", + "label": "pipette mount", + "name": "pipette_mount", + "options": [ + {"label": "right", "value": "right"}, + {"label": "left", "value": "left"} + ] + }, + { + "type": "textFile", + "label": "transfer .csv file", + "name": "transfer_csv", + "default": "Source Labware,Source Slot,Source Well,Source Aspiration Height Above Bottom (in mm),Dest Labware,Dest Slot,Dest Well,Volume (in ul)\nagilent_1_reservoir_290ml,1,A1,1,nest_96_wellplate_100ul_pcr_full_skirt,4,A11,1\nnest_12_reservoir_15ml,2,A1,1,nest_96_wellplate_2ml_deep,5,A5,3\nnest_1_reservoir_195ml,3,A1,1,nest_96_wellplate_2ml_deep,5,H12,7" + } +] diff --git a/protocols/Opentrons_Logo/Opentrons_Logo.ot2.apiv2.py b/protocols/Opentrons_Logo/Opentrons_Logo.ot2.apiv2.py new file mode 100644 index 0000000000..0e6211a666 --- /dev/null +++ b/protocols/Opentrons_Logo/Opentrons_Logo.ot2.apiv2.py @@ -0,0 +1,73 @@ +from opentrons import protocol_api +import math + +metadata = { + 'protocolName': 'Opentrons Logo', + 'author': 'Opentrons ', + 'source': 'Protocol Library', + 'apiLevel': '2.10' + } + + +def run(ctx: protocol_api.ProtocolContext): + [_pip_model, _pip_mount, _dp_type, _dye_type] = get_values( # noqa: F821 + '_pip_model', '_pip_mount', '_dp_type', '_dye_type') + + # customizable parameters + pip_model = _pip_model + pip_mount = _pip_mount + dp_type = _dp_type + dye_type = _dye_type + + # create pipette and tiprack + tip_size = pip_model.split('_')[0][1:] + tip_size = '300' if tip_size == '50' else tip_size + tip_name = 'opentrons_96_tiprack_'+tip_size+'ul' + tips = [ctx.load_labware(tip_name, '1', 'Opentrons Tips')] + + pipette = ctx.load_instrument( + pip_model, pip_mount, tip_racks=tips) + + # create plates and pattern list + output = ctx.load_labware(dp_type, '3', 'Destination Plate') + + dye_container = ctx.load_labware(dye_type, '2', 'Dye Source') + + # Well Location set-up + dye1_wells = ['A5', 'A6', 'A8', 'A9', 'B4', 'B10', 'C3', 'C11', 'D3', + 'D11', 'E3', 'E11', 'F3', 'F11', 'G4', 'G10', + 'H5', 'H6', 'H7', 'H8', 'H9'] + + dye1_dest = [output[x] for x in dye1_wells] + + dye2_wells = ['C7', 'D6', 'D7', 'D8', 'E5', 'E6', 'E7', 'E8', + 'E9', 'F5', 'F6', 'F7', 'F8', 'F9', 'G6', 'G7', 'G8'] + + dye2_dest = [output[x] for x in dye2_wells] + + if 'reservoir' in dye_type: + dye1 = [dye_container.wells()[0]] * 2 + dye2 = [dye_container.wells()[1]] * 2 + else: + dye1 = dye_container.wells()[:2] + dye2 = dye_container.wells()[2:4] + + dye_vol = 100 if tip_size == '1000' else 50 + + # distribution function + def logo_distribute(srcs, dests): + """ + This is a function that will perform the pick_up_tip(), transfers(), + and drop_tip() needed to create the Opentrons logo + :param srcs: source wells (should be a list) + :param dests: destination wells (should be a list) + """ + halfDests = math.ceil(len(dests)/2) + pipette.pick_up_tip() + for src, dest in zip(srcs, [dests[:halfDests], dests[halfDests:]]): + for d in dest: + pipette.transfer(dye_vol, src, d, new_tip='never') + pipette.drop_tip() + + logo_distribute(dye1, dye1_dest) + logo_distribute(dye2, dye2_dest) diff --git a/protocols/Opentrons_Logo/README.md b/protocols/Opentrons_Logo/README.md new file mode 100644 index 0000000000..fb2bba11de --- /dev/null +++ b/protocols/Opentrons_Logo/README.md @@ -0,0 +1,64 @@ +# Opentrons Logo Protocol + +### Author +[Opentrons](https://opentrons.com/) + +# Opentrons has launched a new Protocol Library. You should use the [new page for this protocol](library.opentrons.com/p/opentrons_logo). This page won’t be available after January 31st, 2024. + +## Categories +* Getting Started + * Opentrons Logo + +## Description +This is a demo protocol that will help you to get more familiar with your new OT-2! All you need is some food dye, a 96-well plate, and a 12-row trough or tube rack with 1.5mL or 2mL tubes. Your robot will pipette the Opentrons logo into your plate and you'll be ready to go! + +--- +![Materials Needed](https://s3.amazonaws.com/opentrons-protocol-library-website/custom-README-images/001-General+Headings/materials.png) + +To purchase tips, reagents, or pipettes, please visit our [online store](https://shop.opentrons.com/) or contact our sales team at [info@opentrons.com](mailto:info@opentrons.com) + +* [Opentrons OT-2](https://shop.opentrons.com/collections/ot-2-robot/products/ot-2) +* [Opentrons OT-2 Run App (Version 3.15.0 or later)](https://opentrons.com/ot-app/) +* [Opentrons Single-Channel Pipette](https://shop.opentrons.com/collections/ot-2-pipettes) and corresponding [Tips](https://shop.opentrons.com/collections/opentrons-tips) +* [96-Well Microplate](https://labware.opentrons.com/?category=wellPlate) +* [12-Row Trough](https://labware.opentrons.com/?category=reservoir) or [Tube Rack with 1.5mL/2mL Tubes](https://labware.opentrons.com/?category=tubeRack) +* Water and Food Dye (Two Colors) + +For more detailed information on compatible labware, please visit our [Labware Library](https://labware.opentrons.com/). + + +--- +![Setup](https://s3.amazonaws.com/opentrons-protocol-library-website/custom-README-images/001-General+Headings/Setup.png) + +For this demo protocol, you need a clean, empty 96-well plate (where the Opentrons logo will be created) and either a 12-row trough or 1.5mL/2mL tubes in a tube rack to store the water and food dye solution. + +If using a 12-row trough, the two food dye solutions should be stored in column 1 and column 2. If using the tube rack, dye 1 should be stored in 'A1' & 'B1' and dye 2 should be stored in 'C1' & 'D1'. + +Using the customization fields below, set up your protocol. +* Pipette Model: Select which pipette you will use for this protocol. +* Pipette Mount: Specify which mount your single-channel pipette is on (left or right) +* Destination Plate Type: Select which (destination) plate you will use for this protocol. +* Dye Labware Type: Select which (source) labware you will use for this protocol. + + +### Robot +* [OT-2](https://opentrons.com/ot-2) + + +### Time Estimate +* 2-5 minutes depending on pipette model chosen + +### Reagents +* Food dye + +## Process +1. Select all desired settings according to the “Setup” section above to customize your protocol run. +2. Download your customized OT-2 protocol using the blue “Download” button, located above the deckmap. +3. Upload your protocol into the Opentrons App and follow the instructions there to set up your deck, calibrate your labware, and proceed to run. +4. Make sure to add reagents to your labware before placing it on the deck! Your food dye solution should be in your labware and your destination plate should be empty. + +### Additional Notes +If you’d like to request a protocol supporting multiple plates or require other changes to this script, please fill out our [Protocol Request Form](https://opentrons-protocol-dev.paperform.co/). You can also modify the Python file directly by following our [API Documentation](https://docs.opentrons.com/v2/). If you’d like to chat with an applications engineer about changes, please contact us at [protocols@opentrons.com](mailto:protocols@opentrons.com). + +###### Internal +Demo Protocol 1 diff --git a/protocols/Opentrons_Logo/fields.json b/protocols/Opentrons_Logo/fields.json new file mode 100644 index 0000000000..8f0b47ad36 --- /dev/null +++ b/protocols/Opentrons_Logo/fields.json @@ -0,0 +1,55 @@ +[ + { + "type": "dropDown", + "label": "Pipette Model", + "name": "_pip_model", + "options": [ + {"label": "P300 Single GEN2", "value": "p300_single_gen2"}, + {"label": "P300 Single GEN1", "value": "p300_single"}, + {"label": "P20 Single GEN2", "value": "p20_single_gen2"}, + {"label": "P50 Single GEN1", "value": "p50_single"}, + {"label": "P1000 Single GEN2", "value": "p1000_single_gen2"}, + {"label": "P1000 Single GEN1", "value": "p1000_single"} + ] + }, + { + "type": "dropDown", + "label": "Pipette Mount", + "name": "_pip_mount", + "options": [ + {"label": "Right side", "value": "right"}, + {"label": "Left side", "value": "left"} + ] + }, + { + "type": "dropDown", + "label": "Destination Plate Type", + "name": "_dp_type", + "options": [ + {"label": "NEST 96-Well, 100µL PCR", "value": "nest_96_wellplate_100ul_pcr_full_skirt"}, + {"label": "NEST 96-Well, 200µL Flat", "value": "nest_96_wellplate_200ul_flat"}, + {"label": "BioRad 96-Well, 200µL PCR", "value": "biorad_96_wellplate_200ul_pcr"}, + {"label": "Corning 96-Well, 360µL Flat", "value": "corning_96_wellplate_360ul_flat"}, + { "label": "NEST 96 Deepwell plate 2 mL", "value": "nest_96_wellplate_2ml_deep" }, + { "label": "USA Scientific 96 Deep well Plate 2.4 mL", "value": "usascientific_96_wellplate_2.4ml_deep" } + ] + }, + { + "type": "dropDown", + "label": "Dye Labware Type", + "name": "_dye_type", + "options": [ + {"label": "NEST 12-Well, 15mL", "value": "nest_12_reservoir_15ml"}, + {"label": "USA Scientific 12-Well Reservoir, 22mL", "value": "usascientific_12_reservoir_22ml"}, + {"label": "Opentrons 24 Tube Rack with 2mL NEST Tubes", "value": "opentrons_24_tuberack_nest_2ml_snapcap"}, + {"label": "Opentrons 24 Tube Rack with 1.5mL NEST Tubes", "value": "opentrons_24_tuberack_nest_1.5ml_snapcap"}, + {"label": "Opentrons 24 Tube Rack with 2mL eppendorf Tubes", "value": "opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap"}, + {"label": "Opentrons 24 Tube Rack with 1.5mL eppendorf Tubes", "value": "opentrons_24_tuberack_eppendorf_1.5ml_safelock_snapcap"}, + { "label": "Opentrons 24 Tube Rack with NEST 0.5 mL Screwcap", "value": "opentrons_24_tuberack_nest_0.5ml_screwcap" }, + { "label": "Opentrons 24 Tube Rack with NEST 1.5 mL Screwcap", "value": "opentrons_24_tuberack_nest_1.5ml_screwcap" }, + { "label": "Opentrons 24 Tube Rack with NEST 1.5 mL Snapcap", "value": "opentrons_24_tuberack_nest_1.5ml_snapcap" }, + { "label": "Opentrons 24 Tube Rack with NEST 2 mL Screwcap", "value": "opentrons_24_tuberack_nest_2ml_screwcap" }, + { "label": "Opentrons 24 Tube Rack with Generic 2 mL Screwcap", "value": "opentrons_24_tuberack_generic_2ml_screwcap" } + ] + } +] diff --git a/protocols/cherrypicking/README.md b/protocols/cherrypicking/README.md new file mode 100644 index 0000000000..c4f9d14476 --- /dev/null +++ b/protocols/cherrypicking/README.md @@ -0,0 +1,70 @@ +# Cherrypicking + +### Author +[Opentrons](https://opentrons.com/) + +# Opentrons has launched a new Protocol Library. You should use the [new page for this protocol](library.opentrons.com/p/cherrypicking). This page won’t be available after January 31st, 2024. + +## Categories +* Featured + * Cherrypicking + +## Description + +Our most robust cherrypicking protocol. Specify aspiration height, labware, pipette, as well as source and destination wells with this all inclusive cherrypicking protocol. + +![Cherrypicking Example](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/cherrypicking/cherrypicking_example.png) + +Explanation of complex parameters below: + +* `input .csv file`: Here, you should upload a .csv file formatted in the [following way](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/1211/example.csv), making sure to include headers in your csv file. Refer to our [Labware Library](https://labware.opentrons.com/?category=wellPlate) to copy API names for labware to include in the `Source Labware` and `Dest Labware` columns of the .csv. +* `Pipette Model`: Select which pipette you will use for this protocol. +* `Pipette Mount`: Specify which mount your single-channel pipette is on (left or right) +* `Tip Type`: Specify whether you want to use filter tips. +* `Tip Usage Strategy`: Specify whether you'd like to use a new tip for each transfer, or keep the same tip throughout the protocol. + + + +--- + + +### Labware +* Any verified labware found in our [Labware Library](https://labware.opentrons.com/?category=wellPlate) + +### Pipettes +* [P20 Single GEN2 Pipette](https://opentrons.com/pipettes/) +* [P300 Single GEN2 Pipette](https://opentrons.com/pipettes/) +* [P1000 Single GEN2 Pipette](https://opentrons.com/pipettes/) +* P10 Single GEN1 Pipette +* P50 Single GEN1 Pipette +* P300 Single GEN1 Pipette +* P1000 Single GEN1 Pipette + + +--- + +### Deck Setup +* Example deck setup - tip racks loaded onto remining slots. +![deck layout](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/cherrypicking/Screen+Shot+2021-04-29+at+3.10.02+PM.png) + +--- + +### Protocol Steps +1. Pipette will aspirate a user-specified volume at the designated labware and well according to the imported csv file. Slot is also specified, as well as aspiration height from the bottom of the well. +2. Pipette will dispense this volume into user-specified labware and well according to the imported csv file. Slot is also specified. +3. Steps 1 and 2 repeated over the duration of the CSV. + +### 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 +cherrypicking diff --git a/protocols/cherrypicking/cherrypicking.ot2.apiv2.py b/protocols/cherrypicking/cherrypicking.ot2.apiv2.py new file mode 100644 index 0000000000..093e942d9d --- /dev/null +++ b/protocols/cherrypicking/cherrypicking.ot2.apiv2.py @@ -0,0 +1,98 @@ +metadata = { + 'protocolName': 'Cherrypicking', + 'author': 'Nick ', + 'source': 'Custom Protocol Request', + 'apiLevel': '2.3' +} + + +def run(ctx): + + [pipette_type, pipette_mount, tip_type, + tip_reuse, transfer_csv] = get_values( # noqa: F821 + "pipette_type", "pipette_mount", "tip_type", "tip_reuse", + "transfer_csv") + + tiprack_map = { + 'p10_single': { + 'standard': 'opentrons_96_tiprack_10ul', + 'filter': 'opentrons_96_filtertiprack_20ul' + }, + 'p50_single': { + 'standard': 'opentrons_96_tiprack_300ul', + 'filter': 'opentrons_96_filtertiprack_200ul' + }, + 'p300_single': { + 'standard': 'opentrons_96_tiprack_300ul', + 'filter': 'opentrons_96_filtertiprack_200ul' + }, + 'p1000_single': { + 'standard': 'opentrons_96_tiprack_1000ul', + 'filter': 'opentrons_96_filtertiprack_1000ul' + }, + 'p20_single_gen2': { + 'standard': 'opentrons_96_tiprack_20ul', + 'filter': 'opentrons_96_filtertiprack_20ul' + }, + 'p300_single_gen2': { + 'standard': 'opentrons_96_tiprack_300ul', + 'filter': 'opentrons_96_filtertiprack_200ul' + }, + 'p1000_single_gen2': { + 'standard': 'opentrons_96_tiprack_1000ul', + 'filter': 'opentrons_96_filtertiprack_1000ul' + } + } + + # load labware + transfer_info = [[val.strip().lower() for val in line.split(',')] + for line in transfer_csv.splitlines() + if line.split(',')[0].strip()][1:] + for line in transfer_info: + s_lw, s_slot, d_lw, d_slot = line[:2] + line[4:6] + for slot, lw in zip([s_slot, d_slot], [s_lw, d_lw]): + if not int(slot) in ctx.loaded_labwares: + ctx.load_labware(lw.lower(), slot) + + # load tipracks in remaining slots + tiprack_type = tiprack_map[pipette_type][tip_type] + tipracks = [] + for slot in range(1, 13): + if slot not in ctx.loaded_labwares: + tipracks.append(ctx.load_labware(tiprack_type, str(slot))) + + # load pipette + pip = ctx.load_instrument(pipette_type, pipette_mount, tip_racks=tipracks) + + tip_count = 0 + tip_max = len(tipracks*96) + + def pick_up(): + nonlocal tip_count + if tip_count == tip_max: + ctx.pause('Please refill tipracks before resuming.') + pip.reset_tipracks() + tip_count = 0 + pip.pick_up_tip() + tip_count += 1 + + def parse_well(well): + letter = well[0] + number = well[1:] + return letter.upper() + str(int(number)) + + if tip_reuse == 'never': + pick_up() + for line in transfer_info: + _, s_slot, s_well, h, _, d_slot, d_well, vol = line[:8] + source = ctx.loaded_labwares[ + int(s_slot)].wells_by_name()[parse_well(s_well)].bottom(float(h)) + dest = ctx.loaded_labwares[ + int(d_slot)].wells_by_name()[parse_well(d_well)] + if tip_reuse == 'always': + pick_up() + pip.transfer(float(vol), source, dest, new_tip='never') + if tip_reuse == 'always': + pip.drop_tip() + if pip.hw_pipette['has_tip']: + pip.drop_tip() diff --git a/protocols/cherrypicking/fields.json b/protocols/cherrypicking/fields.json new file mode 100644 index 0000000000..f4362842f2 --- /dev/null +++ b/protocols/cherrypicking/fields.json @@ -0,0 +1,49 @@ +[ + { + "type": "textFile", + "label": "Transfer .csv File", + "name": "transfer_csv", + "default": "Source Labware,Source Slot,Source Well,Source Aspiration Height Above Bottom (in mm),Dest Labware,Dest Slot,Dest Well,Volume (in ul)\nagilent_1_reservoir_290ml,1,A1,1,nest_96_wellplate_100ul_pcr_full_skirt,4,A11,1\nnest_12_reservoir_15ml,2,A1,1,nest_96_wellplate_2ml_deep,5,A5,3\nnest_1_reservoir_195ml,3,A1,1,nest_96_wellplate_2ml_deep,5,H12,7" + }, + { + "type": "dropDown", + "label": "Pipette Model", + "name": "pipette_type", + "options": [ + {"label": "P10 Single (GEN 1)", "value": "p10_single"}, + {"label": "P50 Single (GEN 1)", "value": "p50_single"}, + {"label": "P300 Single (GEN 1)", "value": "p300_single"}, + {"label": "P1000 Single (GEN 1)", "value": "p1000_single"}, + {"label": "P20 Single (GEN 2)", "value": "p20_single_gen2"}, + {"label": "P300 Single (GEN 2)", "value": "p300_single_gen2"}, + {"label": "P1000 Single (GEN 2)", "value": "p1000_single_gen2"} + ] + }, + { + "type": "dropDown", + "label": "Pipette Mount", + "name": "pipette_mount", + "options": [ + {"label": "right", "value": "right"}, + {"label": "left", "value": "left"} + ] + }, + { + "type": "dropDown", + "label": "Tip Type", + "name": "tip_type", + "options": [ + {"label": "standard", "value": "standard"}, + {"label": "filter", "value": "filter"} + ] + }, + { + "type": "dropDown", + "label": "Tip Usage Strategy", + "name": "tip_reuse", + "options": [ + {"label": "Use a new tip for each transfer", "value": "always"}, + {"label": "Reuse tip for each transfer", "value": "never"} + ] + } +] diff --git a/protocols/customizable_serial_dilution_ot2/.feature b/protocols/customizable_serial_dilution_ot2/.feature new file mode 100644 index 0000000000..e69de29bb2 diff --git a/protocols/customizable_serial_dilution_ot2/README.md b/protocols/customizable_serial_dilution_ot2/README.md new file mode 100644 index 0000000000..21fdf4b889 --- /dev/null +++ b/protocols/customizable_serial_dilution_ot2/README.md @@ -0,0 +1,78 @@ +# Customizable Serial Dilution for OT-2 + +### Author +[Opentrons](https://opentrons.com/) + +# Opentrons has launched a new Protocol Library. You should use the [new page for this protocol](library.opentrons.com/p/customizable_serial_dilution_ot2). This page won’t be available after January 31st, 2024. + +## Categories +* Featured + * Serial Dilution + +## Description +With this protocol, you can do a simple serial dilution across a 96-well plate using either a single-channel or 8-channel pipette. This can be useful for everything from creating a simple standard curve to a concentration-limiting dilution. For more information (including data from the Opentrons Lab and other considerations), please see our [Technical Note](https://s3.amazonaws.com/opentrons-protocol-library-website/Technical+Notes/Serial+Dilution+OT2+Technical+Note.pdf). + +--- + +--- + +![serial dilution](https://s3.amazonaws.com/opentrons-protocol-library-website/custom-README-images/customizable-serial-dilution/Customizable+Serial+Dilution+Illustration+LATEST+VERSION.jpg) + +Example Setup + +This protocol uses the inputs you define for "Dilution Factor" and "Total Mixing Volume" to automatically infer the necessary transfer volume for each dilution across your plate. For a 1 in 3 dilution series across an entire plate, as seen above: + +-- Start with your samples/reagents in Column 1 of your plate. In this example, you would pre-add 150 uL of concentrated sample to the first column of your 96-well plate. + +-- Define a Total Mixing Volume of 150uL, a Dilution Factor of 3, and set Number of Dilutions = 11. + +-- Your OT-2 will add 100uL of diluent to each empty well in your plate. Then it will transfer 50uL from Column 1 between each well/column in the plate. + +-- "Total mixing volume" = transfer volume + diluent volume. + +--- + +--- + + +![Materials Needed](https://s3.amazonaws.com/opentrons-protocol-library-website/custom-README-images/customizable-serial-dilution/materials.png) + +-- [Opentrons OT-2](http://opentrons.com/ot-2) + +-- [Opentrons OT-2 Run App (Version 3.19 or later)](http://opentrons.com/ot-app) + +-- [Opentrons Tips](https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-300ul-tips-racks-9-600-tips) for selected Opentrons Pipette + +-- [12-Row, Automation-Friendly Trough](https://shop.opentrons.com/nest-12-well-reservoirs-15-ml/) + +-- [96-Well Plate](https://shop.opentrons.com/nest-96-well-plate-flat/) (found in our [Labware Library](https://labware.opentrons.com/?category=wellPlate)) + +-- Diluent (Pre-loaded in row 1 of trough) + +-- Samples/Standards (Pre-loaded in Column 1 of a standard 96-well plate) + +## Process +1. Choose the pipette you want to use from the dropdown menu above and which side it is installed on the OT-2 +2. Set your dilution factor. + Example: If you want a 1:2 ratio of sample to total reaction volume, you would set your dilution factor to 2. +3. Set your number of dilutions (max is 11, 10 if using blank) +4. Set your total mixing volume. (Total mixing volume = transfer volume + diluent volume). Be careful to make sure this number does not exceed the volume capacity of your plate. To see how this number is used, scroll to the example above. +5. Set whether a blank will be made or not. The blank will be added to the first available column in the plate. + NOTE: 10 dilutions is the max allowed when using a blank +6. Set your tip reuse strategy. + Note: This defaults to no tip changes; adjust only if you want to change tips between each well. +7. Set your air gap, if desired. This will add a specified amount of air into the tip after aspiration +8. Download your customized OT-2 Serial Dilution protocol using the blue "Download" button. +9. Upload into the Opentrons Run App and follow the instructions there to set up your deck and proceed to run! +10. Make sure to add diluent to the first row of your 12-row trough and load your desired samples/standards into column 1 of your plate before running your protocol in the run app! + +### Additional Notes +Please reference our [Technical Note](https://s3.amazonaws.com/opentrons-protocol-library-website/Technical+Notes/Serial+Dilution+OT2+Technical+Note.pdf) for more information about the expected output of this protocol, in addition to expanded sample data from the Opentrons lab. + +We understand that there are limitations to the use of this protocol, and we plan to make improvements soon. In the meantime, if you'd like to request a more complex dilution workflow, please use our [Protocol Development Request Form](https://opentrons-protocol-dev.paperform.co/). You can also download this Python file and modify it using our [API Documentation](https://docs.opentrons.com/). For additional questions about this protocol, please email . + +## Preview +Perform a simple serial dilution across a 96-well plate using either a single-channel or multichannel pipette. This can be useful for everything from creating a simple standard curve to a concentration-limiting dilution. + +###### Internal +Customizable Serial Dilution, v2 diff --git a/protocols/customizable_serial_dilution_ot2/customizable_serial_dilution.ot2.apiv2.py b/protocols/customizable_serial_dilution_ot2/customizable_serial_dilution.ot2.apiv2.py new file mode 100644 index 0000000000..073450e11b --- /dev/null +++ b/protocols/customizable_serial_dilution_ot2/customizable_serial_dilution.ot2.apiv2.py @@ -0,0 +1,126 @@ +"""DETAILS.""" +metadata = { + 'protocolName': 'Customizable Serial Dilution', + 'author': 'Opentrons ', + 'source': 'Protocol Library', + 'apiLevel': '2.11' + } + + +def run(protocol_context): + """PROTOCOL BODY.""" + [pipette_type, mount_side, tip_type, trough_type, plate_type, + dilution_factor, num_of_dilutions, total_mixing_volume, + blank_on, tip_use_strategy, air_gap_volume] = get_values( # noqa: F821 + 'pipette_type', 'mount_side', 'tip_type', 'trough_type', + 'plate_type', 'dilution_factor', 'num_of_dilutions', + 'total_mixing_volume', 'blank_on', + 'tip_use_strategy', 'air_gap_volume' + ) + # check for bad setup here + if not 1 <= num_of_dilutions <= 11: + raise Exception('Enter a number of dilutions between 1 and 11') + + if num_of_dilutions == 11 and blank_on == 1: + raise Exception( + 'No room for blank with 11 dilutions') + + pip_range = pipette_type.split('_')[0].lower() + + tiprack_map = { + 'p10': { + 'standard': 'opentrons_96_tiprack_10ul', + 'filter': 'opentrons_96_filtertiprack_20ul' + }, + 'p20': { + 'standard': 'opentrons_96_tiprack_20ul', + 'filter': 'opentrons_96_filtertiprack_20ul' + }, + 'p50': { + 'standard': 'opentrons_96_tiprack_300ul', + 'filter': 'opentrons_96_filtertiprack_200ul' + }, + 'p300': { + 'standard': 'opentrons_96_tiprack_300ul', + 'filter': 'opentrons_96_filtertiprack_200ul' + }, + 'p1000': { + 'standard': 'opentrons_96_tiprack_1000ul', + 'filter': 'opentrons_96_filtertiprack_1000ul' + } + } + + # labware + trough = protocol_context.load_labware( + trough_type, '2') + plate = protocol_context.load_labware( + plate_type, '3') + tip_name = tiprack_map[pip_range][tip_type] + tipracks = [ + protocol_context.load_labware(tip_name, slot) + for slot in ['1', '4'] + ] + print(mount_side) + # pipette + pipette = protocol_context.load_instrument( + pipette_type, mount_side, tipracks) + + # reagents + diluent = trough.wells()[0] + + transfer_volume = total_mixing_volume/dilution_factor + diluent_volume = total_mixing_volume - transfer_volume + + if 'multi' in pipette_type: + dilution_destination_sets = [ + [row] for row in plate.rows()[0][1:num_of_dilutions]] + dilution_source_sets = [ + [row] for row in plate.rows()[0][:num_of_dilutions-1]] + blank_set = [plate.rows()[0][num_of_dilutions+1]] + + else: + dilution_destination_sets = plate.columns()[1:num_of_dilutions] + dilution_source_sets = plate.columns()[:num_of_dilutions-1] + blank_set = plate.columns()[num_of_dilutions+1] + + all_diluent_destinations = [ + well for set in dilution_destination_sets for well in set] + + pipette.pick_up_tip() + for dest in all_diluent_destinations: + # Distribute diluent across the plate to the the number of samples + # And add diluent to one column after the number of samples for a blank + pipette.transfer( + diluent_volume, + diluent, + dest, + air_gap=air_gap_volume, + new_tip='never') + pipette.drop_tip() + + # Dilution of samples across the 96-well flat bottom plate + if tip_use_strategy == 'never': + pipette.pick_up_tip() + for source_set, dest_set in zip(dilution_source_sets, + dilution_destination_sets): + for s, d in zip(source_set, dest_set): + pipette.transfer( + transfer_volume, + s, + d, + air_gap=air_gap_volume, + mix_after=(5, total_mixing_volume/2), + new_tip=tip_use_strategy) + if tip_use_strategy == 'never': + pipette.drop_tip() + + if blank_on: + pipette.pick_up_tip() + for blank_well in blank_set: + pipette.transfer( + diluent_volume, + diluent, + blank_well, + air_gap=air_gap_volume, + new_tip='never') + pipette.drop_tip() diff --git a/protocols/customizable_serial_dilution_ot2/fields.json b/protocols/customizable_serial_dilution_ot2/fields.json new file mode 100644 index 0000000000..4ecd2f7855 --- /dev/null +++ b/protocols/customizable_serial_dilution_ot2/fields.json @@ -0,0 +1,98 @@ +[ + { + "type": "dropDown", + "label": "Pipette Type", + "name": "pipette_type", + "options": [ + { "label": "P300 Single (GEN2)", "value": "p300_single_gen2" }, + { "label": "P20 Single (GEN2)", "value": "p20_single_gen2" }, + { "label": "P1000 Single (GEN2)", "value": "p1000_single" }, + { "label": "P300 Multi (GEN2)", "value": "p300_multi_gen2" }, + { "label": "P20 Multi (GEN2)", "value": "p20_multi_gen2" }, + { "label": "P50 Single (GEN1)", "value": "p50_single" }, + { "label": "P300 Single (GEN1)", "value": "p300_single" }, + { "label": "P300 Multi (GEN1)", "value": "p300_multi" }, + { "label": "P50 Multi (GEN1)", "value": "p50_multi" } + ] + }, + { + "type": "dropDown", + "label": "Mount Side", + "name": "mount_side", + "options": [ + { "label": "Right", "value": "right" }, + { "label": "Left", "value": "left" } + ] + }, + { + "type": "dropDown", + "label": "Tip Type", + "name": "tip_type", + "options": [ + { "label": "Non-Filtered", "value": "standard" }, + { "label": "Filter", "value": "filter" } + ] + }, + { + "type": "dropDown", + "label": "Trough Type", + "name": "trough_type", + "options": [ + { "label": "NEST 12-Well, 15mL", "value": "nest_12_reservoir_15ml" }, + { "label": "USA Scientific 12-Well, 22mL", "value": "usascientific_12_reservoir_22ml" } + ] + }, + { + "type": "dropDown", + "label": "Plate Type", + "name": "plate_type", + "options": [ + { "label": "NEST 96-Well, 200µL Flat", "value": "nest_96_wellplate_200ul_flat" }, + { "label": "Corning 96-Well, 360µL Flat", "value": "corning_96_wellplate_360ul_flat" }, + { "label": "NEST 96-Well, 100µL PCR", "value": "nest_96_wellplate_100ul_pcr_full_skirt" }, + { "label": "Bio-Rad 96-Well, 200µL PCR", "value": "biorad_96_wellplate_200ul_pcr" } + ] + }, + { + "type": "float", + "label": "dilution factor", + "name": "dilution_factor", + "default": 3.0 + }, + { + "type": "int", + "label": "number of dilutions", + "name": "num_of_dilutions", + "default": 10 + }, + { + "type": "float", + "label": "total mixing volume (in uL)", + "name": "total_mixing_volume", + "default": 150 + }, + { + "type": "dropDown", + "label": "Blank in Well Plate", + "name": "blank_on", + "options": [ + { "label": "Yes", "value": true }, + { "label": "No", "value": false } + ] + }, + { + "type": "dropDown", + "label": "tip use strategy", + "name": "tip_use_strategy", + "options": [ + { "label": "use one tip", "value": "never" }, + { "label": "change tips", "value": "always" } + ] + }, + { + "type": "int", + "label": "volume of air gap", + "name": "air_gap_volume", + "default": 10 + } +] diff --git a/protocols/dinosaur/README.md b/protocols/dinosaur/README.md new file mode 100644 index 0000000000..6337b94c57 --- /dev/null +++ b/protocols/dinosaur/README.md @@ -0,0 +1,61 @@ +# Dinosaur + +### Author +[Opentrons](https://opentrons.com/) + +# Opentrons has launched a new Protocol Library. You should use the [new page for this protocol](library.opentrons.com/p/dinosaur). This page won’t be available after January 31st, 2024. + +## Categories +* Getting Started + * Dinosaur + +## Description +Draw a picture of a dinosaur (Stegosaurus!) on a 96 well plate using food coloring. + +![Dinosaur](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/dinosaur/dinosaur_result.png) + +--- +![Materials Needed](https://s3.amazonaws.com/opentrons-protocol-library-website/custom-README-images/001-General+Headings/materials.png) + +* [Opentrons 300uL Tips](https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-200ul-filter-tips) +* [Opentrons 200uL Filter Tips](https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-200ul-filter-tips) +* [Bio-Rad 96 Well Plate 200 uL PCR](https://labware.opentrons.com/biorad_96_wellplate_200ul_pcr/) +* [NEST 96 Well Plate 100 uL PCR Full Skirt](https://labware.opentrons.com/nest_96_wellplate_100ul_pcr_full_skirt/) +* [Corning 96 Well Plate 360 µL Flat](https://labware.opentrons.com/corning_96_wellplate_360ul_flat/) +* [NEST 96 Well Plate 200 µL Flat](https://labware.opentrons.com/nest_96_wellplate_200ul_flat/) +* [P300 Single Channel GEN2](https://shop.opentrons.com/collections/ot-2-robot/products/single-channel-electronic-pipette?variant=5984549109789) + +For more detailed information on compatible labware, please visit our [Labware Library](https://labware.opentrons.com/). + +--- +![Setup](https://s3.amazonaws.com/opentrons-protocol-library-website/custom-README-images/001-General+Headings/Setup.png) + +**Deck Setup** +![Deck Layout](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/dinosaur/dinosaur_deck_layout.png) + + +**Protocol Steps** + +1. Distribute 50 uL of green solution to all the necessary wells. +2. Distribute 50 uL of blue solution to all the necessary wells. +3. Enjoy the dinosaur! + +### Robot +* [OT-2](https://opentrons.com/ot-2) + +## 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 +dinosaur \ No newline at end of file diff --git a/protocols/dinosaur/dinosaur.ot2.apiv2.py b/protocols/dinosaur/dinosaur.ot2.apiv2.py new file mode 100644 index 0000000000..dffd9b6c0d --- /dev/null +++ b/protocols/dinosaur/dinosaur.ot2.apiv2.py @@ -0,0 +1,44 @@ +metadata = { + 'protocolName': 'Dinosaur', + 'author': 'Opentrons ', + 'description': 'Draw a picture of a dinosaur', + 'apiLevel': '2.9' +} + + +def run(ctx): + + [p300_mount, tip_type, plate_type] = get_values( # noqa: F821 + "p300_mount", "tip_type", "plate_type") + + # Load Labware + tiprack = ctx.load_labware(tip_type, 6) + plate = ctx.load_labware(plate_type, 3) + reservoir = ctx.load_labware('nest_12_reservoir_15ml', 8) + + # Load Pipette + p300 = ctx.load_instrument('p300_single_gen2', p300_mount, + tip_racks=[tiprack]) + + # Solutions + green = reservoir['A1'] + blue = reservoir['A2'] + + # Wells to dispense green + green_wells = [well for well in plate.wells( + 'E1', 'D2', 'E2', 'D3', 'E3', 'F3', 'G3', 'H3', + 'C4', 'D4', 'E4', 'F4', 'G4', 'H4', 'C5', 'D5', + 'E5', 'F5', 'G5', 'C6', 'D6', 'E6', 'F6', 'G6', + 'C7', 'D7', 'E7', 'F7', 'G7', 'D8', 'E8', 'F8', + 'G8', 'H8', 'E9', 'F9', 'G9', 'H9', 'F10', 'G11', + 'H12')] + + # Wells to dispense blue + blue_wells = [well for well in plate.wells( + 'C3', 'B4', 'A5', 'B5', 'B6', 'A7', 'B7', + 'C8', 'C9', 'D9', 'E10', 'E11', 'F11', 'G12')] + + # Distribute green solution to wells + p300.distribute(50, green, green_wells, disposal_vol=0, blow_out=True) + # Distribute blue solution to wells + p300.distribute(50, blue, blue_wells, disposal_vol=0, blow_out=True) diff --git a/protocols/dinosaur/fields.json b/protocols/dinosaur/fields.json new file mode 100644 index 0000000000..9e6aeff4ed --- /dev/null +++ b/protocols/dinosaur/fields.json @@ -0,0 +1,31 @@ +[ + { + "type": "dropDown", + "label": "P300 Single Channel GEN2 Mount Position", + "name": "p300_mount", + "options": [ + {"label": "Left", "value": "left"}, + {"label": "Right", "value": "right"} + ] + }, + { + "type": "dropDown", + "label": "Tip Rack Type", + "name": "tip_type", + "options": [ + {"label": "Opentrons 96 Tip Rack 300 uL", "value": "opentrons_96_tiprack_300ul"}, + {"label": "Opentrons 96 Filter Tip Rack 200 uL", "value": "opentrons_96_filtertiprack_200ul"} + ] + }, + { + "type": "dropDown", + "label": "Plate Type", + "name": "plate_type", + "options": [ + {"label": "Bio-Rad 96 Well Plate 200 uL PCR", "value": "biorad_96_wellplate_200ul_pcr"}, + {"label": "NEST 96 Well Plate 100 uL PCR Full Skirt", "value": "nest_96_wellplate_100ul_pcr_full_skirt"}, + {"label": "Corning 96 Well Plate 360 µL Flat", "value": "corning_96_wellplate_360ul_flat"}, + {"label": "NEST 96 Well Plate 200 µL Flat", "value": "nest_96_wellplate_200ul_flat"} + ] + } + ] \ No newline at end of file diff --git a/protocols/illumina-nextera-XT-library-prep-part1/.feature b/protocols/illumina-nextera-XT-library-prep-part1/.feature new file mode 100644 index 0000000000..e69de29bb2 diff --git a/protocols/illumina-nextera-XT-library-prep-part1/README.md b/protocols/illumina-nextera-XT-library-prep-part1/README.md new file mode 100644 index 0000000000..08debc37c9 --- /dev/null +++ b/protocols/illumina-nextera-XT-library-prep-part1/README.md @@ -0,0 +1,56 @@ +# Nextera XT DNA Library Prep Kit Protocol: Part 1/4 - Tagment Genomic DNA and Amplify Libraries + +### Author +[Opentrons](https://opentrons.com/) + +# Opentrons has launched a new Protocol Library. You should use the [new page for this protocol](library.opentrons.com/p/illumina-nextera-xt-library-prep-part1). This page won’t be available after January 31st, 2024. + +## Categories +* Featured + * NGS Library Prep: Illumina Nextera XT + +## Description +Part 1 of 4: Tagment Genomic DNA and Amplify Libraries + +Links: +* [Part 1: Tagment and Amplify](http://protocols.opentrons.com/protocol/illumina-nextera-XT-library-prep-part1) +* [Part 2: Clean Up Libraries](http://protocols.opentrons.com/protocol/illumina-nextera-XT-library-prep-part2) +* [Part 3: Normalize Libraries](http://protocols.opentrons.com/protocol/illumina-nextera-XT-library-prep-part3) +* [Part 4: Pool Libraries](http://protocols.opentrons.com/protocol/illumina-nextera-XT-library-prep-part4) + +With this protocol, your robot can perform the Nextera XT DNA Library Prep Kit protocol described by the [Illumina Reference Guide](https://support.illumina.com/content/dam/illumina-support/documents/documentation/chemistry_documentation/samplepreps_nextera/nextera-xt/nextera-xt-library-prep-reference-guide-15031942-06.pdf). + +This is part 1 of the protocol, which includes the steps (1) Tagment Genomic DNA and (2) Amplify Libraries. + +The tagmentation step uses Nextera transposase to fragment DNA into sizes suitable for sequencing, and then tags the DNA with adapter sequences. The library amplification step increases the yield of the tagmented DNA using PCR. PCR adds the Index 1 (i7), Index 2 (i5), and full adapter sequences to the tagmented DNA from the previous step. This protocol assumes you are taking your plate off the OT-2 and thermocycling on a stand-alone PCR machine according to the [Illumina Reference Guide](https://support.illumina.com/content/dam/illumina-support/documents/documentation/chemistry_documentation/samplepreps_nextera/nextera-xt/nextera-xt-library-prep-reference-guide-15031942-05.pdf). + +After the two steps carried out in this protocol, you can safely stop work and return to it at a later point. If you are stopping, seal the plate and store at 2°C to 8°C for up to 2 days. + +### Robot +* [OT-2](https://opentrons.com/ot-2) + +### Reagents +* [Nextera XT DNA Library Prep Kit](https://www.illumina.com/products/by-type/sequencing-kits/library-prep-kits/nextera-xt-dna.html) + +## Process +1. Input your number of samples. +2. Download your protocol. +3. Upload your protocol into the [OT App](https://opentrons.com/ot-app). +4. Set up your deck according to the deck map below. +5. Calibrate your labware, tiprack and pipette using the OT App. For calibration tips, check out our [support article](https://support.opentrons.com/ot-2/getting-started-software-setup/deck-calibration). +6. Hit "Run". + +### Additional Notes +* 2-mL Tuberack Reagent Setup: + * Amplicon Tagment Mix: **A1** + * Tagment DNA Buffer: **B1** + * Neutralize Tagment Buffer: **C1** + * Nextera PCR Master Mix: **D1** +* Review the reference guide before proceeding to confirm kit contents and make sure you have the required equipment and consumables. + +## Preview +With this series of protocols and the [Opentrons Magnetic Module](https://shop.opentrons.com/products/magdeck), your robot can complete a library prep using the [Illumina Nextera XT DNA Library Prep Kit](https://support.illumina.com/content/dam/illumina-support/documents/documentation/chemistry_documentation/samplepreps_nextera/nextera-xt/nextera-xt-library-prep-reference-guide-15031942-03.pdf). This library prep protocol comes in four parts: Tagment and Amplify, Clean Up Libraries, Normalize Libraries, and Pool Libraries. + +###### Internal +bU7eUGEh +872 diff --git a/protocols/illumina-nextera-XT-library-prep-part1/fields.json b/protocols/illumina-nextera-XT-library-prep-part1/fields.json new file mode 100644 index 0000000000..f45ca12c03 --- /dev/null +++ b/protocols/illumina-nextera-XT-library-prep-part1/fields.json @@ -0,0 +1,26 @@ +[ + { + "type": "dropDown", + "label": "P20 multi-channel GEN2 mount", + "name": "m20_mount", + "options": [ + { "label": "left", "value": "left" }, + { "label": "right", "value": "right" } + ] + }, + { + "type": "dropDown", + "label": "P20 single-channel GEN2 mount", + "name": "p20_mount", + "options": [ + { "label": "right", "value": "right" }, + { "label": "left", "value": "left" } + ] + }, + { + "type": "int", + "label": "number of samples", + "name": "number_of_samples", + "default": 96 + } +] diff --git a/protocols/illumina-nextera-XT-library-prep-part1/nexteraXT_dna_library_prep_part1.ot2.apiv2.py b/protocols/illumina-nextera-XT-library-prep-part1/nexteraXT_dna_library_prep_part1.ot2.apiv2.py new file mode 100644 index 0000000000..907b695b01 --- /dev/null +++ b/protocols/illumina-nextera-XT-library-prep-part1/nexteraXT_dna_library_prep_part1.ot2.apiv2.py @@ -0,0 +1,87 @@ +import math + +metadata = { + 'protocolName': 'Illumina Nextera XT NGS Prep 1: Tagment Genomic DNA & \ +Amplify Libraries', + 'author': 'Opentrons ', + 'source': 'Protocol Library', + 'apiLevel': '2.2' + } + + +def run(protocol_context): + [p20_mount, m20_mount, number_of_samples] = get_values( # noqa: F821 + 'p20_mount', 'm20_mount', 'number_of_samples') + + # labware setup + gDNA_plate = protocol_context.load_labware( + 'biorad_96_wellplate_200ul_pcr', '1', 'gDNA plate') + out_plate = protocol_context.load_labware( + 'biorad_96_wellplate_200ul_pcr', '2', 'output plate') + index_plate = protocol_context.load_labware( + 'biorad_96_wellplate_200ul_pcr', '4', 'index plate') + tuberack = protocol_context.load_labware( + 'opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap', '5', + 'reagent rack') + tiprack_single = [ + protocol_context.load_labware('opentrons_96_tiprack_20ul', slot) + for slot in ['3', '6', '7', '8']] + tiprack_multi = [ + protocol_context.load_labware('opentrons_96_tiprack_20ul', slot) + for slot in ['9', '10']] + + # reagent setup + num_cols = math.ceil(number_of_samples/8) + + atm = tuberack.wells()[0] # Amplicon Tagment Mix + td = tuberack.wells()[1] # Tagment DNA Buffer + nt = tuberack.wells()[2] # Neutralize Tagment Buffer + npm = tuberack.wells()[3] # Nextera PCR Master Mix + indexes = index_plate.rows()[0][:num_cols] + + # pipette setup + p20 = protocol_context.load_instrument( + 'p20_single_gen2', p20_mount, tip_racks=tiprack_single) + m20 = protocol_context.load_instrument( + 'p20_multi_gen2', m20_mount, tip_racks=tiprack_multi) + + # define sample locations + samples_multi = gDNA_plate.rows()[0][:num_cols] + output_single = out_plate.wells()[:number_of_samples] + output_multi = out_plate.rows()[0][:num_cols] + + """ + Tagment genomic DNA + """ + # Add Tagment DNA Buffer to each well + p20.transfer(10, td, output_single, blow_out=True) + + # Add normalized gDNA to each well + m20.transfer(5, samples_multi, output_multi, new_tip='always') + + # Add ATM to each well + p20.transfer(5, atm, output_single, mix_after=(5, 10), new_tip='always') + + protocol_context.pause("Centrifuge at 280 × g at 20°C for 1 minute. Place \ +on the preprogrammed thermal cycler and run the tagmentation program. When \ +the sample reaches 10°C, immediately proceed to the next step because the \ +transposome is still active. Place the plate back to slot 2.") + + # Add Neutralize Tagment Buffer to each well + p20.transfer(5, nt, output_single, mix_after=(5, 10), new_tip='always') + + protocol_context.pause("Centrifuge at 280 × g at 20°C for 1 minute. Place \ +the plate back on slot 2.") + + # Incubate at RT for 5 minutes + protocol_context.delay(minutes=5) + + """ + Amplify Libraries + """ + # Add each index + m20.transfer( + 10, indexes, output_multi, mix_after=(5, 10), new_tip='always') + + # Add Nextera PCR Master Mix to each well + p20.transfer(15, npm, output_single, mix_after=(2, 10)) diff --git a/protocols/illumina-nextera-XT-library-prep-part2/README.md b/protocols/illumina-nextera-XT-library-prep-part2/README.md new file mode 100644 index 0000000000..305a27612a --- /dev/null +++ b/protocols/illumina-nextera-XT-library-prep-part2/README.md @@ -0,0 +1,111 @@ +# Nextera XT DNA Library Prep Kit Protocol: Part 2/4 - Clean Up Libraries + +### Author +[Opentrons](https://opentrons.com/) + +# Opentrons has launched a new Protocol Library. You should use the [new page for this protocol](library.opentrons.com/p/illumina-nextera-xt-library-prep-part2). This page won’t be available after January 31st, 2024. + +## Categories +* Featured + * NGS Library Prep: Illumina Nextera XT + +## Description +Part 2 of 4: Clean Up Libraries + +Links: +* [Part 1: Tagment and Amplify](http://protocols.opentrons.com/protocol/illumina-nextera-XT-library-prep-part1) +* [Part 2: Clean Up Libraries](http://protocols.opentrons.com/protocol/illumina-nextera-XT-library-prep-part2) +* [Part 3: Normalize Libraries](http://protocols.opentrons.com/protocol/illumina-nextera-XT-library-prep-part3) +* [Part 4: Pool Libraries](http://protocols.opentrons.com/protocol/illumina-nextera-XT-library-prep-part4) + +With this protocol, your robot can perform the Nextera XT DNA Library Prep Kit protocol describe by the [Illumina Reference Guide](https://support.illumina.com/content/dam/illumina-support/documents/documentation/chemistry_documentation/samplepreps_nextera/nextera-xt/nextera-xt-library-prep-reference-guide-15031942-06.pdf). + +This is Part 2 of the protocol, which consists of just step (3) of the overall process: clean up libraries. This step uses AMPure XP beads to purify the library DNA and remove short library fragments after the previous step, library amplification. + +After this step, it is safe to stop the workflow and return to it at a later point. If you are stopping, seal the plate and store at -15°C to -25°C for up to seven days. + +--- +![Materials Needed](https://s3.amazonaws.com/opentrons-protocol-library-website/custom-README-images/001-General+Headings/materials.png) + +To purchase tips, reagents, or pipettes, please visit our [online store](https://shop.opentrons.com/) or contact our sales team at [info@opentrons.com](mailto:info@opentrons.com) + +* [Opentrons OT-2](https://shop.opentrons.com/collections/ot-2-robot/products/ot-2) +* [Opentrons OT-2 Run App (Version 3.15.0 or later)](https://opentrons.com/ot-app/) +* [Opentrons P300 or P50 Pipette (Single or 8-Channel)](https://shop.opentrons.com/collections/ot-2-pipettes) and corresponding [Tips](https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-300ul-tips) +* [Opentrons Magnetic Module](https://shop.opentrons.com/collections/hardware-modules/products/magdeck) +* [Bio-Rad 96-Well Plate, 200μl](https://labware.opentrons.com/biorad_96_wellplate_200ul_pcr) containing samples from [Part 1](http://protocols.opentrons.com/protocol/illumina-nextera-XT-library-prep-part1) +* [Bio-Rad 96-Well Plate, 200μl](https://labware.opentrons.com/biorad_96_wellplate_200ul_pcr), clean and empty (x2) +* [USA Scientific 12-Channel Reservoir](https://labware.opentrons.com/usascientific_12_reservoir_22ml?category=reservoir) +* [Nextera XT DNA Library Prep Kit](https://www.illumina.com/products/by-type/sequencing-kits/library-prep-kits/nextera-xt-dna.html) + +For more detailed information on compatible labware, please visit our [Labware Library](https://labware.opentrons.com/). + + +--- +![Setup](https://s3.amazonaws.com/opentrons-protocol-library-website/custom-README-images/001-General+Headings/Setup.png) + +This protocol requires specific labware in a specific set-up. + +Slot 1: [Bio-Rad Plate](https://labware.opentrons.com/biorad_96_wellplate_200ul_pcr?category=wellPlate) (clean and empty); final elution will be transferred to this plate. + +Slot 2: [USA Scientific 12-Channel Reservoir](https://labware.opentrons.com/usascientific_12_reservoir_22ml?category=reservoir) +* A1: Resuspension Buffer +* A2: AMPure XP Beads +* A3: 80% Ethanol +* A4: 80% Ethanol (if needed) +* A5: 80% Ethanol (if needed) +* A9: Liquid Waste +* A10: Liquid Waste +* A11: Liquid Waste +* A12: Liquid Waste + +Slot 4: [Magnetic Module](https://shop.opentrons.com/collections/hardware-modules/products/magdeck) with [Bio-Rad Plate](https://labware.opentrons.com/biorad_96_wellplate_200ul_pcr?category=wellPlate) (clean and empty) + +Slot 5: [Bio-Rad Plate](https://labware.opentrons.com/biorad_96_wellplate_200ul_pcr) containing samples from [Part 1](http://protocols.opentrons.com/protocol/illumina-nextera-XT-library-prep-part1) + +Slot 6: [Opentrons Tip Rack](https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-300ul-tips) + +Slot 7: [Opentrons Tip Rack](https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-300ul-tips) + +Slot 8: [Opentrons Tip Rack](https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-300ul-tips) +* Note: If your protocol requires more tips due to the parameters you set, you will need to fill subsequent slots with tip racks. + + +Using the customization fields below, set up your protocol. +* Pipette Model: Select which pipette (P50/P300; Single/8-Channel) you will use for this protocol. +* Pipette Mount: Specify which mount your single-channel pipette is on (left or right). +* Magnetic Module Gen: Specify which Magnetic Module is in use +* Number of Samples: Select the number of samples (1-96) to be run in the protocol. +* Initial Product Volume (µl): Select the starting volume of PCR product to be used in the protocol. +* Bead Ratio: Select the bead ratio. 1.8 is recommended for small (300-500 bp) inputs, and 0.6 is recommended for larger (>500 bp) samples. Please see [documentation](https://support.illumina.com/content/dam/illumina-support/documents/documentation/chemistry_documentation/samplepreps_nextera/nextera-xt/nextera-xt-library-prep-reference-guide-15031942-05.pdf) for more information. +* Resuspension Buffer Volume (µL): Specify how much Resuspension Buffer is added to the wells. +* Final PCR Product Volume (µL): Specify the final elution volume to be transferred. +* Dry Time (minutes): Specify how long (in minutes) you would like to let the beads dry after the wash steps and before adding the resuspension buffer. + + + + + +### Robot +* [OT-2](https://opentrons.com/ot-2) + +### Modules +* [Magnetic Module](https://opentrons.com/modules) + +### Reagents +* [Nextera XT DNA Library Prep Kit](https://www.illumina.com/products/by-type/sequencing-kits/library-prep-kits/nextera-xt-dna.html) +* [Ampure XP for Size Selection](https://www.beckman.com/reagents/genomic/cleanup-and-size-selection/pcr) + +## Process +1. Select all desired settings according to the “Setup” section above to customize your protocol run. +2. Download your customized OT-2 protocol using the blue “Download” button, located above the deckmap. +3. Upload your protocol into the Opentrons App and follow the instructions there to set up your deck, calibrate your labware, and proceed to run. +4. Make sure to add reagents to your labware before placing it on the deck! Your reagents should be in your reservoir, and the samples you’re starting with should be in your plate in slot 5 on the deck. + + +### Additional Notes +If you’d like to request a protocol supporting multiple plates or require other changes to this script, please fill out our [Protocol Request Form](https://opentrons-protocol-dev.paperform.co/). You can also modify the Python file directly by following our [API Documentation](https://docs.opentrons.com/v2/). If you’d like to chat with an applications engineer about changes, please contact us at [protocols@opentrons.com](mailto:protocols@opentrons.com). + +###### Internal +bU7eUGEh +872 diff --git a/protocols/illumina-nextera-XT-library-prep-part2/fields.json b/protocols/illumina-nextera-XT-library-prep-part2/fields.json new file mode 100644 index 0000000000..2e954efe9e --- /dev/null +++ b/protocols/illumina-nextera-XT-library-prep-part2/fields.json @@ -0,0 +1,68 @@ +[ + { + "type": "dropDown", + "label": "Pipette Model", + "name": "pip_type", + "options": [ + {"label": "P300 Single GEN2", "value": "p300_single_gen2"}, + {"label": "P300 Multi GEN2", "value": "p300_multi_gen2"}, + {"label": "P300 Single GEN1", "value": "p300_single"}, + {"label": "P50 Single GEN1", "value": "p50_single"}, + {"label": "P300 Multi GEN1", "value": "p300_multi"} + ] + }, + { + "type": "dropDown", + "label": "Pipette Mount", + "name": "pip_mount", + "options": [ + {"label": "Right side", "value": "right"}, + {"label": "Left side", "value": "left"} + ] + }, + { + "type": "dropDown", + "label": "Magnetic Module Gen", + "name": "mag_gen", + "options": [ + {"label": "GEN1", "value": "magnetic module"}, + {"label": "GEN2", "value": "magnetic module gen2"} + ] + }, + { + "type": "int", + "label": "Number of Samples", + "name": "no_of_samps", + "default": 24 + }, + { + "type": "float", + "label": "Initial Product Volume (µl)", + "name": "init_vol", + "default": 50 + }, + { + "type": "float", + "label": "Bead Ratio", + "name": "bead_ratio", + "default": 1.8 + }, + { + "type": "float", + "label": "Resuspension Buffer Volume (µl)", + "name": "rsb_vol", + "default": 52.5 + }, + { + "type": "float", + "label": "Final PCR Product Volume (µl)", + "name": "final_vol", + "default": 50 + }, + { + "type": "int", + "label": "Dry Time (minutes)", + "name": "dry_time", + "default": 15 + } +] diff --git a/protocols/illumina-nextera-XT-library-prep-part2/nexteraXT_dna_library_prep_part2.ot2.apiv2.py b/protocols/illumina-nextera-XT-library-prep-part2/nexteraXT_dna_library_prep_part2.ot2.apiv2.py new file mode 100644 index 0000000000..3015fbe3ce --- /dev/null +++ b/protocols/illumina-nextera-XT-library-prep-part2/nexteraXT_dna_library_prep_part2.ot2.apiv2.py @@ -0,0 +1,164 @@ +import math + +metadata = { + 'protocolName': 'Illumina Nextera XT NGS Prep 2: Clean-Up Libraries', + 'author': 'Opentrons ', + 'source': 'Protocol Library', + 'apiLevel': '2.2' + } + + +def run(protocol): + [pip_type, pip_mount, mag_gen, no_of_samps, init_vol, + bead_ratio, rsb_vol, final_vol, dry_time] = get_values( # noqa: F821 + 'pip_type', 'pip_mount', 'mag_gen', 'no_of_samps', 'init_vol', + 'bead_ratio', 'rsb_vol', 'final_vol', 'dry_time') + + # labware setup + mag_deck = protocol.load_module(mag_gen, '4') + mag_plate = mag_deck.load_labware('biorad_96_wellplate_200ul_pcr') + in_plate = protocol.load_labware( + 'biorad_96_wellplate_200ul_pcr', '5', 'Load Plate' + ) + out_plate = protocol.load_labware( + 'biorad_96_wellplate_200ul_pcr', '1', 'Final Plate (empty)' + ) + trough = protocol.load_labware( + 'usascientific_12_reservoir_22ml', '2', 'Reservoir, 12-channel' + ) + tip_no = no_of_samps * 4 + 3 + no_racks = tip_no//96 + (1 if tip_no % 96 > 0 else 0) + tips = [ + protocol.load_labware('opentrons_96_tiprack_300ul', str(slot)) + for slot in range(6, 7+no_racks) + ] + + pip = protocol.load_instrument(pip_type, pip_mount, tip_racks=tips) + pipC = pip_type.split('_')[1] + + # Volume Tracking - adapted from Sakib + class VolTracker: + def __init__(self, labware, well_vol, pip_type='single', + mode='reagent', start=0, end=12, msg='Reset Labware'): + try: + self.labware_wells = dict.fromkeys( + labware.wells()[start:end], 0) + except Exception: + self.labware_wells = dict.fromkeys( + labware, 0) + self.labware_wells_backup = self.labware_wells.copy() + self.well_vol = well_vol + self.pip_type = pip_type + self.mode = mode + self.start = start + self.end = end + self.msg = msg + + def tracker(self, vol): + '''tracker() will track how much liquid + was used up per well. If the volume of + a given well is greater than self.well_vol + it will remove it from the dictionary and iterate + to the next well which will act as the reservoir.''' + well = next(iter(self.labware_wells)) + if self.labware_wells[well] + vol >= self.well_vol: + del self.labware_wells[well] + if len(self.labware_wells) < 1: + protocol.pause(self.msg) + self.labware_wells = self.labware_wells_backup.copy() + well = next(iter(self.labware_wells)) + if self.pip_type == 'multi': + self.labware_wells[well] = self.labware_wells[well] + vol*8 + elif self.pip_type == 'single': + self.labware_wells[well] = self.labware_wells[well] + vol + """ + Removed the display of comments + """ + # if self.mode == 'waste': + # protocol.comment(f'''{well}: {int(self.labware_wells[well])} + # uL of total waste''') + # else: + # protocol.comment(f'''{int(self.labware_wells[well])} + # uL of liquidused from {well}''') + return well + + # reagent setup + rsb = trough['A1'] # resuspension buffer + beads = trough['A2'] # AMPure XP beads + # 80% ethanol + ethanol = VolTracker( + trough, 14000, pipC, start=2, end=6, msg='Out of Ethanol; replace') + # liquid waste + liquid_trash = VolTracker( + trough, 14500, pipC, start=8, end=12, msg='Empty liqud waste.') + + if pipC == 'multi': + num_cols = math.ceil(no_of_samps/8) + inputs = in_plate.rows()[0][:num_cols] + mag = mag_plate.rows()[0][:num_cols] + outputs = out_plate.rows()[0][:num_cols] + else: + inputs = [well for well in in_plate.wells()][:no_of_samps] + mag = [well for well in mag_plate.wells()][:no_of_samps] + outputs = [well for well in out_plate.wells()][:no_of_samps] + + bead_vol = init_vol*bead_ratio + + # Transfer PCR Product + pip.transfer(init_vol, inputs, mag, new_tip='always') + + # Transfer beads to each well + pip.distribute(bead_vol, beads, [well.top() for well in mag]) + + total_vol = bead_vol + init_vol + 5 + + protocol.pause("Shake at 1800 rpm for 2 minutes.") + + # Incubate at RT for 5 minutes + protocol.delay(minutes=5) + + # Engage MagDeck for 2 minutes, remain engaged + mag_deck.engage() + protocol.delay(minutes=2) + + # Remove supernatant + for well in mag: + pip.transfer(total_vol, well, liquid_trash.tracker(total_vol).top()) + + # Wash beads twice with 80% ethanol + for cycle in range(1, 3): + protocol.comment(f"\nBeginning ethanol wash {cycle}...\n") + pip.pick_up_tip() + for well in mag: + pip.transfer( + 200, ethanol.tracker(200), well.top(), new_tip='never') + pip.drop_tip() + protocol.delay(seconds=30) + for well in mag: + pip.pick_up_tip() + pip.transfer( + 220, well, liquid_trash.tracker(220).top(), new_tip='never') + pip.drop_tip() + + # Air dry + protocol.delay(minutes=dry_time) + + # Turn off MagDeck + mag_deck.disengage() + + # Transfer RSB to well + pip.pick_up_tip() + pip.transfer(rsb_vol, rsb, [well.top() for well in mag], new_tip='never') + pip.drop_tip() + + protocol.pause("Shake at 1800 rpm for 2 minutes.") + + # Turn on MagDeck for 2 minutes + mag_deck.engage() + protocol.delay(minutes=2) + + # Transfer supernatant to new PCR plate + pip.transfer(final_vol, mag, outputs, new_tip='always') + + # Disengage MagDeck + mag_deck.disengage() diff --git a/protocols/macherey-nagel-nucleomag-DNA-microbiome/README.md b/protocols/macherey-nagel-nucleomag-DNA-microbiome/README.md new file mode 100644 index 0000000000..adf8b6af6c --- /dev/null +++ b/protocols/macherey-nagel-nucleomag-DNA-microbiome/README.md @@ -0,0 +1,99 @@ +# MACHEREY-NAGEL NucleoMag® DNA Microbiome + + +### Author +[MACHEREY-NAGEL](https://www.mn-net.com/us) + +### Partner +[Opentrons](https://opentrons.com/) + + +# Opentrons has launched a new Protocol Library. You should use the [new page for this protocol](library.opentrons.com/p/macherey-nagel-nucleomag-dna-microbiome). This page won’t be available after January 31st, 2024. + +## Categories +* Nucleic Acid Extraction & Purification + * MACHEREY-NAGEL NucleoMag® DNA Microbiome + + +## Description +![MACHEREY-NAGEL](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/macherey-nagel/MN_Logo_50.jpeg) + +This protocol automates the NucleoMag® DNA Microbiome kit for flexible magnetic bead based isolation of DNA from microbiome samples. + +Before beginning the protocol on the OT-2, the following preparation steps are needed. +1. Perform the lysis according to the NucleoMag® DNA Microbiome user manual. +2. Fill the 12-Well Buffer Reservoir according to the table below. +3. Resuspend the NucleoMag® B-Beads by vortexing and place them in Position A1 of the 2mL Tube Rack. +4. Load the instrument deck according to the displayed positions. +5. Place the Square-well Block containing the lysates on the Magnetic Module and start the run. + + +You can access the full description of this workflow on the OT-2 by visiting this link: [link](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/macherey-nagel-dna-microbiome/line29.pdf) + + +### Modules +* [Opentrons Magnetic Module (GEN2)](https://shop.opentrons.com/magnetic-module-gen2/) + + +### Labware +* Macherey Nagel 96 Well Square Well Block +* Macherey Nagel 96 Well Elution Plate U-bottom +* [Opentrons 96 Tip Rack 300 µL](https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-300ul-tips) +* [Opentrons 24 Tube Rack with Generic 2 mL Screwcap](https://shop.opentrons.com/collections/opentrons-tips/products/tube-rack-set-1) +* [USA Scientific 12 Well Reservoir 22 mL #1061-8150](https://www.usascientific.com/12-channel-automation-reservoir.aspx) +* [Opentrons 96 Tip Rack 1000 µL](https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-1000ul-tips) +* [Agilent 1 Well Reservoir 290 mL #201252-100](https://www.agilent.com/store/en_US/Prod-201252-100/201252-100) + + +### Pipettes +* [Opentrons P300 8 Channel Electronic Pipette (GEN2)](https://shop.opentrons.com/8-channel-electronic-pipette/) +* [Opentrons P1000 Single Channel Electronic Pipette (GEN2)](https://shop.opentrons.com/single-channel-electronic-pipette-p20/) + + +### Deck Setup +![deck](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/macherey-nagel/deck.png) + + +### Reagent Setup +![reagents](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/macherey-nagel-dna-microbiome/reag_microbiome.png) + + +### Protocol Steps +1. Binding Step +2. Wash 1 +3. Wash 2 +4. Wash 3 +5. Wash 4 +6. Delay for drying +7. Elution +
+
+* Note +The default values for all volumes, incubation times and mix repetitions were pretested and validated. +We do not recommend to change them. If you still decide to change them please scale all volumes proportionally. +For change recommendations please contact automation-bio@mn-net.de +
+
+ +**Process** +1. Input your protocol parameters below. +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/). +
+**Disclaimer**: MACHEREY-NAGEL GmbH & Co. KG makes every effort to include accurate and up-to-date information within this publication; however, it is possible that omissions or errors might have occurred. MACHEREY-NAGEL GmbH & Co. KG cannot, therefore, make any representations or warranties, expressed or implied, as to the accuracy or completeness of the information provided in this publication. Changes in this publication can be made at any time without notice. For technical details and detailed procedures of the specifications provided in this document please contact your MACHEREY-NAGEL representative. This publication may contain reference to applications and products which are not available in all markets. Please check with your local sales representative. +All mentioned trademarks are protected by law. All used names and denotations can be brands, trademarks, or registered labels of their respective owner – also if they are not special denotation. To mention products and brands is only a kind of information (i.e., it does not offend against trademarks and brands and can not be seen as a kind of recommendation or assessment). Reference herein to any specific commercial product, process, or service by trade name, trademark, manufacturer, or otherwise, does not necessarily constitute or imply its endorsement, recommendation, or support by MACHEREY-NAGEL GmbH & Co. KG or Opentrons. Any views or opinions expressed herein by the authors' do not necessarily state or reflect those of MACHEREY-NAGEL or the Eppendorf AG. NucleoMag® is a registered trademark of MACHEREY-NAGEL GmbH & Co. KG, Düren, Germany. Opentrons OT-2 is a device from Opentrons, New York, USA. +
+* The Download links includes all Protocols in their respective subfolders as well as the .json files for the two labware files. + + +###### Internal +macherey-nagal-nucleomag-dna-microbiome diff --git a/protocols/macherey-nagel-nucleomag-DNA-microbiome/fields.json b/protocols/macherey-nagel-nucleomag-DNA-microbiome/fields.json new file mode 100644 index 0000000000..c40d687dfd --- /dev/null +++ b/protocols/macherey-nagel-nucleomag-DNA-microbiome/fields.json @@ -0,0 +1,107 @@ +[ + { + "type": "int", + "label": "Number of Samples [1-48 samples]", + "name": "num_samples", + "default": 48 + }, + { + "type": "int", + "label": "Starting Volume", + "name": "starting_vol", + "default": 500 + }, + { + "type": "int", + "label": "Elution Volume [50-200µL]", + "name": "elution_vol", + "default": 100 + }, + { + "type": "int", + "label": "Binding Buffer Volume", + "name": "binding_buffer_vol", + "default": 310 + }, + { + "type": "int", + "label": "Bead Volume", + "name": "bead_vol", + "default": 25 + }, + { + "type": "int", + "label": "Wash 1 Volume", + "name": "wash1_vol", + "default": 600 + }, + { + "type": "int", + "label": "Wash 2 Volume", + "name": "wash2_vol", + "default": 600 + }, + { + "type": "int", + "label": "Wash 3 Volume", + "name": "wash3_vol", + "default": 600 + }, + { + "type": "int", + "label": "Wash 4 Volume", + "name": "wash4_vol", + "default": 600 + }, + { + "type": "int", + "label": "Mix Repetitions During Binding [pretested default, changing is not recommended]", + "name": "mix_reps_bind", + "default": 25 + }, + { + "type": "int", + "label": "Mix Repetitions during Wash [pretested default, changing is not recommended]", + "name": "mix_reps_wash", + "default": 20 + }, + { + "type": "int", + "label": "Mix Repetitions during Elution [pretested default, changing is not recommended]", + "name": "mix_reps_elu", + "default": 25 + }, + { + "type": "int", + "label": "Separation Time during Binding [pretested default, changing is not recommended]", + "name": "sep_time_bind", + "default": 5 + }, + { + "type": "int", + "label": "Separation Time during Wash [pretested default, changing is not recommended]", + "name": "sep_time_wash", + "default": 2 + }, + { + "type": "int", + "label": "Separation Time during Elution [pretested default, changing is not recommended]", + "name": "sep_time_elu", + "default": 5 + }, + { + "type": "int", + "label": "Time for Air Dry [pretested default, changing is not recommended]", + "name": "dry_time", + "default": 30 + }, + { + "type": "dropDown", + "label": "Track Tips Between Runs", + "name": "tip_track", + "options": [ + { "label": "No", "value": 0 }, + { "label": "Yes", "value": 1 } + ] + } + ] diff --git a/protocols/macherey-nagel-nucleomag-DNA-microbiome/labware/96_elutionplate_ubottom_by_macherey_nagel.json b/protocols/macherey-nagel-nucleomag-DNA-microbiome/labware/96_elutionplate_ubottom_by_macherey_nagel.json new file mode 100644 index 0000000000..67a7627a70 --- /dev/null +++ b/protocols/macherey-nagel-nucleomag-DNA-microbiome/labware/96_elutionplate_ubottom_by_macherey_nagel.json @@ -0,0 +1,1127 @@ +{ + "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": "Macherey-Nagel", + "brandId": [ + "Elution Plate U-bottom (REF740672)" + ] + }, + "metadata": { + "displayName": "96_Elutionplate_ubottom_by_Macherey_Nagel", + "displayCategory": "wellPlate", + "displayVolumeUnits": "µL", + "tags": [] + }, + "dimensions": { + "xDimension": 127.6, + "yDimension": 85.6, + "zDimension": 14.2 + }, + "wells": { + "A1": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 11.1, + "y": 71.3, + "z": 3.8 + }, + "B1": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 11.1, + "y": 62.29, + "z": 3.8 + }, + "C1": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 11.1, + "y": 53.28, + "z": 3.8 + }, + "D1": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 11.1, + "y": 44.27, + "z": 3.8 + }, + "E1": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 11.1, + "y": 35.26, + "z": 3.8 + }, + "F1": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 11.1, + "y": 26.25, + "z": 3.8 + }, + "G1": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 11.1, + "y": 17.24, + "z": 3.8 + }, + "H1": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 11.1, + "y": 8.23, + "z": 3.8 + }, + "A2": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 20.11, + "y": 71.3, + "z": 3.8 + }, + "B2": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 20.11, + "y": 62.29, + "z": 3.8 + }, + "C2": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 20.11, + "y": 53.28, + "z": 3.8 + }, + "D2": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 20.11, + "y": 44.27, + "z": 3.8 + }, + "E2": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 20.11, + "y": 35.26, + "z": 3.8 + }, + "F2": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 20.11, + "y": 26.25, + "z": 3.8 + }, + "G2": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 20.11, + "y": 17.24, + "z": 3.8 + }, + "H2": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 20.11, + "y": 8.23, + "z": 3.8 + }, + "A3": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 29.12, + "y": 71.3, + "z": 3.8 + }, + "B3": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 29.12, + "y": 62.29, + "z": 3.8 + }, + "C3": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 29.12, + "y": 53.28, + "z": 3.8 + }, + "D3": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 29.12, + "y": 44.27, + "z": 3.8 + }, + "E3": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 29.12, + "y": 35.26, + "z": 3.8 + }, + "F3": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 29.12, + "y": 26.25, + "z": 3.8 + }, + "G3": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 29.12, + "y": 17.24, + "z": 3.8 + }, + "H3": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 29.12, + "y": 8.23, + "z": 3.8 + }, + "A4": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 38.13, + "y": 71.3, + "z": 3.8 + }, + "B4": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 38.13, + "y": 62.29, + "z": 3.8 + }, + "C4": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 38.13, + "y": 53.28, + "z": 3.8 + }, + "D4": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 38.13, + "y": 44.27, + "z": 3.8 + }, + "E4": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 38.13, + "y": 35.26, + "z": 3.8 + }, + "F4": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 38.13, + "y": 26.25, + "z": 3.8 + }, + "G4": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 38.13, + "y": 17.24, + "z": 3.8 + }, + "H4": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 38.13, + "y": 8.23, + "z": 3.8 + }, + "A5": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 47.14, + "y": 71.3, + "z": 3.8 + }, + "B5": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 47.14, + "y": 62.29, + "z": 3.8 + }, + "C5": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 47.14, + "y": 53.28, + "z": 3.8 + }, + "D5": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 47.14, + "y": 44.27, + "z": 3.8 + }, + "E5": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 47.14, + "y": 35.26, + "z": 3.8 + }, + "F5": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 47.14, + "y": 26.25, + "z": 3.8 + }, + "G5": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 47.14, + "y": 17.24, + "z": 3.8 + }, + "H5": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 47.14, + "y": 8.23, + "z": 3.8 + }, + "A6": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 56.15, + "y": 71.3, + "z": 3.8 + }, + "B6": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 56.15, + "y": 62.29, + "z": 3.8 + }, + "C6": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 56.15, + "y": 53.28, + "z": 3.8 + }, + "D6": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 56.15, + "y": 44.27, + "z": 3.8 + }, + "E6": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 56.15, + "y": 35.26, + "z": 3.8 + }, + "F6": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 56.15, + "y": 26.25, + "z": 3.8 + }, + "G6": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 56.15, + "y": 17.24, + "z": 3.8 + }, + "H6": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 56.15, + "y": 8.23, + "z": 3.8 + }, + "A7": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 65.16, + "y": 71.3, + "z": 3.8 + }, + "B7": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 65.16, + "y": 62.29, + "z": 3.8 + }, + "C7": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 65.16, + "y": 53.28, + "z": 3.8 + }, + "D7": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 65.16, + "y": 44.27, + "z": 3.8 + }, + "E7": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 65.16, + "y": 35.26, + "z": 3.8 + }, + "F7": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 65.16, + "y": 26.25, + "z": 3.8 + }, + "G7": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 65.16, + "y": 17.24, + "z": 3.8 + }, + "H7": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 65.16, + "y": 8.23, + "z": 3.8 + }, + "A8": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 74.17, + "y": 71.3, + "z": 3.8 + }, + "B8": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 74.17, + "y": 62.29, + "z": 3.8 + }, + "C8": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 74.17, + "y": 53.28, + "z": 3.8 + }, + "D8": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 74.17, + "y": 44.27, + "z": 3.8 + }, + "E8": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 74.17, + "y": 35.26, + "z": 3.8 + }, + "F8": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 74.17, + "y": 26.25, + "z": 3.8 + }, + "G8": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 74.17, + "y": 17.24, + "z": 3.8 + }, + "H8": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 74.17, + "y": 8.23, + "z": 3.8 + }, + "A9": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 83.18, + "y": 71.3, + "z": 3.8 + }, + "B9": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 83.18, + "y": 62.29, + "z": 3.8 + }, + "C9": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 83.18, + "y": 53.28, + "z": 3.8 + }, + "D9": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 83.18, + "y": 44.27, + "z": 3.8 + }, + "E9": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 83.18, + "y": 35.26, + "z": 3.8 + }, + "F9": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 83.18, + "y": 26.25, + "z": 3.8 + }, + "G9": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 83.18, + "y": 17.24, + "z": 3.8 + }, + "H9": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 83.18, + "y": 8.23, + "z": 3.8 + }, + "A10": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 92.19, + "y": 71.3, + "z": 3.8 + }, + "B10": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 92.19, + "y": 62.29, + "z": 3.8 + }, + "C10": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 92.19, + "y": 53.28, + "z": 3.8 + }, + "D10": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 92.19, + "y": 44.27, + "z": 3.8 + }, + "E10": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 92.19, + "y": 35.26, + "z": 3.8 + }, + "F10": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 92.19, + "y": 26.25, + "z": 3.8 + }, + "G10": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 92.19, + "y": 17.24, + "z": 3.8 + }, + "H10": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 92.19, + "y": 8.23, + "z": 3.8 + }, + "A11": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 101.2, + "y": 71.3, + "z": 3.8 + }, + "B11": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 101.2, + "y": 62.29, + "z": 3.8 + }, + "C11": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 101.2, + "y": 53.28, + "z": 3.8 + }, + "D11": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 101.2, + "y": 44.27, + "z": 3.8 + }, + "E11": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 101.2, + "y": 35.26, + "z": 3.8 + }, + "F11": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 101.2, + "y": 26.25, + "z": 3.8 + }, + "G11": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 101.2, + "y": 17.24, + "z": 3.8 + }, + "H11": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 101.2, + "y": 8.23, + "z": 3.8 + }, + "A12": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 110.21, + "y": 71.3, + "z": 3.8 + }, + "B12": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 110.21, + "y": 62.29, + "z": 3.8 + }, + "C12": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 110.21, + "y": 53.28, + "z": 3.8 + }, + "D12": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 110.21, + "y": 44.27, + "z": 3.8 + }, + "E12": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 110.21, + "y": 35.26, + "z": 3.8 + }, + "F12": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 110.21, + "y": 26.25, + "z": 3.8 + }, + "G12": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 110.21, + "y": 17.24, + "z": 3.8 + }, + "H12": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 110.21, + "y": 8.23, + "z": 3.8 + } + }, + "groups": [ + { + "metadata": { + "wellBottomShape": "u" + }, + "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": "96_elutionplate_ubottom_by_macherey_nagel" + }, + "namespace": "custom_beta", + "version": 1, + "schemaVersion": 2, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + } +} \ No newline at end of file diff --git a/protocols/macherey-nagel-nucleomag-DNA-microbiome/labware/96_squarewell_block_macherey_nagel.json b/protocols/macherey-nagel-nucleomag-DNA-microbiome/labware/96_squarewell_block_macherey_nagel.json new file mode 100644 index 0000000000..e8e073702d --- /dev/null +++ b/protocols/macherey-nagel-nucleomag-DNA-microbiome/labware/96_squarewell_block_macherey_nagel.json @@ -0,0 +1,1223 @@ +{ + "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": "Macherey-Nagel", + "brandId": [ + "Square-Well Block (REF740670)" + ] + }, + "metadata": { + "displayName": "96 Square-Well Block by Macherey-Nagel", + "displayCategory": "wellPlate", + "displayVolumeUnits": "µL", + "tags": [] + }, + "dimensions": { + "xDimension": 127.6, + "yDimension": 85.6, + "zDimension": 44.15 + }, + "wells": { + "A1": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 11.1, + "y": 71.3, + "z": 1.95 + }, + "B1": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 11.1, + "y": 62.3, + "z": 1.95 + }, + "C1": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 11.1, + "y": 53.3, + "z": 1.95 + }, + "D1": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 11.1, + "y": 44.3, + "z": 1.95 + }, + "E1": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 11.1, + "y": 35.3, + "z": 1.95 + }, + "F1": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 11.1, + "y": 26.3, + "z": 1.95 + }, + "G1": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 11.1, + "y": 17.3, + "z": 1.95 + }, + "H1": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 11.1, + "y": 8.3, + "z": 1.95 + }, + "A2": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 20.1, + "y": 71.3, + "z": 1.95 + }, + "B2": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 20.1, + "y": 62.3, + "z": 1.95 + }, + "C2": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 20.1, + "y": 53.3, + "z": 1.95 + }, + "D2": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 20.1, + "y": 44.3, + "z": 1.95 + }, + "E2": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 20.1, + "y": 35.3, + "z": 1.95 + }, + "F2": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 20.1, + "y": 26.3, + "z": 1.95 + }, + "G2": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 20.1, + "y": 17.3, + "z": 1.95 + }, + "H2": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 20.1, + "y": 8.3, + "z": 1.95 + }, + "A3": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 29.1, + "y": 71.3, + "z": 1.95 + }, + "B3": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 29.1, + "y": 62.3, + "z": 1.95 + }, + "C3": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 29.1, + "y": 53.3, + "z": 1.95 + }, + "D3": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 29.1, + "y": 44.3, + "z": 1.95 + }, + "E3": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 29.1, + "y": 35.3, + "z": 1.95 + }, + "F3": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 29.1, + "y": 26.3, + "z": 1.95 + }, + "G3": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 29.1, + "y": 17.3, + "z": 1.95 + }, + "H3": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 29.1, + "y": 8.3, + "z": 1.95 + }, + "A4": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 38.1, + "y": 71.3, + "z": 1.95 + }, + "B4": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 38.1, + "y": 62.3, + "z": 1.95 + }, + "C4": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 38.1, + "y": 53.3, + "z": 1.95 + }, + "D4": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 38.1, + "y": 44.3, + "z": 1.95 + }, + "E4": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 38.1, + "y": 35.3, + "z": 1.95 + }, + "F4": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 38.1, + "y": 26.3, + "z": 1.95 + }, + "G4": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 38.1, + "y": 17.3, + "z": 1.95 + }, + "H4": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 38.1, + "y": 8.3, + "z": 1.95 + }, + "A5": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 47.1, + "y": 71.3, + "z": 1.95 + }, + "B5": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 47.1, + "y": 62.3, + "z": 1.95 + }, + "C5": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 47.1, + "y": 53.3, + "z": 1.95 + }, + "D5": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 47.1, + "y": 44.3, + "z": 1.95 + }, + "E5": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 47.1, + "y": 35.3, + "z": 1.95 + }, + "F5": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 47.1, + "y": 26.3, + "z": 1.95 + }, + "G5": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 47.1, + "y": 17.3, + "z": 1.95 + }, + "H5": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 47.1, + "y": 8.3, + "z": 1.95 + }, + "A6": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 56.1, + "y": 71.3, + "z": 1.95 + }, + "B6": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 56.1, + "y": 62.3, + "z": 1.95 + }, + "C6": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 56.1, + "y": 53.3, + "z": 1.95 + }, + "D6": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 56.1, + "y": 44.3, + "z": 1.95 + }, + "E6": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 56.1, + "y": 35.3, + "z": 1.95 + }, + "F6": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 56.1, + "y": 26.3, + "z": 1.95 + }, + "G6": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 56.1, + "y": 17.3, + "z": 1.95 + }, + "H6": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 56.1, + "y": 8.3, + "z": 1.95 + }, + "A7": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 65.1, + "y": 71.3, + "z": 1.95 + }, + "B7": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 65.1, + "y": 62.3, + "z": 1.95 + }, + "C7": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 65.1, + "y": 53.3, + "z": 1.95 + }, + "D7": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 65.1, + "y": 44.3, + "z": 1.95 + }, + "E7": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 65.1, + "y": 35.3, + "z": 1.95 + }, + "F7": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 65.1, + "y": 26.3, + "z": 1.95 + }, + "G7": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 65.1, + "y": 17.3, + "z": 1.95 + }, + "H7": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 65.1, + "y": 8.3, + "z": 1.95 + }, + "A8": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 74.1, + "y": 71.3, + "z": 1.95 + }, + "B8": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 74.1, + "y": 62.3, + "z": 1.95 + }, + "C8": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 74.1, + "y": 53.3, + "z": 1.95 + }, + "D8": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 74.1, + "y": 44.3, + "z": 1.95 + }, + "E8": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 74.1, + "y": 35.3, + "z": 1.95 + }, + "F8": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 74.1, + "y": 26.3, + "z": 1.95 + }, + "G8": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 74.1, + "y": 17.3, + "z": 1.95 + }, + "H8": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 74.1, + "y": 8.3, + "z": 1.95 + }, + "A9": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 83.1, + "y": 71.3, + "z": 1.95 + }, + "B9": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 83.1, + "y": 62.3, + "z": 1.95 + }, + "C9": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 83.1, + "y": 53.3, + "z": 1.95 + }, + "D9": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 83.1, + "y": 44.3, + "z": 1.95 + }, + "E9": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 83.1, + "y": 35.3, + "z": 1.95 + }, + "F9": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 83.1, + "y": 26.3, + "z": 1.95 + }, + "G9": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 83.1, + "y": 17.3, + "z": 1.95 + }, + "H9": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 83.1, + "y": 8.3, + "z": 1.95 + }, + "A10": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 92.1, + "y": 71.3, + "z": 1.95 + }, + "B10": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 92.1, + "y": 62.3, + "z": 1.95 + }, + "C10": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 92.1, + "y": 53.3, + "z": 1.95 + }, + "D10": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 92.1, + "y": 44.3, + "z": 1.95 + }, + "E10": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 92.1, + "y": 35.3, + "z": 1.95 + }, + "F10": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 92.1, + "y": 26.3, + "z": 1.95 + }, + "G10": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 92.1, + "y": 17.3, + "z": 1.95 + }, + "H10": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 92.1, + "y": 8.3, + "z": 1.95 + }, + "A11": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 101.1, + "y": 71.3, + "z": 1.95 + }, + "B11": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 101.1, + "y": 62.3, + "z": 1.95 + }, + "C11": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 101.1, + "y": 53.3, + "z": 1.95 + }, + "D11": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 101.1, + "y": 44.3, + "z": 1.95 + }, + "E11": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 101.1, + "y": 35.3, + "z": 1.95 + }, + "F11": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 101.1, + "y": 26.3, + "z": 1.95 + }, + "G11": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 101.1, + "y": 17.3, + "z": 1.95 + }, + "H11": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 101.1, + "y": 8.3, + "z": 1.95 + }, + "A12": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 110.1, + "y": 71.3, + "z": 1.95 + }, + "B12": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 110.1, + "y": 62.3, + "z": 1.95 + }, + "C12": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 110.1, + "y": 53.3, + "z": 1.95 + }, + "D12": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 110.1, + "y": 44.3, + "z": 1.95 + }, + "E12": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 110.1, + "y": 35.3, + "z": 1.95 + }, + "F12": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 110.1, + "y": 26.3, + "z": 1.95 + }, + "G12": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 110.1, + "y": 17.3, + "z": 1.95 + }, + "H12": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 110.1, + "y": 8.3, + "z": 1.95 + } + }, + "groups": [ + { + "metadata": { + "wellBottomShape": "u" + }, + "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": "96_squarewell_block_macherey_nagel" + }, + "namespace": "custom_beta", + "version": 1, + "schemaVersion": 2, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + } +} \ No newline at end of file diff --git a/protocols/macherey-nagel-nucleomag-DNA-microbiome/macherey-nagel-nucleo-mag-dna-microbiome.ot2.apiv2.py b/protocols/macherey-nagel-nucleomag-DNA-microbiome/macherey-nagel-nucleo-mag-dna-microbiome.ot2.apiv2.py new file mode 100644 index 0000000000..e5b63cb34d --- /dev/null +++ b/protocols/macherey-nagel-nucleomag-DNA-microbiome/macherey-nagel-nucleo-mag-dna-microbiome.ot2.apiv2.py @@ -0,0 +1,595 @@ +# flake8: noqa +from opentrons.types import Point +import json +import os +import math + +metadata = {'protocolName': 'NucleoMag_DNA_Microbiome_Rev01', 'author': 'Macherey-Nagel ', 'apiLevel': '2.9'} + +def run(ctx): + + ''' + Variable definition + ''' + [num_samples, + starting_vol, + elution_vol, + binding_buffer_vol, + bead_vol, + wash1_vol, + wash2_vol, + wash3_vol, + wash4_vol, + mix_reps_bind, + mix_reps_wash, + mix_reps_elu, + sep_time_bind, + sep_time_wash, + sep_time_elu, + dry_time, + tip_track] = [48, 500, 100, 310, 25, 600, 600, 600, 600, 25, 20, 25, 5, 2, 5, 30, False] + + total_vol_per_sample = starting_vol + binding_buffer_vol + wash1_vol + wash2_vol + wash3_vol + wash4_vol + run_liq_waste_vol = num_samples * total_vol_per_sample + + + Mag_height_SQW = 5.5 + + bottom_tolerance = 2.8 + # Bottom tolerance for aspriation from 12 Well Buffer Reserovir + + max_num_sample = 48 + max_num_columns = max_num_sample//8 + + ''' + End of Variable Definition + ''' + + ''' + define minimum & maximum volumes + ''' + if not 350 <= starting_vol <= 500: + raise Exception('Starting volume should be from 350 - 500µl.') + if not 50 <= elution_vol <= 200: + raise Exception('Elution volume should be from 50 - 200µl.') + if not run_liq_waste_vol <= 290000: + raise Exception('Number of samples exceeds maximum liquid waste volume of 400mL.') + if not num_samples <= max_num_sample: + raise Exception('Number of samples exceeds maximum number of 48 samples.') + ''' + End of defining minimum & maximum volumes + ''' + + ''' + Deck and Labware definition + ''' + magdeck = ctx.load_module('magnetic module gen2', '10') + magdeck.disengage() + sep_plate = magdeck.load_labware('96_squarewell_block_macherey_nagel', 'Separation Plate') + + liquid_waste = ctx.load_labware('agilent_1_reservoir_290ml', '11', 'Liquid Waste').wells()[0].top() + + elution_plate = ctx.load_labware('96_elutionplate_ubottom_by_macherey_nagel', '1', 'Elution Plate') + + tips300 = [ctx.load_labware('opentrons_96_tiprack_300ul', slot,'300µl filtertiprack') for slot in ['2', '3', '5', '6']] + tips1000 = ctx.load_labware('opentrons_96_tiprack_1000ul', '9','1000µl filtertiprack') + + num_cols = math.ceil(num_samples/8) + + parkingrack = ctx.load_labware('opentrons_96_tiprack_300ul', '8', 'empty tiprack for parking') + parking_spots = parkingrack.rows()[0][:num_cols] + + buffers = ctx.load_labware('usascientific_12_reservoir_22ml', '7', 'NucleoMag Buffers') + + beads = ctx.load_labware('opentrons_24_tuberack_generic_2ml_screwcap', '4', 'NucleoMag B-Beads').wells()[0] + # Beads are placed in a single 2mL screwcap tube at A1 + # Make sure the tip will not spill beads when driving down into the tube because of to high amount in the tube + + ''' + End of Deck and Labware definition + ''' + + ''' + Define reagents + + Well 1 & 2 Binding Buffer MI2 + Well 3 & 4 Wash Buffer MI3 for 1st Wash + Well 5 & 6 Wash Buffer MI3 for 2nd Wash + Well 7 & 8 Wash Buffer MI4 for 3rd Wash + Well 9 & 10 70% ethanol for 4th Wash + Well 11 empty + Well 12 Elution Buffer MI5 + + ''' + binding_buffer = buffers.wells()[:2] + wash1 = buffers.wells()[2:4] + wash2 = buffers.wells()[4:6] + wash3 = buffers.wells()[6:8] + wash4 = buffers.wells()[8:10] + placeholder = buffers.wells()[10] + elution_buffer = buffers.wells()[11] + ''' + End of reagent definition + ''' + + ''' + tool configuration + ''' + m300 = ctx.load_instrument('p300_multi_gen2', 'left', tip_racks=tips300) + s1000 = ctx.load_instrument('p1000_single_gen2', 'right', tip_racks=[tips1000]) + ''' + End of tool configuration + ''' + + ''' + Value calculations + ''' + mag_samples_s = sep_plate.wells()[:num_samples] + mag_samples_m = sep_plate.rows()[0][:num_cols] + elution_samples_m = elution_plate.rows()[0][:num_cols] + ''' + End of Calculations + ''' + + #sets initial pipetting speeds + m300.flow_rate.aspirate = 100 + m300.flow_rate.dispense = 150 + m300.flow_rate.blow_out = 200 + + s1000.flow_rate.aspirate = 750 + s1000.flow_rate.dispense = 900 + + #define initial pipetting clearance + m300.well_bottom_clearance.aspirate = 5 + m300.well_bottom_clearance.dispense = 25 + + ''' + tip logging and waste handling + ''' + folder_path = '/data/B' + tip_file_path = folder_path + '/tip_log.json' + tip_log = {'count': {}} + if tip_track and not ctx.is_simulating(): + if os.path.isfile(tip_file_path): + with open(tip_file_path) as json_file: + data = json.load(json_file) + if 'tips300' in data: + tip_log['count'][m300] = data['tips300'] + else: + tip_log['count'][m300] = 0 + else: + tip_log['count'][m300] = 0 + else: + tip_log['count'] = {m300: 0} + + tip_log['tips'] = { + m300: [tip for rack in tips300 for tip in rack.rows()[0]]} + tip_log['max'] = {m300: len(tip_log['tips'][m300])} + + # kept _pick_up as default + def _pick_up(pip, loc=None): + nonlocal tip_log + if tip_log['count'][pip] == tip_log['max'][pip] and not loc: + ctx.pause('Replace ' + str(pip.max_volume) + 'µl tipracks before \ resuming.') + pip.reset_tipracks() + tip_log['count'][pip] = 0 + if loc: + pip.pick_up_tip(loc) + else: + pip.pick_up_tip(tip_log['tips'][pip][tip_log['count'][pip]]) + tip_log['count'][pip] += 1 + + switch = True + drop_count = 0 + # number of tips trash will accommodate before prompting user to empty + drop_threshold = 192 + + def _drop(pip): + nonlocal switch + nonlocal drop_count + side = 30 if switch else -18 + drop_loc = ctx.loaded_labwares[12].wells()[0].top().move( + Point(x=side)) + pip.drop_tip(drop_loc) + switch = not switch + drop_count += 8 + if drop_count == drop_threshold: + m300.home() + ctx.pause('Please empty tips from waste before resuming.') + + ctx.home() # home before continuing with protocol + + drop_count = 0 + + waste_vol = 0 + waste_threshold = 300000 #this would need to be changed since we use a dedicated liquid waste reservoir + + ''' + End of tip logging and wase handling + ''' + + def remove_supernatant(vol, reuse=False, restore=False, last=False, blowout=True): + + """ + `remove_supernatant` will transfer supernatant from the deepwell + extraction plate to the liquid waste reservoir. + :param vol (float): The amount of volume to aspirate from all deepwell + sample wells and dispense in the liquid waste. + :param reuse (boolean): Whether to pick up previously restored sample-corresponding tips + from the 'parking rack' or to pick up new tips. + :param restore (boolean): Whether to park used tips in the 'parking rack' or discard them to waste. + :param last (boolean): Does perform the supernatant removal at the lowest hight possible with an extra over aspiration volume for the last wash step to optimize drying performance + """ + + def _waste_track(vol): + nonlocal waste_vol + if waste_vol + vol >= waste_threshold: + ctx.pause('Please empty liquid waste (slot 11) before \ resuming.') + ctx.home() + waste_vol = 0 + waste_vol += vol + if last: + vol=vol+60 + num_trans = math.ceil(vol/200) + vol_per_trans = vol/num_trans + m300.flow_rate.aspirate = 15 + m300.flow_rate.dispense = 90 + + for i, (m, spot) in enumerate(zip(mag_samples_m, parking_spots)): + if reuse: + _pick_up(m300, spot) + else: + _pick_up(m300) + side = -1 if i % 2 == 0 else 1 + #position modifier to aspirate away from the bead pellet + for _ in range(num_trans): + _waste_track(vol_per_trans*8) + if m300.current_volume > 0: + m300.dispense(m300.current_volume, m.top(-10)) + m300.move_to(m.center()) + if _ == num_trans-1: + if last: + loc = m.bottom(0.7).move(Point(x=side*0.5)) + else: + loc = m.bottom(0.8).move(Point(x=side*0.7)) + else: + loc = m.bottom(1.0).move(Point(x=side*1)) + + m300.transfer(vol_per_trans, loc, liquid_waste, new_tip='never', + air_gap=20) + + if _ == num_trans-1: + if blowout: + m300.blow_out(liquid_waste) + m300.aspirate(20, liquid_waste) + else: + if blowout: + m300.blow_out(liquid_waste) + m300.aspirate(20, liquid_waste) + # m300.air_gap(20) + # extra removal in last wash step to remove residual ethanol + if last: + m300.aspirate(20, m.bottom(0.6)) + m300.aspirate(20, m.bottom(0.7)) + m300.aspirate(20, m.bottom(0.8)) + m300.dispense(m300.current_volume, liquid_waste) + m300.aspirate(20, liquid_waste) + if restore: + m300.drop_tip(spot) + else: + _drop(m300) + m300.flow_rate.aspirate = 90 + m300.flow_rate.dispense = 150 + + def bind(vol, bead_vol, reuse=True, restore=False): + """ + `bind` will perform magnetic bead binding on each sample in the + deepwell plate. The binding beads will be mixed before + transfer (with s1000 tool), and the samples will be mixed with the binding beads after + the transfer (with m300 tool). The magnetic deck activates after the addition to all + samples, and the supernatant is removed after bead binding. + :param vol (float): Amount of volume of Binding Buffer to add to each well. + :param bead_vol (float): The amount of volume of NucleoMag B-Beads to dispense to each well. + :param reuse (boolean): Whether to save sample-corresponding tips + between adding binding buffer and removing the supernatant + :param restore (boolean): Whether to save sample-corresponding tips for reuse in the next stepre + """ + if magdeck.status== 'engaged': + magdeck.disengage() + + # Multidispense loop for distributing beads + bead_aspirate_vol_total = num_samples * bead_vol + 50 + if bead_aspirate_vol_total >= 800: + bead_aspirate_vol = bead_aspirate_vol_total/2 + else: + bead_aspirate_vol = bead_aspirate_vol_total + + + bead_mix_vol_temp = num_samples * bead_vol + if bead_mix_vol_temp >= 900: + bead_mix_vol = 900 + else: + bead_mix_vol = bead_mix_vol_temp - 100 + + air_gap_vol = 20 + bead_dispense_vol = bead_vol + air_gap_vol + + #Mix loop to resuspend beads + s1000.pick_up_tip() + for x in range(3): + s1000.aspirate(bead_mix_vol, beads.bottom(5)) + s1000.dispense(bead_mix_vol, beads.bottom(5)) + for x in range(7): + s1000.aspirate(bead_mix_vol, beads.bottom(3)) + s1000.dispense(bead_mix_vol, beads.bottom(3)) + + s1000.aspirate(bead_aspirate_vol, beads.bottom(3)) + s1000.air_gap(air_gap_vol) + s1000.flow_rate.dispense = 1000 + for loop, (well) in enumerate(mag_samples_s): + if loop == 24: + s1000.aspirate(bead_aspirate_vol, beads.bottom(3)) + s1000.dispense(bead_dispense_vol, well.top(-2)) + s1000.air_gap(air_gap_vol) + # End of bead dispense + + for i, (well, spot) in enumerate(zip(mag_samples_m, parking_spots)): + _pick_up(m300) + num_trans = math.ceil(vol/200) + vol_per_trans = vol/num_trans + m300.flow_rate.aspirate = 100 + for t in range(num_trans): + src = binding_buffer[i//(max_num_columns//len(binding_buffer))] + if m300.current_volume > 0: + m300.dispense(m300.current_volume, src.top()) + m300.aspirate(vol_per_trans, src.bottom(bottom_tolerance)) + m300.aspirate(20, src.top(2)) + ctx.delay(seconds=5, msg='drop delay') + m300.dispense(vol_per_trans+20, well.top(-3)) + # m300.transfer(vol_per_trans, src.bottom(bottom_tolerance), well.top(-3), air_gap=20, new_tip='never') + if t < num_trans - 1: + m300.air_gap(20) + side = 1 if i % 2 == 0 else -1 + #loc_mix = well.bottom(1.5).move(Point(x=side*0.8)) + loc_mix_asp_bottom = well.bottom(2) + loc_mix_asp_top = well.bottom(5) + loc_mix_dis_bottom = well.bottom(1) + loc_mix_dis_pellet = well.bottom(1.5).move(Point(x=side*0.8)) + loc_mix_dis_top = well.bottom(15) + # maybe split into two mix pos. + # one directly over the bead pellet for the first 4-5 cycles + # a second one higher in the liquid column to distribute the beads during the later mix cycles) + # m300.mix(mix_reps_bind, 200, loc_mix) + ''' optimized mix ''' + + m300.flow_rate.aspirate = 60 + m300.flow_rate.dispense = 300 + # resuspend at pellet + for x in range(10): + m300.aspirate(250, loc_mix_asp_top) + m300.dispense(250, loc_mix_dis_pellet) + # resuspend beads across the entire liquid column + for x in range(2): + m300.aspirate(200, loc_mix_asp_top) + m300.dispense(200, loc_mix_dis_bottom) + m300.flow_rate.aspirate = 150 + for x in range(mix_reps_bind-7): + m300.aspirate(250, loc_mix_asp_bottom) + m300.dispense(250, loc_mix_dis_top) + m300.flow_rate.aspirate = 100 + m300.flow_rate.dispense = 200 + ''' end of optimized mix ''' + # aspirate and dispense 1µL at top(-10), is there a ctx.move command? + m300.aspirate(15, well.top(-10)) + ctx.delay(seconds=3, msg='Blow out delay') + m300.dispense(15, well.top(-10)) + m300.blow_out(well.bottom(22)) + m300.air_gap(5) + if reuse: + m300.drop_tip(spot) + else: + _drop(m300) + + ctx.delay(minutes=2, msg='Incubate for 2 minutes') + magdeck.engage(height=Mag_height_SQW) + ctx.delay(minutes=sep_time_bind, msg='Incubating on MagDeck for ' + str(sep_time_bind) + ' minutes.') + + # remove initial supernatant + remove_supernatant(vol+bead_vol+starting_vol, reuse=reuse, restore=restore, last=False) + + + def wash(vol, source, mix_reps=mix_reps_wash, reuse=True, restore=True, resuspend=True, last=False, blowout=True): + """ + `wash` will perform bead washing for the extraction protocol. + :param vol (float): The amount of volume to aspirate from each + source and dispense to each well containing beads. + :param source (List[Well]): A list of wells from where liquid will be + aspirated. If the length of the source list + > 1, `wash` automatically calculates + the index of the source that should be + accessed. + :param mix_reps (int): The number of repititions to mix the beads with + specified wash buffer (ignored if resuspend is + False). + :param reuse (boolean): Whether to pick-up sample-corresponding tips for mixing and supernatant removal + that were restored in a previous step. + :param restore (boolean): Whether to park sample-corresponding tips for reuse in a later step + :param resuspend (boolean): Whether to resuspend beads in wash buffer. + """ + + if resuspend and magdeck.status == 'engaged': + magdeck.disengage() + + num_trans = math.ceil(vol/250) + vol_per_trans = vol/num_trans + + if reuse: #Dispense with fresh tips & mix with restored tips from previous step + _pick_up(m300) + for i, (m) in enumerate(mag_samples_m): + src = source[i//(max_num_columns//len(source))] + for n in range(num_trans): + if m300.current_volume > 0: + m300.dispense(m300.current_volume, src.top()) + m300.aspirate(vol_per_trans, src.bottom(bottom_tolerance)) + m300.aspirate(20, src.top(2)) + ctx.delay(seconds=5, msg='drop delay') + m300.dispense(vol_per_trans+20, m.top()) + # m300.transfer(vol_per_trans, src.bottom(bottom_tolerance), m.top(), air_gap=20, new_tip='never') + if n < num_trans - 1: # only air_gap if going back to source + m300.air_gap(20) + _drop(m300) + if resuspend: + m300.flow_rate.aspirate = 220 + m300.flow_rate.dispense = 300 + for i, (m, spot) in enumerate(zip(mag_samples_m, parking_spots)): + _pick_up(m300, spot) + side = 1 if i % 2 == 0 else -1 + # loc_mix = m.bottom(2).move(Point(x=side*1.5)) + ''' new mix locations ''' + loc_mix_asp_bottom = m.bottom(1.5) + loc_mix_asp_top = m.bottom(5) + loc_mix_dis_pellet = m.bottom(1.5).move(Point(x=side*0.8)) + loc_mix_dis_top = m.bottom(12) + ''' end of new mix locations ''' + src = source[i//(10//len(source))] + # for rep in range(mix_reps): + # m300.aspirate(250, loc_mix) + # m300.dispense(250, loc_mix) + ''' optimized mix ''' + # resuspend at pellet + for x in range(10): + m300.aspirate(250, loc_mix_asp_top) + m300.dispense(250, loc_mix_dis_pellet) + # resuspend beads across the entire liquid column + for x in range(mix_reps-5): + m300.aspirate(250, loc_mix_asp_bottom) + m300.dispense(250, loc_mix_dis_top) + ''' end of optimized mix ''' + m300.blow_out(m.bottom(13)) + m300.air_gap(20) + m300.drop_tip(spot) + m300.flow_rate.aspirate = 100 + m300.flow_rate.dispense = 200 + else: # Dispense & mix with fresh tips + for i, (m, spot) in enumerate(zip(mag_samples_m, parking_spots)): + _pick_up(m300) + side = 1 if i % 2 == 0 else -1 + #loc_mix = m.bottom(2).move(Point(x=side*1.5)) + ''' new mix locations ''' + loc_mix_asp_bottom = m.bottom(1.5) + loc_mix_asp_top = m.bottom(5) + loc_mix_dis_bottom = m.bottom(1) + loc_mix_dis_pellet = m.bottom(1.5).move(Point(x=side*0.8)) + loc_mix_dis_top = m.bottom(12) + ''' end of new mix locations ''' + src = source[i//(10//len(source))] + for n in range(num_trans): + if m300.current_volume > 0: + m300.dispense(m300.current_volume, src.top()) + m300.transfer(vol_per_trans, src.bottom(bottom_tolerance), m.top(), air_gap=20, new_tip='never') + if n < num_trans - 1: # only air_gap if going back to source + m300.air_gap(20) + if resuspend: + m300.flow_rate.aspirate = 80 + m300.flow_rate.dispense = 300 + # for rep in range(mix_reps): + # m300.aspirate(250, loc_mix) + # m300.dispense(250, loc_mix) + ''' optimized mix ''' + # resuspend at pellet + for x in range(10): + m300.aspirate(250, loc_mix_asp_top) + m300.dispense(250, loc_mix_dis_pellet) + for x in range(2): + m300.aspirate(200, loc_mix_asp_top) + m300.dispense(200, loc_mix_dis_bottom) + # resuspend beads across the entire liquid column + for x in range(mix_reps-7): + m300.aspirate(250, loc_mix_asp_bottom) + m300.dispense(250, loc_mix_dis_top) + ''' end of optimized mix ''' + m300.flow_rate.aspirate = 120 + m300.flow_rate.dispense = 200 + m300.blow_out(m.bottom(13)) + m300.air_gap(20) + m300.drop_tip(spot) + + + + + if magdeck.status == 'disengaged': + magdeck.engage(height=Mag_height_SQW) + + ctx.delay(minutes=sep_time_wash, msg='Incubating on MagDeck for ' + str(sep_time_wash) + ' minutes.') + + remove_supernatant(vol, reuse=True, restore=restore, last=last, blowout=blowout) + + def elute(vol): + """ + `elute` will perform elution from the deepwell extraciton plate to the + final clean elutions PCR plate to complete the extraction protocol. + :param vol (float): The amount of volume to aspirate from the elution + buffer source and dispense to each well containing + beads. + """ + + magdeck.disengage() + for i, (m) in enumerate(mag_samples_m): + _pick_up(m300) + side = 1 if i % 2 == 0 else -1 + loc_mix_asp_bottom = m.bottom(1.2) + loc_mix_dis_pellet = m.bottom(1.5).move(Point(x=side*1.5)) + m300.aspirate(vol, elution_buffer.bottom(bottom_tolerance)) + m300.move_to(m.center()) + m300.dispense(vol, loc_mix_dis_pellet) + m300.flow_rate.aspirate = 220 + m300.flow_rate.dispense = 300 + for mix in range(mix_reps_elu): + m300.aspirate(0.8*vol, loc_mix_asp_bottom) + m300.dispense(0.8*vol, loc_mix_dis_pellet) + m300.flow_rate.aspirate = 60 + m300.flow_rate.dispense = 100 + m300.blow_out(m.bottom(7)) + m300.air_gap(20) + _drop(m300) + + magdeck.engage(height=Mag_height_SQW) + ctx.delay(minutes=sep_time_elu, msg='Incubating on MagDeck for ' + str(sep_time_elu) + ' minutes.') + + m300.flow_rate.aspirate = 30 + + for i, (m, e) in enumerate(zip(mag_samples_m, elution_samples_m)): + _pick_up(m300) + side = -1 if i % 2 == 0 else 1 + loc = m.bottom(0.9).move(Point(x=side*0.8)) + m300.transfer(vol, loc, e.bottom(5), air_gap=20, new_tip='never') + + m300.blow_out(e.top(-1)) + m300.air_gap(10) + m300.drop_tip() + + magdeck.disengage() + + + """ + Here is where you can call the methods defined above to fit your specific + protocol. The normal sequence is: + """ + bind(binding_buffer_vol, bead_vol, reuse=True, restore=False) + + wash(wash1_vol, wash1, reuse=False, restore=False, resuspend=True, last=False, blowout=False) + wash(wash2_vol, wash2, reuse=False, restore=False, resuspend=True, last=False, blowout=False) + wash(wash3_vol, wash3, reuse=False, restore=False, resuspend=True, last=False, blowout=False) + wash(wash4_vol, wash4, reuse=False, restore=False, resuspend=True, last=True, blowout=False) + + ctx.delay(minutes=dry_time, msg='Air dry') + + elute(elution_vol) + + # track final used tip + if tip_track and not ctx.is_simulating(): + if not os.path.isdir(folder_path): + os.mkdir(folder_path) + data = {'tips300': tip_log['count'][m300]} + with open(tip_file_path, 'w') as outfile: + json.dump(data, outfile) diff --git a/protocols/macherey-nagel-nucleomag-clean-up/README.md b/protocols/macherey-nagel-nucleomag-clean-up/README.md new file mode 100644 index 0000000000..97403c1b10 --- /dev/null +++ b/protocols/macherey-nagel-nucleomag-clean-up/README.md @@ -0,0 +1,93 @@ +# MACHEREY-NAGEL Clean-Up + + +### Author +[MACHEREY-NAGEL](https://www.mn-net.com/us) + +### Partner +[Opentrons](https://opentrons.com/) + + +# Opentrons has launched a new Protocol Library. You should use the [new page for this protocol](library.opentrons.com/p/macherey-nagel-nucleomag-clean-up). This page won’t be available after January 31st, 2024. + +## Categories +* NGS Library Prep + * MACHEREY-NAGEL Clean-Up + + +## Description +![MACHEREY-NAGEL](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/macherey-nagel/MN_Logo_50.jpeg) + +This protocol automates the MACHEREY-NAGEL NucleoMag® NGS Clean-Up and allows for flexible parameterization. + +Before beginning the protocol on the OT-2, the following preparation steps are needed:
+1. Fill the 12-Well Buffer Reservoir according to the table below. +2. Resuspend the NucleoMag® NGS Bead suspension by vortexing. +3. Load the instrument deck according to the displayed positions. +4. Place the Square-well Block containing the lysates on the Magnetic Module and start the run. + +You can access the full descripition of this workflow on the OT-2 by visiting this link: [link](https://insights.opentrons.com/hubfs/Partners/Macherey-Nagel/NucleoMag%20NGS%20clean-up%20on%20OT-2%20Protocol%20Info.pdf) + + +### Modules +* [Opentrons Magnetic Module (GEN2)](https://shop.opentrons.com/magnetic-module-gen2/) + + +### Labware +* 96 Well PCR Plate +* [Opentrons 96 Tip Rack 300 µL](https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-300ul-tips) +* [Opentrons 24 Tube Rack with Generic 2 mL Screwcap](https://shop.opentrons.com/collections/opentrons-tips/products/tube-rack-set-1) +* [USA Scientific 12 Well Reservoir 22 mL #1061-8150](https://www.usascientific.com/12-channel-automation-reservoir.aspx) +* [Opentrons 96 Tip Rack 1000 µL](https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-1000ul-tips) +* 96 Deepwell Plate 2mL +* [Agilent 1 Well Reservoir 290 mL #201252-100](https://www.agilent.com/store/en_US/Prod-201252-100/201252-100) + + +### Pipettes +* [Opentrons P300 8 Channel Electronic Pipette (GEN2)](https://shop.opentrons.com/8-channel-electronic-pipette/) + + +### Deck Setup +![deck](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/macherey-nagel/mn-size-select-deck.png) + + +### Reagent Setup +![reagents](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/macherey-nagel/mn-ngs-reagents.png) + + +### Protocol Steps +1. Binding +2. Wash 1 +3. Wash 2 +4. Elution +
+
+* Note +The default values for all volumes, incubation times and mix repetitions were pretested and validated. +We do not recommend to change them. If you still decide to change them please scale all volumes proportionally. +For change recommendations please contact automation-bio@mn-net.de +
+
+ +**Process** +1. Input your protocol parameters below. +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/). +
+**Disclaimer**: MACHEREY-NAGEL GmbH & Co. KG makes every effort to include accurate and up-to-date information within this publication; however, it is possible that omissions or errors might have occurred. MACHEREY-NAGEL GmbH & Co. KG cannot, therefore, make any representations or warranties, expressed or implied, as to the accuracy or completeness of the information provided in this publication. Changes in this publication can be made at any time without notice. For technical details and detailed procedures of the specifications provided in this document please contact your MACHEREY-NAGEL representative. This publication may contain reference to applications and products which are not available in all markets. Please check with your local sales representative. +All mentioned trademarks are protected by law. All used names and denotations can be brands, trademarks, or registered labels of their respective owner – also if they are not special denotation. To mention products and brands is only a kind of information (i.e., it does not offend against trademarks and brands and can not be seen as a kind of recommendation or assessment). Reference herein to any specific commercial product, process, or service by trade name, trademark, manufacturer, or otherwise, does not necessarily constitute or imply its endorsement, recommendation, or support by MACHEREY-NAGEL GmbH & Co. KG or Opentrons. Any views or opinions expressed herein by the authors' do not necessarily state or reflect those of MACHEREY-NAGEL or the Eppendorf AG. NucleoMag® is a registered trademark of MACHEREY-NAGEL GmbH & Co. KG, Düren, Germany. Opentrons OT-2 is a device from Opentrons, New York, USA. +
+* The Download links includes all Protocols in their respective subfolders as well as the .json files for the two labware files. + + +###### Internal +macherey-nagel-nucleomag-clean-up diff --git a/protocols/macherey-nagel-nucleomag-clean-up/fields.json b/protocols/macherey-nagel-nucleomag-clean-up/fields.json new file mode 100644 index 0000000000..478f6f5908 --- /dev/null +++ b/protocols/macherey-nagel-nucleomag-clean-up/fields.json @@ -0,0 +1,77 @@ +[ + { + "type": "int", + "label": "Number of Samples", + "name": "num_samples", + "default": 96 + }, + { + "type": "int", + "label": "Starting Volume", + "name": "starting_vol", + "default": 100 + }, + { + "type": "int", + "label": "Elution Volume", + "name": "elution_vol", + "default": 20 + }, + { + "type": "float", + "label": "NGS Bead Ratio", + "name": "NGS_bead_ratio", + "default": 1 + }, + { + "type": "int", + "label": "Wash 1 Volume", + "name": "wash1_vol", + "default": 200 + }, + { + "type": "int", + "label": "Wash 2 Volume", + "name": "wash2_vol", + "default": 200 + }, + { + "type": "int", + "label": "Mix Repetitions During Binding [pretested default, changing is not recommended]", + "name": "mix_reps_bind", + "default": 15 + }, + { + "type": "int", + "label": "Mix Repetitions during Wash [pretested default, changing is not recommended]", + "name": "mix_reps_wash", + "default": 10 + }, + { + "type": "int", + "label": "Mix Repetitions during Elution [pretested default, changing is not recommended]", + "name": "mix_reps_elu", + "default": 20 + }, + { + "type": "int", + "label": "Separation Time during Wash [pretested default, changing is not recommended]", + "name": "sep_time", + "default": 5 + }, + { + "type": "int", + "label": "Time for Air Dry [pretested default, changing is not recommended]", + "name": "dry_time", + "default": 10 + }, + { + "type": "dropDown", + "label": "Track Tips Between Runs", + "name": "tip_track", + "options": [ + { "label": "No", "value": 0 }, + { "label": "Yes", "value": 1 } + ] + } + ] diff --git a/protocols/macherey-nagel-nucleomag-clean-up/labware/96_elutionplate_ubottom_by_macherey_nagel.json b/protocols/macherey-nagel-nucleomag-clean-up/labware/96_elutionplate_ubottom_by_macherey_nagel.json new file mode 100644 index 0000000000..67a7627a70 --- /dev/null +++ b/protocols/macherey-nagel-nucleomag-clean-up/labware/96_elutionplate_ubottom_by_macherey_nagel.json @@ -0,0 +1,1127 @@ +{ + "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": "Macherey-Nagel", + "brandId": [ + "Elution Plate U-bottom (REF740672)" + ] + }, + "metadata": { + "displayName": "96_Elutionplate_ubottom_by_Macherey_Nagel", + "displayCategory": "wellPlate", + "displayVolumeUnits": "µL", + "tags": [] + }, + "dimensions": { + "xDimension": 127.6, + "yDimension": 85.6, + "zDimension": 14.2 + }, + "wells": { + "A1": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 11.1, + "y": 71.3, + "z": 3.8 + }, + "B1": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 11.1, + "y": 62.29, + "z": 3.8 + }, + "C1": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 11.1, + "y": 53.28, + "z": 3.8 + }, + "D1": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 11.1, + "y": 44.27, + "z": 3.8 + }, + "E1": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 11.1, + "y": 35.26, + "z": 3.8 + }, + "F1": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 11.1, + "y": 26.25, + "z": 3.8 + }, + "G1": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 11.1, + "y": 17.24, + "z": 3.8 + }, + "H1": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 11.1, + "y": 8.23, + "z": 3.8 + }, + "A2": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 20.11, + "y": 71.3, + "z": 3.8 + }, + "B2": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 20.11, + "y": 62.29, + "z": 3.8 + }, + "C2": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 20.11, + "y": 53.28, + "z": 3.8 + }, + "D2": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 20.11, + "y": 44.27, + "z": 3.8 + }, + "E2": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 20.11, + "y": 35.26, + "z": 3.8 + }, + "F2": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 20.11, + "y": 26.25, + "z": 3.8 + }, + "G2": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 20.11, + "y": 17.24, + "z": 3.8 + }, + "H2": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 20.11, + "y": 8.23, + "z": 3.8 + }, + "A3": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 29.12, + "y": 71.3, + "z": 3.8 + }, + "B3": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 29.12, + "y": 62.29, + "z": 3.8 + }, + "C3": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 29.12, + "y": 53.28, + "z": 3.8 + }, + "D3": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 29.12, + "y": 44.27, + "z": 3.8 + }, + "E3": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 29.12, + "y": 35.26, + "z": 3.8 + }, + "F3": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 29.12, + "y": 26.25, + "z": 3.8 + }, + "G3": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 29.12, + "y": 17.24, + "z": 3.8 + }, + "H3": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 29.12, + "y": 8.23, + "z": 3.8 + }, + "A4": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 38.13, + "y": 71.3, + "z": 3.8 + }, + "B4": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 38.13, + "y": 62.29, + "z": 3.8 + }, + "C4": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 38.13, + "y": 53.28, + "z": 3.8 + }, + "D4": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 38.13, + "y": 44.27, + "z": 3.8 + }, + "E4": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 38.13, + "y": 35.26, + "z": 3.8 + }, + "F4": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 38.13, + "y": 26.25, + "z": 3.8 + }, + "G4": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 38.13, + "y": 17.24, + "z": 3.8 + }, + "H4": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 38.13, + "y": 8.23, + "z": 3.8 + }, + "A5": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 47.14, + "y": 71.3, + "z": 3.8 + }, + "B5": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 47.14, + "y": 62.29, + "z": 3.8 + }, + "C5": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 47.14, + "y": 53.28, + "z": 3.8 + }, + "D5": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 47.14, + "y": 44.27, + "z": 3.8 + }, + "E5": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 47.14, + "y": 35.26, + "z": 3.8 + }, + "F5": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 47.14, + "y": 26.25, + "z": 3.8 + }, + "G5": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 47.14, + "y": 17.24, + "z": 3.8 + }, + "H5": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 47.14, + "y": 8.23, + "z": 3.8 + }, + "A6": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 56.15, + "y": 71.3, + "z": 3.8 + }, + "B6": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 56.15, + "y": 62.29, + "z": 3.8 + }, + "C6": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 56.15, + "y": 53.28, + "z": 3.8 + }, + "D6": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 56.15, + "y": 44.27, + "z": 3.8 + }, + "E6": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 56.15, + "y": 35.26, + "z": 3.8 + }, + "F6": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 56.15, + "y": 26.25, + "z": 3.8 + }, + "G6": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 56.15, + "y": 17.24, + "z": 3.8 + }, + "H6": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 56.15, + "y": 8.23, + "z": 3.8 + }, + "A7": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 65.16, + "y": 71.3, + "z": 3.8 + }, + "B7": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 65.16, + "y": 62.29, + "z": 3.8 + }, + "C7": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 65.16, + "y": 53.28, + "z": 3.8 + }, + "D7": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 65.16, + "y": 44.27, + "z": 3.8 + }, + "E7": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 65.16, + "y": 35.26, + "z": 3.8 + }, + "F7": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 65.16, + "y": 26.25, + "z": 3.8 + }, + "G7": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 65.16, + "y": 17.24, + "z": 3.8 + }, + "H7": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 65.16, + "y": 8.23, + "z": 3.8 + }, + "A8": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 74.17, + "y": 71.3, + "z": 3.8 + }, + "B8": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 74.17, + "y": 62.29, + "z": 3.8 + }, + "C8": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 74.17, + "y": 53.28, + "z": 3.8 + }, + "D8": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 74.17, + "y": 44.27, + "z": 3.8 + }, + "E8": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 74.17, + "y": 35.26, + "z": 3.8 + }, + "F8": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 74.17, + "y": 26.25, + "z": 3.8 + }, + "G8": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 74.17, + "y": 17.24, + "z": 3.8 + }, + "H8": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 74.17, + "y": 8.23, + "z": 3.8 + }, + "A9": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 83.18, + "y": 71.3, + "z": 3.8 + }, + "B9": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 83.18, + "y": 62.29, + "z": 3.8 + }, + "C9": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 83.18, + "y": 53.28, + "z": 3.8 + }, + "D9": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 83.18, + "y": 44.27, + "z": 3.8 + }, + "E9": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 83.18, + "y": 35.26, + "z": 3.8 + }, + "F9": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 83.18, + "y": 26.25, + "z": 3.8 + }, + "G9": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 83.18, + "y": 17.24, + "z": 3.8 + }, + "H9": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 83.18, + "y": 8.23, + "z": 3.8 + }, + "A10": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 92.19, + "y": 71.3, + "z": 3.8 + }, + "B10": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 92.19, + "y": 62.29, + "z": 3.8 + }, + "C10": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 92.19, + "y": 53.28, + "z": 3.8 + }, + "D10": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 92.19, + "y": 44.27, + "z": 3.8 + }, + "E10": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 92.19, + "y": 35.26, + "z": 3.8 + }, + "F10": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 92.19, + "y": 26.25, + "z": 3.8 + }, + "G10": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 92.19, + "y": 17.24, + "z": 3.8 + }, + "H10": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 92.19, + "y": 8.23, + "z": 3.8 + }, + "A11": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 101.2, + "y": 71.3, + "z": 3.8 + }, + "B11": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 101.2, + "y": 62.29, + "z": 3.8 + }, + "C11": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 101.2, + "y": 53.28, + "z": 3.8 + }, + "D11": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 101.2, + "y": 44.27, + "z": 3.8 + }, + "E11": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 101.2, + "y": 35.26, + "z": 3.8 + }, + "F11": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 101.2, + "y": 26.25, + "z": 3.8 + }, + "G11": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 101.2, + "y": 17.24, + "z": 3.8 + }, + "H11": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 101.2, + "y": 8.23, + "z": 3.8 + }, + "A12": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 110.21, + "y": 71.3, + "z": 3.8 + }, + "B12": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 110.21, + "y": 62.29, + "z": 3.8 + }, + "C12": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 110.21, + "y": 53.28, + "z": 3.8 + }, + "D12": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 110.21, + "y": 44.27, + "z": 3.8 + }, + "E12": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 110.21, + "y": 35.26, + "z": 3.8 + }, + "F12": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 110.21, + "y": 26.25, + "z": 3.8 + }, + "G12": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 110.21, + "y": 17.24, + "z": 3.8 + }, + "H12": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 110.21, + "y": 8.23, + "z": 3.8 + } + }, + "groups": [ + { + "metadata": { + "wellBottomShape": "u" + }, + "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": "96_elutionplate_ubottom_by_macherey_nagel" + }, + "namespace": "custom_beta", + "version": 1, + "schemaVersion": 2, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + } +} \ No newline at end of file diff --git a/protocols/macherey-nagel-nucleomag-clean-up/labware/96_squarewell_block_macherey_nagel.json b/protocols/macherey-nagel-nucleomag-clean-up/labware/96_squarewell_block_macherey_nagel.json new file mode 100644 index 0000000000..e8e073702d --- /dev/null +++ b/protocols/macherey-nagel-nucleomag-clean-up/labware/96_squarewell_block_macherey_nagel.json @@ -0,0 +1,1223 @@ +{ + "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": "Macherey-Nagel", + "brandId": [ + "Square-Well Block (REF740670)" + ] + }, + "metadata": { + "displayName": "96 Square-Well Block by Macherey-Nagel", + "displayCategory": "wellPlate", + "displayVolumeUnits": "µL", + "tags": [] + }, + "dimensions": { + "xDimension": 127.6, + "yDimension": 85.6, + "zDimension": 44.15 + }, + "wells": { + "A1": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 11.1, + "y": 71.3, + "z": 1.95 + }, + "B1": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 11.1, + "y": 62.3, + "z": 1.95 + }, + "C1": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 11.1, + "y": 53.3, + "z": 1.95 + }, + "D1": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 11.1, + "y": 44.3, + "z": 1.95 + }, + "E1": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 11.1, + "y": 35.3, + "z": 1.95 + }, + "F1": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 11.1, + "y": 26.3, + "z": 1.95 + }, + "G1": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 11.1, + "y": 17.3, + "z": 1.95 + }, + "H1": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 11.1, + "y": 8.3, + "z": 1.95 + }, + "A2": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 20.1, + "y": 71.3, + "z": 1.95 + }, + "B2": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 20.1, + "y": 62.3, + "z": 1.95 + }, + "C2": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 20.1, + "y": 53.3, + "z": 1.95 + }, + "D2": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 20.1, + "y": 44.3, + "z": 1.95 + }, + "E2": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 20.1, + "y": 35.3, + "z": 1.95 + }, + "F2": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 20.1, + "y": 26.3, + "z": 1.95 + }, + "G2": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 20.1, + "y": 17.3, + "z": 1.95 + }, + "H2": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 20.1, + "y": 8.3, + "z": 1.95 + }, + "A3": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 29.1, + "y": 71.3, + "z": 1.95 + }, + "B3": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 29.1, + "y": 62.3, + "z": 1.95 + }, + "C3": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 29.1, + "y": 53.3, + "z": 1.95 + }, + "D3": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 29.1, + "y": 44.3, + "z": 1.95 + }, + "E3": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 29.1, + "y": 35.3, + "z": 1.95 + }, + "F3": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 29.1, + "y": 26.3, + "z": 1.95 + }, + "G3": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 29.1, + "y": 17.3, + "z": 1.95 + }, + "H3": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 29.1, + "y": 8.3, + "z": 1.95 + }, + "A4": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 38.1, + "y": 71.3, + "z": 1.95 + }, + "B4": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 38.1, + "y": 62.3, + "z": 1.95 + }, + "C4": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 38.1, + "y": 53.3, + "z": 1.95 + }, + "D4": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 38.1, + "y": 44.3, + "z": 1.95 + }, + "E4": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 38.1, + "y": 35.3, + "z": 1.95 + }, + "F4": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 38.1, + "y": 26.3, + "z": 1.95 + }, + "G4": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 38.1, + "y": 17.3, + "z": 1.95 + }, + "H4": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 38.1, + "y": 8.3, + "z": 1.95 + }, + "A5": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 47.1, + "y": 71.3, + "z": 1.95 + }, + "B5": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 47.1, + "y": 62.3, + "z": 1.95 + }, + "C5": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 47.1, + "y": 53.3, + "z": 1.95 + }, + "D5": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 47.1, + "y": 44.3, + "z": 1.95 + }, + "E5": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 47.1, + "y": 35.3, + "z": 1.95 + }, + "F5": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 47.1, + "y": 26.3, + "z": 1.95 + }, + "G5": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 47.1, + "y": 17.3, + "z": 1.95 + }, + "H5": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 47.1, + "y": 8.3, + "z": 1.95 + }, + "A6": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 56.1, + "y": 71.3, + "z": 1.95 + }, + "B6": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 56.1, + "y": 62.3, + "z": 1.95 + }, + "C6": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 56.1, + "y": 53.3, + "z": 1.95 + }, + "D6": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 56.1, + "y": 44.3, + "z": 1.95 + }, + "E6": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 56.1, + "y": 35.3, + "z": 1.95 + }, + "F6": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 56.1, + "y": 26.3, + "z": 1.95 + }, + "G6": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 56.1, + "y": 17.3, + "z": 1.95 + }, + "H6": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 56.1, + "y": 8.3, + "z": 1.95 + }, + "A7": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 65.1, + "y": 71.3, + "z": 1.95 + }, + "B7": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 65.1, + "y": 62.3, + "z": 1.95 + }, + "C7": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 65.1, + "y": 53.3, + "z": 1.95 + }, + "D7": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 65.1, + "y": 44.3, + "z": 1.95 + }, + "E7": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 65.1, + "y": 35.3, + "z": 1.95 + }, + "F7": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 65.1, + "y": 26.3, + "z": 1.95 + }, + "G7": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 65.1, + "y": 17.3, + "z": 1.95 + }, + "H7": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 65.1, + "y": 8.3, + "z": 1.95 + }, + "A8": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 74.1, + "y": 71.3, + "z": 1.95 + }, + "B8": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 74.1, + "y": 62.3, + "z": 1.95 + }, + "C8": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 74.1, + "y": 53.3, + "z": 1.95 + }, + "D8": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 74.1, + "y": 44.3, + "z": 1.95 + }, + "E8": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 74.1, + "y": 35.3, + "z": 1.95 + }, + "F8": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 74.1, + "y": 26.3, + "z": 1.95 + }, + "G8": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 74.1, + "y": 17.3, + "z": 1.95 + }, + "H8": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 74.1, + "y": 8.3, + "z": 1.95 + }, + "A9": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 83.1, + "y": 71.3, + "z": 1.95 + }, + "B9": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 83.1, + "y": 62.3, + "z": 1.95 + }, + "C9": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 83.1, + "y": 53.3, + "z": 1.95 + }, + "D9": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 83.1, + "y": 44.3, + "z": 1.95 + }, + "E9": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 83.1, + "y": 35.3, + "z": 1.95 + }, + "F9": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 83.1, + "y": 26.3, + "z": 1.95 + }, + "G9": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 83.1, + "y": 17.3, + "z": 1.95 + }, + "H9": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 83.1, + "y": 8.3, + "z": 1.95 + }, + "A10": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 92.1, + "y": 71.3, + "z": 1.95 + }, + "B10": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 92.1, + "y": 62.3, + "z": 1.95 + }, + "C10": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 92.1, + "y": 53.3, + "z": 1.95 + }, + "D10": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 92.1, + "y": 44.3, + "z": 1.95 + }, + "E10": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 92.1, + "y": 35.3, + "z": 1.95 + }, + "F10": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 92.1, + "y": 26.3, + "z": 1.95 + }, + "G10": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 92.1, + "y": 17.3, + "z": 1.95 + }, + "H10": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 92.1, + "y": 8.3, + "z": 1.95 + }, + "A11": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 101.1, + "y": 71.3, + "z": 1.95 + }, + "B11": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 101.1, + "y": 62.3, + "z": 1.95 + }, + "C11": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 101.1, + "y": 53.3, + "z": 1.95 + }, + "D11": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 101.1, + "y": 44.3, + "z": 1.95 + }, + "E11": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 101.1, + "y": 35.3, + "z": 1.95 + }, + "F11": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 101.1, + "y": 26.3, + "z": 1.95 + }, + "G11": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 101.1, + "y": 17.3, + "z": 1.95 + }, + "H11": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 101.1, + "y": 8.3, + "z": 1.95 + }, + "A12": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 110.1, + "y": 71.3, + "z": 1.95 + }, + "B12": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 110.1, + "y": 62.3, + "z": 1.95 + }, + "C12": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 110.1, + "y": 53.3, + "z": 1.95 + }, + "D12": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 110.1, + "y": 44.3, + "z": 1.95 + }, + "E12": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 110.1, + "y": 35.3, + "z": 1.95 + }, + "F12": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 110.1, + "y": 26.3, + "z": 1.95 + }, + "G12": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 110.1, + "y": 17.3, + "z": 1.95 + }, + "H12": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 110.1, + "y": 8.3, + "z": 1.95 + } + }, + "groups": [ + { + "metadata": { + "wellBottomShape": "u" + }, + "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": "96_squarewell_block_macherey_nagel" + }, + "namespace": "custom_beta", + "version": 1, + "schemaVersion": 2, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + } +} \ No newline at end of file diff --git a/protocols/macherey-nagel-nucleomag-clean-up/macherey-nagel-nucleomag-cleanup.ot2.apiv2.py b/protocols/macherey-nagel-nucleomag-clean-up/macherey-nagel-nucleomag-cleanup.ot2.apiv2.py new file mode 100644 index 0000000000..232c233ff7 --- /dev/null +++ b/protocols/macherey-nagel-nucleomag-clean-up/macherey-nagel-nucleomag-cleanup.ot2.apiv2.py @@ -0,0 +1,477 @@ +from opentrons.types import Point +import json +import os +import math + +metadata = { + 'protocolName': 'NucleoMag_NGS_clean_up_Rev01', + 'author': 'Macherey-Nagel ', + 'apiLevel': '2.9' + } + + +def run(ctx): + + ''' + Variable definition + ''' + [num_samples, starting_vol, elution_vol, NGS_bead_ratio, wash1_vol, + wash2_vol, mix_reps_bind, mix_reps_wash, mix_reps_elu, + sep_time, dry_time, tip_track] = get_values( # noqa: F821 + 'num_samples', 'starting_vol', 'elution_vol', 'NGS_bead_ratio', + 'wash1_vol', 'wash2_vol', 'mix_reps_bind', 'mix_reps_wash', + 'mix_reps_elu', 'sep_time', 'dry_time', 'tip_track') + + # values = [96, 100, 20, 1, 200, 200, 0, 15, 10, 20, 5, 10, False] + + NGS_bead_vol = starting_vol * NGS_bead_ratio + supernatant_bind = starting_vol + NGS_bead_vol + + Mag_height_elution_plate = 8.0 + + bottom_tolerance = 2.8 + # Bottom tolerance for aspriation from 12 Well Buffer Reserovir + + ''' + End of Variable Definition + ''' + + ''' + define minimum & maximum volumes + ''' + if not 90 <= starting_vol <= 110: + raise Exception('Starting volume should be from 90-110µl.') + if not 10 <= elution_vol <= 50: + raise Exception('Elution volume should be from 10-50µl.') + if not num_samples <= 96: + raise Exception('Number of samples should not exceed 96') + ''' + End of defining minimum & maximum volumes + ''' + + ''' + Deck and Labware definition + ''' + magdeck = ctx.load_module('magnetic module gen2', '10') + magdeck.disengage() + sep_plate = magdeck.load_labware( + '96_elutionplate_ubottom_by_macherey_nagel', 'Separation Plate') + + liquid_waste = ctx.load_labware( + 'agilent_1_reservoir_290ml', '11', 'Liquid Waste').wells()[0].top() + + elution_plate = ctx.load_labware( + '96_elutionplate_ubottom_by_macherey_nagel', '1', 'Elution Plate') + + tips300 = [ctx.load_labware( + 'opentrons_96_tiprack_300ul', slot, + '300µl filtertiprack') for slot in ['2', '3', '5', '6']] + + num_cols = math.ceil(num_samples/8) + + parkingrack = ctx.load_labware( + 'opentrons_96_tiprack_300ul', '8', 'empty tiprack for parking') + parking_spots = parkingrack.rows()[0][:num_cols] + + buffers = ctx.load_labware( + 'usascientific_12_reservoir_22ml', '7', 'NucleoMag Buffers') + + ''' + End of Deck and Labware definition + ''' + + ''' + Define reagents + + Well 1 NGS Bead Suspension + Well 2 80% Ethanol + Well 3 80% Ethanol + Well 4 empty place holder + Well 12 Elution Buffer / Water + + ''' + NGS_Beads = buffers.wells()[0] + wash1 = buffers.wells()[1] + wash2 = buffers.wells()[2] + # wash3 = buffers.wells()[3] + elution_buffer = buffers.wells()[11] + ''' + End of reagent definition + ''' + + ''' + tool configuration + ''' + m300 = ctx.load_instrument('p300_multi_gen2', 'left', tip_racks=tips300) + ''' + End of tool configuration + ''' + + ''' + Value calculations + ''' + # mag_samples_s = sep_plate.wells()[:num_samples] + mag_samples_m = sep_plate.rows()[0][:num_cols] + elution_samples_m = elution_plate.rows()[0][:num_cols] + ''' + End of Calculations + ''' + # sets initial pipetting speeds + m300.flow_rate.aspirate = 100 + m300.flow_rate.dispense = 150 + m300.flow_rate.blow_out = 200 + + # s1000.flow_rate.aspirate = 750 + # s1000.flow_rate.dispense = 900 + + # define initial pipetting clearance + m300.well_bottom_clearance.aspirate = 5 + m300.well_bottom_clearance.dispense = 25 + + ''' + tip logging and waste handling + ''' + folder_path = '/data/B' + tip_file_path = folder_path + '/tip_log.json' + tip_log = {'count': {}} + if tip_track and not ctx.is_simulating(): + if os.path.isfile(tip_file_path): + with open(tip_file_path) as json_file: + data = json.load(json_file) + if 'tips300' in data: + tip_log['count'][m300] = data['tips300'] + else: + tip_log['count'][m300] = 0 + else: + tip_log['count'][m300] = 0 + else: + tip_log['count'] = {m300: 0} + + tip_log['tips'] = { + m300: [tip for rack in tips300 for tip in rack.rows()[0]]} + tip_log['max'] = {m300: len(tip_log['tips'][m300])} + + # kept _pick_up as default + def _pick_up(pip, loc=None): + nonlocal tip_log + if tip_log['count'][pip] == tip_log['max'][pip] and not loc: + ctx.pause( + 'Replace ' + str(pip.max_volume) + 'µl tipracks before \ + resuming.') + pip.reset_tipracks() + tip_log['count'][pip] = 0 + if loc: + pip.pick_up_tip(loc) + else: + pip.pick_up_tip(tip_log['tips'][pip][tip_log['count'][pip]]) + tip_log['count'][pip] += 1 + + switch = True + drop_count = 0 + # number of tips trash will accommodate before prompting user to empty + drop_threshold = 192 + + def _drop(pip): + nonlocal switch + nonlocal drop_count + side = 30 if switch else -18 + drop_loc = ctx.loaded_labwares[12].wells()[0].top().move( + Point(x=side)) + pip.drop_tip(drop_loc) + switch = not switch + drop_count += 8 + if drop_count == drop_threshold: + m300.home() + ctx.pause('Please empty tips from waste before resuming.') + + ctx.home() # home before continuing with protocol + + drop_count = 0 + + waste_vol = 0 + waste_threshold = 300000 + + ''' + End of tip logging and wase handling + ''' + + def remove_supernatant(vol, reuse=False, restore=False, last=False): + + """ + `remove_supernatant` will transfer supernatant from the deepwell + extraction plate to the liquid waste reservoir. + :param vol (float): The amount of volume to aspirate from all deepwell + sample wells and dispense in the liquid waste. + :param park (boolean): Whether to pick up sample-corresponding tips + in the 'parking rack' or to pick up new tips. + """ + + def _waste_track(vol): + nonlocal waste_vol + if waste_vol + vol >= waste_threshold: + ctx.pause('Please empty liquid waste (slot 11) before \ + resuming.') + ctx.home() + waste_vol = 0 + waste_vol += vol + if last: + vol = vol+20 + num_trans = math.ceil(vol/200) + vol_per_trans = vol/num_trans + + for i, (m, spot) in enumerate(zip(mag_samples_m, parking_spots)): + if reuse: + _pick_up(m300, spot) + else: + _pick_up(m300) + # side = -1 if i % 2 == 0 else 1 + for _ in range(num_trans): + _waste_track(vol_per_trans*8) + if m300.current_volume > 0: + m300.dispense(m300.current_volume, m.top(-10)) + m300.move_to(m.center()) + if _ == num_trans-1: + if last: + loc = m.bottom(0.3) + else: + loc = m.bottom(0.5) + else: + loc = m.bottom(0.7) + m300.flow_rate.aspirate = 20 + m300.flow_rate.dispense = 120 + m300.transfer( + vol_per_trans, loc, liquid_waste, new_tip='never', + air_gap=20) + m300.flow_rate.dispense = 200 + m300.blow_out(liquid_waste) + # m300.air_gap(20) + if restore: + m300.drop_tip(spot) + else: + _drop(m300) + m300.flow_rate.aspirate = 120 + m300.flow_rate.aspirate = 150 + + def bind(bead_vol): + """ + `bind` will perform magnetic bead binding on each sample in the plate + right half. + The binding beads will be mixed before transfer, and the samples will + be mixed with the binding beads after the transfer. The magnetic deck + activates after the addition to all samples, and the supernatant is + removed after bead binding. + :param bead_vol (float): The amount of volume of NGS_Bead_Suspension + to dispense to each well. + :param reuse (boolean): Whether to save sample-corresponding tips + between adding binding buffer and removing the supernatant + :param restore (boolean): Whether to save sample-corresponding tips for + reuse in the next stepre + """ + if magdeck.status == 'engaged': + magdeck.disengage() + + for i, (well, spot) in enumerate(zip(mag_samples_m, parking_spots)): + _pick_up(m300) + if m300.current_volume > 0: + m300.dispense(m300.current_volume, NGS_Beads.top()) + m300.flow_rate.aspirate = 10 + m300.aspirate(bead_vol/2, NGS_Beads.bottom(bottom_tolerance)) + ctx.delay(seconds=2) + m300.flow_rate.dispense = 20 + m300.dispense(bead_vol/2, NGS_Beads.bottom(bottom_tolerance)) + ctx.delay(seconds=2) + m300.flow_rate.dispense = 60 + m300.aspirate(bead_vol, NGS_Beads.bottom(bottom_tolerance)) + ctx.delay(seconds=2) + m300.dispense(bead_vol, well.top(-3)) + m300.flow_rate.aspirate = 100 + m300.flow_rate.dispense = 150 + # side = 1 if i % 2 == 0 else -1 + loc_mix = well.bottom(0.8) + m300.mix(mix_reps_bind, supernatant_bind-10, loc_mix) + m300.aspirate(15, well.top(-1)) + ctx.delay(seconds=4, msg='Blow out delay') + m300.dispense(15, well.top(-1)) + m300.blow_out(well.top(-1)) + m300.air_gap(20) + _drop(m300) + + ctx.delay(minutes=2, msg='Incubate for 2 minutes') + magdeck.engage(height=Mag_height_elution_plate) + ctx.delay( + minutes=sep_time, + msg='Incubating on MagDeck for ' + str(sep_time) + ' minutes.') + + # remove initial supernatant + remove_supernatant( + supernatant_bind+5, reuse=False, restore=False, last=False) + + def wash(vol, source, mix_reps=mix_reps_wash, reuse=True, + restore=True, resuspend=True, last=False): + """ + `wash` will perform bead washing for the extraction protocol. + :param vol (float): The amount of volume to aspirate from each + source and dispense to each well containing beads. + :param source (List[Well]): A list of wells from where liquid will be + aspirated. If the length of the source list + > 1, `wash` automatically calculates + the index of the source that should be + accessed. + :param mix_reps (int): The number of repititions to mix the beads with + specified wash buffer (ignored if resuspend is + False). + :param reuse (boolean): Whether to pick-up sample-corresponding tips + for mixing and supernatant removal that were restored + in a previous step. + :param restore (boolean): Whether to park sample-corresponding tips for + reuse in a later step + :param resuspend (boolean): Whether to resuspend beads in wash buffer. + """ + + if resuspend and magdeck.status == 'engaged': + magdeck.disengage() + + num_trans = math.ceil(vol/250) + vol_per_trans = vol/num_trans + + if reuse: + _pick_up(m300) + for i, (m) in enumerate(mag_samples_m): + src = source + for n in range(num_trans): + if m300.current_volume > 0: + m300.dispense(m300.current_volume, src.top()) + m300.flow_rate.dispense = 80 + m300.transfer( + vol_per_trans, src.bottom(bottom_tolerance), + m.top(), air_gap=20, new_tip='never') + if n < num_trans - 1: + m300.air_gap(20) + _drop(m300) + if resuspend: + m300.flow_rate.aspirate = 160 + m300.flow_rate.dispense = 160 + for i, (m, spot) in enumerate( + zip(mag_samples_m, parking_spots)): + _pick_up(m300, spot) + side = 1 if i % 2 == 0 else -1 + loc_mix = m.bottom(1).move(Point(x=side*0.5)) + src = source + for rep in range(mix_reps): + m300.aspirate(250, loc_mix) + m300.dispense(250, loc_mix) + m300.blow_out(m.top(-2)) + m300.air_gap(20) + m300.drop_tip(spot) + m300.flow_rate.aspirate = 100 + m300.flow_rate.dispense = 200 + else: + for i, (m, spot) in enumerate(zip(mag_samples_m, parking_spots)): + _pick_up(m300) + side = 1 if i % 2 == 0 else -1 + loc_mix = m.bottom(1).move(Point(x=side*0.5)) + src = source + for n in range(num_trans): + if m300.current_volume > 0: + m300.dispense(m300.current_volume, src.top()) + m300.flow_rate.dispense = 80 + m300.transfer( + vol_per_trans, src.bottom(bottom_tolerance), + m.top(), air_gap=20, new_tip='never') + if n < num_trans - 1: + m300.air_gap(20) + if resuspend: + m300.flow_rate.aspirate = 220 + m300.flow_rate.dispense = 300 + for rep in range(mix_reps): + m300.aspirate(250, loc_mix) + m300.dispense(250, loc_mix) + m300.flow_rate.aspirate = 100 + m300.flow_rate.dispense = 200 + m300.blow_out(m.top(-2)) + m300.air_gap(20) + m300.drop_tip(spot) + + m300.flow_rate.aspirate = 100 + m300.flow_rate.dispense = 200 + + if magdeck.status == 'disengaged': + magdeck.engage(height=Mag_height_elution_plate) + + ctx.delay( + minutes=0.5, + msg='Incubating on MagDeck for ' + str(sep_time) + ' minutes.') + + remove_supernatant(vol, reuse=True, restore=restore, last=last) + + def elute(vol): + """ + `elute` will perform elution from the deepwell extraciton plate to the + final clean elutions PCR plate to complete the extraction protocol. + :param vol (float): The amount of volume to aspirate from the elution + buffer source and dispense to each well containing + beads. + """ + + magdeck.disengage() + for i, (m) in enumerate(mag_samples_m): + _pick_up(m300) + side = 1 if i % 2 == 0 else -1 + loc_mix_dis = m.bottom(1.2).move(Point(x=side*1.5)) + loc_mix_asp = m.bottom(0.4).move(Point(x=side*0.5)) + m300.flow_rate.aspirate = 120 + m300.flow_rate.dispense = 120 + m300.aspirate(vol, elution_buffer.bottom(bottom_tolerance)) + m300.move_to(m.center()) + m300.dispense(vol, loc_mix_dis) + m300.flow_rate.aspirate = 60 + m300.flow_rate.dispense = 90 + for mix in range(mix_reps_elu): + m300.aspirate(0.8*vol, loc_mix_asp) + m300.dispense(0.8*vol, loc_mix_dis) + m300.blow_out(m.bottom(5)) + m300.air_gap(20) + _drop(m300) + + magdeck.engage(height=Mag_height_elution_plate) + ctx.delay( + minutes=sep_time, + msg='Incubating on MagDeck for ' + str(sep_time) + ' minutes.') + + m300.flow_rate.aspirate = 15 + m300.flow_rate.dispense = 60 + for i, (m, e) in enumerate(zip(mag_samples_m, elution_samples_m)): + _pick_up(m300) + side = -1 if i % 2 == 0 else 1 + m300.transfer( + vol, m.bottom(0.2), e.bottom(2), air_gap=20, new_tip='never') + + m300.blow_out(e.top(-1)) + m300.air_gap(10) + m300.drop_tip() + + magdeck.disengage() + + """ + Here is where you can call the methods defined above to fit your specific + protocol. The normal sequence is: + """ + bind(NGS_bead_vol) + wash( + wash1_vol, wash1, reuse=False, restore=True, + resuspend=False, last=False) + wash( + wash2_vol, wash2, reuse=True, restore=False, + resuspend=False, last=True) + + ctx.delay(minutes=dry_time, msg='Air dry') + + elute(elution_vol) + + # track final used tip + if tip_track and not ctx.is_simulating(): + if not os.path.isdir(folder_path): + os.mkdir(folder_path) + data = {'tips300': tip_log['count'][m300]} + with open(tip_file_path, 'w') as outfile: + json.dump(data, outfile) diff --git a/protocols/macherey-nagel-nucleomag-dna-food/README.md b/protocols/macherey-nagel-nucleomag-dna-food/README.md new file mode 100644 index 0000000000..e1ed5309d5 --- /dev/null +++ b/protocols/macherey-nagel-nucleomag-dna-food/README.md @@ -0,0 +1,98 @@ +# MACHEREY-NAGEL NucleoMag® DNA Food + + +### Author +[MACHEREY-NAGEL](https://www.mn-net.com/us) + +### Partner +[Opentrons](https://opentrons.com/) + + +# Opentrons has launched a new Protocol Library. You should use the [new page for this protocol](library.opentrons.com/p/macherey-nagel-nucleomag-dna-food). This page won’t be available after January 31st, 2024. + +## Categories +* Nucleic Acid Extraction & Purification + * MACHEREY-NAGEL NucleoMag® DNA Food + + +## Description +![MACHEREY-NAGEL](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/macherey-nagel/MN_Logo_50.jpeg) + +This protocol automates the NucleoMag® DNA Food kit for flexible magnetic bead based isolation of DNA from food samples. + +Before beginning the protocol on the OT-2, the following preparation steps are needed. +1. Perform the lysis according to the NucleoMag® DNA Food user manual. Note: We recommend to reduce the sample input to 50mg depending on the sample type. +2. Fill the 12-Well Buffer Reservoir according to the table below. +3. Resuspend the NucleoMag® B-Beads by vortexing and place them in Position A1 of the 2mL Tube Rack. +4. Load the instrument deck according to the displayed positions. +5. Place the Square-well Block containing the lysates on the Magnetic Module and start the run. + + +You can access the full description of this workflow on the OT-2 by visiting this link: [link](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/macherey-nagel-dna-food/line29.pdf) + + +### Modules +* [Opentrons Magnetic Module (GEN2)](https://shop.opentrons.com/magnetic-module-gen2/) + + +### Labware +* Macherey Nagel 96 Well Square Well Block +* Macherey Nagel 96 Well Elution Plate U-bottom +* [Opentrons 96 Tip Rack 300 µL](https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-300ul-tips) +* [Opentrons 24 Tube Rack with Generic 2 mL Screwcap](https://shop.opentrons.com/collections/opentrons-tips/products/tube-rack-set-1) +* [USA Scientific 12 Well Reservoir 22 mL #1061-8150](https://www.usascientific.com/12-channel-automation-reservoir.aspx) +* [Opentrons 96 Tip Rack 1000 µL](https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-1000ul-tips) +* [Agilent 1 Well Reservoir 290 mL #201252-100](https://www.agilent.com/store/en_US/Prod-201252-100/201252-100) + + +### Pipettes +* [Opentrons P300 8 Channel Electronic Pipette (GEN2)](https://shop.opentrons.com/8-channel-electronic-pipette/) +* [Opentrons P1000 Single Channel Electronic Pipette (GEN2)](https://shop.opentrons.com/single-channel-electronic-pipette-p20/) + + +### Deck Setup +![deck](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/macherey-nagel/deck.png) + + +### Reagent Setup +![reagents](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/macherey-nagel-dna-food/line56reagents.png) + + +### Protocol Steps +1. Binding Step +2. Wash 1 +3. Wash 2 +4. Wash 3 +5. Delay for drying +6. Elution +
+
+* Note +The default values for all volumes, incubation times and mix repetitions were pretested and validated. +We do not recommend to change them. If you still decide to change them please scale all volumes proportionally. +For change recommendations please contact automation-bio@mn-net.de +
+
+ +**Process** +1. Input your protocol parameters below. +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/). +
+**Disclaimer**: MACHEREY-NAGEL GmbH & Co. KG makes every effort to include accurate and up-to-date information within this publication; however, it is possible that omissions or errors might have occurred. MACHEREY-NAGEL GmbH & Co. KG cannot, therefore, make any representations or warranties, expressed or implied, as to the accuracy or completeness of the information provided in this publication. Changes in this publication can be made at any time without notice. For technical details and detailed procedures of the specifications provided in this document please contact your MACHEREY-NAGEL representative. This publication may contain reference to applications and products which are not available in all markets. Please check with your local sales representative. +All mentioned trademarks are protected by law. All used names and denotations can be brands, trademarks, or registered labels of their respective owner – also if they are not special denotation. To mention products and brands is only a kind of information (i.e., it does not offend against trademarks and brands and can not be seen as a kind of recommendation or assessment). Reference herein to any specific commercial product, process, or service by trade name, trademark, manufacturer, or otherwise, does not necessarily constitute or imply its endorsement, recommendation, or support by MACHEREY-NAGEL GmbH & Co. KG or Opentrons. Any views or opinions expressed herein by the authors' do not necessarily state or reflect those of MACHEREY-NAGEL or the Eppendorf AG. NucleoMag® is a registered trademark of MACHEREY-NAGEL GmbH & Co. KG, Düren, Germany. Opentrons OT-2 is a device from Opentrons, New York, USA. +
+* The Download links includes all Protocols in their respective subfolders as well as the .json files for the two labware files. + + +###### Internal +macherey-nagal-nucleomag-dna-food diff --git a/protocols/macherey-nagel-nucleomag-dna-food/fields.json b/protocols/macherey-nagel-nucleomag-dna-food/fields.json new file mode 100644 index 0000000000..d5c2d6006a --- /dev/null +++ b/protocols/macherey-nagel-nucleomag-dna-food/fields.json @@ -0,0 +1,107 @@ +[ + { + "type": "int", + "label": "Number of Samples [1-48 samples]", + "name": "num_samples", + "default": 48 + }, + { + "type": "int", + "label": "Starting Volume", + "name": "starting_vol", + "default": 400 + }, + { + "type": "int", + "label": "Elution Volume [50-200µL]", + "name": "elution_vol", + "default": 100 + }, + { + "type": "int", + "label": "Binding Buffer Volume", + "name": "binding_buffer_vol", + "default": 600 + }, + { + "type": "int", + "label": "Bead Volume", + "name": "bead_vol", + "default": 25 + }, + { + "type": "int", + "label": "Wash 1 Volume", + "name": "wash1_vol", + "default": 600 + }, + { + "type": "int", + "label": "Wash 2 Volume", + "name": "wash2_vol", + "default": 600 + }, + { + "type": "int", + "label": "Wash 3 Volume", + "name": "wash3_vol", + "default": 600 + }, + { + "type": "int", + "label": "Wash 4 Volume", + "name": "wash4_vol", + "default": 0 + }, + { + "type": "int", + "label": "Mix Repetitions During Binding [pretested default, changing is not recommended]", + "name": "mix_reps_bind", + "default": 25 + }, + { + "type": "int", + "label": "Mix Repetitions during Wash [pretested default, changing is not recommended]", + "name": "mix_reps_wash", + "default": 20 + }, + { + "type": "int", + "label": "Mix Repetitions during Elution [pretested default, changing is not recommended]", + "name": "mix_reps_elu", + "default": 25 + }, + { + "type": "int", + "label": "Separation Time during Binding [pretested default, changing is not recommended]", + "name": "sep_time_bind", + "default": 5 + }, + { + "type": "int", + "label": "Separation Time during Wash [pretested default, changing is not recommended]", + "name": "sep_time_wash", + "default": 2 + }, + { + "type": "int", + "label": "Separation Time during Elution [pretested default, changing is not recommended]", + "name": "sep_time_elu", + "default": 5 + }, + { + "type": "int", + "label": "Time for Air Dry [pretested default, changing is not recommended]", + "name": "dry_time", + "default": 30 + }, + { + "type": "dropDown", + "label": "Track Tips Between Runs", + "name": "tip_track", + "options": [ + { "label": "No", "value": 0 }, + { "label": "Yes", "value": 1 } + ] + } + ] diff --git a/protocols/macherey-nagel-nucleomag-dna-food/labware/96_elutionplate_ubottom_by_macherey_nagel.json b/protocols/macherey-nagel-nucleomag-dna-food/labware/96_elutionplate_ubottom_by_macherey_nagel.json new file mode 100644 index 0000000000..67a7627a70 --- /dev/null +++ b/protocols/macherey-nagel-nucleomag-dna-food/labware/96_elutionplate_ubottom_by_macherey_nagel.json @@ -0,0 +1,1127 @@ +{ + "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": "Macherey-Nagel", + "brandId": [ + "Elution Plate U-bottom (REF740672)" + ] + }, + "metadata": { + "displayName": "96_Elutionplate_ubottom_by_Macherey_Nagel", + "displayCategory": "wellPlate", + "displayVolumeUnits": "µL", + "tags": [] + }, + "dimensions": { + "xDimension": 127.6, + "yDimension": 85.6, + "zDimension": 14.2 + }, + "wells": { + "A1": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 11.1, + "y": 71.3, + "z": 3.8 + }, + "B1": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 11.1, + "y": 62.29, + "z": 3.8 + }, + "C1": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 11.1, + "y": 53.28, + "z": 3.8 + }, + "D1": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 11.1, + "y": 44.27, + "z": 3.8 + }, + "E1": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 11.1, + "y": 35.26, + "z": 3.8 + }, + "F1": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 11.1, + "y": 26.25, + "z": 3.8 + }, + "G1": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 11.1, + "y": 17.24, + "z": 3.8 + }, + "H1": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 11.1, + "y": 8.23, + "z": 3.8 + }, + "A2": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 20.11, + "y": 71.3, + "z": 3.8 + }, + "B2": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 20.11, + "y": 62.29, + "z": 3.8 + }, + "C2": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 20.11, + "y": 53.28, + "z": 3.8 + }, + "D2": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 20.11, + "y": 44.27, + "z": 3.8 + }, + "E2": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 20.11, + "y": 35.26, + "z": 3.8 + }, + "F2": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 20.11, + "y": 26.25, + "z": 3.8 + }, + "G2": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 20.11, + "y": 17.24, + "z": 3.8 + }, + "H2": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 20.11, + "y": 8.23, + "z": 3.8 + }, + "A3": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 29.12, + "y": 71.3, + "z": 3.8 + }, + "B3": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 29.12, + "y": 62.29, + "z": 3.8 + }, + "C3": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 29.12, + "y": 53.28, + "z": 3.8 + }, + "D3": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 29.12, + "y": 44.27, + "z": 3.8 + }, + "E3": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 29.12, + "y": 35.26, + "z": 3.8 + }, + "F3": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 29.12, + "y": 26.25, + "z": 3.8 + }, + "G3": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 29.12, + "y": 17.24, + "z": 3.8 + }, + "H3": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 29.12, + "y": 8.23, + "z": 3.8 + }, + "A4": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 38.13, + "y": 71.3, + "z": 3.8 + }, + "B4": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 38.13, + "y": 62.29, + "z": 3.8 + }, + "C4": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 38.13, + "y": 53.28, + "z": 3.8 + }, + "D4": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 38.13, + "y": 44.27, + "z": 3.8 + }, + "E4": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 38.13, + "y": 35.26, + "z": 3.8 + }, + "F4": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 38.13, + "y": 26.25, + "z": 3.8 + }, + "G4": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 38.13, + "y": 17.24, + "z": 3.8 + }, + "H4": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 38.13, + "y": 8.23, + "z": 3.8 + }, + "A5": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 47.14, + "y": 71.3, + "z": 3.8 + }, + "B5": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 47.14, + "y": 62.29, + "z": 3.8 + }, + "C5": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 47.14, + "y": 53.28, + "z": 3.8 + }, + "D5": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 47.14, + "y": 44.27, + "z": 3.8 + }, + "E5": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 47.14, + "y": 35.26, + "z": 3.8 + }, + "F5": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 47.14, + "y": 26.25, + "z": 3.8 + }, + "G5": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 47.14, + "y": 17.24, + "z": 3.8 + }, + "H5": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 47.14, + "y": 8.23, + "z": 3.8 + }, + "A6": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 56.15, + "y": 71.3, + "z": 3.8 + }, + "B6": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 56.15, + "y": 62.29, + "z": 3.8 + }, + "C6": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 56.15, + "y": 53.28, + "z": 3.8 + }, + "D6": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 56.15, + "y": 44.27, + "z": 3.8 + }, + "E6": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 56.15, + "y": 35.26, + "z": 3.8 + }, + "F6": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 56.15, + "y": 26.25, + "z": 3.8 + }, + "G6": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 56.15, + "y": 17.24, + "z": 3.8 + }, + "H6": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 56.15, + "y": 8.23, + "z": 3.8 + }, + "A7": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 65.16, + "y": 71.3, + "z": 3.8 + }, + "B7": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 65.16, + "y": 62.29, + "z": 3.8 + }, + "C7": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 65.16, + "y": 53.28, + "z": 3.8 + }, + "D7": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 65.16, + "y": 44.27, + "z": 3.8 + }, + "E7": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 65.16, + "y": 35.26, + "z": 3.8 + }, + "F7": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 65.16, + "y": 26.25, + "z": 3.8 + }, + "G7": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 65.16, + "y": 17.24, + "z": 3.8 + }, + "H7": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 65.16, + "y": 8.23, + "z": 3.8 + }, + "A8": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 74.17, + "y": 71.3, + "z": 3.8 + }, + "B8": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 74.17, + "y": 62.29, + "z": 3.8 + }, + "C8": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 74.17, + "y": 53.28, + "z": 3.8 + }, + "D8": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 74.17, + "y": 44.27, + "z": 3.8 + }, + "E8": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 74.17, + "y": 35.26, + "z": 3.8 + }, + "F8": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 74.17, + "y": 26.25, + "z": 3.8 + }, + "G8": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 74.17, + "y": 17.24, + "z": 3.8 + }, + "H8": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 74.17, + "y": 8.23, + "z": 3.8 + }, + "A9": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 83.18, + "y": 71.3, + "z": 3.8 + }, + "B9": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 83.18, + "y": 62.29, + "z": 3.8 + }, + "C9": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 83.18, + "y": 53.28, + "z": 3.8 + }, + "D9": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 83.18, + "y": 44.27, + "z": 3.8 + }, + "E9": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 83.18, + "y": 35.26, + "z": 3.8 + }, + "F9": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 83.18, + "y": 26.25, + "z": 3.8 + }, + "G9": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 83.18, + "y": 17.24, + "z": 3.8 + }, + "H9": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 83.18, + "y": 8.23, + "z": 3.8 + }, + "A10": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 92.19, + "y": 71.3, + "z": 3.8 + }, + "B10": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 92.19, + "y": 62.29, + "z": 3.8 + }, + "C10": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 92.19, + "y": 53.28, + "z": 3.8 + }, + "D10": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 92.19, + "y": 44.27, + "z": 3.8 + }, + "E10": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 92.19, + "y": 35.26, + "z": 3.8 + }, + "F10": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 92.19, + "y": 26.25, + "z": 3.8 + }, + "G10": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 92.19, + "y": 17.24, + "z": 3.8 + }, + "H10": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 92.19, + "y": 8.23, + "z": 3.8 + }, + "A11": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 101.2, + "y": 71.3, + "z": 3.8 + }, + "B11": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 101.2, + "y": 62.29, + "z": 3.8 + }, + "C11": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 101.2, + "y": 53.28, + "z": 3.8 + }, + "D11": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 101.2, + "y": 44.27, + "z": 3.8 + }, + "E11": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 101.2, + "y": 35.26, + "z": 3.8 + }, + "F11": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 101.2, + "y": 26.25, + "z": 3.8 + }, + "G11": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 101.2, + "y": 17.24, + "z": 3.8 + }, + "H11": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 101.2, + "y": 8.23, + "z": 3.8 + }, + "A12": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 110.21, + "y": 71.3, + "z": 3.8 + }, + "B12": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 110.21, + "y": 62.29, + "z": 3.8 + }, + "C12": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 110.21, + "y": 53.28, + "z": 3.8 + }, + "D12": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 110.21, + "y": 44.27, + "z": 3.8 + }, + "E12": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 110.21, + "y": 35.26, + "z": 3.8 + }, + "F12": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 110.21, + "y": 26.25, + "z": 3.8 + }, + "G12": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 110.21, + "y": 17.24, + "z": 3.8 + }, + "H12": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 110.21, + "y": 8.23, + "z": 3.8 + } + }, + "groups": [ + { + "metadata": { + "wellBottomShape": "u" + }, + "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": "96_elutionplate_ubottom_by_macherey_nagel" + }, + "namespace": "custom_beta", + "version": 1, + "schemaVersion": 2, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + } +} \ No newline at end of file diff --git a/protocols/macherey-nagel-nucleomag-dna-food/labware/96_squarewell_block_macherey_nagel.json b/protocols/macherey-nagel-nucleomag-dna-food/labware/96_squarewell_block_macherey_nagel.json new file mode 100644 index 0000000000..e8e073702d --- /dev/null +++ b/protocols/macherey-nagel-nucleomag-dna-food/labware/96_squarewell_block_macherey_nagel.json @@ -0,0 +1,1223 @@ +{ + "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": "Macherey-Nagel", + "brandId": [ + "Square-Well Block (REF740670)" + ] + }, + "metadata": { + "displayName": "96 Square-Well Block by Macherey-Nagel", + "displayCategory": "wellPlate", + "displayVolumeUnits": "µL", + "tags": [] + }, + "dimensions": { + "xDimension": 127.6, + "yDimension": 85.6, + "zDimension": 44.15 + }, + "wells": { + "A1": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 11.1, + "y": 71.3, + "z": 1.95 + }, + "B1": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 11.1, + "y": 62.3, + "z": 1.95 + }, + "C1": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 11.1, + "y": 53.3, + "z": 1.95 + }, + "D1": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 11.1, + "y": 44.3, + "z": 1.95 + }, + "E1": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 11.1, + "y": 35.3, + "z": 1.95 + }, + "F1": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 11.1, + "y": 26.3, + "z": 1.95 + }, + "G1": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 11.1, + "y": 17.3, + "z": 1.95 + }, + "H1": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 11.1, + "y": 8.3, + "z": 1.95 + }, + "A2": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 20.1, + "y": 71.3, + "z": 1.95 + }, + "B2": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 20.1, + "y": 62.3, + "z": 1.95 + }, + "C2": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 20.1, + "y": 53.3, + "z": 1.95 + }, + "D2": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 20.1, + "y": 44.3, + "z": 1.95 + }, + "E2": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 20.1, + "y": 35.3, + "z": 1.95 + }, + "F2": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 20.1, + "y": 26.3, + "z": 1.95 + }, + "G2": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 20.1, + "y": 17.3, + "z": 1.95 + }, + "H2": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 20.1, + "y": 8.3, + "z": 1.95 + }, + "A3": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 29.1, + "y": 71.3, + "z": 1.95 + }, + "B3": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 29.1, + "y": 62.3, + "z": 1.95 + }, + "C3": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 29.1, + "y": 53.3, + "z": 1.95 + }, + "D3": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 29.1, + "y": 44.3, + "z": 1.95 + }, + "E3": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 29.1, + "y": 35.3, + "z": 1.95 + }, + "F3": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 29.1, + "y": 26.3, + "z": 1.95 + }, + "G3": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 29.1, + "y": 17.3, + "z": 1.95 + }, + "H3": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 29.1, + "y": 8.3, + "z": 1.95 + }, + "A4": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 38.1, + "y": 71.3, + "z": 1.95 + }, + "B4": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 38.1, + "y": 62.3, + "z": 1.95 + }, + "C4": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 38.1, + "y": 53.3, + "z": 1.95 + }, + "D4": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 38.1, + "y": 44.3, + "z": 1.95 + }, + "E4": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 38.1, + "y": 35.3, + "z": 1.95 + }, + "F4": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 38.1, + "y": 26.3, + "z": 1.95 + }, + "G4": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 38.1, + "y": 17.3, + "z": 1.95 + }, + "H4": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 38.1, + "y": 8.3, + "z": 1.95 + }, + "A5": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 47.1, + "y": 71.3, + "z": 1.95 + }, + "B5": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 47.1, + "y": 62.3, + "z": 1.95 + }, + "C5": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 47.1, + "y": 53.3, + "z": 1.95 + }, + "D5": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 47.1, + "y": 44.3, + "z": 1.95 + }, + "E5": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 47.1, + "y": 35.3, + "z": 1.95 + }, + "F5": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 47.1, + "y": 26.3, + "z": 1.95 + }, + "G5": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 47.1, + "y": 17.3, + "z": 1.95 + }, + "H5": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 47.1, + "y": 8.3, + "z": 1.95 + }, + "A6": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 56.1, + "y": 71.3, + "z": 1.95 + }, + "B6": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 56.1, + "y": 62.3, + "z": 1.95 + }, + "C6": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 56.1, + "y": 53.3, + "z": 1.95 + }, + "D6": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 56.1, + "y": 44.3, + "z": 1.95 + }, + "E6": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 56.1, + "y": 35.3, + "z": 1.95 + }, + "F6": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 56.1, + "y": 26.3, + "z": 1.95 + }, + "G6": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 56.1, + "y": 17.3, + "z": 1.95 + }, + "H6": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 56.1, + "y": 8.3, + "z": 1.95 + }, + "A7": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 65.1, + "y": 71.3, + "z": 1.95 + }, + "B7": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 65.1, + "y": 62.3, + "z": 1.95 + }, + "C7": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 65.1, + "y": 53.3, + "z": 1.95 + }, + "D7": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 65.1, + "y": 44.3, + "z": 1.95 + }, + "E7": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 65.1, + "y": 35.3, + "z": 1.95 + }, + "F7": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 65.1, + "y": 26.3, + "z": 1.95 + }, + "G7": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 65.1, + "y": 17.3, + "z": 1.95 + }, + "H7": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 65.1, + "y": 8.3, + "z": 1.95 + }, + "A8": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 74.1, + "y": 71.3, + "z": 1.95 + }, + "B8": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 74.1, + "y": 62.3, + "z": 1.95 + }, + "C8": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 74.1, + "y": 53.3, + "z": 1.95 + }, + "D8": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 74.1, + "y": 44.3, + "z": 1.95 + }, + "E8": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 74.1, + "y": 35.3, + "z": 1.95 + }, + "F8": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 74.1, + "y": 26.3, + "z": 1.95 + }, + "G8": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 74.1, + "y": 17.3, + "z": 1.95 + }, + "H8": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 74.1, + "y": 8.3, + "z": 1.95 + }, + "A9": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 83.1, + "y": 71.3, + "z": 1.95 + }, + "B9": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 83.1, + "y": 62.3, + "z": 1.95 + }, + "C9": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 83.1, + "y": 53.3, + "z": 1.95 + }, + "D9": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 83.1, + "y": 44.3, + "z": 1.95 + }, + "E9": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 83.1, + "y": 35.3, + "z": 1.95 + }, + "F9": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 83.1, + "y": 26.3, + "z": 1.95 + }, + "G9": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 83.1, + "y": 17.3, + "z": 1.95 + }, + "H9": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 83.1, + "y": 8.3, + "z": 1.95 + }, + "A10": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 92.1, + "y": 71.3, + "z": 1.95 + }, + "B10": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 92.1, + "y": 62.3, + "z": 1.95 + }, + "C10": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 92.1, + "y": 53.3, + "z": 1.95 + }, + "D10": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 92.1, + "y": 44.3, + "z": 1.95 + }, + "E10": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 92.1, + "y": 35.3, + "z": 1.95 + }, + "F10": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 92.1, + "y": 26.3, + "z": 1.95 + }, + "G10": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 92.1, + "y": 17.3, + "z": 1.95 + }, + "H10": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 92.1, + "y": 8.3, + "z": 1.95 + }, + "A11": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 101.1, + "y": 71.3, + "z": 1.95 + }, + "B11": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 101.1, + "y": 62.3, + "z": 1.95 + }, + "C11": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 101.1, + "y": 53.3, + "z": 1.95 + }, + "D11": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 101.1, + "y": 44.3, + "z": 1.95 + }, + "E11": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 101.1, + "y": 35.3, + "z": 1.95 + }, + "F11": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 101.1, + "y": 26.3, + "z": 1.95 + }, + "G11": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 101.1, + "y": 17.3, + "z": 1.95 + }, + "H11": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 101.1, + "y": 8.3, + "z": 1.95 + }, + "A12": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 110.1, + "y": 71.3, + "z": 1.95 + }, + "B12": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 110.1, + "y": 62.3, + "z": 1.95 + }, + "C12": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 110.1, + "y": 53.3, + "z": 1.95 + }, + "D12": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 110.1, + "y": 44.3, + "z": 1.95 + }, + "E12": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 110.1, + "y": 35.3, + "z": 1.95 + }, + "F12": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 110.1, + "y": 26.3, + "z": 1.95 + }, + "G12": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 110.1, + "y": 17.3, + "z": 1.95 + }, + "H12": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 110.1, + "y": 8.3, + "z": 1.95 + } + }, + "groups": [ + { + "metadata": { + "wellBottomShape": "u" + }, + "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": "96_squarewell_block_macherey_nagel" + }, + "namespace": "custom_beta", + "version": 1, + "schemaVersion": 2, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + } +} \ No newline at end of file diff --git a/protocols/macherey-nagel-nucleomag-dna-food/macherey-nagel-nucleomag-dna-food.ot2.apiv2.py b/protocols/macherey-nagel-nucleomag-dna-food/macherey-nagel-nucleomag-dna-food.ot2.apiv2.py new file mode 100644 index 0000000000..c0da3907e3 --- /dev/null +++ b/protocols/macherey-nagel-nucleomag-dna-food/macherey-nagel-nucleomag-dna-food.ot2.apiv2.py @@ -0,0 +1,595 @@ +# flake8: noqa +from opentrons.types import Point +import json +import os +import math + +metadata = {'protocolName': 'NucleoMag_DNA_Food_Rev01', 'author': 'Macherey-Nagel ', 'apiLevel': '2.9'} + +def run(ctx): + + ''' + Variable definition + ''' + [num_samples, + starting_vol, + elution_vol, + binding_buffer_vol, + bead_vol, + wash1_vol, + wash2_vol, + wash3_vol, + wash4_vol, + mix_reps_bind, + mix_reps_wash, + mix_reps_elu, + sep_time_bind, + sep_time_wash, + sep_time_elu, + dry_time, + tip_track] = [48, 400, 100, 600, 25, 600, 600, 600, 0, 25, 20, 25, 5, 2, 5, 30, False] + + total_vol_per_sample = starting_vol + binding_buffer_vol + wash1_vol + wash2_vol + wash3_vol + wash4_vol + run_liq_waste_vol = num_samples * total_vol_per_sample + + + Mag_height_SQW = 5.5 + + bottom_tolerance = 2.8 + # Bottom tolerance for aspriation from 12 Well Buffer Reserovir + + max_num_sample = 48 + max_num_columns = max_num_sample//8 + + ''' + End of Variable Definition + ''' + + ''' + define minimum & maximum volumes + ''' + if not 350 <= starting_vol <= 500: + raise Exception('Starting volume should be from 350 - 500µl.') + if not 50 <= elution_vol <= 200: + raise Exception('Elution volume should be from 50 - 200µl.') + if not run_liq_waste_vol <= 290000: + raise Exception('Number of samples exceeds maximum liquid waste volume of 400mL.') + if not num_samples <= max_num_sample: + raise Exception('Number of samples exceeds maximum number of 48 samples.') + ''' + End of defining minimum & maximum volumes + ''' + + ''' + Deck and Labware definition + ''' + magdeck = ctx.load_module('magnetic module gen2', '10') + magdeck.disengage() + sep_plate = magdeck.load_labware('96_squarewell_block_macherey_nagel', 'Separation Plate') + + liquid_waste = ctx.load_labware('agilent_1_reservoir_290ml', '11', 'Liquid Waste').wells()[0].top() + + elution_plate = ctx.load_labware('96_elutionplate_ubottom_by_macherey_nagel', '1', 'Elution Plate') + + tips300 = [ctx.load_labware('opentrons_96_tiprack_300ul', slot,'300µl filtertiprack') for slot in ['2', '3', '5', '6']] + tips1000 = ctx.load_labware('opentrons_96_tiprack_1000ul', '9','1000µl filtertiprack') + + num_cols = math.ceil(num_samples/8) + + parkingrack = ctx.load_labware('opentrons_96_tiprack_300ul', '8', 'empty tiprack for parking') + parking_spots = parkingrack.rows()[0][:num_cols] + + buffers = ctx.load_labware('usascientific_12_reservoir_22ml', '7', 'NucleoMag Buffers') + + beads = ctx.load_labware('opentrons_24_tuberack_generic_2ml_screwcap', '4', 'NucleoMag B-Beads').wells()[0] + # Beads are placed in a single 2mL screwcap tube at A1 + # Make sure the tip will not spill beads when driving down into the tube because of to high amount in the tube + + ''' + End of Deck and Labware definition + ''' + + ''' + Define reagents + + Well 1 & 2 Binding Buffer CB + Well 3 & 4 Wash Buffer CMW for 1st Wash + Well 5 & 6 Wash Buffer CQW for 2nd Wash + Well 7 & 8 Wash Buffer 80% Ethanol for 3rd Wash + Well 9 & 10 empty Placeholder for optional 4th wash + Well 11 empty + Well 12 Elution Buffer CE + + ''' + binding_buffer = buffers.wells()[:2] + wash1 = buffers.wells()[2:4] + wash2 = buffers.wells()[4:6] + wash3 = buffers.wells()[6:8] + wash4 = buffers.wells()[8:10] + placeholder = buffers.wells()[10] + elution_buffer = buffers.wells()[11] + ''' + End of reagent definition + ''' + + ''' + tool configuration + ''' + m300 = ctx.load_instrument('p300_multi_gen2', 'left', tip_racks=tips300) + s1000 = ctx.load_instrument('p1000_single_gen2', 'right', tip_racks=[tips1000]) + ''' + End of tool configuration + ''' + + ''' + Value calculations + ''' + mag_samples_s = sep_plate.wells()[:num_samples] + mag_samples_m = sep_plate.rows()[0][:num_cols] + elution_samples_m = elution_plate.rows()[0][:num_cols] + ''' + End of Calculations + ''' + + #sets initial pipetting speeds + m300.flow_rate.aspirate = 100 + m300.flow_rate.dispense = 150 + m300.flow_rate.blow_out = 200 + + s1000.flow_rate.aspirate = 750 + s1000.flow_rate.dispense = 900 + + #define initial pipetting clearance + m300.well_bottom_clearance.aspirate = 5 + m300.well_bottom_clearance.dispense = 25 + + ''' + tip logging and waste handling + ''' + folder_path = '/data/B' + tip_file_path = folder_path + '/tip_log.json' + tip_log = {'count': {}} + if tip_track and not ctx.is_simulating(): + if os.path.isfile(tip_file_path): + with open(tip_file_path) as json_file: + data = json.load(json_file) + if 'tips300' in data: + tip_log['count'][m300] = data['tips300'] + else: + tip_log['count'][m300] = 0 + else: + tip_log['count'][m300] = 0 + else: + tip_log['count'] = {m300: 0} + + tip_log['tips'] = { + m300: [tip for rack in tips300 for tip in rack.rows()[0]]} + tip_log['max'] = {m300: len(tip_log['tips'][m300])} + + # kept _pick_up as default + def _pick_up(pip, loc=None): + nonlocal tip_log + if tip_log['count'][pip] == tip_log['max'][pip] and not loc: + ctx.pause('Replace ' + str(pip.max_volume) + 'µl tipracks before \ resuming.') + pip.reset_tipracks() + tip_log['count'][pip] = 0 + if loc: + pip.pick_up_tip(loc) + else: + pip.pick_up_tip(tip_log['tips'][pip][tip_log['count'][pip]]) + tip_log['count'][pip] += 1 + + switch = True + drop_count = 0 + # number of tips trash will accommodate before prompting user to empty + drop_threshold = 192 + + def _drop(pip): + nonlocal switch + nonlocal drop_count + side = 30 if switch else -18 + drop_loc = ctx.loaded_labwares[12].wells()[0].top().move( + Point(x=side)) + pip.drop_tip(drop_loc) + switch = not switch + drop_count += 8 + if drop_count == drop_threshold: + m300.home() + ctx.pause('Please empty tips from waste before resuming.') + + ctx.home() # home before continuing with protocol + + drop_count = 0 + + waste_vol = 0 + waste_threshold = 300000 #this would need to be changed since we use a dedicated liquid waste reservoir + + ''' + End of tip logging and wase handling + ''' + + def remove_supernatant(vol, reuse=False, restore=False, last=False, blowout=True): + + """ + `remove_supernatant` will transfer supernatant from the deepwell + extraction plate to the liquid waste reservoir. + :param vol (float): The amount of volume to aspirate from all deepwell + sample wells and dispense in the liquid waste. + :param reuse (boolean): Whether to pick up previously restored sample-corresponding tips + from the 'parking rack' or to pick up new tips. + :param restore (boolean): Whether to park used tips in the 'parking rack' or discard them to waste. + :param last (boolean): Does perform the supernatant removal at the lowest hight possible with an extra over aspiration volume for the last wash step to optimize drying performance + """ + + def _waste_track(vol): + nonlocal waste_vol + if waste_vol + vol >= waste_threshold: + ctx.pause('Please empty liquid waste (slot 11) before \ resuming.') + ctx.home() + waste_vol = 0 + waste_vol += vol + if last: + vol=vol+60 + num_trans = math.ceil(vol/200) + vol_per_trans = vol/num_trans + m300.flow_rate.aspirate = 15 + m300.flow_rate.dispense = 90 + + for i, (m, spot) in enumerate(zip(mag_samples_m, parking_spots)): + if reuse: + _pick_up(m300, spot) + else: + _pick_up(m300) + side = -1 if i % 2 == 0 else 1 + #position modifier to aspirate away from the bead pellet + for _ in range(num_trans): + _waste_track(vol_per_trans*8) + if m300.current_volume > 0: + m300.dispense(m300.current_volume, m.top(-10)) + m300.move_to(m.center()) + if _ == num_trans-1: + if last: + loc = m.bottom(0.7).move(Point(x=side*0.5)) + else: + loc = m.bottom(0.8).move(Point(x=side*0.7)) + else: + loc = m.bottom(1.0).move(Point(x=side*1)) + + m300.transfer(vol_per_trans, loc, liquid_waste, new_tip='never', + air_gap=20) + + if _ == num_trans-1: + if blowout: + m300.blow_out(liquid_waste) + m300.aspirate(20, liquid_waste) + else: + if blowout: + m300.blow_out(liquid_waste) + m300.aspirate(20, liquid_waste) + # m300.air_gap(20) + # extra removal in last wash step to remove residual ethanol + if last: + m300.aspirate(20, m.bottom(0.6)) + m300.aspirate(20, m.bottom(0.7)) + m300.aspirate(20, m.bottom(0.8)) + m300.dispense(m300.current_volume, liquid_waste) + m300.aspirate(20, liquid_waste) + if restore: + m300.drop_tip(spot) + else: + _drop(m300) + m300.flow_rate.aspirate = 90 + m300.flow_rate.dispense = 150 + + def bind(vol, bead_vol, reuse=True, restore=False): + """ + `bind` will perform magnetic bead binding on each sample in the + deepwell plate. The binding beads will be mixed before + transfer (with s1000 tool), and the samples will be mixed with the binding beads after + the transfer (with m300 tool). The magnetic deck activates after the addition to all + samples, and the supernatant is removed after bead binding. + :param vol (float): Amount of volume of Binding Buffer to add to each well. + :param bead_vol (float): The amount of volume of NucleoMag B-Beads to dispense to each well. + :param reuse (boolean): Whether to save sample-corresponding tips + between adding binding buffer and removing the supernatant + :param restore (boolean): Whether to save sample-corresponding tips for reuse in the next stepre + """ + if magdeck.status== 'engaged': + magdeck.disengage() + + # Multidispense loop for distributing beads + bead_aspirate_vol_total = num_samples * bead_vol + 50 + if bead_aspirate_vol_total >= 800: + bead_aspirate_vol = bead_aspirate_vol_total/2 + else: + bead_aspirate_vol = bead_aspirate_vol_total + + + bead_mix_vol_temp = num_samples * bead_vol + if bead_mix_vol_temp >= 900: + bead_mix_vol = 900 + else: + bead_mix_vol = bead_mix_vol_temp - 100 + + air_gap_vol = 20 + bead_dispense_vol = bead_vol + air_gap_vol + + #Mix loop to resuspend beads + s1000.pick_up_tip() + for x in range(3): + s1000.aspirate(bead_mix_vol, beads.bottom(5)) + s1000.dispense(bead_mix_vol, beads.bottom(5)) + for x in range(7): + s1000.aspirate(bead_mix_vol, beads.bottom(3)) + s1000.dispense(bead_mix_vol, beads.bottom(3)) + + s1000.aspirate(bead_aspirate_vol, beads.bottom(3)) + s1000.air_gap(air_gap_vol) + s1000.flow_rate.dispense = 1000 + for loop, (well) in enumerate(mag_samples_s): + if loop == 24: + s1000.aspirate(bead_aspirate_vol, beads.bottom(3)) + s1000.dispense(bead_dispense_vol, well.top(-2)) + s1000.air_gap(air_gap_vol) + # End of bead dispense + + for i, (well, spot) in enumerate(zip(mag_samples_m, parking_spots)): + _pick_up(m300) + num_trans = math.ceil(vol/200) + vol_per_trans = vol/num_trans + m300.flow_rate.aspirate = 100 + for t in range(num_trans): + src = binding_buffer[i//(max_num_columns//len(binding_buffer))] + if m300.current_volume > 0: + m300.dispense(m300.current_volume, src.top()) + m300.aspirate(vol_per_trans, src.bottom(bottom_tolerance)) + m300.aspirate(20, src.top(2)) + ctx.delay(seconds=5, msg='drop delay') + m300.dispense(vol_per_trans+20, well.top(-3)) + # m300.transfer(vol_per_trans, src.bottom(bottom_tolerance), well.top(-3), air_gap=20, new_tip='never') + if t < num_trans - 1: + m300.air_gap(20) + side = 1 if i % 2 == 0 else -1 + #loc_mix = well.bottom(1.5).move(Point(x=side*0.8)) + loc_mix_asp_bottom = well.bottom(2) + loc_mix_asp_top = well.bottom(5) + loc_mix_dis_bottom = well.bottom(1) + loc_mix_dis_pellet = well.bottom(1.5).move(Point(x=side*0.8)) + loc_mix_dis_top = well.bottom(15) + # maybe split into two mix pos. + # one directly over the bead pellet for the first 4-5 cycles + # a second one higher in the liquid column to distribute the beads during the later mix cycles) + # m300.mix(mix_reps_bind, 200, loc_mix) + ''' optimized mix ''' + + m300.flow_rate.aspirate = 60 + m300.flow_rate.dispense = 300 + # resuspend at pellet + for x in range(10): + m300.aspirate(250, loc_mix_asp_top) + m300.dispense(250, loc_mix_dis_pellet) + # resuspend beads across the entire liquid column + for x in range(2): + m300.aspirate(200, loc_mix_asp_top) + m300.dispense(200, loc_mix_dis_bottom) + m300.flow_rate.aspirate = 150 + for x in range(mix_reps_bind-7): + m300.aspirate(250, loc_mix_asp_bottom) + m300.dispense(250, loc_mix_dis_top) + m300.flow_rate.aspirate = 100 + m300.flow_rate.dispense = 200 + ''' end of optimized mix ''' + # aspirate and dispense 1µL at top(-10), is there a ctx.move command? + m300.aspirate(15, well.top(-10)) + ctx.delay(seconds=3, msg='Blow out delay') + m300.dispense(15, well.top(-10)) + m300.blow_out(well.bottom(22)) + m300.air_gap(5) + if reuse: + m300.drop_tip(spot) + else: + _drop(m300) + + ctx.delay(minutes=2, msg='Incubate for 2 minutes') + magdeck.engage(height=Mag_height_SQW) + ctx.delay(minutes=sep_time_bind, msg='Incubating on MagDeck for ' + str(sep_time_bind) + ' minutes.') + + # remove initial supernatant + remove_supernatant(vol+bead_vol+starting_vol, reuse=reuse, restore=restore, last=False) + + + def wash(vol, source, mix_reps=mix_reps_wash, reuse=True, restore=True, resuspend=True, last=False, blowout=True): + """ + `wash` will perform bead washing for the extraction protocol. + :param vol (float): The amount of volume to aspirate from each + source and dispense to each well containing beads. + :param source (List[Well]): A list of wells from where liquid will be + aspirated. If the length of the source list + > 1, `wash` automatically calculates + the index of the source that should be + accessed. + :param mix_reps (int): The number of repititions to mix the beads with + specified wash buffer (ignored if resuspend is + False). + :param reuse (boolean): Whether to pick-up sample-corresponding tips for mixing and supernatant removal + that were restored in a previous step. + :param restore (boolean): Whether to park sample-corresponding tips for reuse in a later step + :param resuspend (boolean): Whether to resuspend beads in wash buffer. + """ + + if resuspend and magdeck.status == 'engaged': + magdeck.disengage() + + num_trans = math.ceil(vol/250) + vol_per_trans = vol/num_trans + + if reuse: #Dispense with fresh tips & mix with restored tips from previous step + _pick_up(m300) + for i, (m) in enumerate(mag_samples_m): + # src = source[i//(10//len(source))] neue Kalkulation mit 16mL Fassungvolumen der Resevoirkammern + src = source[i//(max_num_columns//len(source))] + for n in range(num_trans): + if m300.current_volume > 0: + m300.dispense(m300.current_volume, src.top()) + m300.aspirate(vol_per_trans, src.bottom(bottom_tolerance)) + m300.aspirate(20, src.top(2)) + ctx.delay(seconds=5, msg='drop delay') + m300.dispense(vol_per_trans+20, m.top()) + # m300.transfer(vol_per_trans, src.bottom(bottom_tolerance), m.top(), air_gap=20, new_tip='never') + if n < num_trans - 1: # only air_gap if going back to source + m300.air_gap(20) + _drop(m300) + if resuspend: + m300.flow_rate.aspirate = 220 + m300.flow_rate.dispense = 300 + for i, (m, spot) in enumerate(zip(mag_samples_m, parking_spots)): + _pick_up(m300, spot) + side = 1 if i % 2 == 0 else -1 + # loc_mix = m.bottom(2).move(Point(x=side*1.5)) + ''' new mix locations ''' + loc_mix_asp_bottom = m.bottom(1.5) + loc_mix_asp_top = m.bottom(5) + loc_mix_dis_pellet = m.bottom(1.5).move(Point(x=side*0.8)) + loc_mix_dis_top = m.bottom(12) + ''' end of new mix locations ''' + src = source[i//(10//len(source))] + # for rep in range(mix_reps): + # m300.aspirate(250, loc_mix) + # m300.dispense(250, loc_mix) + ''' optimized mix ''' + # resuspend at pellet + for x in range(10): + m300.aspirate(250, loc_mix_asp_top) + m300.dispense(250, loc_mix_dis_pellet) + # resuspend beads across the entire liquid column + for x in range(mix_reps-5): + m300.aspirate(250, loc_mix_asp_bottom) + m300.dispense(250, loc_mix_dis_top) + ''' end of optimized mix ''' + m300.blow_out(m.bottom(13)) + m300.air_gap(20) + m300.drop_tip(spot) + m300.flow_rate.aspirate = 100 + m300.flow_rate.dispense = 200 + else: # Dispense & mix with fresh tips + for i, (m, spot) in enumerate(zip(mag_samples_m, parking_spots)): + _pick_up(m300) + side = 1 if i % 2 == 0 else -1 + #loc_mix = m.bottom(2).move(Point(x=side*1.5)) + ''' new mix locations ''' + loc_mix_asp_bottom = m.bottom(1.5) + loc_mix_asp_top = m.bottom(5) + loc_mix_dis_bottom = m.bottom(1) + loc_mix_dis_pellet = m.bottom(1.5).move(Point(x=side*0.8)) + loc_mix_dis_top = m.bottom(12) + ''' end of new mix locations ''' + src = source[i//(10//len(source))] + for n in range(num_trans): + if m300.current_volume > 0: + m300.dispense(m300.current_volume, src.top()) + m300.transfer(vol_per_trans, src.bottom(bottom_tolerance), m.top(), air_gap=20, new_tip='never') + if n < num_trans - 1: # only air_gap if going back to source + m300.air_gap(20) + if resuspend: + m300.flow_rate.aspirate = 80 + m300.flow_rate.dispense = 300 + # for rep in range(mix_reps): + # m300.aspirate(250, loc_mix) + # m300.dispense(250, loc_mix) + ''' optimized mix ''' + # resuspend at pellet + for x in range(10): + m300.aspirate(250, loc_mix_asp_top) + m300.dispense(250, loc_mix_dis_pellet) + for x in range(2): + m300.aspirate(200, loc_mix_asp_top) + m300.dispense(200, loc_mix_dis_bottom) + # resuspend beads across the entire liquid column + for x in range(mix_reps-7): + m300.aspirate(250, loc_mix_asp_bottom) + m300.dispense(250, loc_mix_dis_top) + ''' end of optimized mix ''' + m300.flow_rate.aspirate = 120 + m300.flow_rate.dispense = 200 + m300.blow_out(m.bottom(13)) + m300.air_gap(20) + m300.drop_tip(spot) + + + + + if magdeck.status == 'disengaged': + magdeck.engage(height=Mag_height_SQW) + + ctx.delay(minutes=sep_time_wash, msg='Incubating on MagDeck for ' + str(sep_time_wash) + ' minutes.') + + remove_supernatant(vol, reuse=True, restore=restore, last=last, blowout=blowout) + + def elute(vol): + """ + `elute` will perform elution from the deepwell extraciton plate to the + final clean elutions PCR plate to complete the extraction protocol. + :param vol (float): The amount of volume to aspirate from the elution + buffer source and dispense to each well containing + beads. + """ + + magdeck.disengage() + for i, (m) in enumerate(mag_samples_m): + _pick_up(m300) + side = 1 if i % 2 == 0 else -1 + loc_mix_asp_bottom = m.bottom(1.2) + loc_mix_dis_pellet = m.bottom(1.5).move(Point(x=side*1.5)) + m300.aspirate(vol, elution_buffer.bottom(bottom_tolerance)) + m300.move_to(m.center()) + m300.dispense(vol, loc_mix_dis_pellet) + m300.flow_rate.aspirate = 220 + m300.flow_rate.dispense = 300 + for mix in range(mix_reps_elu): + m300.aspirate(0.8*vol, loc_mix_asp_bottom) + m300.dispense(0.8*vol, loc_mix_dis_pellet) + m300.flow_rate.aspirate = 60 + m300.flow_rate.dispense = 100 + m300.blow_out(m.bottom(7)) + m300.air_gap(20) + _drop(m300) + + magdeck.engage(height=Mag_height_SQW) + ctx.delay(minutes=sep_time_elu, msg='Incubating on MagDeck for ' + str(sep_time_elu) + ' minutes.') + + m300.flow_rate.aspirate = 30 + + for i, (m, e) in enumerate(zip(mag_samples_m, elution_samples_m)): + _pick_up(m300) + side = -1 if i % 2 == 0 else 1 + loc = m.bottom(0.9).move(Point(x=side*0.8)) + m300.transfer(vol, loc, e.bottom(5), air_gap=20, new_tip='never') + + m300.blow_out(e.top(-1)) + m300.air_gap(10) + m300.drop_tip() + + magdeck.disengage() + + + """ + Here is where you can call the methods defined above to fit your specific + protocol. The normal sequence is: + """ + bind(binding_buffer_vol, bead_vol, reuse=True, restore=False) + + wash(wash1_vol, wash1, reuse=False, restore=False, resuspend=True, last=False, blowout=False) + wash(wash2_vol, wash2, reuse=False, restore=False, resuspend=True, last=False, blowout=False) + wash(wash3_vol, wash3, reuse=False, restore=False, resuspend=True, last=True, blowout=False) + + ctx.delay(minutes=dry_time, msg='Air dry') + + elute(elution_vol) + + # track final used tip + if tip_track and not ctx.is_simulating(): + if not os.path.isdir(folder_path): + os.mkdir(folder_path) + data = {'tips300': tip_log['count'][m300]} + with open(tip_file_path, 'w') as outfile: + json.dump(data, outfile) diff --git a/protocols/macherey-nagel-nucleomag-tissue/README.md b/protocols/macherey-nagel-nucleomag-tissue/README.md new file mode 100644 index 0000000000..3d28a2b2f6 --- /dev/null +++ b/protocols/macherey-nagel-nucleomag-tissue/README.md @@ -0,0 +1,98 @@ +# MACHEREY-NAGEL NucleoMag® Tissue + + +### Author +[MACHEREY-NAGEL](https://www.mn-net.com/us) + +### Partner +[Opentrons](https://opentrons.com/) + + +# Opentrons has launched a new Protocol Library. You should use the [new page for this protocol](library.opentrons.com/p/macherey-nagel-nucleomag-tissue). This page won’t be available after January 31st, 2024. + +## Categories +* Nucleic Acid Extraction & Purification + * MACHEREY-NAGEL NucleoMag® Tissue + + +## Description +![MACHEREY-NAGEL](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/macherey-nagel/MN_Logo_50.jpeg) + +This protocol automates the NucleoMag® Tissue kit for flexible magnetic bead based isolation. + +Before beginning the protocol on the OT-2, the following preparation steps are needed. +1. Perform the lysis according to the NucleoMag® Tissue user manual. +2. Fill the 12-Well Buffer Reservoir according to the table below. +3. Resuspend the NucleoMag® B-Beads by vortexing and place them in Position A1 of the 2mL Tube Rack. +4. Load the instrument deck according to the displayed positions. +5. Place the Square-well Block containing the lysates on the Magnetic Module and start the run. + + +You can access the full description of this workflow on the OT-2 by visiting this link: [link](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/macherey-nagel-nucleomag-tissue/thepdf.pdf) + + +### Modules +* [Opentrons Magnetic Module (GEN2)](https://shop.opentrons.com/magnetic-module-gen2/) + + +### Labware +* Macherey Nagel 96 Well Square Well Block +* Macherey Nagel 96 Well Elution Plate U-bottom +* [Opentrons 96 Tip Rack 300 µL](https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-300ul-tips) +* [Opentrons 24 Tube Rack with Generic 2 mL Screwcap](https://shop.opentrons.com/collections/opentrons-tips/products/tube-rack-set-1) +* [USA Scientific 12 Well Reservoir 22 mL #1061-8150](https://www.usascientific.com/12-channel-automation-reservoir.aspx) +* [Opentrons 96 Tip Rack 1000 µL](https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-1000ul-tips) +* [Agilent 1 Well Reservoir 290 mL #201252-100](https://www.agilent.com/store/en_US/Prod-201252-100/201252-100) + + +### Pipettes +* [Opentrons P300 8 Channel Electronic Pipette (GEN2)](https://shop.opentrons.com/8-channel-electronic-pipette/) +* [Opentrons P1000 Single Channel Electronic Pipette (GEN2)](https://shop.opentrons.com/single-channel-electronic-pipette-p20/) + + +### Deck Setup +![deck](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/macherey-nagel/deck.png) + + +### Reagent Setup +![reagents](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/macherey-nagel-nucleomag-tissue/reag_tissue.png) + + +### Protocol Steps +1. Binding Step +2. Wash 1 +3. Wash 2 +4. Wash 3 +5. Delay for drying +6. Elution +
+
+* Note +The default values for all volumes, incubation times and mix repetitions were pretested and validated. +We do not recommend to change them. If you still decide to change them please scale all volumes proportionally. +For change recommendations please contact automation-bio@mn-net.de +
+
+ +**Process** +1. Input your protocol parameters below. +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/). +
+**Disclaimer**: MACHEREY-NAGEL GmbH & Co. KG makes every effort to include accurate and up-to-date information within this publication; however, it is possible that omissions or errors might have occurred. MACHEREY-NAGEL GmbH & Co. KG cannot, therefore, make any representations or warranties, expressed or implied, as to the accuracy or completeness of the information provided in this publication. Changes in this publication can be made at any time without notice. For technical details and detailed procedures of the specifications provided in this document please contact your MACHEREY-NAGEL representative. This publication may contain reference to applications and products which are not available in all markets. Please check with your local sales representative. +All mentioned trademarks are protected by law. All used names and denotations can be brands, trademarks, or registered labels of their respective owner – also if they are not special denotation. To mention products and brands is only a kind of information (i.e., it does not offend against trademarks and brands and can not be seen as a kind of recommendation or assessment). Reference herein to any specific commercial product, process, or service by trade name, trademark, manufacturer, or otherwise, does not necessarily constitute or imply its endorsement, recommendation, or support by MACHEREY-NAGEL GmbH & Co. KG or Opentrons. Any views or opinions expressed herein by the authors' do not necessarily state or reflect those of MACHEREY-NAGEL or the Eppendorf AG. NucleoMag® is a registered trademark of MACHEREY-NAGEL GmbH & Co. KG, Düren, Germany. Opentrons OT-2 is a device from Opentrons, New York, USA. +
+* The Download links includes all Protocols in their respective subfolders as well as the .json files for the two labware files. + + +###### Internal +macherey-nagel-nucleomag-tissue diff --git a/protocols/macherey-nagel-nucleomag-tissue/fields.json b/protocols/macherey-nagel-nucleomag-tissue/fields.json new file mode 100644 index 0000000000..d44ffba1d7 --- /dev/null +++ b/protocols/macherey-nagel-nucleomag-tissue/fields.json @@ -0,0 +1,101 @@ +[ + { + "type": "int", + "label": "Number of Samples [1-48 samples]", + "name": "num_samples", + "default": 48 + }, + { + "type": "int", + "label": "Starting Volume", + "name": "starting_vol", + "default": 225 + }, + { + "type": "int", + "label": "Elution Volume [50-200µL]", + "name": "elution_vol", + "default": 100 + }, + { + "type": "int", + "label": "Binding Buffer Volume", + "name": "binding_buffer_vol", + "default": 360 + }, + { + "type": "int", + "label": "Bead Volume", + "name": "bead_vol", + "default": 24 + }, + { + "type": "int", + "label": "Wash 1 Volume", + "name": "wash1_vol", + "default": 600 + }, + { + "type": "int", + "label": "Wash 2 Volume", + "name": "wash2_vol", + "default": 600 + }, + { + "type": "int", + "label": "Wash 3 Volume", + "name": "wash3_vol", + "default": 600 + }, + { + "type": "int", + "label": "Mix Repetitions During Binding [pretested default, changing is not recommended]", + "name": "mix_reps_bind", + "default": 20 + }, + { + "type": "int", + "label": "Mix Repetitions during Wash [pretested default, changing is not recommended]", + "name": "mix_reps_wash", + "default": 15 + }, + { + "type": "int", + "label": "Mix Repetitions during Elution [pretested default, changing is not recommended]", + "name": "mix_reps_elu", + "default": 20 + }, + { + "type": "int", + "label": "Separation Time during Binding [pretested default, changing is not recommended]", + "name": "sep_time_bind", + "default": 5 + }, + { + "type": "int", + "label": "Separation Time during Wash [pretested default, changing is not recommended]", + "name": "sep_time_wash", + "default": 2 + }, + { + "type": "int", + "label": "Separation Time during Elution [pretested default, changing is not recommended]", + "name": "sep_time_elu", + "default": 5 + }, + { + "type": "int", + "label": "Time for Air Dry [pretested default, changing is not recommended]", + "name": "dry_time", + "default": 20 + }, + { + "type": "dropDown", + "label": "Track Tips Between Runs", + "name": "tip_track", + "options": [ + { "label": "No", "value": 0 }, + { "label": "Yes", "value": 1 } + ] + } + ] diff --git a/protocols/macherey-nagel-nucleomag-tissue/labware/96_elutionplate_ubottom_by_macherey_nagel.json b/protocols/macherey-nagel-nucleomag-tissue/labware/96_elutionplate_ubottom_by_macherey_nagel.json new file mode 100644 index 0000000000..67a7627a70 --- /dev/null +++ b/protocols/macherey-nagel-nucleomag-tissue/labware/96_elutionplate_ubottom_by_macherey_nagel.json @@ -0,0 +1,1127 @@ +{ + "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": "Macherey-Nagel", + "brandId": [ + "Elution Plate U-bottom (REF740672)" + ] + }, + "metadata": { + "displayName": "96_Elutionplate_ubottom_by_Macherey_Nagel", + "displayCategory": "wellPlate", + "displayVolumeUnits": "µL", + "tags": [] + }, + "dimensions": { + "xDimension": 127.6, + "yDimension": 85.6, + "zDimension": 14.2 + }, + "wells": { + "A1": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 11.1, + "y": 71.3, + "z": 3.8 + }, + "B1": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 11.1, + "y": 62.29, + "z": 3.8 + }, + "C1": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 11.1, + "y": 53.28, + "z": 3.8 + }, + "D1": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 11.1, + "y": 44.27, + "z": 3.8 + }, + "E1": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 11.1, + "y": 35.26, + "z": 3.8 + }, + "F1": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 11.1, + "y": 26.25, + "z": 3.8 + }, + "G1": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 11.1, + "y": 17.24, + "z": 3.8 + }, + "H1": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 11.1, + "y": 8.23, + "z": 3.8 + }, + "A2": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 20.11, + "y": 71.3, + "z": 3.8 + }, + "B2": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 20.11, + "y": 62.29, + "z": 3.8 + }, + "C2": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 20.11, + "y": 53.28, + "z": 3.8 + }, + "D2": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 20.11, + "y": 44.27, + "z": 3.8 + }, + "E2": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 20.11, + "y": 35.26, + "z": 3.8 + }, + "F2": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 20.11, + "y": 26.25, + "z": 3.8 + }, + "G2": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 20.11, + "y": 17.24, + "z": 3.8 + }, + "H2": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 20.11, + "y": 8.23, + "z": 3.8 + }, + "A3": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 29.12, + "y": 71.3, + "z": 3.8 + }, + "B3": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 29.12, + "y": 62.29, + "z": 3.8 + }, + "C3": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 29.12, + "y": 53.28, + "z": 3.8 + }, + "D3": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 29.12, + "y": 44.27, + "z": 3.8 + }, + "E3": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 29.12, + "y": 35.26, + "z": 3.8 + }, + "F3": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 29.12, + "y": 26.25, + "z": 3.8 + }, + "G3": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 29.12, + "y": 17.24, + "z": 3.8 + }, + "H3": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 29.12, + "y": 8.23, + "z": 3.8 + }, + "A4": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 38.13, + "y": 71.3, + "z": 3.8 + }, + "B4": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 38.13, + "y": 62.29, + "z": 3.8 + }, + "C4": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 38.13, + "y": 53.28, + "z": 3.8 + }, + "D4": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 38.13, + "y": 44.27, + "z": 3.8 + }, + "E4": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 38.13, + "y": 35.26, + "z": 3.8 + }, + "F4": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 38.13, + "y": 26.25, + "z": 3.8 + }, + "G4": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 38.13, + "y": 17.24, + "z": 3.8 + }, + "H4": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 38.13, + "y": 8.23, + "z": 3.8 + }, + "A5": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 47.14, + "y": 71.3, + "z": 3.8 + }, + "B5": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 47.14, + "y": 62.29, + "z": 3.8 + }, + "C5": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 47.14, + "y": 53.28, + "z": 3.8 + }, + "D5": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 47.14, + "y": 44.27, + "z": 3.8 + }, + "E5": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 47.14, + "y": 35.26, + "z": 3.8 + }, + "F5": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 47.14, + "y": 26.25, + "z": 3.8 + }, + "G5": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 47.14, + "y": 17.24, + "z": 3.8 + }, + "H5": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 47.14, + "y": 8.23, + "z": 3.8 + }, + "A6": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 56.15, + "y": 71.3, + "z": 3.8 + }, + "B6": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 56.15, + "y": 62.29, + "z": 3.8 + }, + "C6": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 56.15, + "y": 53.28, + "z": 3.8 + }, + "D6": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 56.15, + "y": 44.27, + "z": 3.8 + }, + "E6": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 56.15, + "y": 35.26, + "z": 3.8 + }, + "F6": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 56.15, + "y": 26.25, + "z": 3.8 + }, + "G6": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 56.15, + "y": 17.24, + "z": 3.8 + }, + "H6": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 56.15, + "y": 8.23, + "z": 3.8 + }, + "A7": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 65.16, + "y": 71.3, + "z": 3.8 + }, + "B7": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 65.16, + "y": 62.29, + "z": 3.8 + }, + "C7": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 65.16, + "y": 53.28, + "z": 3.8 + }, + "D7": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 65.16, + "y": 44.27, + "z": 3.8 + }, + "E7": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 65.16, + "y": 35.26, + "z": 3.8 + }, + "F7": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 65.16, + "y": 26.25, + "z": 3.8 + }, + "G7": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 65.16, + "y": 17.24, + "z": 3.8 + }, + "H7": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 65.16, + "y": 8.23, + "z": 3.8 + }, + "A8": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 74.17, + "y": 71.3, + "z": 3.8 + }, + "B8": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 74.17, + "y": 62.29, + "z": 3.8 + }, + "C8": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 74.17, + "y": 53.28, + "z": 3.8 + }, + "D8": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 74.17, + "y": 44.27, + "z": 3.8 + }, + "E8": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 74.17, + "y": 35.26, + "z": 3.8 + }, + "F8": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 74.17, + "y": 26.25, + "z": 3.8 + }, + "G8": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 74.17, + "y": 17.24, + "z": 3.8 + }, + "H8": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 74.17, + "y": 8.23, + "z": 3.8 + }, + "A9": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 83.18, + "y": 71.3, + "z": 3.8 + }, + "B9": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 83.18, + "y": 62.29, + "z": 3.8 + }, + "C9": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 83.18, + "y": 53.28, + "z": 3.8 + }, + "D9": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 83.18, + "y": 44.27, + "z": 3.8 + }, + "E9": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 83.18, + "y": 35.26, + "z": 3.8 + }, + "F9": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 83.18, + "y": 26.25, + "z": 3.8 + }, + "G9": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 83.18, + "y": 17.24, + "z": 3.8 + }, + "H9": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 83.18, + "y": 8.23, + "z": 3.8 + }, + "A10": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 92.19, + "y": 71.3, + "z": 3.8 + }, + "B10": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 92.19, + "y": 62.29, + "z": 3.8 + }, + "C10": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 92.19, + "y": 53.28, + "z": 3.8 + }, + "D10": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 92.19, + "y": 44.27, + "z": 3.8 + }, + "E10": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 92.19, + "y": 35.26, + "z": 3.8 + }, + "F10": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 92.19, + "y": 26.25, + "z": 3.8 + }, + "G10": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 92.19, + "y": 17.24, + "z": 3.8 + }, + "H10": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 92.19, + "y": 8.23, + "z": 3.8 + }, + "A11": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 101.2, + "y": 71.3, + "z": 3.8 + }, + "B11": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 101.2, + "y": 62.29, + "z": 3.8 + }, + "C11": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 101.2, + "y": 53.28, + "z": 3.8 + }, + "D11": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 101.2, + "y": 44.27, + "z": 3.8 + }, + "E11": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 101.2, + "y": 35.26, + "z": 3.8 + }, + "F11": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 101.2, + "y": 26.25, + "z": 3.8 + }, + "G11": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 101.2, + "y": 17.24, + "z": 3.8 + }, + "H11": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 101.2, + "y": 8.23, + "z": 3.8 + }, + "A12": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 110.21, + "y": 71.3, + "z": 3.8 + }, + "B12": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 110.21, + "y": 62.29, + "z": 3.8 + }, + "C12": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 110.21, + "y": 53.28, + "z": 3.8 + }, + "D12": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 110.21, + "y": 44.27, + "z": 3.8 + }, + "E12": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 110.21, + "y": 35.26, + "z": 3.8 + }, + "F12": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 110.21, + "y": 26.25, + "z": 3.8 + }, + "G12": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 110.21, + "y": 17.24, + "z": 3.8 + }, + "H12": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 110.21, + "y": 8.23, + "z": 3.8 + } + }, + "groups": [ + { + "metadata": { + "wellBottomShape": "u" + }, + "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": "96_elutionplate_ubottom_by_macherey_nagel" + }, + "namespace": "custom_beta", + "version": 1, + "schemaVersion": 2, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + } +} \ No newline at end of file diff --git a/protocols/macherey-nagel-nucleomag-tissue/labware/96_squarewell_block_macherey_nagel.json b/protocols/macherey-nagel-nucleomag-tissue/labware/96_squarewell_block_macherey_nagel.json new file mode 100644 index 0000000000..e8e073702d --- /dev/null +++ b/protocols/macherey-nagel-nucleomag-tissue/labware/96_squarewell_block_macherey_nagel.json @@ -0,0 +1,1223 @@ +{ + "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": "Macherey-Nagel", + "brandId": [ + "Square-Well Block (REF740670)" + ] + }, + "metadata": { + "displayName": "96 Square-Well Block by Macherey-Nagel", + "displayCategory": "wellPlate", + "displayVolumeUnits": "µL", + "tags": [] + }, + "dimensions": { + "xDimension": 127.6, + "yDimension": 85.6, + "zDimension": 44.15 + }, + "wells": { + "A1": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 11.1, + "y": 71.3, + "z": 1.95 + }, + "B1": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 11.1, + "y": 62.3, + "z": 1.95 + }, + "C1": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 11.1, + "y": 53.3, + "z": 1.95 + }, + "D1": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 11.1, + "y": 44.3, + "z": 1.95 + }, + "E1": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 11.1, + "y": 35.3, + "z": 1.95 + }, + "F1": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 11.1, + "y": 26.3, + "z": 1.95 + }, + "G1": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 11.1, + "y": 17.3, + "z": 1.95 + }, + "H1": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 11.1, + "y": 8.3, + "z": 1.95 + }, + "A2": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 20.1, + "y": 71.3, + "z": 1.95 + }, + "B2": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 20.1, + "y": 62.3, + "z": 1.95 + }, + "C2": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 20.1, + "y": 53.3, + "z": 1.95 + }, + "D2": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 20.1, + "y": 44.3, + "z": 1.95 + }, + "E2": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 20.1, + "y": 35.3, + "z": 1.95 + }, + "F2": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 20.1, + "y": 26.3, + "z": 1.95 + }, + "G2": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 20.1, + "y": 17.3, + "z": 1.95 + }, + "H2": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 20.1, + "y": 8.3, + "z": 1.95 + }, + "A3": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 29.1, + "y": 71.3, + "z": 1.95 + }, + "B3": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 29.1, + "y": 62.3, + "z": 1.95 + }, + "C3": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 29.1, + "y": 53.3, + "z": 1.95 + }, + "D3": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 29.1, + "y": 44.3, + "z": 1.95 + }, + "E3": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 29.1, + "y": 35.3, + "z": 1.95 + }, + "F3": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 29.1, + "y": 26.3, + "z": 1.95 + }, + "G3": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 29.1, + "y": 17.3, + "z": 1.95 + }, + "H3": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 29.1, + "y": 8.3, + "z": 1.95 + }, + "A4": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 38.1, + "y": 71.3, + "z": 1.95 + }, + "B4": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 38.1, + "y": 62.3, + "z": 1.95 + }, + "C4": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 38.1, + "y": 53.3, + "z": 1.95 + }, + "D4": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 38.1, + "y": 44.3, + "z": 1.95 + }, + "E4": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 38.1, + "y": 35.3, + "z": 1.95 + }, + "F4": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 38.1, + "y": 26.3, + "z": 1.95 + }, + "G4": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 38.1, + "y": 17.3, + "z": 1.95 + }, + "H4": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 38.1, + "y": 8.3, + "z": 1.95 + }, + "A5": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 47.1, + "y": 71.3, + "z": 1.95 + }, + "B5": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 47.1, + "y": 62.3, + "z": 1.95 + }, + "C5": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 47.1, + "y": 53.3, + "z": 1.95 + }, + "D5": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 47.1, + "y": 44.3, + "z": 1.95 + }, + "E5": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 47.1, + "y": 35.3, + "z": 1.95 + }, + "F5": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 47.1, + "y": 26.3, + "z": 1.95 + }, + "G5": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 47.1, + "y": 17.3, + "z": 1.95 + }, + "H5": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 47.1, + "y": 8.3, + "z": 1.95 + }, + "A6": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 56.1, + "y": 71.3, + "z": 1.95 + }, + "B6": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 56.1, + "y": 62.3, + "z": 1.95 + }, + "C6": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 56.1, + "y": 53.3, + "z": 1.95 + }, + "D6": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 56.1, + "y": 44.3, + "z": 1.95 + }, + "E6": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 56.1, + "y": 35.3, + "z": 1.95 + }, + "F6": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 56.1, + "y": 26.3, + "z": 1.95 + }, + "G6": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 56.1, + "y": 17.3, + "z": 1.95 + }, + "H6": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 56.1, + "y": 8.3, + "z": 1.95 + }, + "A7": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 65.1, + "y": 71.3, + "z": 1.95 + }, + "B7": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 65.1, + "y": 62.3, + "z": 1.95 + }, + "C7": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 65.1, + "y": 53.3, + "z": 1.95 + }, + "D7": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 65.1, + "y": 44.3, + "z": 1.95 + }, + "E7": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 65.1, + "y": 35.3, + "z": 1.95 + }, + "F7": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 65.1, + "y": 26.3, + "z": 1.95 + }, + "G7": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 65.1, + "y": 17.3, + "z": 1.95 + }, + "H7": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 65.1, + "y": 8.3, + "z": 1.95 + }, + "A8": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 74.1, + "y": 71.3, + "z": 1.95 + }, + "B8": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 74.1, + "y": 62.3, + "z": 1.95 + }, + "C8": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 74.1, + "y": 53.3, + "z": 1.95 + }, + "D8": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 74.1, + "y": 44.3, + "z": 1.95 + }, + "E8": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 74.1, + "y": 35.3, + "z": 1.95 + }, + "F8": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 74.1, + "y": 26.3, + "z": 1.95 + }, + "G8": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 74.1, + "y": 17.3, + "z": 1.95 + }, + "H8": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 74.1, + "y": 8.3, + "z": 1.95 + }, + "A9": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 83.1, + "y": 71.3, + "z": 1.95 + }, + "B9": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 83.1, + "y": 62.3, + "z": 1.95 + }, + "C9": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 83.1, + "y": 53.3, + "z": 1.95 + }, + "D9": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 83.1, + "y": 44.3, + "z": 1.95 + }, + "E9": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 83.1, + "y": 35.3, + "z": 1.95 + }, + "F9": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 83.1, + "y": 26.3, + "z": 1.95 + }, + "G9": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 83.1, + "y": 17.3, + "z": 1.95 + }, + "H9": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 83.1, + "y": 8.3, + "z": 1.95 + }, + "A10": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 92.1, + "y": 71.3, + "z": 1.95 + }, + "B10": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 92.1, + "y": 62.3, + "z": 1.95 + }, + "C10": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 92.1, + "y": 53.3, + "z": 1.95 + }, + "D10": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 92.1, + "y": 44.3, + "z": 1.95 + }, + "E10": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 92.1, + "y": 35.3, + "z": 1.95 + }, + "F10": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 92.1, + "y": 26.3, + "z": 1.95 + }, + "G10": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 92.1, + "y": 17.3, + "z": 1.95 + }, + "H10": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 92.1, + "y": 8.3, + "z": 1.95 + }, + "A11": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 101.1, + "y": 71.3, + "z": 1.95 + }, + "B11": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 101.1, + "y": 62.3, + "z": 1.95 + }, + "C11": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 101.1, + "y": 53.3, + "z": 1.95 + }, + "D11": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 101.1, + "y": 44.3, + "z": 1.95 + }, + "E11": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 101.1, + "y": 35.3, + "z": 1.95 + }, + "F11": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 101.1, + "y": 26.3, + "z": 1.95 + }, + "G11": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 101.1, + "y": 17.3, + "z": 1.95 + }, + "H11": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 101.1, + "y": 8.3, + "z": 1.95 + }, + "A12": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 110.1, + "y": 71.3, + "z": 1.95 + }, + "B12": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 110.1, + "y": 62.3, + "z": 1.95 + }, + "C12": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 110.1, + "y": 53.3, + "z": 1.95 + }, + "D12": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 110.1, + "y": 44.3, + "z": 1.95 + }, + "E12": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 110.1, + "y": 35.3, + "z": 1.95 + }, + "F12": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 110.1, + "y": 26.3, + "z": 1.95 + }, + "G12": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 110.1, + "y": 17.3, + "z": 1.95 + }, + "H12": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 110.1, + "y": 8.3, + "z": 1.95 + } + }, + "groups": [ + { + "metadata": { + "wellBottomShape": "u" + }, + "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": "96_squarewell_block_macherey_nagel" + }, + "namespace": "custom_beta", + "version": 1, + "schemaVersion": 2, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + } +} \ No newline at end of file diff --git a/protocols/macherey-nagel-nucleomag-tissue/macherey-nagel-nucleomag-tissue.ot2.apiv2.py b/protocols/macherey-nagel-nucleomag-tissue/macherey-nagel-nucleomag-tissue.ot2.apiv2.py new file mode 100644 index 0000000000..5b1177a2b0 --- /dev/null +++ b/protocols/macherey-nagel-nucleomag-tissue/macherey-nagel-nucleomag-tissue.ot2.apiv2.py @@ -0,0 +1,589 @@ +# flake8: noqa +from opentrons.types import Point +import json +import os +import math + +metadata = {'protocolName': 'NucleoMag_Tissue_Rev01', 'author': 'Macherey-Nagel ', 'apiLevel': '2.9'} + +def run(ctx): + + ''' + Variable definition + ''' + [num_samples, + starting_vol, + elution_vol, + binding_buffer_vol, + bead_vol, + wash1_vol, + wash2_vol, + wash3_vol, + mix_reps_bind, + mix_reps_wash, + mix_reps_elu, + sep_time_bind, + sep_time_wash, + sep_time_elu, + dry_time, + tip_track] = [48, 225, 100, 360, 24, 600, 600, 600, 20, 15, 20, 5, 2, 5, 20, False] + + total_vol_per_sample = starting_vol + binding_buffer_vol + wash1_vol + wash2_vol + wash3_vol + run_liq_waste_vol = num_samples * total_vol_per_sample + + + Mag_height_SQW = 5.5 + + bottom_tolerance = 2.8 + # Bottom tolerance for aspriation from 12 Well Buffer Reserovir + + max_num_sample = 48 + max_num_columns = max_num_sample//8 + + ''' + End of Variable Definition + ''' + + ''' + define minimum & maximum volumes + ''' + if not 180 <= starting_vol <= 225: + raise Exception('Starting volume should be from 180 - 225µl.') + if not 50 <= elution_vol <= 200: + raise Exception('Elution volume should be from 50 - 200µl.') + if not run_liq_waste_vol <= 290000: + raise Exception('Number of samples exceeds maximum liquid waste volume of 400mL.') + if not num_samples <= max_num_sample: + raise Exception('Number of samples exceeds maximum number of samples.') + ''' + End of defining minimum & maximum volumes + ''' + + ''' + Deck and Labware definition + ''' + magdeck = ctx.load_module('magnetic module gen2', '10') + magdeck.disengage() + sep_plate = magdeck.load_labware('96_squarewell_block_macherey_nagel', 'Separation Plate') + + liquid_waste = ctx.load_labware('agilent_1_reservoir_290ml', '11', 'Liquid Waste').wells()[0].top() + + elution_plate = ctx.load_labware('96_elutionplate_ubottom_by_macherey_nagel', '1', 'Elution Plate') + + tips300 = [ctx.load_labware('opentrons_96_tiprack_300ul', slot,'300µl filtertiprack') for slot in ['2', '3', '5', '6']] + tips1000 = ctx.load_labware('opentrons_96_tiprack_1000ul', '9','1000µl filtertiprack') + + num_cols = math.ceil(num_samples/8) + + parkingrack = ctx.load_labware('opentrons_96_tiprack_300ul', '8', 'empty tiprack for parking') + parking_spots = parkingrack.rows()[0][:num_cols] + + buffers = ctx.load_labware('usascientific_12_reservoir_22ml', '7', 'NucleoMag Buffers') + + beads = ctx.load_labware('opentrons_24_tuberack_generic_2ml_screwcap', '4', 'NucleoMag B-Beads').wells()[0] + # Beads are placed in a single 2mL screwcap tube at A1 + # Make sure the tip will not spill beads when driving down into the tube because of to high amount in the tube + + ''' + End of Deck and Labware definition + ''' + + ''' + Define reagents + + Well 1 & 2 Binding Buffer MB2 + Well 3 & 4 Wash Buffer MB3 + Well 6 & 7 Wash Buffer MB4 + Well 9 & 10 80% ethanol (MB5 was replaced for 80% ethanol, because a rinse step is not feasable on the OT2) + Well 12 Elution Buffer MB6 + + ''' + binding_buffer = buffers.wells()[:2] + wash1 = buffers.wells()[2:4] + wash2 = buffers.wells()[5:7] + wash3 = buffers.wells()[8:10] + elution_buffer = buffers.wells()[11] + ''' + End of reagent definition + ''' + + ''' + tool configuration + ''' + m300 = ctx.load_instrument('p300_multi_gen2', 'left', tip_racks=tips300) + s1000 = ctx.load_instrument('p1000_single_gen2', 'right', tip_racks=[tips1000]) + ''' + End of tool configuration + ''' + + ''' + Value calculations + ''' + mag_samples_s = sep_plate.wells()[:num_samples] + mag_samples_m = sep_plate.rows()[0][:num_cols] + elution_samples_m = elution_plate.rows()[0][:num_cols] + ''' + End of Calculations + ''' + + #sets initial pipetting speeds + m300.flow_rate.aspirate = 100 + m300.flow_rate.dispense = 150 + m300.flow_rate.blow_out = 200 + + s1000.flow_rate.aspirate = 750 + s1000.flow_rate.dispense = 900 + + #define initial pipetting clearance + m300.well_bottom_clearance.aspirate = 5 + m300.well_bottom_clearance.dispense = 25 + + ''' + tip logging and waste handling + ''' + folder_path = '/data/B' + tip_file_path = folder_path + '/tip_log.json' + tip_log = {'count': {}} + if tip_track and not ctx.is_simulating(): + if os.path.isfile(tip_file_path): + with open(tip_file_path) as json_file: + data = json.load(json_file) + if 'tips300' in data: + tip_log['count'][m300] = data['tips300'] + else: + tip_log['count'][m300] = 0 + else: + tip_log['count'][m300] = 0 + else: + tip_log['count'] = {m300: 0} + + tip_log['tips'] = { + m300: [tip for rack in tips300 for tip in rack.rows()[0]]} + tip_log['max'] = {m300: len(tip_log['tips'][m300])} + + # kept _pick_up as default + def _pick_up(pip, loc=None): + nonlocal tip_log + if tip_log['count'][pip] == tip_log['max'][pip] and not loc: + ctx.pause('Replace ' + str(pip.max_volume) + 'µl tipracks before \ resuming.') + pip.reset_tipracks() + tip_log['count'][pip] = 0 + if loc: + pip.pick_up_tip(loc) + else: + pip.pick_up_tip(tip_log['tips'][pip][tip_log['count'][pip]]) + tip_log['count'][pip] += 1 + + switch = True + drop_count = 0 + # number of tips trash will accommodate before prompting user to empty + drop_threshold = 192 + + def _drop(pip): + nonlocal switch + nonlocal drop_count + side = 30 if switch else -18 + drop_loc = ctx.loaded_labwares[12].wells()[0].top().move( + Point(x=side)) + pip.drop_tip(drop_loc) + switch = not switch + drop_count += 8 + if drop_count == drop_threshold: + m300.home() + ctx.pause('Please empty tips from waste before resuming.') + + ctx.home() # home before continuing with protocol + + drop_count = 0 + + waste_vol = 0 + waste_threshold = 300000 #this would need to be changed since we use a dedicated liquid waste reservoir + + ''' + End of tip logging and wase handling + ''' + + def remove_supernatant(vol, reuse=False, restore=False, last=False, blowout=True): + + """ + `remove_supernatant` will transfer supernatant from the deepwell + extraction plate to the liquid waste reservoir. + :param vol (float): The amount of volume to aspirate from all deepwell + sample wells and dispense in the liquid waste. + :param reuse (boolean): Whether to pick up previously restored sample-corresponding tips + from the 'parking rack' or to pick up new tips. + :param restore (boolean): Whether to park used tips in the 'parking rack' or discard them to waste. + :param last (boolean): Does perform the supernatant removal at the lowest hight possible with an extra over aspiration volume for the last wash step to optimize drying performance + """ + + def _waste_track(vol): + nonlocal waste_vol + if waste_vol + vol >= waste_threshold: + ctx.pause('Please empty liquid waste (slot 11) before \ resuming.') + ctx.home() + waste_vol = 0 + waste_vol += vol + if last: + vol=vol+60 + num_trans = math.ceil(vol/200) + vol_per_trans = vol/num_trans + m300.flow_rate.aspirate = 15 + m300.flow_rate.dispense = 90 + + for i, (m, spot) in enumerate(zip(mag_samples_m, parking_spots)): + if reuse: + _pick_up(m300, spot) + else: + _pick_up(m300) + side = -1 if i % 2 == 0 else 1 + #position modifier to aspirate away from the bead pellet + for _ in range(num_trans): + _waste_track(vol_per_trans*8) + if m300.current_volume > 0: + m300.dispense(m300.current_volume, m.top(-10)) + m300.move_to(m.center()) + if _ == num_trans-1: + if last: + loc = m.bottom(0.7).move(Point(x=side*0.5)) + else: + loc = m.bottom(0.8).move(Point(x=side*0.7)) + else: + loc = m.bottom(1.0).move(Point(x=side*1)) + + m300.transfer(vol_per_trans, loc, liquid_waste, new_tip='never', + air_gap=20) + + if _ == num_trans-1: + if blowout: + m300.blow_out(liquid_waste) + m300.aspirate(20, liquid_waste) + else: + if blowout: + m300.blow_out(liquid_waste) + m300.aspirate(20, liquid_waste) + # m300.air_gap(20) + # extra removal in last wash step to remove residual ethanol + if last: + m300.aspirate(20, m.bottom(0.6)) + m300.aspirate(20, m.bottom(0.7)) + m300.aspirate(20, m.bottom(0.8)) + m300.dispense(m300.current_volume, liquid_waste) + m300.aspirate(20, liquid_waste) + if restore: + m300.drop_tip(spot) + else: + _drop(m300) + m300.flow_rate.aspirate = 90 + m300.flow_rate.dispense = 150 + + def bind(vol, bead_vol, reuse=True, restore=False): + """ + `bind` will perform magnetic bead binding on each sample in the + deepwell plate. The binding beads will be mixed before + transfer (with s1000 tool), and the samples will be mixed with the binding beads after + the transfer (with m300 tool). The magnetic deck activates after the addition to all + samples, and the supernatant is removed after bead binding. + :param vol (float): Amount of volume of Binding Buffer to add to each well. + :param bead_vol (float): The amount of volume of NucleoMag B-Beads to dispense to each well. + :param reuse (boolean): Whether to save sample-corresponding tips + between adding binding buffer and removing the supernatant + :param restore (boolean): Whether to save sample-corresponding tips for reuse in the next stepre + """ + if magdeck.status== 'engaged': + magdeck.disengage() + + # Multidispense loop for distributing beads + bead_aspirate_vol_total = num_samples * bead_vol + 50 + if bead_aspirate_vol_total >= 800: + bead_aspirate_vol = bead_aspirate_vol_total/2 + else: + bead_aspirate_vol = bead_aspirate_vol_total + + + bead_mix_vol_temp = num_samples * bead_vol + if bead_mix_vol_temp >= 900: + bead_mix_vol = 900 + else: + bead_mix_vol = bead_mix_vol_temp - 100 + + air_gap_vol = 20 + bead_dispense_vol = bead_vol + air_gap_vol + + #Mix loop to resuspend beads + s1000.pick_up_tip() + for x in range(3): + s1000.aspirate(bead_mix_vol, beads.bottom(5)) + s1000.dispense(bead_mix_vol, beads.bottom(5)) + for x in range(7): + s1000.aspirate(bead_mix_vol, beads.bottom(3)) + s1000.dispense(bead_mix_vol, beads.bottom(3)) + + s1000.aspirate(bead_aspirate_vol, beads.bottom(3)) + s1000.air_gap(air_gap_vol) + s1000.flow_rate.dispense = 1000 + for loop, (well) in enumerate(mag_samples_s): + if loop == 24: + s1000.aspirate(bead_aspirate_vol, beads.bottom(3)) + s1000.dispense(bead_dispense_vol, well.top(-2)) + s1000.air_gap(air_gap_vol) + # End of bead dispense + + for i, (well, spot) in enumerate(zip(mag_samples_m, parking_spots)): + _pick_up(m300) + num_trans = math.ceil(vol/200) + vol_per_trans = vol/num_trans + m300.flow_rate.aspirate = 100 + for t in range(num_trans): + src = binding_buffer[i//(max_num_columns//len(binding_buffer))] + if m300.current_volume > 0: + m300.dispense(m300.current_volume, src.top()) + m300.aspirate(vol_per_trans, src.bottom(bottom_tolerance)) + m300.aspirate(20, src.top(2)) + ctx.delay(minutes=0.1, msg='drop delay') + m300.dispense(vol_per_trans+20, well.top(-3)) + # m300.transfer(vol_per_trans, src.bottom(bottom_tolerance), well.top(-3), air_gap=20, new_tip='never') + if t < num_trans - 1: + m300.air_gap(20) + side = 1 if i % 2 == 0 else -1 + #loc_mix = well.bottom(1.5).move(Point(x=side*0.8)) + loc_mix_asp_bottom = well.bottom(2) + loc_mix_asp_top = well.bottom(5) + loc_mix_dis_bottom = well.bottom(1) + loc_mix_dis_pellet = well.bottom(1.5).move(Point(x=side*0.8)) + loc_mix_dis_top = well.bottom(15) + # maybe split into two mix pos. + # one directly over the bead pellet for the first 4-5 cycles + # a second one higher in the liquid column to distribute the beads during the later mix cycles) + # m300.mix(mix_reps_bind, 200, loc_mix) + ''' optimized mix ''' + + m300.flow_rate.aspirate = 60 + m300.flow_rate.dispense = 300 + # resuspend at pellet + for x in range(5): + m300.aspirate(250, loc_mix_asp_top) + m300.dispense(250, loc_mix_dis_pellet) + # resuspend beads across the entire liquid column + for x in range(5): + m300.aspirate(200, loc_mix_asp_top) + m300.dispense(200, loc_mix_dis_bottom) + m300.flow_rate.aspirate = 150 + for x in range(mix_reps_bind-5): + m300.aspirate(250, loc_mix_asp_bottom) + m300.dispense(250, loc_mix_dis_top) + m300.flow_rate.aspirate = 100 + m300.flow_rate.dispense = 200 + ''' end of optimized mix ''' + # aspirate and dispense 1µL at top(-10), is there a ctx.move command? + m300.aspirate(15, well.top(-10)) + ctx.delay(seconds=2, msg='Blow out delay') + m300.dispense(15, well.top(-10)) + m300.blow_out(well.top(-10)) + m300.air_gap(20) + if reuse: + m300.drop_tip(spot) + else: + _drop(m300) + + ctx.delay(minutes=2, msg='Incubate for 2 minutes') + magdeck.engage(height=Mag_height_SQW) + ctx.delay(minutes=sep_time_bind, msg='Incubating on MagDeck for ' + str(sep_time_bind) + ' minutes.') + + # remove initial supernatant + remove_supernatant(vol+bead_vol+starting_vol, reuse=reuse, restore=restore, last=False) + + + def wash(vol, source, mix_reps=mix_reps_wash, reuse=True, restore=True, resuspend=True, last=False, blowout=True): + """ + `wash` will perform bead washing for the extraction protocol. + :param vol (float): The amount of volume to aspirate from each + source and dispense to each well containing beads. + :param source (List[Well]): A list of wells from where liquid will be + aspirated. If the length of the source list + > 1, `wash` automatically calculates + the index of the source that should be + accessed. + :param mix_reps (int): The number of repititions to mix the beads with + specified wash buffer (ignored if resuspend is + False). + :param reuse (boolean): Whether to pick-up sample-corresponding tips for mixing and supernatant removal + that were restored in a previous step. + :param restore (boolean): Whether to park sample-corresponding tips for reuse in a later step + :param resuspend (boolean): Whether to resuspend beads in wash buffer. + """ + + if resuspend and magdeck.status == 'engaged': + magdeck.disengage() + + num_trans = math.ceil(vol/250) + vol_per_trans = vol/num_trans + + if reuse: #Dispense with fresh tips & mix with restored tips from previous step + _pick_up(m300) + for i, (m) in enumerate(mag_samples_m): + src = source[i//(max_num_columns//len(source))] + for n in range(num_trans): + if m300.current_volume > 0: + m300.dispense(m300.current_volume, src.top()) + m300.aspirate(vol_per_trans, src.bottom(bottom_tolerance)) + m300.aspirate(20, src.top(2)) + ctx.delay(minutes=0.2, msg='drop delay') + m300.dispense(vol_per_trans+20, m.top()) + # m300.transfer(vol_per_trans, src.bottom(bottom_tolerance), m.top(), air_gap=20, new_tip='never') + if n < num_trans - 1: # only air_gap if going back to source + m300.air_gap(20) + _drop(m300) + if resuspend: + m300.flow_rate.aspirate = 220 + m300.flow_rate.dispense = 300 + for i, (m, spot) in enumerate(zip(mag_samples_m, parking_spots)): + _pick_up(m300, spot) + side = 1 if i % 2 == 0 else -1 + # loc_mix = m.bottom(2).move(Point(x=side*1.5)) + ''' new mix locations ''' + loc_mix_asp_bottom = m.bottom(1.5) + loc_mix_asp_top = m.bottom(5) + loc_mix_dis_pellet = m.bottom(1.5).move(Point(x=side*0.8)) + loc_mix_dis_top = m.bottom(12) + ''' end of new mix locations ''' + src = source[i//(10//len(source))] + # for rep in range(mix_reps): + # m300.aspirate(250, loc_mix) + # m300.dispense(250, loc_mix) + ''' optimized mix ''' + # resuspend at pellet + for x in range(5): + m300.aspirate(250, loc_mix_asp_top) + m300.dispense(250, loc_mix_dis_pellet) + # resuspend beads across the entire liquid column + for x in range(mix_reps): + m300.aspirate(250, loc_mix_asp_bottom) + m300.dispense(250, loc_mix_dis_top) + ''' end of optimized mix ''' + m300.blow_out(m.bottom(13)) + m300.air_gap(20) + m300.drop_tip(spot) + m300.flow_rate.aspirate = 100 + m300.flow_rate.dispense = 200 + else: # Dispense & mix with fresh tips + for i, (m, spot) in enumerate(zip(mag_samples_m, parking_spots)): + _pick_up(m300) + side = 1 if i % 2 == 0 else -1 + #loc_mix = m.bottom(2).move(Point(x=side*1.5)) + ''' new mix locations ''' + loc_mix_asp_bottom = m.bottom(1.5) + loc_mix_asp_top = m.bottom(5) + loc_mix_dis_bottom = m.bottom(1) + loc_mix_dis_pellet = m.bottom(1.5).move(Point(x=side*0.8)) + loc_mix_dis_top = m.bottom(12) + ''' end of new mix locations ''' + src = source[i//(10//len(source))] + for n in range(num_trans): + if m300.current_volume > 0: + m300.dispense(m300.current_volume, src.top()) + m300.transfer(vol_per_trans, src.bottom(bottom_tolerance), m.top(), air_gap=20, new_tip='never') + if n < num_trans - 1: # only air_gap if going back to source + m300.air_gap(20) + if resuspend: + m300.flow_rate.aspirate = 80 + m300.flow_rate.dispense = 300 + # for rep in range(mix_reps): + # m300.aspirate(250, loc_mix) + # m300.dispense(250, loc_mix) + ''' optimized mix ''' + # resuspend at pellet + for x in range(5): + m300.aspirate(250, loc_mix_asp_top) + m300.dispense(250, loc_mix_dis_pellet) + for x in range(5): + m300.aspirate(200, loc_mix_asp_top) + m300.dispense(200, loc_mix_dis_bottom) + # resuspend beads across the entire liquid column + for x in range(mix_reps-5): + m300.aspirate(250, loc_mix_asp_bottom) + m300.dispense(250, loc_mix_dis_top) + ''' end of optimized mix ''' + m300.flow_rate.aspirate = 120 + m300.flow_rate.dispense = 200 + m300.blow_out(m.bottom(13)) + m300.air_gap(20) + m300.drop_tip(spot) + + + + + if magdeck.status == 'disengaged': + magdeck.engage(height=Mag_height_SQW) + + ctx.delay(minutes=sep_time_wash, msg='Incubating on MagDeck for ' + str(sep_time_wash) + ' minutes.') + + remove_supernatant(vol, reuse=True, restore=restore, last=last, blowout=blowout) + + def elute(vol): + """ + `elute` will perform elution from the deepwell extraciton plate to the + final clean elutions PCR plate to complete the extraction protocol. + :param vol (float): The amount of volume to aspirate from the elution + buffer source and dispense to each well containing + beads. + """ + + magdeck.disengage() + for i, (m) in enumerate(mag_samples_m): + _pick_up(m300) + side = 1 if i % 2 == 0 else -1 + loc_mix = m.bottom(1.5).move(Point(x=side*1.5)) + m300.aspirate(vol, elution_buffer.bottom(bottom_tolerance)) + m300.move_to(m.center()) + m300.dispense(vol, loc_mix) + m300.flow_rate.aspirate = 220 + m300.flow_rate.dispense = 300 + for mix in range(mix_reps_elu): + m300.aspirate(0.8*vol, loc_mix) + m300.dispense(0.8*vol, loc_mix) + m300.flow_rate.aspirate = 60 + m300.flow_rate.dispense = 100 + m300.blow_out(m.bottom(7)) + m300.air_gap(20) + _drop(m300) + + magdeck.engage(height=Mag_height_SQW) + ctx.delay(minutes=sep_time_elu, msg='Incubating on MagDeck for ' + str(sep_time_elu) + ' minutes.') + + m300.flow_rate.aspirate = 30 + + for i, (m, e) in enumerate(zip(mag_samples_m, elution_samples_m)): + _pick_up(m300) + side = -1 if i % 2 == 0 else 1 + loc = m.bottom(0.9).move(Point(x=side*0.8)) + m300.transfer(vol, loc, e.bottom(5), air_gap=20, new_tip='never') + + m300.blow_out(e.top(-1)) + m300.air_gap(10) + m300.drop_tip() + + magdeck.disengage() + + + """ + Here is where you can call the methods defined above to fit your specific + protocol. The normal sequence is: + """ + bind(binding_buffer_vol, bead_vol, reuse=True, restore=False) + + wash(wash1_vol, wash1, reuse=False, restore=False, resuspend=True, last=False, blowout=False) + wash(wash2_vol, wash2, reuse=False, restore=False, resuspend=True, last=False, blowout=False) + wash(wash3_vol, wash3, reuse=False, restore=False, resuspend=True, last=True, blowout=False) + + #replaced MV5 rinse with drying step + ctx.delay(minutes=dry_time, msg='Air dry') + + elute(elution_vol) + + # track final used tip + if tip_track and not ctx.is_simulating(): + if not os.path.isdir(folder_path): + os.mkdir(folder_path) + data = {'tips300': tip_log['count'][m300]} + with open(tip_file_path, 'w') as outfile: + json.dump(data, outfile) diff --git a/protocols/macherey-nagel-nucleomag-virus/README.md b/protocols/macherey-nagel-nucleomag-virus/README.md new file mode 100644 index 0000000000..8c5fbc2715 --- /dev/null +++ b/protocols/macherey-nagel-nucleomag-virus/README.md @@ -0,0 +1,97 @@ +# MACHEREY-NAGEL NucleoMag® Virus + + +### Author +[MACHEREY-NAGEL](https://www.mn-net.com/us) + +### Partner +[Opentrons](https://opentrons.com/) + + +# Opentrons has launched a new Protocol Library. You should use the [new page for this protocol](library.opentrons.com/p/macherey-nagel-nucleomag-virus). This page won’t be available after January 31st, 2024. + +## Categories +* Nucleic Acid Extraction & Purification + * MACHEREY-NAGEL NucleoMag® Virus + + +## Description +![MACHEREY-NAGEL](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/macherey-nagel/MN_Logo_50.jpeg) + +This protocol automates the NucleoMag® Virus kit for flexible magnetic bead based isolation. + +Before beginning the protocol on the OT-2, the following preparation steps are needed. +1. Perform the lysis according to the NucleoMag® Virus user manual. +2. Fill the 12-Well Buffer Reservoir according to the table below. +3. Resuspend the NucleoMag® V-Beads by vortexing and place them in Position A1 of the 2mL Tube Rack. +4. Load the instrument deck according to the displayed positions. +5. Place the Square-well Block containing the lysates on the Magnetic Module and start the run. + + +You can access the full description of this workflow on the OT-2 by visiting this link: [link](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/macherey-nagel-nucleomag-virus/thepdf.pdf) + + +### Modules +* [Opentrons Magnetic Module (GEN2)](https://shop.opentrons.com/magnetic-module-gen2/) + + +### Labware +* Macherey Nagel 96 Well Square Well Block +* Macherey Nagel 96 Well Elution Plate U-bottom +* [Opentrons 96 Tip Rack 300 µL](https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-300ul-tips) +* [Opentrons 24 Tube Rack with Generic 2 mL Screwcap](https://shop.opentrons.com/collections/opentrons-tips/products/tube-rack-set-1) +* [USA Scientific 12 Well Reservoir 22 mL #1061-8150](https://www.usascientific.com/12-channel-automation-reservoir.aspx) +* [Opentrons 96 Tip Rack 1000 µL](https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-1000ul-tips) +* [Agilent 1 Well Reservoir 290 mL #201252-100](https://www.agilent.com/store/en_US/Prod-201252-100/201252-100) + + +### Pipettes +* [Opentrons P300 8 Channel Electronic Pipette (GEN2)](https://shop.opentrons.com/8-channel-electronic-pipette/) +* [Opentrons P1000 Single Channel Electronic Pipette (GEN2)](https://shop.opentrons.com/single-channel-electronic-pipette-p20/) + + +### Deck Setup +![deck](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/macherey-nagel/deck.png) + + +### Reagent Setup +![reagents](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/macherey-nagel-nucleomag-virus/Screen+Shot+2022-11-02+at+11.27.24+AM.png) + + +### Protocol Steps +1. Binding Step +2. Wash 1 +3. Wash 2 +4. Delay for drying +5. Elution +
+
+* Note +The default values for all volumes, incubation times and mix repetitions were pretested and validated. +We do not recommend to change them. If you still decide to change them please scale all volumes proportionally. +For change recommendations please contact automation-bio@mn-net.de +
+
+ +**Process** +1. Input your protocol parameters below. +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/). +
+**Disclaimer**: MACHEREY-NAGEL GmbH & Co. KG makes every effort to include accurate and up-to-date information within this publication; however, it is possible that omissions or errors might have occurred. MACHEREY-NAGEL GmbH & Co. KG cannot, therefore, make any representations or warranties, expressed or implied, as to the accuracy or completeness of the information provided in this publication. Changes in this publication can be made at any time without notice. For technical details and detailed procedures of the specifications provided in this document please contact your MACHEREY-NAGEL representative. This publication may contain reference to applications and products which are not available in all markets. Please check with your local sales representative. +All mentioned trademarks are protected by law. All used names and denotations can be brands, trademarks, or registered labels of their respective owner – also if they are not special denotation. To mention products and brands is only a kind of information (i.e., it does not offend against trademarks and brands and can not be seen as a kind of recommendation or assessment). Reference herein to any specific commercial product, process, or service by trade name, trademark, manufacturer, or otherwise, does not necessarily constitute or imply its endorsement, recommendation, or support by MACHEREY-NAGEL GmbH & Co. KG or Opentrons. Any views or opinions expressed herein by the authors' do not necessarily state or reflect those of MACHEREY-NAGEL or the Eppendorf AG. NucleoMag® is a registered trademark of MACHEREY-NAGEL GmbH & Co. KG, Düren, Germany. Opentrons OT-2 is a device from Opentrons, New York, USA. +
+* The Download links includes all Protocols in their respective subfolders as well as the .json files for the two labware files. + + +###### Internal +macherey-nagel-nucleomag-virus diff --git a/protocols/macherey-nagel-nucleomag-virus/fields.json b/protocols/macherey-nagel-nucleomag-virus/fields.json new file mode 100644 index 0000000000..e1de313031 --- /dev/null +++ b/protocols/macherey-nagel-nucleomag-virus/fields.json @@ -0,0 +1,101 @@ +[ + { + "type": "int", + "label": "Number of Samples [1-48 samples]", + "name": "num_samples", + "default": 48 + }, + { + "type": "int", + "label": "Starting Volume", + "name": "starting_vol", + "default": 414 + }, + { + "type": "int", + "label": "Elution Volume [50-200µL]", + "name": "elution_vol", + "default": 100 + }, + { + "type": "int", + "label": "Binding Buffer Volume", + "name": "binding_buffer_vol", + "default": 600 + }, + { + "type": "int", + "label": "Bead Volume", + "name": "bead_vol", + "default": 30 + }, + { + "type": "int", + "label": "Wash 1 Volume", + "name": "wash1_vol", + "default": 500 + }, + { + "type": "int", + "label": "Wash 2 Volume", + "name": "wash2_vol", + "default": 500 + }, + { + "type": "int", + "label": "Wash 3 Volume", + "name": "wash3_vol", + "default": 0 + }, + { + "type": "int", + "label": "Mix Repetitions During Binding [pretested default, changing is not recommended]", + "name": "mix_reps_bind", + "default": 20 + }, + { + "type": "int", + "label": "Mix Repetitions during Wash [pretested default, changing is not recommended]", + "name": "mix_reps_wash", + "default": 15 + }, + { + "type": "int", + "label": "Mix Repetitions during Elution [pretested default, changing is not recommended]", + "name": "mix_reps_elu", + "default": 20 + }, + { + "type": "int", + "label": "Separation Time during Binding [pretested default, changing is not recommended]", + "name": "sep_time_bind", + "default": 5 + }, + { + "type": "int", + "label": "Separation Time during Wash [pretested default, changing is not recommended]", + "name": "sep_time_wash", + "default": 2 + }, + { + "type": "int", + "label": "Separation Time during Elution [pretested default, changing is not recommended]", + "name": "sep_time_elu", + "default": 5 + }, + { + "type": "int", + "label": "Time for Air Dry [pretested default, changing is not recommended]", + "name": "dry_time", + "default": 20 + }, + { + "type": "dropDown", + "label": "Track Tips Between Runs", + "name": "tip_track", + "options": [ + { "label": "No", "value": 0 }, + { "label": "Yes", "value": 1 } + ] + } + ] diff --git a/protocols/macherey-nagel-nucleomag-virus/labware/96_elutionplate_ubottom_by_macherey_nagel.json b/protocols/macherey-nagel-nucleomag-virus/labware/96_elutionplate_ubottom_by_macherey_nagel.json new file mode 100644 index 0000000000..67a7627a70 --- /dev/null +++ b/protocols/macherey-nagel-nucleomag-virus/labware/96_elutionplate_ubottom_by_macherey_nagel.json @@ -0,0 +1,1127 @@ +{ + "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": "Macherey-Nagel", + "brandId": [ + "Elution Plate U-bottom (REF740672)" + ] + }, + "metadata": { + "displayName": "96_Elutionplate_ubottom_by_Macherey_Nagel", + "displayCategory": "wellPlate", + "displayVolumeUnits": "µL", + "tags": [] + }, + "dimensions": { + "xDimension": 127.6, + "yDimension": 85.6, + "zDimension": 14.2 + }, + "wells": { + "A1": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 11.1, + "y": 71.3, + "z": 3.8 + }, + "B1": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 11.1, + "y": 62.29, + "z": 3.8 + }, + "C1": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 11.1, + "y": 53.28, + "z": 3.8 + }, + "D1": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 11.1, + "y": 44.27, + "z": 3.8 + }, + "E1": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 11.1, + "y": 35.26, + "z": 3.8 + }, + "F1": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 11.1, + "y": 26.25, + "z": 3.8 + }, + "G1": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 11.1, + "y": 17.24, + "z": 3.8 + }, + "H1": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 11.1, + "y": 8.23, + "z": 3.8 + }, + "A2": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 20.11, + "y": 71.3, + "z": 3.8 + }, + "B2": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 20.11, + "y": 62.29, + "z": 3.8 + }, + "C2": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 20.11, + "y": 53.28, + "z": 3.8 + }, + "D2": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 20.11, + "y": 44.27, + "z": 3.8 + }, + "E2": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 20.11, + "y": 35.26, + "z": 3.8 + }, + "F2": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 20.11, + "y": 26.25, + "z": 3.8 + }, + "G2": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 20.11, + "y": 17.24, + "z": 3.8 + }, + "H2": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 20.11, + "y": 8.23, + "z": 3.8 + }, + "A3": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 29.12, + "y": 71.3, + "z": 3.8 + }, + "B3": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 29.12, + "y": 62.29, + "z": 3.8 + }, + "C3": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 29.12, + "y": 53.28, + "z": 3.8 + }, + "D3": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 29.12, + "y": 44.27, + "z": 3.8 + }, + "E3": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 29.12, + "y": 35.26, + "z": 3.8 + }, + "F3": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 29.12, + "y": 26.25, + "z": 3.8 + }, + "G3": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 29.12, + "y": 17.24, + "z": 3.8 + }, + "H3": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 29.12, + "y": 8.23, + "z": 3.8 + }, + "A4": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 38.13, + "y": 71.3, + "z": 3.8 + }, + "B4": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 38.13, + "y": 62.29, + "z": 3.8 + }, + "C4": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 38.13, + "y": 53.28, + "z": 3.8 + }, + "D4": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 38.13, + "y": 44.27, + "z": 3.8 + }, + "E4": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 38.13, + "y": 35.26, + "z": 3.8 + }, + "F4": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 38.13, + "y": 26.25, + "z": 3.8 + }, + "G4": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 38.13, + "y": 17.24, + "z": 3.8 + }, + "H4": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 38.13, + "y": 8.23, + "z": 3.8 + }, + "A5": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 47.14, + "y": 71.3, + "z": 3.8 + }, + "B5": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 47.14, + "y": 62.29, + "z": 3.8 + }, + "C5": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 47.14, + "y": 53.28, + "z": 3.8 + }, + "D5": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 47.14, + "y": 44.27, + "z": 3.8 + }, + "E5": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 47.14, + "y": 35.26, + "z": 3.8 + }, + "F5": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 47.14, + "y": 26.25, + "z": 3.8 + }, + "G5": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 47.14, + "y": 17.24, + "z": 3.8 + }, + "H5": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 47.14, + "y": 8.23, + "z": 3.8 + }, + "A6": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 56.15, + "y": 71.3, + "z": 3.8 + }, + "B6": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 56.15, + "y": 62.29, + "z": 3.8 + }, + "C6": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 56.15, + "y": 53.28, + "z": 3.8 + }, + "D6": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 56.15, + "y": 44.27, + "z": 3.8 + }, + "E6": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 56.15, + "y": 35.26, + "z": 3.8 + }, + "F6": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 56.15, + "y": 26.25, + "z": 3.8 + }, + "G6": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 56.15, + "y": 17.24, + "z": 3.8 + }, + "H6": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 56.15, + "y": 8.23, + "z": 3.8 + }, + "A7": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 65.16, + "y": 71.3, + "z": 3.8 + }, + "B7": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 65.16, + "y": 62.29, + "z": 3.8 + }, + "C7": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 65.16, + "y": 53.28, + "z": 3.8 + }, + "D7": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 65.16, + "y": 44.27, + "z": 3.8 + }, + "E7": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 65.16, + "y": 35.26, + "z": 3.8 + }, + "F7": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 65.16, + "y": 26.25, + "z": 3.8 + }, + "G7": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 65.16, + "y": 17.24, + "z": 3.8 + }, + "H7": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 65.16, + "y": 8.23, + "z": 3.8 + }, + "A8": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 74.17, + "y": 71.3, + "z": 3.8 + }, + "B8": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 74.17, + "y": 62.29, + "z": 3.8 + }, + "C8": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 74.17, + "y": 53.28, + "z": 3.8 + }, + "D8": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 74.17, + "y": 44.27, + "z": 3.8 + }, + "E8": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 74.17, + "y": 35.26, + "z": 3.8 + }, + "F8": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 74.17, + "y": 26.25, + "z": 3.8 + }, + "G8": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 74.17, + "y": 17.24, + "z": 3.8 + }, + "H8": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 74.17, + "y": 8.23, + "z": 3.8 + }, + "A9": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 83.18, + "y": 71.3, + "z": 3.8 + }, + "B9": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 83.18, + "y": 62.29, + "z": 3.8 + }, + "C9": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 83.18, + "y": 53.28, + "z": 3.8 + }, + "D9": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 83.18, + "y": 44.27, + "z": 3.8 + }, + "E9": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 83.18, + "y": 35.26, + "z": 3.8 + }, + "F9": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 83.18, + "y": 26.25, + "z": 3.8 + }, + "G9": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 83.18, + "y": 17.24, + "z": 3.8 + }, + "H9": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 83.18, + "y": 8.23, + "z": 3.8 + }, + "A10": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 92.19, + "y": 71.3, + "z": 3.8 + }, + "B10": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 92.19, + "y": 62.29, + "z": 3.8 + }, + "C10": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 92.19, + "y": 53.28, + "z": 3.8 + }, + "D10": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 92.19, + "y": 44.27, + "z": 3.8 + }, + "E10": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 92.19, + "y": 35.26, + "z": 3.8 + }, + "F10": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 92.19, + "y": 26.25, + "z": 3.8 + }, + "G10": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 92.19, + "y": 17.24, + "z": 3.8 + }, + "H10": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 92.19, + "y": 8.23, + "z": 3.8 + }, + "A11": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 101.2, + "y": 71.3, + "z": 3.8 + }, + "B11": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 101.2, + "y": 62.29, + "z": 3.8 + }, + "C11": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 101.2, + "y": 53.28, + "z": 3.8 + }, + "D11": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 101.2, + "y": 44.27, + "z": 3.8 + }, + "E11": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 101.2, + "y": 35.26, + "z": 3.8 + }, + "F11": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 101.2, + "y": 26.25, + "z": 3.8 + }, + "G11": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 101.2, + "y": 17.24, + "z": 3.8 + }, + "H11": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 101.2, + "y": 8.23, + "z": 3.8 + }, + "A12": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 110.21, + "y": 71.3, + "z": 3.8 + }, + "B12": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 110.21, + "y": 62.29, + "z": 3.8 + }, + "C12": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 110.21, + "y": 53.28, + "z": 3.8 + }, + "D12": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 110.21, + "y": 44.27, + "z": 3.8 + }, + "E12": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 110.21, + "y": 35.26, + "z": 3.8 + }, + "F12": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 110.21, + "y": 26.25, + "z": 3.8 + }, + "G12": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 110.21, + "y": 17.24, + "z": 3.8 + }, + "H12": { + "depth": 10.4, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 6.8, + "x": 110.21, + "y": 8.23, + "z": 3.8 + } + }, + "groups": [ + { + "metadata": { + "wellBottomShape": "u" + }, + "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": "96_elutionplate_ubottom_by_macherey_nagel" + }, + "namespace": "custom_beta", + "version": 1, + "schemaVersion": 2, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + } +} \ No newline at end of file diff --git a/protocols/macherey-nagel-nucleomag-virus/labware/96_squarewell_block_macherey_nagel.json b/protocols/macherey-nagel-nucleomag-virus/labware/96_squarewell_block_macherey_nagel.json new file mode 100644 index 0000000000..e8e073702d --- /dev/null +++ b/protocols/macherey-nagel-nucleomag-virus/labware/96_squarewell_block_macherey_nagel.json @@ -0,0 +1,1223 @@ +{ + "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": "Macherey-Nagel", + "brandId": [ + "Square-Well Block (REF740670)" + ] + }, + "metadata": { + "displayName": "96 Square-Well Block by Macherey-Nagel", + "displayCategory": "wellPlate", + "displayVolumeUnits": "µL", + "tags": [] + }, + "dimensions": { + "xDimension": 127.6, + "yDimension": 85.6, + "zDimension": 44.15 + }, + "wells": { + "A1": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 11.1, + "y": 71.3, + "z": 1.95 + }, + "B1": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 11.1, + "y": 62.3, + "z": 1.95 + }, + "C1": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 11.1, + "y": 53.3, + "z": 1.95 + }, + "D1": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 11.1, + "y": 44.3, + "z": 1.95 + }, + "E1": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 11.1, + "y": 35.3, + "z": 1.95 + }, + "F1": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 11.1, + "y": 26.3, + "z": 1.95 + }, + "G1": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 11.1, + "y": 17.3, + "z": 1.95 + }, + "H1": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 11.1, + "y": 8.3, + "z": 1.95 + }, + "A2": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 20.1, + "y": 71.3, + "z": 1.95 + }, + "B2": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 20.1, + "y": 62.3, + "z": 1.95 + }, + "C2": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 20.1, + "y": 53.3, + "z": 1.95 + }, + "D2": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 20.1, + "y": 44.3, + "z": 1.95 + }, + "E2": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 20.1, + "y": 35.3, + "z": 1.95 + }, + "F2": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 20.1, + "y": 26.3, + "z": 1.95 + }, + "G2": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 20.1, + "y": 17.3, + "z": 1.95 + }, + "H2": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 20.1, + "y": 8.3, + "z": 1.95 + }, + "A3": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 29.1, + "y": 71.3, + "z": 1.95 + }, + "B3": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 29.1, + "y": 62.3, + "z": 1.95 + }, + "C3": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 29.1, + "y": 53.3, + "z": 1.95 + }, + "D3": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 29.1, + "y": 44.3, + "z": 1.95 + }, + "E3": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 29.1, + "y": 35.3, + "z": 1.95 + }, + "F3": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 29.1, + "y": 26.3, + "z": 1.95 + }, + "G3": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 29.1, + "y": 17.3, + "z": 1.95 + }, + "H3": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 29.1, + "y": 8.3, + "z": 1.95 + }, + "A4": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 38.1, + "y": 71.3, + "z": 1.95 + }, + "B4": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 38.1, + "y": 62.3, + "z": 1.95 + }, + "C4": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 38.1, + "y": 53.3, + "z": 1.95 + }, + "D4": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 38.1, + "y": 44.3, + "z": 1.95 + }, + "E4": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 38.1, + "y": 35.3, + "z": 1.95 + }, + "F4": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 38.1, + "y": 26.3, + "z": 1.95 + }, + "G4": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 38.1, + "y": 17.3, + "z": 1.95 + }, + "H4": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 38.1, + "y": 8.3, + "z": 1.95 + }, + "A5": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 47.1, + "y": 71.3, + "z": 1.95 + }, + "B5": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 47.1, + "y": 62.3, + "z": 1.95 + }, + "C5": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 47.1, + "y": 53.3, + "z": 1.95 + }, + "D5": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 47.1, + "y": 44.3, + "z": 1.95 + }, + "E5": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 47.1, + "y": 35.3, + "z": 1.95 + }, + "F5": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 47.1, + "y": 26.3, + "z": 1.95 + }, + "G5": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 47.1, + "y": 17.3, + "z": 1.95 + }, + "H5": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 47.1, + "y": 8.3, + "z": 1.95 + }, + "A6": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 56.1, + "y": 71.3, + "z": 1.95 + }, + "B6": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 56.1, + "y": 62.3, + "z": 1.95 + }, + "C6": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 56.1, + "y": 53.3, + "z": 1.95 + }, + "D6": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 56.1, + "y": 44.3, + "z": 1.95 + }, + "E6": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 56.1, + "y": 35.3, + "z": 1.95 + }, + "F6": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 56.1, + "y": 26.3, + "z": 1.95 + }, + "G6": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 56.1, + "y": 17.3, + "z": 1.95 + }, + "H6": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 56.1, + "y": 8.3, + "z": 1.95 + }, + "A7": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 65.1, + "y": 71.3, + "z": 1.95 + }, + "B7": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 65.1, + "y": 62.3, + "z": 1.95 + }, + "C7": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 65.1, + "y": 53.3, + "z": 1.95 + }, + "D7": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 65.1, + "y": 44.3, + "z": 1.95 + }, + "E7": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 65.1, + "y": 35.3, + "z": 1.95 + }, + "F7": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 65.1, + "y": 26.3, + "z": 1.95 + }, + "G7": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 65.1, + "y": 17.3, + "z": 1.95 + }, + "H7": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 65.1, + "y": 8.3, + "z": 1.95 + }, + "A8": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 74.1, + "y": 71.3, + "z": 1.95 + }, + "B8": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 74.1, + "y": 62.3, + "z": 1.95 + }, + "C8": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 74.1, + "y": 53.3, + "z": 1.95 + }, + "D8": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 74.1, + "y": 44.3, + "z": 1.95 + }, + "E8": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 74.1, + "y": 35.3, + "z": 1.95 + }, + "F8": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 74.1, + "y": 26.3, + "z": 1.95 + }, + "G8": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 74.1, + "y": 17.3, + "z": 1.95 + }, + "H8": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 74.1, + "y": 8.3, + "z": 1.95 + }, + "A9": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 83.1, + "y": 71.3, + "z": 1.95 + }, + "B9": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 83.1, + "y": 62.3, + "z": 1.95 + }, + "C9": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 83.1, + "y": 53.3, + "z": 1.95 + }, + "D9": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 83.1, + "y": 44.3, + "z": 1.95 + }, + "E9": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 83.1, + "y": 35.3, + "z": 1.95 + }, + "F9": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 83.1, + "y": 26.3, + "z": 1.95 + }, + "G9": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 83.1, + "y": 17.3, + "z": 1.95 + }, + "H9": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 83.1, + "y": 8.3, + "z": 1.95 + }, + "A10": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 92.1, + "y": 71.3, + "z": 1.95 + }, + "B10": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 92.1, + "y": 62.3, + "z": 1.95 + }, + "C10": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 92.1, + "y": 53.3, + "z": 1.95 + }, + "D10": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 92.1, + "y": 44.3, + "z": 1.95 + }, + "E10": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 92.1, + "y": 35.3, + "z": 1.95 + }, + "F10": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 92.1, + "y": 26.3, + "z": 1.95 + }, + "G10": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 92.1, + "y": 17.3, + "z": 1.95 + }, + "H10": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 92.1, + "y": 8.3, + "z": 1.95 + }, + "A11": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 101.1, + "y": 71.3, + "z": 1.95 + }, + "B11": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 101.1, + "y": 62.3, + "z": 1.95 + }, + "C11": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 101.1, + "y": 53.3, + "z": 1.95 + }, + "D11": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 101.1, + "y": 44.3, + "z": 1.95 + }, + "E11": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 101.1, + "y": 35.3, + "z": 1.95 + }, + "F11": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 101.1, + "y": 26.3, + "z": 1.95 + }, + "G11": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 101.1, + "y": 17.3, + "z": 1.95 + }, + "H11": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 101.1, + "y": 8.3, + "z": 1.95 + }, + "A12": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 110.1, + "y": 71.3, + "z": 1.95 + }, + "B12": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 110.1, + "y": 62.3, + "z": 1.95 + }, + "C12": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 110.1, + "y": 53.3, + "z": 1.95 + }, + "D12": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 110.1, + "y": 44.3, + "z": 1.95 + }, + "E12": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 110.1, + "y": 35.3, + "z": 1.95 + }, + "F12": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 110.1, + "y": 26.3, + "z": 1.95 + }, + "G12": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 110.1, + "y": 17.3, + "z": 1.95 + }, + "H12": { + "depth": 42.2, + "totalLiquidVolume": 2500, + "shape": "rectangular", + "xDimension": 8, + "yDimension": 8.1, + "x": 110.1, + "y": 8.3, + "z": 1.95 + } + }, + "groups": [ + { + "metadata": { + "wellBottomShape": "u" + }, + "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": "96_squarewell_block_macherey_nagel" + }, + "namespace": "custom_beta", + "version": 1, + "schemaVersion": 2, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + } +} \ No newline at end of file diff --git a/protocols/macherey-nagel-nucleomag-virus/macherey-nagel-nucleomag-virus.ot2.apiv2.py b/protocols/macherey-nagel-nucleomag-virus/macherey-nagel-nucleomag-virus.ot2.apiv2.py new file mode 100644 index 0000000000..494ce9b004 --- /dev/null +++ b/protocols/macherey-nagel-nucleomag-virus/macherey-nagel-nucleomag-virus.ot2.apiv2.py @@ -0,0 +1,589 @@ +# flake8: noqa +from opentrons.types import Point +import json +import os +import math + +metadata = {'protocolName': 'NucleoMag_Virus_Rev01', 'author': 'Macherey-Nagel ', 'apiLevel': '2.9'} + +def run(ctx): + + ''' + Variable definition + ''' + [num_samples, + starting_vol, + elution_vol, + binding_buffer_vol, + bead_vol, + wash1_vol, + wash2_vol, + wash3_vol, + mix_reps_bind, + mix_reps_wash, + mix_reps_elu, + sep_time_bind, + sep_time_wash, + sep_time_elu, + dry_time, + tip_track] = [48, 414, 100, 600, 30, 500, 500, 0, + 20, 15, 20, 5, 2, 5, 20, False] + + total_vol_per_sample = starting_vol + binding_buffer_vol + wash1_vol + wash2_vol + wash3_vol + run_liq_waste_vol = num_samples * total_vol_per_sample + + + + Mag_height_SQW = 5.5 + + bottom_tolerance = 2.8 + # Bottom tolerance for aspriation from 12 Well Buffer Reserovir + + max_num_sample = 48 + max_num_columns = max_num_sample//8 + + ''' + End of Variable Definition + ''' + + ''' + define minimum & maximum volumes + ''' + if not 380 <= starting_vol <= 420: + raise Exception('Starting volume should be from 360 - 420µl.') + if not 50 <= elution_vol <= 200: + raise Exception('Elution volume should be from 50 - 200µl.') + if not run_liq_waste_vol <= 290000: + raise Exception('Number of samples exceeds maximum liquid waste volume of 400mL.') + if not num_samples <= max_num_sample: + raise Exception('Number of samples exceeds maximum number of 48 samples.') + ''' + End of defining minimum & maximum volumes + ''' + + ''' + Deck and Labware definition + ''' + magdeck = ctx.load_module('magnetic module gen2', '10') + magdeck.disengage() + sep_plate = magdeck.load_labware('96_squarewell_block_macherey_nagel', 'Separation Plate') + + liquid_waste = ctx.load_labware('agilent_1_reservoir_290ml', '11', 'Liquid Waste').wells()[0].top() + + elution_plate = ctx.load_labware('96_elutionplate_ubottom_by_macherey_nagel', '1', 'Elution Plate') + + tips300 = [ctx.load_labware('opentrons_96_tiprack_300ul', slot,'300µl filtertiprack') for slot in ['2', '3', '5', '6']] + tips1000 = ctx.load_labware('opentrons_96_tiprack_1000ul', '9','1000µl filtertiprack') + + num_cols = math.ceil(num_samples/8) + + parkingrack = ctx.load_labware('opentrons_96_tiprack_300ul', '8', 'empty tiprack for parking') + parking_spots = parkingrack.rows()[0][:num_cols] + + buffers = ctx.load_labware('usascientific_12_reservoir_22ml', '7', 'NucleoMag Buffers') + + beads = ctx.load_labware('opentrons_24_tuberack_generic_2ml_screwcap', '4', 'NucleoMag B-Beads').wells()[0] + # Beads are placed in a single 2mL screwcap tube at A1 + # Make sure the tip will not spill beads when driving down into the tube because of to high amount in the tube + + ''' + End of Deck and Labware definition + ''' + + ''' + Define reagents + + Well 1 & 2 Binding Buffer MV2 + Well 4 & 5 Wash Buffer MV3 + Well 7 & 8 Wash Buffer MV4 + Well 9, 10 & 11 empty (Rinse replaced with Air dry) + Well 12 Elution Buffer MV6 + + ''' + binding_buffer = buffers.wells()[:2] + wash1 = buffers.wells()[3:5] + wash2 = buffers.wells()[6:8] + wash3 = buffers.wells()[8:11] + elution_buffer = buffers.wells()[11] + ''' + End of reagent definition + ''' + + ''' + tool configuration + ''' + m300 = ctx.load_instrument('p300_multi_gen2', 'left', tip_racks=tips300) + s1000 = ctx.load_instrument('p1000_single_gen2', 'right', tip_racks=[tips1000]) + ''' + End of tool configuration + ''' + + ''' + Value calculations + ''' + mag_samples_s = sep_plate.wells()[:num_samples] + mag_samples_m = sep_plate.rows()[0][:num_cols] + elution_samples_m = elution_plate.rows()[0][:num_cols] + ''' + End of Calculations + ''' + + #sets initial pipetting speeds + m300.flow_rate.aspirate = 100 + m300.flow_rate.dispense = 150 + m300.flow_rate.blow_out = 200 + + s1000.flow_rate.aspirate = 750 + s1000.flow_rate.dispense = 900 + + #define initial pipetting clearance + m300.well_bottom_clearance.aspirate = 5 + m300.well_bottom_clearance.dispense = 25 + + ''' + tip logging and waste handling + ''' + folder_path = '/data/B' + tip_file_path = folder_path + '/tip_log.json' + tip_log = {'count': {}} + if tip_track and not ctx.is_simulating(): + if os.path.isfile(tip_file_path): + with open(tip_file_path) as json_file: + data = json.load(json_file) + if 'tips300' in data: + tip_log['count'][m300] = data['tips300'] + else: + tip_log['count'][m300] = 0 + else: + tip_log['count'][m300] = 0 + else: + tip_log['count'] = {m300: 0} + + tip_log['tips'] = { + m300: [tip for rack in tips300 for tip in rack.rows()[0]]} + tip_log['max'] = {m300: len(tip_log['tips'][m300])} + + # kept _pick_up as default + def _pick_up(pip, loc=None): + nonlocal tip_log + if tip_log['count'][pip] == tip_log['max'][pip] and not loc: + ctx.pause('Replace ' + str(pip.max_volume) + 'µl tipracks before \ resuming.') + pip.reset_tipracks() + tip_log['count'][pip] = 0 + if loc: + pip.pick_up_tip(loc) + else: + pip.pick_up_tip(tip_log['tips'][pip][tip_log['count'][pip]]) + tip_log['count'][pip] += 1 + + switch = True + drop_count = 0 + # number of tips trash will accommodate before prompting user to empty + drop_threshold = 192 + + def _drop(pip): + nonlocal switch + nonlocal drop_count + side = 30 if switch else -18 + drop_loc = ctx.loaded_labwares[12].wells()[0].top().move( + Point(x=side)) + pip.drop_tip(drop_loc) + switch = not switch + drop_count += 8 + if drop_count == drop_threshold: + m300.home() + ctx.pause('Please empty tips from waste before resuming.') + + ctx.home() # home before continuing with protocol + + drop_count = 0 + + waste_vol = 0 + waste_threshold = 300000 #this would need to be changed since we use a dedicated liquid waste reservoir + + ''' + End of tip logging and wase handling + ''' + + def remove_supernatant(vol, reuse=False, restore=False, last=False, blowout=True): + + """ + `remove_supernatant` will transfer supernatant from the deepwell + extraction plate to the liquid waste reservoir. + :param vol (float): The amount of volume to aspirate from all deepwell + sample wells and dispense in the liquid waste. + :param reuse (boolean): Whether to pick up previously restored sample-corresponding tips + from the 'parking rack' or to pick up new tips. + :param restore (boolean): Whether to park used tips in the 'parking rack' or discard them to waste. + :param last (boolean): Does perform the supernatant removal at the lowest hight possible with an extra over aspiration volume for the last wash step to optimize drying performance + """ + + def _waste_track(vol): + nonlocal waste_vol + if waste_vol + vol >= waste_threshold: + ctx.pause('Please empty liquid waste (slot 11) before \ resuming.') + ctx.home() + waste_vol = 0 + waste_vol += vol + if last: + vol=vol+60 + num_trans = math.ceil(vol/200) + vol_per_trans = vol/num_trans + m300.flow_rate.aspirate = 15 + m300.flow_rate.dispense = 90 + + for i, (m, spot) in enumerate(zip(mag_samples_m, parking_spots)): + if reuse: + _pick_up(m300, spot) + else: + _pick_up(m300) + side = -1 if i % 2 == 0 else 1 + #position modifier to aspirate away from the bead pellet + for _ in range(num_trans): + _waste_track(vol_per_trans*8) + if m300.current_volume > 0: + m300.dispense(m300.current_volume, m.top(-10)) + m300.move_to(m.center()) + if _ == num_trans-1: + if last: + loc = m.bottom(0.7).move(Point(x=side*0.5)) + else: + loc = m.bottom(0.8).move(Point(x=side*0.7)) + else: + loc = m.bottom(1.0).move(Point(x=side*1)) + + m300.transfer(vol_per_trans, loc, liquid_waste, new_tip='never', + air_gap=20) + + if _ == num_trans-1: + if blowout: + m300.blow_out(liquid_waste) + m300.aspirate(20, liquid_waste) + else: + if blowout: + m300.blow_out(liquid_waste) + m300.aspirate(20, liquid_waste) + # m300.air_gap(20) + # extra removal in last wash step to remove residual ethanol + if last: + m300.aspirate(20, m.bottom(0.6)) + m300.aspirate(20, m.bottom(0.7)) + m300.aspirate(20, m.bottom(0.8)) + m300.dispense(m300.current_volume, liquid_waste) + m300.aspirate(20, liquid_waste) + if restore: + m300.drop_tip(spot) + else: + _drop(m300) + m300.flow_rate.aspirate = 90 + m300.flow_rate.dispense = 150 + + def bind(vol, bead_vol, reuse=True, restore=False): + """ + `bind` will perform magnetic bead binding on each sample in the + deepwell plate. The binding beads will be mixed before + transfer (with s1000 tool), and the samples will be mixed with the binding beads after + the transfer (with m300 tool). The magnetic deck activates after the addition to all + samples, and the supernatant is removed after bead binding. + :param vol (float): Amount of volume of Binding Buffer to add to each well. + :param bead_vol (float): The amount of volume of NucleoMag B-Beads to dispense to each well. + :param reuse (boolean): Whether to save sample-corresponding tips + between adding binding buffer and removing the supernatant + :param restore (boolean): Whether to save sample-corresponding tips for reuse in the next stepre + """ + if magdeck.status== 'engaged': + magdeck.disengage() + + # Multidispense loop for distributing beads + bead_aspirate_vol_total = num_samples * bead_vol + 50 + if bead_aspirate_vol_total >= 800: + bead_aspirate_vol = bead_aspirate_vol_total/2 + else: + bead_aspirate_vol = bead_aspirate_vol_total + + + bead_mix_vol_temp = num_samples * bead_vol + if bead_mix_vol_temp >= 900: + bead_mix_vol = 900 + else: + bead_mix_vol = bead_mix_vol_temp - 100 + + air_gap_vol = 20 + bead_dispense_vol = bead_vol + air_gap_vol + + #Mix loop to resuspend beads + s1000.pick_up_tip() + for x in range(3): + s1000.aspirate(bead_mix_vol, beads.bottom(5)) + s1000.dispense(bead_mix_vol, beads.bottom(5)) + for x in range(7): + s1000.aspirate(bead_mix_vol, beads.bottom(3)) + s1000.dispense(bead_mix_vol, beads.bottom(3)) + + s1000.aspirate(bead_aspirate_vol, beads.bottom(3)) + s1000.air_gap(air_gap_vol) + s1000.flow_rate.dispense = 1000 + for loop, (well) in enumerate(mag_samples_s): + if loop == 24: + s1000.aspirate(bead_aspirate_vol, beads.bottom(3)) + s1000.dispense(bead_dispense_vol, well.top(-2)) + s1000.air_gap(air_gap_vol) + # End of bead dispense + + for i, (well, spot) in enumerate(zip(mag_samples_m, parking_spots)): + _pick_up(m300) + num_trans = math.ceil(vol/200) + vol_per_trans = vol/num_trans + m300.flow_rate.aspirate = 100 + for t in range(num_trans): + src = binding_buffer[i//(max_num_columns//len(binding_buffer))] + if m300.current_volume > 0: + m300.dispense(m300.current_volume, src.top()) + m300.aspirate(vol_per_trans, src.bottom(bottom_tolerance)) + m300.aspirate(20, src.top(2)) + ctx.delay(seconds=5, msg='drop delay') + m300.dispense(vol_per_trans+20, well.top(-3)) + # m300.transfer(vol_per_trans, src.bottom(bottom_tolerance), well.top(-3), air_gap=20, new_tip='never') + if t < num_trans - 1: + m300.air_gap(20) + side = 1 if i % 2 == 0 else -1 + #loc_mix = well.bottom(1.5).move(Point(x=side*0.8)) + loc_mix_asp_bottom = well.bottom(2) + loc_mix_asp_top = well.bottom(5) + loc_mix_dis_bottom = well.bottom(1) + loc_mix_dis_pellet = well.bottom(1.5).move(Point(x=side*0.8)) + loc_mix_dis_top = well.bottom(15) + # maybe split into two mix pos. + # one directly over the bead pellet for the first 4-5 cycles + # a second one higher in the liquid column to distribute the beads during the later mix cycles) + # m300.mix(mix_reps_bind, 200, loc_mix) + ''' optimized mix ''' + + m300.flow_rate.aspirate = 60 + m300.flow_rate.dispense = 300 + # resuspend at pellet + for x in range(5): + m300.aspirate(250, loc_mix_asp_top) + m300.dispense(250, loc_mix_dis_pellet) + # resuspend beads across the entire liquid column + for x in range(5): + m300.aspirate(200, loc_mix_asp_top) + m300.dispense(200, loc_mix_dis_bottom) + m300.flow_rate.aspirate = 150 + for x in range(mix_reps_bind-5): + m300.aspirate(250, loc_mix_asp_bottom) + m300.dispense(250, loc_mix_dis_top) + m300.flow_rate.aspirate = 100 + m300.flow_rate.dispense = 200 + ''' end of optimized mix ''' + # aspirate and dispense 1µL at top(-10), is there a ctx.move command? + m300.aspirate(15, well.top(-10)) + ctx.delay(seconds=3, msg='Blow out delay') + m300.dispense(15, well.top(-10)) + m300.blow_out(well.bottom(22)) + m300.air_gap(5) + if reuse: + m300.drop_tip(spot) + else: + _drop(m300) + + ctx.delay(minutes=2, msg='Incubate for 2 minutes') + magdeck.engage(height=Mag_height_SQW) + ctx.delay(minutes=sep_time_bind, msg='Incubating on MagDeck for ' + str(sep_time_bind) + ' minutes.') + + # remove initial supernatant + remove_supernatant(vol+bead_vol+starting_vol, reuse=reuse, restore=restore, last=False) + + + def wash(vol, source, mix_reps=mix_reps_wash, reuse=True, restore=True, resuspend=True, last=False, blowout=True): + """ + `wash` will perform bead washing for the extraction protocol. + :param vol (float): The amount of volume to aspirate from each + source and dispense to each well containing beads. + :param source (List[Well]): A list of wells from where liquid will be + aspirated. If the length of the source list + > 1, `wash` automatically calculates + the index of the source that should be + accessed. + :param mix_reps (int): The number of repititions to mix the beads with + specified wash buffer (ignored if resuspend is + False). + :param reuse (boolean): Whether to pick-up sample-corresponding tips for mixing and supernatant removal + that were restored in a previous step. + :param restore (boolean): Whether to park sample-corresponding tips for reuse in a later step + :param resuspend (boolean): Whether to resuspend beads in wash buffer. + """ + + if resuspend and magdeck.status == 'engaged': + magdeck.disengage() + + num_trans = math.ceil(vol/250) + vol_per_trans = vol/num_trans + + if reuse: #Dispense with fresh tips & mix with restored tips from previous step + _pick_up(m300) + for i, (m) in enumerate(mag_samples_m): + src = source[i//(max_num_columns//len(source))] + for n in range(num_trans): + if m300.current_volume > 0: + m300.dispense(m300.current_volume, src.top()) + m300.aspirate(vol_per_trans, src.bottom(bottom_tolerance)) + m300.aspirate(20, src.top(2)) + ctx.delay(seconds=5, msg='drop delay') + m300.dispense(vol_per_trans+20, m.top()) + # m300.transfer(vol_per_trans, src.bottom(bottom_tolerance), m.top(), air_gap=20, new_tip='never') + if n < num_trans - 1: # only air_gap if going back to source + m300.air_gap(20) + _drop(m300) + if resuspend: + m300.flow_rate.aspirate = 220 + m300.flow_rate.dispense = 300 + for i, (m, spot) in enumerate(zip(mag_samples_m, parking_spots)): + _pick_up(m300, spot) + side = 1 if i % 2 == 0 else -1 + # loc_mix = m.bottom(2).move(Point(x=side*1.5)) + ''' new mix locations ''' + loc_mix_asp_bottom = m.bottom(1.5) + loc_mix_asp_top = m.bottom(5) + loc_mix_dis_pellet = m.bottom(1.5).move(Point(x=side*0.8)) + loc_mix_dis_top = m.bottom(12) + ''' end of new mix locations ''' + src = source[i//(10//len(source))] + # for rep in range(mix_reps): + # m300.aspirate(250, loc_mix) + # m300.dispense(250, loc_mix) + ''' optimized mix ''' + # resuspend at pellet + for x in range(5): + m300.aspirate(250, loc_mix_asp_top) + m300.dispense(250, loc_mix_dis_pellet) + # resuspend beads across the entire liquid column + for x in range(mix_reps): + m300.aspirate(250, loc_mix_asp_bottom) + m300.dispense(250, loc_mix_dis_top) + ''' end of optimized mix ''' + m300.blow_out(m.bottom(11)) + m300.air_gap(20) + m300.drop_tip(spot) + m300.flow_rate.aspirate = 100 + m300.flow_rate.dispense = 200 + else: # Dispense & mix with fresh tips + for i, (m, spot) in enumerate(zip(mag_samples_m, parking_spots)): + _pick_up(m300) + side = 1 if i % 2 == 0 else -1 + #loc_mix = m.bottom(2).move(Point(x=side*1.5)) + ''' new mix locations ''' + loc_mix_asp_bottom = m.bottom(1.5) + loc_mix_asp_top = m.bottom(5) + loc_mix_dis_bottom = m.bottom(1) + loc_mix_dis_pellet = m.bottom(1.5).move(Point(x=side*0.8)) + loc_mix_dis_top = m.bottom(12) + ''' end of new mix locations ''' + src = source[i//(10//len(source))] + for n in range(num_trans): + if m300.current_volume > 0: + m300.dispense(m300.current_volume, src.top()) + m300.transfer(vol_per_trans, src.bottom(bottom_tolerance), m.top(), air_gap=20, new_tip='never') + if n < num_trans - 1: # only air_gap if going back to source + m300.air_gap(20) + if resuspend: + m300.flow_rate.aspirate = 80 + m300.flow_rate.dispense = 300 + # for rep in range(mix_reps): + # m300.aspirate(250, loc_mix) + # m300.dispense(250, loc_mix) + ''' optimized mix ''' + # resuspend at pellet + for x in range(5): + m300.aspirate(250, loc_mix_asp_top) + m300.dispense(250, loc_mix_dis_pellet) + for x in range(5): + m300.aspirate(200, loc_mix_asp_top) + m300.dispense(200, loc_mix_dis_bottom) + # resuspend beads across the entire liquid column + for x in range(mix_reps-5): + m300.aspirate(250, loc_mix_asp_bottom) + m300.dispense(250, loc_mix_dis_top) + ''' end of optimized mix ''' + m300.flow_rate.aspirate = 120 + m300.flow_rate.dispense = 200 + m300.blow_out(m.bottom(11)) + m300.air_gap(20) + m300.drop_tip(spot) + + + + + if magdeck.status == 'disengaged': + magdeck.engage(height=Mag_height_SQW) + + ctx.delay(minutes=sep_time_wash, msg='Incubating on MagDeck for ' + str(sep_time_wash) + ' minutes.') + + remove_supernatant(vol, reuse=True, restore=restore, last=last, blowout=blowout) + + def elute(vol): + """ + `elute` will perform elution from the deepwell extraciton plate to the + final clean elutions PCR plate to complete the extraction protocol. + :param vol (float): The amount of volume to aspirate from the elution + buffer source and dispense to each well containing + beads. + """ + + magdeck.disengage() + for i, (m) in enumerate(mag_samples_m): + _pick_up(m300) + side = 1 if i % 2 == 0 else -1 + loc_mix = m.bottom(1.5).move(Point(x=side*1.5)) + m300.aspirate(vol, elution_buffer.bottom(bottom_tolerance)) + m300.move_to(m.center()) + m300.dispense(vol, loc_mix) + m300.flow_rate.aspirate = 220 + m300.flow_rate.dispense = 300 + for mix in range(mix_reps_elu): + m300.aspirate(0.8*vol, loc_mix) + m300.dispense(0.8*vol, loc_mix) + m300.flow_rate.aspirate = 60 + m300.flow_rate.dispense = 100 + m300.blow_out(m.bottom(7)) + m300.air_gap(20) + _drop(m300) + + magdeck.engage(height=Mag_height_SQW) + ctx.delay(minutes=sep_time_elu, msg='Incubating on MagDeck for ' + str(sep_time_elu) + ' minutes.') + + m300.flow_rate.aspirate = 30 + + for i, (m, e) in enumerate(zip(mag_samples_m, elution_samples_m)): + _pick_up(m300) + side = -1 if i % 2 == 0 else 1 + loc = m.bottom(0.9).move(Point(x=side*0.8)) + m300.transfer(vol, loc, e.bottom(5), air_gap=20, new_tip='never') + + m300.blow_out(e.top(-1)) + m300.air_gap(10) + m300.drop_tip() + + magdeck.disengage() + + + """ + Here is where you can call the methods defined above to fit your specific + protocol. The normal sequence is: + """ + bind(binding_buffer_vol, bead_vol, reuse=True, restore=False) + + wash(wash1_vol, wash1, reuse=False, restore=False, resuspend=True, last=False, blowout=False) + wash(wash2_vol, wash2, reuse=False, restore=False, resuspend=True, last=True, blowout=False) + + ctx.delay(minutes=dry_time, msg='Air dry') + + elute(elution_vol) + + # track final used tip + if tip_track and not ctx.is_simulating(): + if not os.path.isdir(folder_path): + os.mkdir(folder_path) + data = {'tips300': tip_log['count'][m300]} + with open(tip_file_path, 'w') as outfile: + json.dump(data, outfile) diff --git a/protocols/normalization/README.md b/protocols/normalization/README.md new file mode 100644 index 0000000000..ed2fba1d07 --- /dev/null +++ b/protocols/normalization/README.md @@ -0,0 +1,77 @@ +# Normalization + +### Author +[Opentrons](https://opentrons.com/) + +# Opentrons has launched a new Protocol Library. You should use the [new page for this protocol](library.opentrons.com/p/normalization). This page won’t be available after January 31st, 2024. + +## Categories +* Featured + * Normalization + +## Description +![Normalization Example](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/normalization/normalization_example.png) + +Concentration normalization is a key component of many genomic and proteomic applications, such as NGS library prep. With this protocol, you can easily normalize the concentrations of samples in a 96 or 384 microwell plate without worrying about missing a well or adding the wrong volume. Just upload your properly formatted CSV file (keep scrolling for an example), customize your parameters, and download your ready-to-run protocol. + + +--- +![Materials Needed](https://s3.amazonaws.com/opentrons-protocol-library-website/custom-README-images/001-General+Headings/materials.png) + +To purchase tips, reagents, or pipettes, please visit our [online store](https://shop.opentrons.com/) or contact our sales team at [info@opentrons.com](mailto:info@opentrons.com) + +* [Opentrons OT-2](https://shop.opentrons.com/collections/ot-2-robot/products/ot-2) +* [Opentrons OT-2 Run App (Version 3.15.0 or later)](https://opentrons.com/ot-app/) +* [Opentrons Single-Channel Pipette](https://shop.opentrons.com/collections/ot-2-pipettes) and corresponding [Tips](https://shop.opentrons.com/collections/opentrons-tips) +* [Samples in a compatible plate (96-well or 384-well)](https://labware.opentrons.com/?category=wellPlate) +* [Automation-friendly reservoir](https://labware.opentrons.com/?category=reservoir) +* Diluent + +For more detailed information on compatible labware, please visit our [Labware Library](https://labware.opentrons.com/). + + +--- +![Setup](https://s3.amazonaws.com/opentrons-protocol-library-website/custom-README-images/001-General+Headings/Setup.png) + +**CSV Format** + +Your file must be saved as a comma separated value (.csv) file type. Your CSV must contain values corresponding to volumes in microliters (μL). It should be formatted in “landscape” orientation, with the value corresponding to well A1 in the upper left-hand corner of the value list. + +![Normalization CSV](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/normalization/normalization_csv.png) + +In this example, 40μL will be added to A1, 41μL will be added to well B1, and so on. + +If you’d like to follow our template, you can make a copy of [this spreadsheet](https://opentrons-protocol-library-website.s3.amazonaws.com/Technical+Notes/normalization/Opentrons+Normalization+Template.xlsx), fill out your values, and export as CSV from there. + +*Note about CSV*: All values corresponding to wells in the CSV must have a value (zero (0) is a valid value and nothing will be transferred to the corresponding well(s)). Additionally, the CSV can be formatted in "portrait" orientation. In portrait orientation, the bottom left corner is treated as A1 and the top right corner would correspond to the furthest well from A1 (H12 in a 96-well plate). + +Using the customization fields below, set up your protocol. +* Volumes CSV: Upload the CSV (.csv) containing your diluent volumes. +* Pipette Model: Select which pipette you will use for this protocol. +* Pipette Mount: Specify which mount your single-channel pipette is on (left or right) +* Plate Type: Select which (destination) plate you will use for this protocol. +* Reservoir Type: Select which (source) reservoir you will use for this protocol. +* Filter Tips: Specify whether you want to use filter tips. +* Tip Usage Strategy: Specify whether you'd like to use a new tip for each transfer, or keep the same tip throughout the protocol. + + + +### Robot +* [OT-2](https://opentrons.com/ot-2) + + +## Process + +1. Create your CSV file according to our instructions. +2. Upload your CSV and select all desired settings according to the “Setup” section above to customize your protocol run. +3. Download your customized OT-2 protocol using the blue “Download” button, located above the deckmap. +4. Upload your protocol into the Opentrons App and follow the instructions there to set up your deck, calibrate your labware, and proceed to run. +5. Make sure to add reagents to your labware before placing it on the deck! Your diluent should be in your reservoir, and the samples you’re normalizing should be in your plate. + + +### Additional Notes + +If you’d like to request a protocol supporting multiple plates or require other changes to this script, please fill out our [Protocol Request Form](https://opentrons-protocol-dev.paperform.co/). You can also modify the Python file directly by following our [API Documentation](https://docs.opentrons.com/v2/). If you’d like to chat with an applications engineer about changes, please contact us at [protocols@opentrons.com](mailto:protocols@opentrons.com). + +###### Internal +normalization diff --git a/protocols/normalization/fields.json b/protocols/normalization/fields.json new file mode 100644 index 0000000000..493bd86300 --- /dev/null +++ b/protocols/normalization/fields.json @@ -0,0 +1,74 @@ +[ + { + "type": "textFile", + "label": "Volumes CSV", + "name": "volumes_csv", + "default": "1,2,3" + }, + { + "type": "dropDown", + "label": "Pipette Model", + "name": "pip_model", + "options": [ + {"label": "P300 Single GEN2", "value": "p300_single_gen2"}, + {"label": "P300 Single GEN1", "value": "p300_single"}, + {"label": "P20 Single GEN2", "value": "p20_single_gen2"}, + {"label": "P50 Single GEN1", "value": "p50_single"}, + {"label": "P10 Single GEN1", "value": "p10_single"}, + {"label": "P1000 Single GEN2", "value": "p1000_single_gen2"}, + {"label": "P1000 Single GEN1", "value": "p1000_single"} + ] + }, + { + "type": "dropDown", + "label": "Pipette Mount", + "name": "pip_mount", + "options": [ + {"label": "Right side", "value": "right"}, + {"label": "Left side", "value": "left"} + ] + }, + { + "type": "dropDown", + "label": "Plate Type", + "name": "plate_type", + "options": [ + {"label": "NEST 96-Well, 200µL Flat", "value": "nest_96_wellplate_200ul_flat"}, + {"label": "NEST 96-Well, 100µL PCR", "value": "nest_96_wellplate_100ul_pcr_full_skirt"}, + {"label": "BioRad 96-Well, 200µL PCR", "value": "biorad_96_wellplate_200ul_pcr"}, + {"label": "Corning 96-Well, 360µL Flat", "value": "corning_96_wellplate_360ul_flat"}, + {"label": "Corning 384-Well, 112µL Flat", "value": "corning_384_wellplate_112ul_flat"}, + {"label": "USA Scientific 96-Deepwell, 2.4mL", "value": "usascientific_96_wellplate_2.4ml_deep"} + ] + }, + { + "type": "dropDown", + "label": "Reservoir Type", + "name": "res_type", + "options": [ + {"label": "NEST 1-Well, 195mL", "value": "nest_1_reservoir_195ml"}, + {"label": "NEST 12-Well, 15mL", "value": "nest_12_reservoir_15ml"}, + {"label": "Agilent 1-Well, 290mL", "value": "agilent_1_reservoir_290ml"}, + {"label": "Axygen 1-Well, 90mL", "value": "axygen_1_reservoir_90ml"}, + {"label": "USA Scientific 12-Well, 22mL", "value": "usascientific_12_reservoir_22ml"} + ] + }, + { + "type": "dropDown", + "label": "Use Filter Tips?", + "name": "filter_tip", + "options": [ + {"label": "No", "value": "no"}, + {"label": "Yes", "value": "yes"} + ] + }, + { + "type": "dropDown", + "label": "Tip Usage Strategy", + "name": "tip_reuse", + "options": [ + {"label": "Use a new tip for each transfer", "value": "always"}, + {"label": "Reuse tip for each transfer", "value": "never"} + ] + } +] diff --git a/protocols/normalization/normalization.ot2.apiv2.py b/protocols/normalization/normalization.ot2.apiv2.py new file mode 100644 index 0000000000..6a4954bfb6 --- /dev/null +++ b/protocols/normalization/normalization.ot2.apiv2.py @@ -0,0 +1,79 @@ +metadata = { + 'protocolName': 'Normalization', + 'author': 'Opentrons ', + 'source': 'Protocol Library', + 'apiLevel': '2.12' + } + +tiprack_slots = ['1', '4', '7', '10'] + + +def transpose_matrix(m): + return [[r[i] for r in reversed(m)] for i in range(len(m[0]))] + + +def flatten_matrix(m): + return [cell for row in m for cell in row] + + +def well_csv_to_list(csv_string): + """ + Takes a csv string and flattens it to a list, re-ordering to match + Opentrons well order convention (A1, B1, C1, ..., A2, B2, B2, ...) + """ + data = [ + line.split(',') + for line in reversed(csv_string.split('\n')) if line.strip() + if line + ] + if len(data[0]) > len(data): + # row length > column length ==> "landscape", so transpose + return flatten_matrix(transpose_matrix(data)) + # "portrait" + return flatten_matrix(data) + + +def run(protocol): + [volumes_csv, pip_model, pip_mount, plate_type, + res_type, filter_tip, tip_reuse] = get_values( # noqa: F821 + 'volumes_csv', 'pip_model', 'pip_mount', 'plate_type', + 'res_type', 'filter_tip', 'tip_reuse') + + # create labware + plate = protocol.load_labware(plate_type, '3') + + reservoir = protocol.load_labware(res_type, '2') + source = reservoir.wells()[0] + + pip_size = pip_model.split('_')[0][1:] + + pip_size = '300' if pip_size == '50' else pip_size + tip_name = 'opentrons_96_tiprack_'+pip_size+'ul' + if filter_tip == 'yes': + pip_size = '200' if pip_size == '300' else pip_size + tip_name = 'opentrons_96_filtertiprack_'+pip_size+'ul' + + tipracks = [protocol.load_labware(tip_name, slot) + for slot in tiprack_slots] + + pipette = protocol.load_instrument(pip_model, pip_mount, + tip_racks=tipracks) + + # create volumes list + volumes = [float(cell) for cell in well_csv_to_list(volumes_csv)] + + for vol in volumes: + if vol < pipette.min_volume: + protocol.comment( + 'WARNING: volume {} is below pipette\'s minimum volume.' + .format(vol)) + + if tip_reuse == 'never': + pipette.pick_up_tip() + + for vol, dest in zip(volumes, plate.wells()): + if vol > 0: + pipette.transfer(vol, source, dest, new_tip=tip_reuse) + + if pipette.has_tip: + pipette.drop_tip() diff --git a/protocols/nucleic_acid_purification_with_magnetic_beads/.feature b/protocols/nucleic_acid_purification_with_magnetic_beads/.feature new file mode 100644 index 0000000000..e69de29bb2 diff --git a/protocols/nucleic_acid_purification_with_magnetic_beads/README.md b/protocols/nucleic_acid_purification_with_magnetic_beads/README.md new file mode 100644 index 0000000000..fb41c92df1 --- /dev/null +++ b/protocols/nucleic_acid_purification_with_magnetic_beads/README.md @@ -0,0 +1,80 @@ +# Nucleic Acid Purification with Magnetic Beads + +### Author +[Opentrons](https://opentrons.com/) + +# Opentrons has launched a new Protocol Library. You should use the [new page for this protocol](library.opentrons.com/p/nucleic_acid_purification_with_magnetic_beads). This page won’t be available after January 31st, 2024. + +## Categories +* Featured + * Nucleic Acid Purification with Magnetic Beads (Universal) + +## Description +With this protocol, you can perform high-quality nucleic acid purifications using magnetic beads and the [Opentrons Magnetic Module](https://shop.opentrons.com/products/magdeck]). This protocol contains flexible parameters that you can customize for many different magnetic bead and nucleic acid types. Use this setup to rapidly iterate and optimize your magbead-based workflows! + +You can use any magnetic beads you prefer with this protocol, but we have included some reagent recommendations in the **Materials Needed** section below to help you get started. For more detailed information on how to use this protocol, please see our [Technical Note](https://s3.amazonaws.com/opentrons-protocol-library-website/Technical+Notes/Nucleic+Acid+Purification+with+Magnetic+Module+OT2+Technical+Note.pdf). + +--- + +--- + +![Materials Needed](https://s3.amazonaws.com/opentrons-protocol-library-website/custom-README-images/customizable-serial-dilution/materials.png) + +-- [Opentrons OT-2](http://opentrons.com/ot-2) + +-- [Opentrons Magnetic Module](https://shop.opentrons.com/products/magdeck?_ga=2.171718441.823190023.1542396855-403439593.1535387376) + +-- [Opentrons OT-2 Run App (Version 3.1.2 or later)](http://opentrons.com/ot-app) + +-- 200uL or 300 uL Tiprack ([Opentrons tips suggested](https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-300ul-tips-racks-9-600-tips)) + +-- [12-row automation-friendly trough](https://www.usascientific.com/12-channel-automation-reservoir.aspx) + +-- [BioRad HardShell 96-Well PCR Plate](http://www.bio-rad.com/en-us/sku/hsp9601-hard-shell-96-well-pcr-plates-low-profile-thin-wall-skirted-white-clear?ID=hsp9601) + +-- Magnetic Beads (Looking for a kit? We recommend trying [Omega Bio-tek Mag-Bind® TotalPure NGS](https://shop.opentrons.com/products/mag-bind-total-pure-ngs)) + +-- Ethanol + +-- Elution Buffer (Typically 10 mM Tris pH 8.0, TE Buffer, or nuclease-free water) + +--- + +--- + +![Setup](https://s3.amazonaws.com/opentrons-protocol-library-website/custom-README-images/001-General+Headings/Setup.png) + +Using the customization fields below, set up your protocol as follows: + + * **Pipette:** Specify your pipette. We recommend using a p50 or p300 multi- or single-channel. + * **Pipette Mount:** Specify which mount (left or right) your pipette is on. + * **Sample number:** Customize the number of samples to run per protocol. A multiple of 8 is recommended when you are using a multichannel pipette. + * **Sample volume:** Specify the starting volume (in uL) of the input sample. + * **Bead Ratio:** Customize the ratio of beads for left or right side size-selection of fragments. *The default bead ratio is 1.8x the input sample volume.* + * **Elution Volume:** Specify the final volume (in uL) to elute the purified nucleic acid. *The Opentrons MagDeck supports elution volumes above 10 µL.* + * **Incubation Time:** Specify the amount of time (in minutes) that the bead solution and input sample interact. + * **Settling Time:** Specify the amount of time (in minutes) needed to pellet the beads. *Higher volumes may require a longer settling time.* + * **Drying Time:** Specify the drying time (in minutes) needed after wash steps. + +--- + +--- + +## Process +1. Select all desired settings according to the "Setup" section above to create your customized protocol. +2. Download your customized Nucleic Acid Purification protocol using the blue "Download" button. +3. Upload your protocol file into the Opentrons Run App and follow the instructions there to set up your deck and proceed to run. +4. Make sure to add reagents to your labware before placing it on the deck! You can see where to place your reagents below. + +![Labware setup](https://s3.amazonaws.com/opentrons-protocol-library-website/custom-README-images/Nucleic+Acid+Purification/Nucleic+Acid+Purification+with+Magnetic+Beads+-+Reagent+Start+Position.png) + +###### Internal +Nucleic Acid Purification, v1 + +### Additional Notes +Please reference our [Technical Note](https://s3.amazonaws.com/opentrons-protocol-library-website/Technical+Notes/Nucleic+Acid+Purification+with+Magnetic+Module+OT2+Technical+Note.pdf) for more information about the expected output of this protocol, in addition to expanded sample data from the Opentrons lab. + +We understand that there are limitations to the use of this protocol and we plan to make improvements soon! In the meantime, if you'd like to request a more complex purification workflow, please use our [Protocol Development Request Form](https://opentrons-protocol-dev.paperform.co/). You can also download the Python file from this page and modify it using our [API Documentation](https://docs.opentrons.com/). For additional questions about this protocol, please email . + +## Preview +Perform high-quality nucleic acid purifications using any magnetic beads and the [Opentrons Magnetic Module](https://shop.opentrons.com/products/magdeck]). diff --git a/protocols/nucleic_acid_purification_with_magnetic_beads/dna_purification.ot2.apiv2.py b/protocols/nucleic_acid_purification_with_magnetic_beads/dna_purification.ot2.apiv2.py new file mode 100644 index 0000000000..b24ede0ca8 --- /dev/null +++ b/protocols/nucleic_acid_purification_with_magnetic_beads/dna_purification.ot2.apiv2.py @@ -0,0 +1,142 @@ +import math + +metadata = { + 'protocolName': 'DNA Purification', + 'author': 'Opentrons ', + 'source': 'Protocol Library', + 'apiLevel': '2.4' + } + + +def run(protocol_context): + + [mag_mod, pipette_type, pipette_mount, sample_number, sample_volume, + bead_ratio, elution_buffer_volume, incubation_time, settling_time, + drying_time] = get_values( # noqa: F821 + "mag_mod", "pipette_type", "pipette_mount", "sample_number", + "sample_volume", "bead_ratio", "elution_buffer_volume", + "incubation_time", "settling_time", "drying_time" + ) + + mag_deck = protocol_context.load_module(mag_mod, '1') + mag_plate = mag_deck.load_labware( + 'biorad_96_wellplate_200ul_pcr') + output_plate = protocol_context.load_labware( + 'biorad_96_wellplate_200ul_pcr', '2', 'output plate') + + total_tips = sample_number*8 + tiprack_num = math.ceil(total_tips/96) + slots = ['3', '5', '6', '7', '8', '9', '10', '11'][:tiprack_num] + + pip_range = pipette_type.split('_')[0] + if pip_range == 'p1000': + tip_name = 'opentrons_96_tiprack_1000ul' + elif pip_range == 'p300' or pip_range == 'p50': + tip_name = 'opentrons_96_tiprack_300ul' + elif pip_range == 'p20': + tip_name = 'opentrons_96_tiprack_20ul' + else: + tip_name = 'opentrons_96_tiprack_10ul' + tipracks = [ + protocol_context.load_labware(tip_name, slot) + for slot in slots + ] + + pipette = protocol_context.load_instrument( + pipette_type, pipette_mount, tip_racks=tipracks) + + mode = pipette_type.split('_')[1] + + if mode == 'single': + if sample_number <= 5: + reagent_container = protocol_context.load_labware( + 'opentrons_24_tuberack_nest_2ml_snapcap', '4') + liquid_waste = protocol_context.load_labware( + 'usascientific_12_reservoir_22ml', '5').wells()[-1] + else: + reagent_container = protocol_context.load_labware( + 'usascientific_12_reservoir_22ml', '4') + liquid_waste = reagent_container.wells()[-1] + samples = [well for well in mag_plate.wells()[:sample_number]] + output = [well for well in output_plate.wells()[:sample_number]] + else: + reagent_container = protocol_context.load_labware( + 'usascientific_12_reservoir_22ml', '4') + liquid_waste = reagent_container.wells()[-1] + col_num = math.ceil(sample_number/8) + samples = [col for col in mag_plate.rows()[0][:col_num]] + output = [col for col in output_plate.rows()[0][:col_num]] + + # Define reagents and liquid waste + beads = reagent_container.wells()[0] + ethanol = reagent_container.wells()[1] + elution_buffer = reagent_container.wells()[2] + + # Define bead and mix volume + bead_volume = sample_volume*bead_ratio + if bead_volume/2 > pipette.max_volume: + mix_vol = pipette.max_volume + else: + mix_vol = bead_volume/2 + total_vol = bead_volume + sample_volume + 5 + + # Mix beads and PCR samples + for target in samples: + pipette.pick_up_tip() + pipette.mix(5, mix_vol, beads) + pipette.transfer(bead_volume, beads, target, new_tip='never') + pipette.mix(10, mix_vol, target) + pipette.blow_out() + pipette.drop_tip() + + # Incubate beads and PCR product at RT for 5 minutes + protocol_context.delay(minutes=incubation_time) + + # Engagae MagDeck and incubate + mag_deck.engage() + protocol_context.delay(minutes=settling_time) + + # Remove supernatant from magnetic beads + pipette.flow_rate.aspirate = 25 + pipette.flow_rate.dispense = 150 + for target in samples: + pipette.transfer(total_vol, target, liquid_waste, blow_out=True) + + # Wash beads twice with 70% ethanol + air_vol = pipette.max_volume * 0.1 + for cycle in range(2): + for target in samples: + pipette.transfer(200, ethanol, target, air_gap=air_vol, + new_tip='once') + protocol_context.delay(minutes=1) + for target in samples: + pipette.transfer(200, target, liquid_waste, air_gap=air_vol) + + # Dry at RT + protocol_context.delay(minutes=drying_time) + + # Disengage MagDeck + mag_deck.disengage() + + # Mix beads with elution buffer + if elution_buffer_volume/2 > pipette.max_volume: + mix_vol = pipette.max_volume + else: + mix_vol = elution_buffer_volume/2 + for target in samples: + pipette.pick_up_tip() + pipette.transfer( + elution_buffer_volume, elution_buffer, target, new_tip='never') + pipette.mix(20, mix_vol, target) + pipette.drop_tip() + + # Incubate at RT + protocol_context.delay(minutes=5) + + # Engage MagDeck and remain engaged for DNA elution + mag_deck.engage() + protocol_context.delay(minutes=settling_time) + + # Transfer clean PCR product to a new well + for target, dest in zip(samples, output): + pipette.transfer(elution_buffer_volume, target, dest, blow_out=True) diff --git a/protocols/nucleic_acid_purification_with_magnetic_beads/fields.json b/protocols/nucleic_acid_purification_with_magnetic_beads/fields.json new file mode 100644 index 0000000000..f2d89bef6a --- /dev/null +++ b/protocols/nucleic_acid_purification_with_magnetic_beads/fields.json @@ -0,0 +1,81 @@ +[ + { + "type": "dropDown", + "label": "magnetic module", + "name": "mag_mod", + "options": [ + { "label": "GEN1 Magnetic Module", "value": "magnetic module"}, + { "label": "GEN2 Magnetic Module", "value": "magnetic module gen2"} + ] + }, + { + "type": "dropDown", + "label": "pipette type", + "name": "pipette_type", + "options": [ + { "label": "GEN2 P1000 Single", "value": "p1000_single_gen2"}, + { "label": "GEN2 P300 Single", "value": "p300_single_gen2" }, + { "label": "GEN2 P20 Single", "value": "p10_single_gen2" }, + { "label": "GEN2 P300 Multi", "value": "p300_multi_gen2" }, + { "label": "GEN2 P20 Multi", "value": "p20_multi_gen2"}, + { "label": "GEN1 P1000 Single", "value": "p1000_single"}, + { "label": "GEN1 P300 Single", "value": "p300_single" }, + { "label": "GEN1 P50 Single", "value": "p50_single" }, + { "label": "GEN1 P10 Single", "value": "p10_single" }, + { "label": "GEN1 P300 Multi", "value": "p300_multi" }, + { "label": "GEN1 P50 Multi", "value": "p50_multi" }, + { "label": "GEN1 P10 Multi", "value": "p10_multi"} + ] + }, + { + "type": "dropDown", + "label": "pipette mount", + "name": "pipette_mount", + "options": [ + { "label": "left", "value": "left"}, + { "label": "right", "value": "right"} + ] + }, + { + "type": "int", + "label": "number of samples", + "name": "sample_number", + "default": 24 + }, + { + "type": "float", + "label": "sample volume (in uL)", + "name": "sample_volume", + "default": 20 + }, + { + "type": "float", + "label": "bead ratio", + "name": "bead_ratio", + "default": 1.8 + }, + { + "type": "float", + "label": "elution buffer volume (in uL)", + "name": "elution_buffer_volume", + "default": 200 + }, + { + "type": "float", + "label": "incubation time (in minutes)", + "name": "incubation_time", + "default": 1 + }, + { + "type": "float", + "label": "settling time (in minutes)", + "name": "settling_time", + "default": 1 + }, + { + "type": "float", + "label": "drying time (in minutes)", + "name": "drying_time", + "default": 5 + } +] diff --git a/protocols/omega_biotek_magbind_totalpure_NGS/.feature b/protocols/omega_biotek_magbind_totalpure_NGS/.feature new file mode 100644 index 0000000000..e69de29bb2 diff --git a/protocols/omega_biotek_magbind_totalpure_NGS/README.md b/protocols/omega_biotek_magbind_totalpure_NGS/README.md new file mode 100644 index 0000000000..68f75ff1e8 --- /dev/null +++ b/protocols/omega_biotek_magbind_totalpure_NGS/README.md @@ -0,0 +1,83 @@ +# NGS Cleanup and Size Selection with Omega Bio-tek Mag-Bind® TotalPure NGS + +### Author +[Opentrons (verified)](https://opentrons.com/) + +### Partner +[Omega Bio-tek](http://omegabiotek.com/store/) + +# Opentrons has launched a new Protocol Library. You should use the [new page for this protocol](library.opentrons.com/p/omega_biotek_magbind_totalpure_ngs). This page won’t be available after January 31st, 2024. + +## Categories +* Featured + * NGS Cleanup and Size Selection with Omega Bio-tek Mag-Bind® TotalPure + +## Description +![Omega Bio-tek](https://s3.amazonaws.com/opentrons-protocol-library-website/custom-README-images/001-General+Headings/Omega+Logo.png) + +With this protocol, you can perform high-quality nucleic acid purifications using [Omega Bio-tek Mag-Bind® TotalPure NGS](https://shop.opentrons.com/products/mag-bind-total-pure-ngs) magnetic beads and the [Opentrons Magnetic Module](https://shop.opentrons.com/products/magdeck). This setup yields high quality PCR product and other nucleic acids without the use of centrifugation or vacuum separation. + +This kit is widely used in NGS cleanup for its affordability and simplicity. It is also well-adapted for nucleic acid size selection by varying bead ratios for the isolation of a wide array of fragment sizes. For more detailed information on how to use this protocol, please see our [Application Note](https://s3.amazonaws.com/opentrons-protocol-library-website/Technical+Notes/Omega_Application_Note.pdf). + +Please note this protocol is currently being updated. + +--- + +--- + +![Materials Needed](https://s3.amazonaws.com/opentrons-protocol-library-website/custom-README-images/001-General+Headings/materials.png) + +To purchase tips, reagents, or our Magnetic Module, please [visit our online store](https://shop.opentrons.com/) or contact our Sales team at . + + * [Omega Bio-tek Mag-Bind® TotalPure NGS Kit](https://shop.opentrons.com/products/mag-bind-total-pure-ngs) + * [Opentrons OT-2](http://opentrons.com/ot-2) + * [Opentrons Magnetic Module](https://shop.opentrons.com/products/magdeck) + * [Opentrons OT-2 Run App (Version 3.1.2 or later)](http://opentrons.com/ot-app) + * 200uL or 300 uL Tiprack ([Opentrons tips suggested](https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-300ul-tips-racks-9-600-tips)) + * [12-row automation-friendly trough](https://shop.opentrons.com/collections/verified-labware/products/nest-12-well-reservoir-15-ml) + * [BioRad HardShell 96-Well PCR Plates](http://www.bio-rad.com/en-us/sku/hsp9601-hard-shell-96-well-pcr-plates-low-profile-thin-wall-skirted-white-clear?ID=hsp9601) + * Ethanol + * Elution Buffer (Typically 10 mM Tris pH 8.0, TE Buffer, or nuclease-free water) + +--- + +--- + + +![Setup](https://s3.amazonaws.com/opentrons-protocol-library-website/custom-README-images/001-General+Headings/Setup.png) + +Using the customization fields below, set up your protocol as follows: + + * **Pipette:** Specify your pipette. We recommend using a p50 or p300 multi- or single-channel. + * **Pipette Mount:** Specify which mount (left or right) your pipette is on. + * **Sample number:** Customize the number of samples to run per protocol. A multiple of 8 is recommended when you are using a multichannel pipette. + * **Sample volume:** Specify the starting volume (in uL) of the input sample. + * **Bead Ratio:** Customize the ratio of beads for left or right side size-selection of fragments. *The default bead ratio is 1.8x the input sample volume.* + * **Elution Volume:** Specify the final volume (in uL) to elute the purified nucleic acid. *The Opentrons MagDeck supports elution volumes above 10 µL.* + +Make sure to add reagents to your labware before placing it on the deck! You can see where to place your reagents below. + +![Labware setup](https://s3.amazonaws.com/opentrons-protocol-library-website/custom-README-images/Nucleic+Acid+Purification/Nucleic+Acid+Purification+with+Magnetic+Beads+-+Reagent+Start+Position.png) + +--- + +--- + +## Process +1. Select all desired settings according to the "Setup" section above to create your customized protocol. +2. Download your customized OT-2 protocol using the blue "Download" button. +3. Upload your protocol file into the Opentrons Run App and follow the instructions there to set up your deck and proceed to run! +4. Make sure to add reagents to your labware before placing it on the deck! You can see where to place your reagents in the "Setup" section above. + +###### Internal +Omega Nucleic Acid Purification, v2 + +### Additional Notes +Please reference our [Application Note](https://s3.amazonaws.com/opentrons-protocol-library-website/Technical+Notes/Omega_Application_Note.pdf) for more information about the expected output of this protocol, in addition to expanded sample data from the Opentrons and Omega Bio-tek labs. + +If you'd like to request a more complex purification workflow, please use our [Protocol Development Request Form](https://opentrons-protocol-dev.paperform.co/). You can also download the Python file from this page and modify it using our [API Documentation](https://docs.opentrons.com/). For additional questions about this protocol, please email . + +If you are interested in purchasing the Opentrons Magnetic Module or trying out the Omega Bio-tek Mag-Bind® beads, please contact our Sales Team at to learn more! + +## Preview +With this protocol, you can perform high-quality nucleic acid purifications using the [Opentrons Magnetic Module](https://shop.opentrons.com/products/magdeck) and [Omega Bio-tek Mag-Bind® TotalPure NGS](https://shop.opentrons.com/products/mag-bind-total-pure-ngs) magnetic beads. This kit is widely used in NGS cleanup for its affordability and simplicity. You can select specific sizes of nucleic acids by varying the bead-to-DNA ratio across a wide array of fragment sizes. For reagent and module purchasing details contact . diff --git a/protocols/omega_biotek_magbind_totalpure_NGS/fields.json b/protocols/omega_biotek_magbind_totalpure_NGS/fields.json new file mode 100644 index 0000000000..83e455dc7e --- /dev/null +++ b/protocols/omega_biotek_magbind_totalpure_NGS/fields.json @@ -0,0 +1,72 @@ +[ + { + "type": "dropDown", + "label": "pipette type", + "name": "pipette_type", + "options": [ + { "label": "GEN2 P1000 Single", "value": "p1000_single_gen2"}, + { "label": "GEN2 P300 Single", "value": "p300_single_gen2" }, + { "label": "GEN2 P20 Single", "value": "p10_single_gen2" }, + { "label": "GEN2 P300 Multi", "value": "p300_multi_gen2" }, + { "label": "GEN2 P20 Multi", "value": "p20_multi_gen2"}, + { "label": "GEN1 P1000 Single", "value": "p1000_single"}, + { "label": "GEN1 P300 Single", "value": "p300_single" }, + { "label": "GEN1 P50 Single", "value": "p50_single" }, + { "label": "GEN1 P10 Single", "value": "p10_single" }, + { "label": "GEN1 P300 Multi", "value": "p300_multi" }, + { "label": "GEN1 P50 Multi", "value": "p50_multi" }, + { "label": "GEN1 P10 Multi", "value": "p10_multi"} + ] + }, + { + "type": "dropDown", + "label": "pipette mount", + "name": "pipette_mount", + "options": [ + { "label": "left", "value": "left"}, + { "label": "right", "value": "right"} + ] + }, + { + "type": "int", + "label": "number of samples", + "name": "sample_number", + "default": 24 + }, + { + "type": "float", + "label": "PCR volume (in uL)", + "name": "PCR_volume", + "default": 20 + }, + { + "type": "float", + "label": "bead ratio", + "name": "bead_ratio", + "default": 1.8 + }, + { + "type": "float", + "label": "elution buffer volume (in uL)", + "name": "elution_buffer_volume", + "default": 20 + }, + { + "type": "float", + "label": "incubation time (in minutes)", + "name": "incubation_time", + "default": 1 + }, + { + "type": "float", + "label": "settling time (in minutes)", + "name": "settling_time", + "default": 1 + }, + { + "type": "float", + "label": "drying time (in minutes)", + "name": "drying_time", + "default": 5 + } +] diff --git a/protocols/omega_biotek_magbind_totalpure_NGS/omegaMagBind.ot2.apiv2.py b/protocols/omega_biotek_magbind_totalpure_NGS/omegaMagBind.ot2.apiv2.py new file mode 100644 index 0000000000..60043003e3 --- /dev/null +++ b/protocols/omega_biotek_magbind_totalpure_NGS/omegaMagBind.ot2.apiv2.py @@ -0,0 +1,191 @@ +import math + +metadata = { + 'protocolName': 'Omega Bio-tek Mag-Bind TotalPure NGS', + 'author': 'Opentrons ', + 'source': 'Protocol Library', + 'apiLevel': '2.2' +} + + +def run(protocol_context): + [pipette_type, pipette_mount, sample_number, PCR_volume, bead_ratio, + elution_buffer_volume, incubation_time, settling_time, + drying_time] = get_values( # noqa: F821 + "pipette_type", "pipette_mount", "sample_number", "PCR_volume", + "bead_ratio", "elution_buffer_volume", "incubation_time", + "settling_time", "drying_time") + + mag_deck = protocol_context.load_module('magdeck', '1') + mag_plate = mag_deck.load_labware( + 'biorad_96_wellplate_200ul_pcr') + output_plate = protocol_context.load_labware( + 'biorad_96_wellplate_200ul_pcr', '2', 'output plate') + total_tips = sample_number*8 + tiprack_num = math.ceil(total_tips/96) + slots = ['3', '5', '6', '8', '9', '10', '11'][:tiprack_num] + + pip_range = pipette_type.split('_')[0] + if pip_range == 'p1000': + tip_name = 'opentrons_96_tiprack_1000ul' + elif pip_range == 'p300' or range == 'p50': + tip_name = 'opentrons_96_tiprack_300ul' + elif pip_range == 'p20': + tip_name = 'opentrons_96_tiprack_20ul' + else: + tip_name = 'opentrons_96_tiprack_10ul' + + tipracks = [ + protocol_context.load_labware(tip_name, slot, pip_range + ' tiprack') + for slot in slots + ] + pipette = protocol_context.load_instrument( + pipette_type, pipette_mount, tip_racks=tipracks) + + mode = pipette_type.split('_')[1] + if mode == 'single': + if sample_number <= 5: + reagent_container = protocol_context.load_labware( + 'opentrons_24_tuberack_generic_2ml_screwcap', + '7', + 'reagent rack' + ) + liquid_waste = protocol_context.load_labware( + 'usascientific_12_reservoir_22ml', + '5', + 'reservoir for waste').wells()[-1] + + else: + reagent_container = protocol_context.load_labware( + 'usascientific_12_reservoir_22ml', '7', 'reagent reservoir') + liquid_waste = reagent_container.wells()[-1] + samples = [well for well in mag_plate.wells()[:sample_number]] + samples_top = [well.top() for well in samples] + output = [well for well in output_plate.wells()[:sample_number]] + + else: + reagent_container = protocol_context.load_labware( + 'usascientific_12_reservoir_22ml', '7', 'reagent reservoir') + liquid_waste = reagent_container.wells()[-1] + col_num = math.ceil(sample_number/8) + samples = [col for col in mag_plate.rows()[0][:col_num]] + samples_top = [well.top() for well in mag_plate.rows()[0][:col_num]] + output = [col for col in output_plate.rows()[0][:col_num]] + + # Define reagents and liquid waste + beads = reagent_container.wells()[0] + ethanol = reagent_container.wells()[1] + elution_buffer = reagent_container.wells()[2] + + # Define bead and mix volume to resuspend beads + bead_volume = PCR_volume*bead_ratio + if mode == 'single': + if bead_volume*sample_number > pipette.max_volume: + mix_vol = pipette.max_volume + else: + mix_vol = bead_volume*sample_number + else: + if bead_volume*col_num > pipette.max_volume: + mix_vol = pipette.max_volume + else: + mix_vol = bead_volume*col_num + total_vol = bead_volume + PCR_volume + 15 + mix_voltarget = PCR_volume + 10 + + # Disengage MagDeck + mag_deck.disengage() + + # Mix beads and PCR samples + for target in samples: + pipette.flow_rate.aspirate = 180 + pipette.flow_rate.dispense = 180 + pipette.pick_up_tip() + # Slow down head speed 0.5X for bead handling + pipette.mix(25, mix_vol, beads) + protocol_context.default_speed = 200 + pipette.flow_rate.aspirate = 10 + pipette.flow_rate.dispense = 10 + pipette.transfer( + bead_volume, beads, target, new_tip='never') + pipette.flow_rate.aspirate = 50 + pipette.flow_rate.dispense = 50 + pipette.mix(40, mix_voltarget, target) + pipette.blow_out() + protocol_context.default_speed = 400 + + pipette.drop_tip() + + # Incubate beads and PCR product at RT for 5 minutes + protocol_context.comment("Incubating the beads and PCR products at room \ +temperature for 5 minutes. Protocol will resume automatically.") + protocol_context.delay(seconds=incubation_time) + + # Engage MagDeck and Magnetize + mag_deck.engage() + protocol_context.comment("Delaying for "+str(settling_time)+" seconds for \ +beads to settle.") + protocol_context.delay(seconds=settling_time) + + # Remove supernatant from magnetic beads + pipette.flow_rate.aspirate = 25 + pipette.flow_rate.dispense = 120 + for target in samples: + pipette.transfer( + total_vol, target, liquid_waste.top(), blow_out=True) + + # Wash beads twice with 70% ethanol + air_vol = pipette.max_volume*0.1 + + for _ in range(2): + pipette.pick_up_tip() + for target in samples_top: + pipette.transfer( + 185, ethanol, target, air_gap=air_vol, new_tip='never') + msg = "Delaying for 17 seconds." + protocol_context.delay(seconds=17, msg=msg) + for target in samples: + if not pipette.hw_pipette['has_tip']: + pipette.pick_up_tip() + pipette.transfer(195, target.bottom(z=0.7), liquid_waste.top(), + air_gap=air_vol, new_tip='never') + pipette.drop_tip() + + # Dry at RT + msg = "Drying the beads for " + str(drying_time) + " minutes. Protocol \ +will resume automatically." + protocol_context.delay(minutes=drying_time, msg=msg) + + # Disengage MagDeck + mag_deck.disengage() + + # Mix beads with elution buffer + if elution_buffer_volume/2 > pipette.max_volume: + mix_vol = pipette.max_volume + else: + mix_vol = elution_buffer_volume/2 + for target in samples: + pipette.transfer( + elution_buffer_volume, + elution_buffer, + target, + mix_after=(45, mix_vol) + ) + + # Incubate at RT for 3 minutes + protocol_context.comment("Incubating at room temperature for 3 minutes. \ +Protocol will resume automatically.") + protocol_context.delay(minutes=3) + + # Engage MagDeck for 1 minute and remain engaged for DNA elution + mag_deck.engage() + protocol_context.comment("Delaying for "+str(settling_time)+" seconds for \ +beads to settle.") + protocol_context.delay(seconds=settling_time) + + # Transfer clean PCR product to a new well + for target, dest in zip(samples, output): + pipette.transfer(elution_buffer_volume, target.bottom(z=1), dest.top(), + blow_out=True) + + # Disengage MagDeck + mag_deck.disengage() diff --git a/protocols/pcr_prep_part_1/README.md b/protocols/pcr_prep_part_1/README.md new file mode 100644 index 0000000000..f23df14e34 --- /dev/null +++ b/protocols/pcr_prep_part_1/README.md @@ -0,0 +1,95 @@ +# OT-2 PCR Prep 1/2: Master Mix Assembly + +### Author +[Opentrons (verified)](https://opentrons.com/) + +# Opentrons has launched a new Protocol Library. You should use the [new page for this protocol](library.opentrons.com/p/pcr_prep_part_1). This page won’t be available after January 31st, 2024. + +## Categories +* PCR + * Mastermix Assembly + +## Description +Part 1 of 2: Master Mix Assembly + +Links: +* [Part 1: Master Mix Assembly](./pcr_prep_part_1) +* [Part 2: Master Mix Distribution and DNA Transfer](./pcr_prep_part_2) + +This protocol allows your robot to create a master mix solution using any reagents stored in one or two different types of tube racks, or reservoir well A2 to A12. The master mix will be created in well A1 of the trough. The ingredient information will be provided as a CSV file. See Additional Notes for more details. + +Parameters: +* `right pipette type`: Which single channel pipette to use in the right mount +* `left pipette type`: Which single channel pipette to use in the left mount +* `Filter or regular tips`: Use filter tips or non-filtered. +* `Tuberack 1`: Tuberack 1 for reagents (optional) +* `Tuberack 2`: Tuberack 2 for reagents (optional) +* `12-well reservoir`: 12 well reservoir for mastermix target and optionally reagents in well A2-A12 +* `master mix .csv file`: Input csv file (see format below) + +--- + +### Labware +* [4-in-1 Tube Rack Set](https://shop.opentrons.com/collections/opentrons-tips/products/tube-rack-set-1) +* [12-well Trough](https://www.usascientific.com/12-channel-automation-reservoir.aspx) + +### Pipettes +* [One or two single-Channel pipette(s)](https://shop.opentrons.com/single-channel-electronic-pipette-p20/) + +### Reagents +* Mastermix components, e.g. polymerase enzyme, buffer, dNTPs etc located in the tubes and reservoir well A2-A12 specified by your input csv file. + +--- + +### Deck Setup +* Slot 1: Option of Opentrons tuberack/tube combo 1, or none +* Slot 2: Option of Opentrons tuberack/tube combo 2, or none +* Slot 3: Choice of Opentrons labware library 12-well reservoir +![deck layout](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/pcr_prep_part_1/deck.jpg) + +### Reagent Setup +* Tuberack 1: slot 1 - any number of reagents that can fit on the tuberack (defined in the csv) +![tuberack 1](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/pcr_prep_part_1/tuberack1.jpg) +* Tuberack 2: slot 2 - any number of reagents that can fit on the tuberack (defined in the csv) +![tuberack 2](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/pcr_prep_part_1/tuberack2.jpg) + +--- + +### Protocol Steps +1. The protocol reads a line from the csv and transfers that specific reagent from its tube or reservoir well to resevoir well A1 (i.e. the leftmost reservoir well). +2. The protocol repeats this until it has worked through the whole csv file. + +## Process +1. Select your pipettes. +2. Select your labware +3. Upload your master mix CSV. +4. Download your protocol. +5. Upload your protocol into the [OT App](https://opentrons.com/ot-app). +6. Set up your deck according to the deck map. +7. Calibrate your labware, tiprack and pipette using the OT App. For calibration tips, check out our [support article](https://support.opentrons.com/ot-2/getting-started-software-setup/deck-calibration). +8. Hit "Run". +9. Robot will transfer each reagent from its source to well A1 of trough in slot 3. + +### Additional Notes +Slot 1: Option of Opentrons tuberack/tube combo 1, or none +Slot 2: Option of Opentrons tuberack/tube combo 2, or none +Slot 3: 12-well Trough + +Please reference our [Application Note](https://opentrons-protocol-library-website.s3.amazonaws.com/Technical+Notes/Thermocycler+PCR+Application+Note.pdf) for more information about the expected output of this protocol. + +--- + +![csv_layout](https://s3.amazonaws.com/opentrons-protocol-library-website/custom-README-images/1473-acies-bio/CSV.png) +* Slot 1 refers to tuberack 1 (slot 1) , slot 2 refers to tuberack 2 (slot 2) slot 3 refers to the reservoir + +* The slot (1, 2, 3) and well (A1 - D6 for tubes, A2 to A12 for reservoir) describe source location of the reagent +* You can add as many reagents as necessary +* Make sure you do not reuse the same well in the same slot +* Keep the headers of the csv because the protocol expects them to be there. + +--- + +If you have any questions about this protocol, please contact protocols@opentrons.com. + +###### Internal +OT-2 PCR Prep v2 diff --git a/protocols/pcr_prep_part_1/fields.json b/protocols/pcr_prep_part_1/fields.json new file mode 100644 index 0000000000..57ee32a525 --- /dev/null +++ b/protocols/pcr_prep_part_1/fields.json @@ -0,0 +1,85 @@ +[ + { + "type": "dropDown", + "label": "right pipette type", + "name": "right_pipette", + "options": [ + { "label": "GEN2 P1000 Single", "value": "p1000_single_gen2"}, + { "label": "GEN2 P300 Single", "value": "p300_single_gen2" }, + { "label": "GEN2 P20 Single", "value": "p20_single_gen2" }, + { "label": "GEN1 P1000 Single", "value": "p1000_single"}, + { "label": "GEN1 P300 Single", "value": "p300_single" }, + { "label": "GEN1 P50 Single", "value": "p50_single" }, + { "label": "GEN1 P10 Single", "value": "p10_single" }, + { "label": "none", "value": null} + ] + }, + { + "type": "dropDown", + "label": "left pipette type", + "name": "left_pipette", + "options": [ + { "label": "GEN2 P1000 Single", "value": "p1000_single_gen2"}, + { "label": "GEN2 P300 Single", "value": "p300_single_gen2" }, + { "label": "GEN2 P20 Single", "value": "p20_single_gen2" }, + { "label": "GEN1 P1000 Single", "value": "p1000_single"}, + { "label": "GEN1 P300 Single", "value": "p300_single" }, + { "label": "GEN1 P50 Single", "value": "p50_single" }, + { "label": "GEN1 P10 Single", "value": "p10_single" }, + { "label": "none", "value": null} + ] + }, + { + "type": "dropDown", + "label": "Filter or regular tips", + "name": "is_filtered", + "options": [ + { "label": "Filtered tips", "value": true}, + { "label": "Regular tips", "value": false } + ] + }, + { + "type": "dropDown", + "label": "Tuberack 1", + "name": "tuberack_1_lname", + "options": [ + { "label": "Opentrons 24 Tube Rack with NEST 0.5 mL Screwcap", "value": "opentrons_24_tuberack_nest_0.5ml_screwcap" }, + { "label": "Opentrons 24 Tube Rack with NEST 1.5 mL Screwcap", "value": "opentrons_24_tuberack_nest_1.5ml_screwcap" }, + { "label": "Opentrons 24 Tube Rack with NEST 1.5 mL Snapcap", "value": "opentrons_24_tuberack_nest_1.5ml_snapcap" }, + { "label": "Opentrons 24 Tube Rack with NEST 2 mL Screwcap", "value": "opentrons_24_tuberack_nest_2ml_screwcap" }, + { "label": "Opentrons 24 Tube Rack with Eppendorf 1.5 mL Safe-Lock Snapcap", "value": "opentrons_24_tuberack_eppendorf_1.5ml_safelock_snapcap" }, + { "label": "Opentrons 24 Tube Rack with Eppendorf 2 mL Safe-Lock Snapcap", "value": "opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap" }, + { "label": "Opentrons 24 Tube Rack with Generic 2 mL Screwcap", "value": "opentrons_24_tuberack_generic_2ml_screwcap" }, + { "label": "None", "value": null } + ] + }, + { + "type": "dropDown", + "label": "Tuberack 2", + "name": "tuberack_2_lname", + "options": [ + { "label": "Opentrons 24 Tube Rack with NEST 0.5 mL Screwcap", "value": "opentrons_24_tuberack_nest_0.5ml_screwcap" }, + { "label": "Opentrons 24 Tube Rack with NEST 1.5 mL Screwcap", "value": "opentrons_24_tuberack_nest_1.5ml_screwcap" }, + { "label": "Opentrons 24 Tube Rack with NEST 1.5 mL Snapcap", "value": "opentrons_24_tuberack_nest_1.5ml_snapcap" }, + { "label": "Opentrons 24 Tube Rack with NEST 2 mL Screwcap", "value": "opentrons_24_tuberack_nest_2ml_screwcap" }, + { "label": "Opentrons 24 Tube Rack with Eppendorf 1.5 mL Safe-Lock Snapcap", "value": "opentrons_24_tuberack_eppendorf_1.5ml_safelock_snapcap" }, + { "label": "Opentrons 24 Tube Rack with Eppendorf 2 mL Safe-Lock Snapcap", "value": "opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap" }, + { "label": "Opentrons 24 Tube Rack with Generic 2 mL Screwcap", "value": "opentrons_24_tuberack_generic_2ml_screwcap" }, + { "label": "None", "value": null } + ] + },{ + "type": "dropDown", + "label": "12-well reservoir", + "name": "reservoir12_lname", + "options": [ + { "label": "NEST 12 Well Reservoir 15 mL", "value": "nest_12_reservoir_15ml" }, + { "label": "USA Scientific 12 Well Reservoir 22 mL", "value": "usascientific_12_reservoir_22ml" } + ] + }, + { + "type": "textFile", + "label": "master mix .csv file", + "name": "master_mix_csv", + "default": "Reagent,Slot,Well,Volume\nBuffer,1,A2,3\nMgCl,1,A3,40\ndNTPs,2,A2,90\nWater,2,A3,248\nprimer 1,1,A4,25\nprimer 2,1,A5,25\n" + } +] diff --git a/protocols/pcr_prep_part_1/pcr_prep-part1.ot2.apiv2.py b/protocols/pcr_prep_part_1/pcr_prep-part1.ot2.apiv2.py new file mode 100644 index 0000000000..d7437ca6a6 --- /dev/null +++ b/protocols/pcr_prep_part_1/pcr_prep-part1.ot2.apiv2.py @@ -0,0 +1,110 @@ +metadata = { + 'protocolName': 'PCR Prep', + 'author': 'Opentrons ', + 'source': 'Protocol Library', + 'apiLevel': '2.2' +} + + +def run(protocol_context): + [right_pipette, + left_pipette, + is_filtered, + tuberack_1_lname, + tuberack_2_lname, + reservoir12_lname, + master_mix_csv] = get_values( # noqa: F821 + "right_pipette", + "left_pipette", + "is_filtered", + "tuberack_1_lname", + "tuberack_2_lname", + "reservoir12_lname", + "master_mix_csv") + + if not left_pipette and not right_pipette: + raise Exception('You have to select at least 1 pipette.') + + pipette_l = None + pipette_r = None + + tiprack_pip_dict = { + "p10_single": ("opentrons_96_filtertiprack_20ul", + "opentrons_96_tiprack_20ul"), + "p20_single_gen2": ("opentrons_96_filtertiprack_20ul", + "opentrons_96_tiprack_20ul"), + "p50_single": ("opentrons_96_filtertiprack_200ul", + "opentrons_96_tiprack_300ul"), + "p300_single": ("opentrons_96_filtertiprack_200ul", + "opentrons_96_tiprack_300ul"), + "p300_single_gen2": ("opentrons_96_filtertiprack_200ul", + "opentrons_96_tiprack_300ul"), + "p1000_single": ("opentrons_96_filtertiprack_1000ul", + "opentrons_96_tiprack_1000ul"), + "p1000_single_gen2": ("opentrons_96_filtertiprack_1000ul", + "opentrons_96_tiprack_1000ul") + } + + for pip, mount, slot in zip( + [left_pipette, right_pipette], ['left', 'right'], ['5', '6']): + + if pip: + rack = tiprack_pip_dict[pip][0] if is_filtered else \ + tiprack_pip_dict[pip][1] + tiprack = protocol_context.load_labware(rack, slot) + if mount == 'left': + pipette_l = protocol_context.load_instrument( + pip, mount, tip_racks=[tiprack]) + else: + pipette_r = protocol_context.load_instrument( + pip, mount, tip_racks=[tiprack]) + + # labware setup + tuberack_1 = protocol_context.load_labware( + tuberack_1_lname, + '1', + 'tuberack 1' + ) + tuberack_2 = protocol_context.load_labware( + tuberack_2_lname, + '2', + 'tuberack 2' + ) + res12 = protocol_context.load_labware( + 'usascientific_12_reservoir_22ml', '3', '12-channel reservoir') + reagents = { + '1': tuberack_1, + '2': tuberack_2, + '3': res12 + } + + # determine which pipette has the smaller volume range + if pipette_l and pipette_r: + if left_pipette == right_pipette: + pip_s = pipette_l + pip_l = pipette_r + else: + if pipette_l.max_volume < pipette_r.max_volume: + pip_s, pip_l = pipette_l, pipette_r + else: + pip_s, pip_l = pipette_r, pipette_l + else: + pipette = pipette_l if pipette_l else pipette_r + + # destination + mastermix_dest = res12.wells()[0] + + info_list = [ + [cell.strip() for cell in line.split(',')] + for line in master_mix_csv.splitlines()[1:] if line + ] + + for line in info_list[1:]: + source = reagents[line[1]].wells(line[2].upper()) + vol = float(line[3]) + if pipette_l and pipette_r: + if vol <= pip_s.max_volume: + pipette = pip_s + else: + pipette = pip_l + pipette.transfer(vol, source, mastermix_dest) diff --git a/protocols/pcr_prep_part_2/README.md b/protocols/pcr_prep_part_2/README.md new file mode 100644 index 0000000000..2932e362a3 --- /dev/null +++ b/protocols/pcr_prep_part_2/README.md @@ -0,0 +1,55 @@ +# OT-2 PCR Prep 2/2: Master Mix Distribution and DNA Transfer + +### Author +[Opentrons (verified)](https://opentrons.com/) + +# Opentrons has launched a new Protocol Library. You should use the [new page for this protocol](library.opentrons.com/p/pcr_prep_part_2). This page won’t be available after January 31st, 2024. + +## Categories +* PCR + * PCR Prep + +## Description +Part 2 of 2: Master Mix Distribution and DNA Transfer + +Links: +* [Part 1: Master Mix Assembly](./pcr_prep_part_1) +* [Part 2: Master Mix Distribution and DNA Transfer](./pcr_prep_part_2) + + +This protocol allows your robot to distribute a master mix solution from well A1 of a trough to PCR strips. Robot will then transfer DNA samples to the master mix solution. + +--- + +You will need: +* [12-channel reservoir](https://www.usascientific.com/12-channel-automation-reservoir.aspx) +* [96-well PCR plate](https://www.bio-rad.com/en-us/sku/hsp9601-hard-shell-96-well-pcr-plates-low-profile-thin-wall-skirted-white-clear?ID=hsp9601) + +### Robot +* [OT-2](https://opentrons.com/ot-2) + +## Process +1. Input the number of samples you are processing. +2. Select your pipettes. +3. Input the desired master mix and DNA volume in each well. +4. Download your protocol. +5. Upload your protocol into the [OT App](https://opentrons.com/ot-app). +6. Set up your deck according to the deck map. +7. Calibrate your labware, tiprack and pipette using the OT App. For calibration tips, check out our [support article](https://support.opentrons.com/ot-2/getting-started-software-setup/deck-calibration). +8. Hit "Run". +9. Robot will distribute master mix solution from trough to PCR strips in slot 2. +10. Robot will transfer DNA from PCR strips in slot 1 to those in slot 2. + +### Additional Notes +Slot 1: PCR plate with DNA samples +Slot 2: Empty PCR plate +Slot 3: 12-channel reservoir with master mix solution in well A1 + +Please reference our [Application Note](https://opentrons-protocol-library-website.s3.amazonaws.com/Technical+Notes/Thermocycler+PCR+Application+Note.pdf) for more information about the expected output of this protocol. + +--- + +If you have any questions about this protocol, please contact protocols@opentrons.com. + +###### Internal +OT-2 PCR Prep v2 diff --git a/protocols/pcr_prep_part_2/fields.json b/protocols/pcr_prep_part_2/fields.json new file mode 100644 index 0000000000..b1a7e52eee --- /dev/null +++ b/protocols/pcr_prep_part_2/fields.json @@ -0,0 +1,48 @@ +[ + { + "type": "int", + "label": "sample number", + "name": "number_of_samples", + "default": 96 + }, + { + "type": "dropDown", + "label": "right pipette type", + "name": "right_pipette", + "options": [ + { "label": "GEN2 P300 Multi", "value": "p300_multi_gen2" }, + { "label": "GEN2 P20 Multi", "value": "p20_multi_gen2" }, + { "label": "GEN1 P1000 Multi", "value": "p1000_multi"}, + { "label": "GEN1 P300 Multi", "value": "p300_multi" }, + { "label": "GEN1 P50 Multi", "value": "p50_multi" }, + { "label": "GEN1 P10 Multi", "value": "p10_multi" }, + { "label": "none", "value": null} + ] + }, + { + "type": "dropDown", + "label": "left pipette type", + "name": "left_pipette", + "options": [ + { "label": "GEN2 P300 Multi", "value": "p300_multi_gen2" }, + { "label": "GEN2 P20 Multi", "value": "p20_multi_gen2" }, + { "label": "GEN1 P1000 Multi", "value": "p1000_multi"}, + { "label": "GEN1 P300 Multi", "value": "p300_multi" }, + { "label": "GEN1 P50 Multi", "value": "p50_multi" }, + { "label": "GEN1 P10 Multi", "value": "p10_multi" }, + { "label": "none", "value": null} + ] + }, + { + "type": "float", + "label": "mastermix volume (in ul)", + "name": "mastermix_volume", + "default": 18 + }, + { + "type": "float", + "label": "DNA volume (in ul)", + "name": "DNA_volume", + "default": 2 + } +] diff --git a/protocols/pcr_prep_part_2/pcr_prep-part2.ot2.apiv2.py b/protocols/pcr_prep_part_2/pcr_prep-part2.ot2.apiv2.py new file mode 100644 index 0000000000..6abd041128 --- /dev/null +++ b/protocols/pcr_prep_part_2/pcr_prep-part2.ot2.apiv2.py @@ -0,0 +1,92 @@ +import math + +metadata = { + 'protocolName': 'PCR Prep', + 'author': 'Opentrons ', + 'source': 'Protocol Library', + 'apiLevel': '2.2' + } + + +def run(protocol_context): + [number_of_samples, left_pipette, right_pipette, mastermix_volume, + DNA_volume] = get_values( # noqa: F821 + "number_of_samples", "left_pipette", 'right_pipette', + "mastermix_volume", "DNA_volume" + ) + + if not left_pipette and not right_pipette: + raise Exception('You have to select at least 1 pipette.') + + pipette_l = None + pipette_r = None + + for pip, mount, slots in zip( + [left_pipette, right_pipette], + ['left', 'right'], + [['5', '6'], ['7', '8']]): + + if pip: + range = pip.split('_')[0][1:] + rack = 'opentrons_96_tiprack_' + range + 'ul' + tipracks = [ + protocol_context.load_labware(rack, slot) for slot in slots] + if mount == 'left': + pipette_l = protocol_context.load_instrument( + pip, mount, tip_racks=tipracks) + else: + pipette_r = protocol_context.load_instrument( + pip, mount, tip_racks=tipracks) + + # labware setup + dna_plate = protocol_context.load_labware( + 'biorad_96_wellplate_200ul_pcr', '1', 'DNA plate') + dest_plate = protocol_context.load_labware( + 'biorad_96_wellplate_200ul_pcr', '2', 'Output plate') + res12 = protocol_context.load_labware( + 'usascientific_12_reservoir_22ml', '3', 'reservoir') + + # determine which pipette has the smaller volume range + if pipette_l and pipette_r: + if left_pipette == right_pipette: + pip_s = pipette_l + pip_l = pipette_r + else: + if pipette_l.max_volume < pipette_r.max_volume: + pip_s, pip_l = pipette_l, pipette_r + else: + pip_s, pip_l = pipette_r, pipette_l + else: + pipette = pipette_l if pipette_l else pipette_r + + # reagent setup + mastermix = res12.wells()[0] + + col_num = math.ceil(number_of_samples/8) + + # distribute mastermix + if pipette_l and pipette_r: + if mastermix_volume <= pip_s.max_volume: + pipette = pip_s + else: + pipette = pip_l + pipette.pick_up_tip() + for dest in dest_plate.rows()[0][:col_num]: + pipette.transfer( + mastermix_volume, + mastermix, + dest_plate.rows()[0][:col_num], + new_tip='never' + ) + pipette.blow_out(mastermix.top()) + pipette.drop_tip() + + # transfer DNA + if pipette_l and pipette_r: + if DNA_volume <= pip_s.max_volume: + pipette = pip_s + else: + pipette = pip_l + for source, dest in zip(dna_plate.rows()[0][:col_num], + dest_plate.rows()[0][:col_num]): + pipette.transfer(DNA_volume, source, dest) diff --git a/protocols/sci-macherey-nagel-nucleomag/README.md b/protocols/sci-macherey-nagel-nucleomag/README.md new file mode 100644 index 0000000000..8dd64fcd56 --- /dev/null +++ b/protocols/sci-macherey-nagel-nucleomag/README.md @@ -0,0 +1,96 @@ +# NucleoMag® Virus Viral DNA/RNA Isolation + +### Author +[Opentrons (verified)](https://opentrons.com/) + +# Opentrons has launched a new Protocol Library. You should use the [new page for this protocol](library.opentrons.com/p/sci-macherey-nagel-nucleomag). This page won’t be available after January 31st, 2024. + +## Categories +* Nucleic Acid Extraction & Purification + * DNA Extraction + +## Description +Your OT-2 can fully automate the entire NucleoMag® Virus Viral DNA/RNA Isolation. +Results of the Opentrons Science team's internal testing of this protocol on the OT-2 are shown below: + +![results](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/sci-macherey-nagel-nucleomag/NucleoMag+Virus+Viral+DNA%3ARNA+Isolation-results.png) + +Explanation of complex parameters below: +* `Number of samples`: Specify the number of samples this run (1-96 and divisible by 8, i.e. whole columns at a time). +* `Deepwell type`: Specify which well plate will be mounted on the magnetic module. +* `Reservoir Type`: Specify which reservoir will be employed. +* `Starting Volume`: Specify starting volume of sample (ul). +* `Binding Buffer Volume`: Specify the volume of binding buffer to use (ul). +* `Elution Volume`: Specify elution volume (ul). +* `Park Tips`: Specify whether to park tips or drop tips. +* `P300 Multi Channel Pipette Mount`: Specify whether the P300 multi channel pipette will be on the left or right mount. + +--- + +### Modules +* [Magnetic Module (GEN2)](https://shop.opentrons.com/collections/hardware-modules/products/magdeck) + +### Labware +* [NEST 96 Wellplate 2mL](https://shop.opentrons.com/collections/lab-plates/products/nest-0-2-ml-96-well-deep-well-plate-v-bottom) +* [USA Scientific 96 Wellplate 2.4mL](https://labware.opentrons.com/?category=wellPlate) +* [NEST 12 Reservoir 15mL](https://shop.opentrons.com/collections/reservoirs/products/nest-12-well-reservoir-15-ml) +* [USA Scientific 12 Reservoir 22mL](https://labware.opentrons.com/?category=reservoir) +* [Opentrons 200uL Filter Tips](https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-200ul-filter-tips) +* [Opentrons 96 Aluminum block Nest Wellplate 100ul](https://labware.opentrons.com/opentrons_96_aluminumblock_nest_wellplate_100ul?category=aluminumBlock) + +### Pipettes +* [P300 Multi Channel Pipette](https://shop.opentrons.com/collections/ot-2-robot/products/8-channel-electronic-pipette) + +### Reagents +* [Promega MagaZorb® DNA Mini-Prep Kit](https://www.promega.com/products/nucleic-acid-extraction/genomic-dna/magazorb-dna-mini-prep-kit/?catNum=MB1004) + +--- + +### Deck Setup + +* Tip rack on Slot 4 is used for tip parking if selected. + +![deck layout](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/sci-macherey-nagel-nucleomag/nucleomag-virus-isolation.png) + +### Reagent Setup + +* Reservoir 1: Slot 2 + +![reservoir 1](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/sci-macherey-nagel-nucleomag/res1.png) + +* Reservoir 2: Slot 3 + +![reservoir 2](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/sci-macherey-nagel-nucleomag/res2.png) + +--- + +### Protocol Steps +1. Binding buffer is mixed 5 times. +2. Binding buffer is added to samples on deep well plate on the magnetic module. +3. Magnetic module is engaged and incubated for 7 minutes. +4. Supernatant is removed and dropped into the liquid waste container. +5. Add Wash Buffer and resuspend by mixing. +6. Remove supernatant to liquid waste container. +7. Perform second wash (repeats step 5-6 with second wash buffer set). +8. Perform third wash (repeats step 5-6 with third wash buffer without resuspension). +8. Incubate for 1 minute to dry beads. +9. Elution solution is added to the samples. +10. Beads are resuspended in elution solution. +11. Incubates elution solution for 5 minutes. +12. Magnetic module is engaged and incubates for 7 minutes (variable settling time). +13. Elution samples are transferred to elution plate in Slot 1. + +### 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 +sci-promega-magazorb-dna-mini-prep-kit diff --git a/protocols/sci-macherey-nagel-nucleomag/fields.json b/protocols/sci-macherey-nagel-nucleomag/fields.json new file mode 100644 index 0000000000..1e66483e03 --- /dev/null +++ b/protocols/sci-macherey-nagel-nucleomag/fields.json @@ -0,0 +1,128 @@ +[ + { + "type": "int", + "label": "number of samples + controls (1-96)", + "name": "num_samples", + "default": 8 + }, + { + "type": "dropDown", + "label": "96-deepwell plate type", + "name": "deepwell_type", + "options": [ + {"label": "NEST", "value": "nest_96_wellplate_2ml_deep"}, + {"label": "USA Scientific", "value": "usascientific_96_wellplate_2.4ml_deep"} + ] + }, + { + "type": "float", + "label": "Mag Deck Engage Height", + "name": "mag_height", + "default": 6.8 + }, + { + "type": "float", + "label": "Z-offset for liquid transfer", + "name": "z_offset", + "default": 1 + }, + { + "type": "float", + "label": "Radial offset for liquid transfer", + "name": "radial_offset", + "default": 0.8 + }, + { + "type": "dropDown", + "label": "12-well reservoir type", + "name": "res_type", + "options": [ + {"label": "NEST", "value": "nest_12_reservoir_15ml"}, + {"label": "USA Scientific", "value": "usascientific_12_reservoir_22ml"} + ] + }, + { + "type": "float", + "label": "intitial volume (sample + lysis buffer, in ul)", + "name": "starting_vol", + "default": 230 + }, + { + "type": "float", + "label": "binding buffer volume (in ul)", + "name": "binding_buffer_vol", + "default": 315 + }, + { + "type": "float", + "label": "wash 1 volume (in ul, up to 500ul)", + "name": "wash1_vol", + "default": 500.0 + }, + { + "type": "float", + "label": "wash 2 volume (in ul, up to 500ul)", + "name": "wash2_vol", + "default": 500.0 + }, + { + "type": "float", + "label": "wash 3 volume (in ul, up to 500ul)", + "name": "wash3_vol", + "default": 500.0 + }, + { + "type": "float", + "label": "final elution volume (in ul)", + "name": "elution_vol", + "default": 50.0 + }, + { + "type": "int", + "label": "mix repetitions for bead resuspension", + "name": "mix_reps", + "default": 15 + }, + { + "type": "float", + "label": "bead settling time (in minutes)", + "name": "settling_time", + "default": 5 + }, + { + "type": "dropDown", + "label": "park tips", + "name": "park_tips", + "options": [ + {"label": "yes", "value": true}, + {"label": "no", "value": false} + ] + }, + { + "type": "dropDown", + "label": "track tips across protocol runs", + "name": "tip_track", + "options": [ + {"label": "no", "value": false}, + {"label": "yes", "value": true} + ] + }, + { + "type": "dropDown", + "label": "flash robot on pause", + "name": "flash", + "options": [ + {"label": "no", "value": false}, + {"label": "yes", "value": true} + ] + }, + { + "type": "dropDown", + "label": "P300 Multi Channel Pipette Mount", + "name": "p300_mount", + "options": [ + {"label": "Left", "value": "left"}, + {"label": "Right", "value": "right"} + ] + } + ] diff --git a/protocols/sci-macherey-nagel-nucleomag/sci-macherey-nagel-nucleomag.ot2.apiv2.py b/protocols/sci-macherey-nagel-nucleomag/sci-macherey-nagel-nucleomag.ot2.apiv2.py new file mode 100644 index 0000000000..390cb428ba --- /dev/null +++ b/protocols/sci-macherey-nagel-nucleomag/sci-macherey-nagel-nucleomag.ot2.apiv2.py @@ -0,0 +1,415 @@ +from opentrons.types import Point +import json +import os +import math +import threading +from time import sleep + + +metadata = { + 'protocolName': 'NucleoMag® Virus Viral DNA/RNA Isolation', + 'author': 'Opentrons ', + 'apiLevel': '2.4' +} + + +""" +Magheight is for gen 1 magdeck!! +""" + + +# Definitions for deck light flashing +class CancellationToken: + def __init__(self): + self.is_continued = False + + def set_true(self): + self.is_continued = True + + def set_false(self): + self.is_continued = False + + +def turn_on_blinking_notification(hardware, pause): + while pause.is_continued: + hardware.set_lights(rails=True) + sleep(1) + hardware.set_lights(rails=False) + sleep(1) + + +def create_thread(ctx, cancel_token): + t1 = threading.Thread(target=turn_on_blinking_notification, + args=(ctx._hw_manager.hardware, cancel_token)) + t1.start() + return t1 + + +# Start protocol +def run(ctx): + # Setup for flashing lights notification to empty trash + cancellationToken = CancellationToken() + + [num_samples, deepwell_type, mag_height, z_offset, radial_offset, res_type, + starting_vol, binding_buffer_vol, wash1_vol, wash2_vol, wash3_vol, + elution_vol, mix_reps, settling_time, park_tips, tip_track, + flash, p300_mount] = get_values( # noqa: F821 + 'num_samples', 'deepwell_type', 'mag_height', 'z_offset', + 'radial_offset', 'res_type', 'starting_vol', 'binding_buffer_vol', + 'wash1_vol', 'wash2_vol', 'wash3_vol', 'elution_vol', 'mix_reps', + 'settling_time', 'park_tips', 'tip_track', 'flash', 'p300_mount') + + """ + Here is where you can change the locations of your labware and modules + (note that this is the recommended configuration) + """ + magdeck = ctx.load_module('magnetic module Gen2', '6') + magdeck.disengage() + magplate = magdeck.load_labware(deepwell_type, 'deepwell plate') + elutionplate = ctx.load_labware( + 'opentrons_96_aluminumblock_nest_wellplate_100ul', + '1') + waste = ctx.load_labware('nest_1_reservoir_195ml', '9', + 'Liquid Waste').wells()[0].top() + res2 = ctx.load_labware(res_type, '3', 'reagent reservoir 2') + res1 = ctx.load_labware(res_type, '2', 'reagent reservoir 1') + num_cols = math.ceil(num_samples/8) + tips300 = [ctx.load_labware('opentrons_96_tiprack_300ul', slot, + '200µl filtertiprack') + for slot in ['5', '7', '8', '10', '11']] + if park_tips: + parkingrack = ctx.load_labware( + 'opentrons_96_tiprack_300ul', '4', 'tiprack for parking') + parking_spots = parkingrack.rows()[0][:num_cols] + else: + tips300.insert(0, ctx.load_labware('opentrons_96_tiprack_300ul', '4', + '200µl filtertiprack')) + parking_spots = [None for none in range(12)] +# tips300.insert(0, rack) + + # load P300M pipette + m300 = ctx.load_instrument( + 'p300_multi_gen2', 'left', tip_racks=tips300) + + tip_log = {val: {} for val in ctx.loaded_instruments.values()} + + """ + Here is where you can define the locations of your reagents. + """ + binding_buffer = res1.wells()[:5] + elution_solution = res2.wells()[-1] + wash1 = res1.wells()[5:9] + wash2 = res2.wells()[:4] + wash3 = res2.wells()[4:8] + + mag_samples_m = magplate.rows()[0][:num_cols] + elution_samples_m = elutionplate.rows()[0][:num_cols] + radius = mag_samples_m[0].width + +# magdeck.disengage() # just in case +# tempdeck.set_temperature(4) + + m300.flow_rate.aspirate = 50 + m300.flow_rate.dispense = 150 + m300.flow_rate.blow_out = 300 + + folder_path = '/data/B' + tip_file_path = folder_path + '/tip_log.json' + if tip_track and not ctx.is_simulating(): + if os.path.isfile(tip_file_path): + with open(tip_file_path) as json_file: + data = json.load(json_file) + for pip in tip_log: + if pip.name in data: + tip_log[pip]['count'] = data[pip.name] + else: + tip_log[pip]['count'] = 0 + else: + for pip in tip_log: + tip_log[pip]['count'] = 0 + else: + for pip in tip_log: + tip_log[pip]['count'] = 0 + + for pip in tip_log: + if pip.type == 'multi': + tip_log[pip]['tips'] = [tip for rack in pip.tip_racks + for tip in rack.rows()[0]] + else: + tip_log[pip]['tips'] = [tip for rack in pip.tip_racks + for tip in rack.wells()] + tip_log[pip]['max'] = len(tip_log[pip]['tips']) + + def _pick_up(pip, loc=None): + if tip_log[pip]['count'] == tip_log[pip]['max'] and not loc: + ctx.pause('Replace ' + str(pip.max_volume) + 'µl tipracks before \ +resuming.') + pip.reset_tipracks() + tip_log[pip]['count'] = 0 + if loc: + pip.pick_up_tip(loc) + else: + pip.pick_up_tip(tip_log[pip]['tips'][tip_log[pip]['count']]) + tip_log[pip]['count'] += 1 + + switch = True + drop_count = 0 + # number of tips trash will accommodate before prompting user to empty + drop_threshold = 120 + + def _drop(pip): + nonlocal switch + nonlocal drop_count + side = 30 if switch else -18 + drop_loc = ctx.loaded_labwares[12].wells()[0].top().move( + Point(x=side)) + pip.drop_tip(drop_loc) + switch = not switch + if pip.type == 'multi': + drop_count += 8 + else: + drop_count += 1 + if drop_count >= drop_threshold: + # Setup for flashing lights notification to empty trash + if flash: + if not ctx._hw_manager.hardware.is_simulator: + cancellationToken.set_true() + thread = create_thread(ctx, cancellationToken) + m300.home() + ctx.pause('Please empty tips from waste before resuming.') + ctx.home() # home before continuing with protocol + if flash: + cancellationToken.set_false() # stop light flashing after home + thread.join() + drop_count = 0 + + waste_vol = 0 + waste_threshold = 185000 + + def remove_supernatant(vol, park=False): + """ + `remove_supernatant` will transfer supernatant from the deepwell + extraction plate to the liquid waste reservoir. + :param vol (float): The amount of volume to aspirate from all deepwell + sample wells and dispense in the liquid waste. + :param park (boolean): Whether to pick up sample-corresponding tips + in the 'parking rack' or to pick up new tips. + """ + + def _waste_track(vol): + nonlocal waste_vol + if waste_vol + vol >= waste_threshold: + # Setup for flashing lights notification to empty liquid waste + if flash: + if not ctx._hw_manager.hardware.is_simulator: + cancellationToken.set_true() + thread = create_thread(ctx, cancellationToken) + m300.home() + ctx.pause('Please empty liquid waste (slot 11) before \ +resuming.') + + ctx.home() # home before continuing with protocol + if flash: + # stop light flashing after home + cancellationToken.set_false() + thread.join() + + waste_vol = 0 + waste_vol += vol + + m300.flow_rate.aspirate = 30 + num_trans = math.ceil(vol/200) + vol_per_trans = vol/num_trans + for i, (m, spot) in enumerate(zip(mag_samples_m, parking_spots)): + if park: + _pick_up(m300, spot) + else: + _pick_up(m300) + side = -1 if i % 2 == 0 else 1 + loc = m.bottom(0).move(Point(x=side*radius*radial_offset, + z=z_offset)) + for _ in range(num_trans): + _waste_track(vol_per_trans) + if m300.current_volume > 0: + # void air gap if necessary + m300.dispense(m300.current_volume, m.top()) + m300.move_to(m.center()) + m300.transfer(vol_per_trans, loc, waste, new_tip='never', + air_gap=20) + m300.blow_out(waste) + m300.air_gap(20) + _drop(m300) + m300.flow_rate.aspirate = 150 + + def bind(vol, park=True): + """ + `bind` will perform magnetic bead binding on each sample in the + deepwell plate. Each channel of binding beads will be mixed before + transfer, and the samples will be mixed with the binding beads after + the transfer. The magnetic deck activates after the addition to all + samples, and the supernatant is removed after bead bining. + :param vol (float): The amount of volume to aspirate from the elution + buffer source and dispense to each well containing + beads. + :param park (boolean): Whether to save sample-corresponding tips + between adding elution buffer and transferring + supernatant to the final clean elutions PCR + plate. + """ + latest_chan = -1 + for i, (well, spot) in enumerate(zip(mag_samples_m, parking_spots)): + _pick_up(m300) + num_trans = math.ceil(vol/200) + vol_per_trans = vol/num_trans + asp_per_chan = (0.95*res1.wells()[0].max_volume)//(vol_per_trans*8) + for t in range(num_trans): + chan_ind = int((i*num_trans + t)//asp_per_chan) + source = binding_buffer[chan_ind] + if m300.current_volume > 0: + # void air gap if necessary + m300.dispense(m300.current_volume, source.top()) + if chan_ind > latest_chan: # mix if accessing new channel + for _ in range(5): + m300.aspirate(180, source.bottom(0.5)) + m300.dispense(180, source.bottom(5)) + latest_chan = chan_ind + m300.transfer(vol_per_trans, source, well.top(), air_gap=20, + new_tip='never') + if t < num_trans - 1: + m300.air_gap(20) + m300.mix(5, 200, well) + m300.blow_out(well.top(-2)) + m300.air_gap(20) + if park: + m300.drop_tip(spot) + else: + _drop(m300) + ctx.delay(minutes=5, msg='Bind for 5 minutes off deck in a mixer') + magdeck.engage(height=mag_height) + ctx.delay(minutes=settling_time, msg='Incubating on MagDeck for \ +' + str(settling_time) + ' minutes.') + + # remove initial supernatant + remove_supernatant(vol+starting_vol, park=park) + + def wash(vol, source, mix_reps=15, park=True, resuspend=True): + """ + `wash` will perform bead washing for the extraction protocol. + :param vol (float): The amount of volume to aspirate from each + source and dispense to each well containing beads. + :param source (List[Well]): A list of wells from where liquid will be + aspirated. If the length of the source list + > 1, `wash` automatically calculates + the index of the source that should be + accessed. + :param mix_reps (int): The number of repititions to mix the beads with + specified wash buffer (ignored if resuspend is + False). + :param park (boolean): Whether to save sample-corresponding tips + between adding wash buffer and removing + supernatant. + :param resuspend (boolean): Whether to resuspend beads in wash buffer. + """ + + if resuspend and magdeck.status == 'engaged': + magdeck.disengage() + + num_trans = math.ceil(vol/200) + vol_per_trans = vol/num_trans + for i, (m, spot) in enumerate(zip(mag_samples_m, parking_spots)): + _pick_up(m300) + side = 1 if i % 2 == 0 else -1 + loc = m.bottom().move(Point(x=side*radius*radial_offset, + z=z_offset)) + src = source[i//(12//len(source))] + for n in range(num_trans): + if m300.current_volume > 0: + m300.dispense(m300.current_volume, src.top()) + m300.transfer(vol_per_trans, src, m.top(), air_gap=20, + new_tip='never') + if n < num_trans - 1: # only air_gap if going back to source + m300.air_gap(20) + if resuspend: + m300.mix(mix_reps, 150, loc) + m300.blow_out(m.top()) + m300.air_gap(20) + if park: + m300.drop_tip(spot) + else: + _drop(m300) + + if magdeck.status == 'disengaged': + magdeck.engage(height=mag_height) + + ctx.delay(minutes=settling_time, msg='Incubating on MagDeck for \ +' + str(settling_time) + ' minutes.') + + remove_supernatant(vol, park=park) + + def elute(vol, park=True): + """ + `elute` will perform elution from the deepwell extraciton plate to the + final clean elutions PCR plate to complete the extraction protocol. + :param vol (float): The amount of volume to aspirate from the elution + buffer source and dispense to each well containing + beads. + :param park (boolean): Whether to save sample-corresponding tips + between adding elution buffer and transferring + supernatant to the final clean elutions PCR + plate. + """ + + # resuspend beads in elution + if magdeck.status == 'enagaged': + magdeck.disengage() + for i, (m, spot) in enumerate(zip(mag_samples_m, parking_spots)): + _pick_up(m300) + side = 1 if i % 2 == 0 else -1 + loc = m.bottom().move(Point(x=side*radius*radial_offset, + z=z_offset)) + m300.aspirate(vol, elution_solution) + m300.move_to(m.center()) + m300.dispense(vol, loc) + m300.mix(mix_reps, 0.8*vol, loc) + m300.blow_out(m.bottom(5)) + m300.air_gap(20) + if park: + m300.drop_tip(spot) + else: + _drop(m300) + + magdeck.engage(height=mag_height) + ctx.delay(minutes=settling_time, msg='Incubating on MagDeck for \ +' + str(settling_time) + ' minutes.') + + for i, (m, e, spot) in enumerate( + zip(mag_samples_m, elution_samples_m, parking_spots)): + if park: + _pick_up(m300, spot) + else: + _pick_up(m300) + side = -1 if i % 2 == 0 else 1 + loc = m.bottom().move(Point(x=side*radius*radial_offset, + z=z_offset)) + m300.transfer(vol, loc, e.bottom(5), air_gap=20, new_tip='never') + m300.blow_out(e.top(-2)) + m300.air_gap(20) + m300.drop_tip() + + """ + Here is where you can call the methods defined above to fit your specific + protocol. The normal sequence is: + """ + bind(binding_buffer_vol, park=park_tips) + wash(wash1_vol, wash1, park=park_tips) + wash(wash2_vol, wash2, park=park_tips) + wash(wash3_vol, wash3, park=park_tips, resuspend=False) + elute(elution_vol, park=park_tips) + + # track final used tip + if tip_track and not ctx.is_simulating(): + if not os.path.isdir(folder_path): + os.mkdir(folder_path) + data = {pip.name: tip_log[pip]['count'] for pip in tip_log} + with open(tip_file_path, 'w') as outfile: + json.dump(data, outfile) diff --git a/protocols/sci-mag-bind-blood-tissue-kit/README.md b/protocols/sci-mag-bind-blood-tissue-kit/README.md new file mode 100644 index 0000000000..07ca71348e --- /dev/null +++ b/protocols/sci-mag-bind-blood-tissue-kit/README.md @@ -0,0 +1,96 @@ +# Mag-Bind® Blood & Tissue DNA HDQ 96 Kit + +### Author +[Opentrons (verified)](https://opentrons.com/) + +# Opentrons has launched a new Protocol Library. You should use the [new page for this protocol](library.opentrons.com/p/sci-mag-bind-blood-tissue-kit). This page won’t be available after January 31st, 2024. + +## Categories +* Nucleic Acid Extraction & Purification + * DNA Extraction + +## Description +Your OT-2 can fully automate the entire Mag-Bind® Blood & Tissue DNA HDQ 96 Kit. +Results of the Opentrons Science team's internal testing of this protocol on the OT-2 are shown below: + +![results](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/sci-mag-bind-blood-tissue-kit/sci-mag-bind-blood-tissue-kit-results.png) + +Explanation of complex parameters below: +* `Number of samples`: Specify the number of samples this run (1-96 and divisible by 8, i.e. whole columns at a time). +* `Deepwell type`: Specify which well plate will be mounted on the magnetic module. +* `Reservoir Type`: Specify which reservoir will be employed. +* `Starting Volume`: Specify starting volume of sample (ul). +* `Binding Buffer Volume`: Specify the volume of binding buffer to use (ul). +* `Elution Volume`: Specify elution volume (ul). +* `Park Tips`: Specify whether to park tips or drop tips. +* `P300 Multi Channel Pipette Mount`: Specify whether the P300 multi channel pipette will be on the left or right mount. + +--- + +### Modules +* [Magnetic Module (GEN2)](https://shop.opentrons.com/collections/hardware-modules/products/magdeck) + +### Labware +* [NEST 96 Wellplate 2mL](https://shop.opentrons.com/collections/lab-plates/products/nest-0-2-ml-96-well-deep-well-plate-v-bottom) +* [USA Scientific 96 Wellplate 2.4mL](https://labware.opentrons.com/?category=wellPlate) +* [NEST 12 Reservoir 15mL](https://shop.opentrons.com/collections/reservoirs/products/nest-12-well-reservoir-15-ml) +* [USA Scientific 12 Reservoir 22mL](https://labware.opentrons.com/?category=reservoir) +* [Opentrons 200uL Filter Tips](https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-200ul-filter-tips) +* [Opentrons 96 Aluminum block Nest Wellplate 100ul](https://labware.opentrons.com/opentrons_96_aluminumblock_nest_wellplate_100ul?category=aluminumBlock) + +### Pipettes +* [P300 Multi Channel Pipette](https://shop.opentrons.com/collections/ot-2-robot/products/8-channel-electronic-pipette) + +### Reagents +* [Mag-Bind® Blood & Tissue DNA HDQ 96 Kit](https://www.omegabiotek.com/product/tissue-and-blood-kit-genomic-dna-isolation-mag-bind-hdq-96/) + +--- + +### Deck Setup + +* Tip rack on Slot 4 is used for tip parking if selected. + +![deck layout](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/sci-mag-bind-blood-tissue-kit/sci-mag-bind-blood-tissue-kit.png) + +### Reagent Setup + +* Reservoir 1: Slot 2 + +![reservoir 1](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/sci-mag-bind-blood-tissue-kit/res1.png) + +* Reservoir 2: Slot 3 + +![reservoir 2](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/sci-mag-bind-blood-tissue-kit/res2.png) + +--- + +### Protocol Steps +1. Binding buffer is mixed 5 times. +2. Binding buffer is added to samples on deep well plate on the magnetic module. +3. Magnetic module is engaged and incubated for 7 minutes. +4. Supernatant is removed and dropped into the liquid waste container. +5. Add Wash Buffer and resuspend by mixing. +6. Remove supernatant to liquid waste container. +7. Perform second wash (repeats step 5-6 with second wash buffer set). +8. Perform third wash (repeats step 5-6 with third wash buffer without resuspension). +8. Incubate for 1 minute to dry beads. +9. Elution solution is added to the samples. +10. Beads are resuspended in elution solution. +11. Incubates elution solution for 5 minutes. +12. Magnetic module is engaged and incubates for 7 minutes (variable settling time). +13. Elution samples are transferred to elution plate in Slot 1. + +### 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 +sci-mag-bind-blood-tissue-kit diff --git a/protocols/sci-mag-bind-blood-tissue-kit/fields.json b/protocols/sci-mag-bind-blood-tissue-kit/fields.json new file mode 100644 index 0000000000..6d127a3816 --- /dev/null +++ b/protocols/sci-mag-bind-blood-tissue-kit/fields.json @@ -0,0 +1,110 @@ +[ + { + "type": "int", + "label": "number of samples + controls (1-96)", + "name": "num_samples", + "default": 8 + }, + { + "type": "dropDown", + "label": "96-deepwell plate type", + "name": "deepwell_type", + "options": [ + {"label": "NEST", "value": "nest_96_wellplate_2ml_deep"}, + {"label": "USA Scientific", "value": "usascientific_96_wellplate_2.4ml_deep"} + ] + }, + { + "type": "dropDown", + "label": "12-well reservoir type", + "name": "res_type", + "options": [ + {"label": "NEST", "value": "nest_12_reservoir_15ml"}, + {"label": "USA Scientific", "value": "usascientific_12_reservoir_22ml"} + ] + }, + { + "type": "float", + "label": "intitial volume (sample + lysis buffer, in ul)", + "name": "starting_vol", + "default": 430 + }, + { + "type": "float", + "label": "binding buffer volume (in ul)", + "name": "binding_buffer_vol", + "default": 370 + }, + { + "type": "float", + "label": "wash 1 volume (in ul, up to 500ul)", + "name": "wash1_vol", + "default": 500.0 + }, + { + "type": "float", + "label": "wash 2 volume (in ul, up to 500ul)", + "name": "wash2_vol", + "default": 500.0 + }, + { + "type": "float", + "label": "wash 3 volume (in ul, up to 500ul)", + "name": "wash3_vol", + "default": 500.0 + }, + { + "type": "float", + "label": "final elution volume (in ul)", + "name": "elution_vol", + "default": 50.0 + }, + { + "type": "int", + "label": "mix repetitions for bead resuspension", + "name": "mix_reps", + "default": 15 + }, + { + "type": "float", + "label": "bead settling time (in minutes)", + "name": "settling_time", + "default": 7 + }, + { + "type": "dropDown", + "label": "park tips", + "name": "park_tips", + "options": [ + {"label": "yes", "value": true}, + {"label": "no", "value": false} + ] + }, + { + "type": "dropDown", + "label": "track tips across protocol runs", + "name": "tip_track", + "options": [ + {"label": "no", "value": false}, + {"label": "yes", "value": true} + ] + }, + { + "type": "dropDown", + "label": "flash robot on pause", + "name": "flash", + "options": [ + {"label": "no", "value": false}, + {"label": "yes", "value": true} + ] + }, + { + "type": "dropDown", + "label": "P300 Multi Channel Pipette Mount", + "name": "p300_mount", + "options": [ + {"label": "Left", "value": "left"}, + {"label": "Right", "value": "right"} + ] + } + ] \ No newline at end of file diff --git a/protocols/sci-mag-bind-blood-tissue-kit/sci-mag-bind-blood-tissue-kit.ot2.apiv2.py b/protocols/sci-mag-bind-blood-tissue-kit/sci-mag-bind-blood-tissue-kit.ot2.apiv2.py new file mode 100644 index 0000000000..be72c7956e --- /dev/null +++ b/protocols/sci-mag-bind-blood-tissue-kit/sci-mag-bind-blood-tissue-kit.ot2.apiv2.py @@ -0,0 +1,456 @@ +from opentrons.types import Point +import json +import os +import math +import threading +from time import sleep +from opentrons import types + + +metadata = { + 'protocolName': 'Mag-Bind® Blood & Tissue DNA HDQ 96 Kit', + 'author': 'Opentrons ', + 'apiLevel': '2.4' +} + + +""" +Here is where you can modify the magnetic module engage height: +""" +MAG_HEIGHT = 13.6 + + +# Definitions for deck light flashing +class CancellationToken: + def __init__(self): + self.is_continued = False + + def set_true(self): + self.is_continued = True + + def set_false(self): + self.is_continued = False + + +def turn_on_blinking_notification(hardware, pause): + while pause.is_continued: + hardware.set_lights(rails=True) + sleep(1) + hardware.set_lights(rails=False) + sleep(1) + + +def create_thread(ctx, cancel_token): + t1 = threading.Thread(target=turn_on_blinking_notification, + args=(ctx._hw_manager.hardware, cancel_token)) + t1.start() + return t1 + + +# Start protocol +def run(ctx): + # Setup for flashing lights notification to empty trash + cancellationToken = CancellationToken() + + [num_samples, deepwell_type, res_type, starting_vol, binding_buffer_vol, + wash1_vol, wash2_vol, wash3_vol, elution_vol, mix_reps, settling_time, + park_tips, tip_track, flash, p300_mount] = get_values( # noqa: F821 + 'num_samples', 'deepwell_type', 'res_type', 'starting_vol', + 'binding_buffer_vol', 'wash1_vol', 'wash2_vol', 'wash3_vol', + 'elution_vol', 'mix_reps', 'settling_time', 'park_tips', 'tip_track', + 'flash', 'p300_mount') + + """ + Here is where you can change the locations of your labware and modules + (note that this is the recommended configuration) + """ + magdeck = ctx.load_module('magdeck', '6') + magdeck.disengage() + magplate = magdeck.load_labware(deepwell_type, 'deepwell plate') +# tempdeck = ctx.load_module('Temperature Module Gen2', '1') + elutionplate = ctx.load_labware( + 'opentrons_96_aluminumblock_nest_wellplate_100ul', + '1') + waste = ctx.load_labware('nest_1_reservoir_195ml', '9', + 'Liquid Waste').wells()[0].top() + res2 = ctx.load_labware(res_type, '3', 'reagent reservoir 2') + res1 = ctx.load_labware(res_type, '2', 'reagent reservoir 1') + num_cols = math.ceil(num_samples/8) + tips300 = [ctx.load_labware('opentrons_96_tiprack_300ul', slot, + '200µl filtertiprack') + for slot in ['5', '7', '8', '10', '11']] + if park_tips: + parkingrack = ctx.load_labware( + 'opentrons_96_tiprack_300ul', '4', 'tiprack for parking') + parking_spots = parkingrack.rows()[0][:num_cols] + else: + tips300.insert(0, ctx.load_labware('opentrons_96_tiprack_300ul', '4', + '200µl filtertiprack')) + parking_spots = [None for none in range(12)] + + # load P300M pipette + m300 = ctx.load_instrument( + 'p300_multi_gen2', p300_mount, tip_racks=tips300) + + """ + Here is where you can define the locations of your reagents. + """ + binding_buffer = res1.wells()[:4] + elution_solution = res2.wells()[-1] + wash1 = res1.wells()[4:8] + wash2 = res1.wells()[8:] + wash3 = res2.wells()[:4] + + mag_samples_m = magplate.rows()[0][:num_cols] + elution_samples_m = elutionplate.rows()[0][:num_cols] + +# magdeck.disengage() # just in case +# tempdeck.set_temperature(4) + + m300.flow_rate.aspirate = 50 + m300.flow_rate.dispense = 150 + m300.flow_rate.blow_out = 300 + + folder_path = '/data/B' + tip_file_path = folder_path + '/tip_log.json' + tip_log = {'count': {}} + if tip_track and not ctx.is_simulating(): + if os.path.isfile(tip_file_path): + with open(tip_file_path) as json_file: + data = json.load(json_file) + if 'tips300' in data: + tip_log['count'][m300] = data['tips300'] + else: + tip_log['count'][m300] = 0 + else: + tip_log['count'][m300] = 0 + else: + tip_log['count'] = {m300: 0} + + tip_log['tips'] = { + m300: [tip for rack in tips300 for tip in rack.rows()[0]]} + tip_log['max'] = {m300: len(tip_log['tips'][m300])} + + def _pick_up(pip, loc=None): + nonlocal tip_log + if tip_log['count'][pip] == tip_log['max'][pip] and not loc: + ctx.pause('Replace ' + str(pip.max_volume) + 'µl tipracks before \ +resuming.') + pip.reset_tipracks() + tip_log['count'][pip] = 0 + if loc: + pip.pick_up_tip(loc) + else: + pip.pick_up_tip(tip_log['tips'][pip][tip_log['count'][pip]]) + tip_log['count'][pip] += 1 + + switch = True + drop_count = 0 + # number of tips trash will accommodate before prompting user to empty + drop_threshold = 120 + + def _drop(pip): + nonlocal switch + nonlocal drop_count + side = 30 if switch else -18 + drop_loc = ctx.loaded_labwares[12].wells()[0].top().move( + Point(x=side)) + pip.drop_tip(drop_loc) + switch = not switch + if pip.type == 'multi': + drop_count += 8 + else: + drop_count += 1 + if drop_count >= drop_threshold: + # Setup for flashing lights notification to empty trash + if flash: + if not ctx._hw_manager.hardware.is_simulator: + cancellationToken.set_true() + thread = create_thread(ctx, cancellationToken) + m300.home() + ctx.pause('Please empty tips from waste before resuming.') + ctx.home() # home before continuing with protocol + if flash: + cancellationToken.set_false() # stop light flashing after home + thread.join() + drop_count = 0 + + waste_vol = 0 + waste_threshold = 185000 + + def remove_supernatant(vol, park=False): + """ + `remove_supernatant` will transfer supernatant from the deepwell + extraction plate to the liquid waste reservoir. + :param vol (float): The amount of volume to aspirate from all deepwell + sample wells and dispense in the liquid waste. + :param park (boolean): Whether to pick up sample-corresponding tips + in the 'parking rack' or to pick up new tips. + """ + + def _waste_track(vol): + nonlocal waste_vol + if waste_vol + vol >= waste_threshold: + # Setup for flashing lights notification to empty liquid waste + if flash: + if not ctx._hw_manager.hardware.is_simulator: + cancellationToken.set_true() + thread = create_thread(ctx, cancellationToken) + m300.home() + ctx.pause('Please empty liquid waste (slot 11) before \ +resuming.') + + ctx.home() # home before continuing with protocol + if flash: + # stop light flashing after home + cancellationToken.set_false() + thread.join() + + waste_vol = 0 + waste_vol += vol + + m300.flow_rate.aspirate = 30 + num_trans = math.ceil(vol/200) + vol_per_trans = vol/num_trans + for i, (m, spot) in enumerate(zip(mag_samples_m, parking_spots)): + if park: + _pick_up(m300, spot) + else: + _pick_up(m300) + side = -1 if i % 2 == 0 else 1 + loc = m.bottom(0.5).move(Point(x=side*2)) + for _ in range(num_trans): + _waste_track(vol_per_trans*8) + if m300.current_volume > 0: + # void air gap if necessary + m300.dispense(m300.current_volume, m.top()) + m300.move_to(m.center()) + m300.transfer(vol_per_trans, loc, waste, new_tip='never', + air_gap=20) + m300.blow_out(waste) + m300.air_gap(20) + _drop(m300) + m300.flow_rate.aspirate = 150 + + def resuspend_pellet(well, pip, mvol, reps=5): + """ + 'resuspend_pellet' will forcefully dispense liquid over the pellet + after the magdeck engage in order to more thoroughly resuspend the + pellet. param well: The current well that the resuspension will occur + in. param pip: The pipet that is currently attached/ being used. + param mvol: The volume that is transferred before the mixing steps. + param reps: The number of mix repetitions that should occur. Note~ + During each mix rep, there are 2 cycles of aspirating from center, + dispensing at the top and 2 cycles of aspirating from center, + dispensing at the bottom (5 mixes total) + """ + + rightLeft = int(str(well).split(' ')[0][1:]) % 2 + """ + 'rightLeft' will determine which value to use in the list of 'top' and + 'bottom' (below), based on the column of the 'well' used. + In the case that an Even column is used, the first value of 'top' and + 'bottom' will be used, otherwise, the second value of each will be + used. + """ + center = well.bottom().move(types.Point(x=0, y=0, z=0.1)) + top = [ + well.bottom().move(types.Point(x=-3.8, y=3.8, z=0.1)), + well.bottom().move(types.Point(x=3.8, y=3.8, z=0.1)) + ] + bottom = [ + well.bottom().move(types.Point(x=-3.8, y=-3.8, z=0.1)), + well.bottom().move(types.Point(x=3.8, y=-3.8, z=0.1)) + ] + + pip.flow_rate.dispense = 500 + pip.flow_rate.aspirate = 150 + + mix_vol = 0.9 * mvol + + pip.move_to(center) + for _ in range(reps): + for _ in range(2): + pip.aspirate(mix_vol, center) + pip.dispense(mix_vol, top[rightLeft]) + for _ in range(2): + pip.aspirate(mix_vol, center) + pip.dispense(mix_vol, bottom[rightLeft]) + + def bind(vol, park=True): + """ + `bind` will perform magnetic bead binding on each sample in the + deepwell plate. Each channel of binding beads will be mixed before + transfer, and the samples will be mixed with the binding beads after + the transfer. The magnetic deck activates after the addition to all + samples, and the supernatant is removed after bead bining. + :param vol (float): The amount of volume to aspirate from the elution + buffer source and dispense to each well containing + beads. + :param park (boolean): Whether to save sample-corresponding tips + between adding elution buffer and transferring + supernatant to the final clean elutions PCR + plate. + """ + latest_chan = -1 + for i, (well, spot) in enumerate(zip(mag_samples_m, parking_spots)): + if park: + _pick_up(m300, spot) + else: + _pick_up(m300) + num_trans = math.ceil(vol/200) + vol_per_trans = vol/num_trans + asp_per_chan = (0.95*res1.wells()[0].max_volume)//(vol_per_trans*8) + for t in range(num_trans): + chan_ind = int((i*num_trans + t)//asp_per_chan) + source = binding_buffer[chan_ind] + if m300.current_volume > 0: + # void air gap if necessary + m300.dispense(m300.current_volume, source.top()) + if chan_ind > latest_chan: # mix if accessing new channel + for _ in range(5): + m300.aspirate(180, source.bottom(0.5)) + m300.dispense(180, source.bottom(5)) + latest_chan = chan_ind + m300.transfer(vol_per_trans, source, well.top(), air_gap=20, + new_tip='never') + if t < num_trans - 1: + m300.air_gap(20) + m300.mix(5, 200, well) + + m300.blow_out(well.top(-2)) + m300.air_gap(20) + if park: + m300.drop_tip(spot) + else: + _drop(m300) + ctx.delay(minutes=10, msg='Bind off-deck on a heater/shaker') + magdeck.engage(height=MAG_HEIGHT) + ctx.delay(minutes=settling_time, msg='Incubating on MagDeck for \ +' + str(settling_time) + ' minutes.') + + # remove initial supernatant + remove_supernatant(vol+starting_vol, park=park) + + def wash(vol, source, mix_reps=15, park=True, resuspend=True): + """ + `wash` will perform bead washing for the extraction protocol. + :param vol (float): The amount of volume to aspirate from each + source and dispense to each well containing beads. + :param source (List[Well]): A list of wells from where liquid will be + aspirated. If the length of the source list + > 1, `wash` automatically calculates + the index of the source that should be + accessed. + :param mix_reps (int): The number of repititions to mix the beads with + specified wash buffer (ignored if resuspend is + False). + :param park (boolean): Whether to save sample-corresponding tips + between adding wash buffer and removing + supernatant. + :param resuspend (boolean): Whether to resuspend beads in wash buffer. + """ + + if resuspend and magdeck.status == 'engaged': + magdeck.disengage() + + num_trans = math.ceil(vol/200) + vol_per_trans = vol/num_trans + for i, (m, spot) in enumerate(zip(mag_samples_m, parking_spots)): + _pick_up(m300) + # side = 1 if i % 2 == 0 else -1 + # loc = m.bottom(0.5).move(Point(x=side*2)) + src = source[i//(12//len(source))] + for n in range(num_trans): + if m300.current_volume > 0: + m300.dispense(m300.current_volume, src.top()) + m300.transfer(vol_per_trans, src, m.top(), air_gap=20, + new_tip='never') + if n < num_trans - 1: # only air_gap if going back to source + m300.air_gap(20) + if resuspend: + # m300.mix(mix_reps, 150, loc) + resuspend_pellet(m, m300, 180) + + m300.blow_out(m.top()) + m300.air_gap(20) + if park: + m300.drop_tip(spot) + else: + _drop(m300) + + if magdeck.status == 'disengaged': + magdeck.engage(height=MAG_HEIGHT) + + ctx.delay(minutes=settling_time, msg='Incubating on MagDeck for \ +' + str(settling_time) + ' minutes.') + + remove_supernatant(vol, park=park) + + def elute(vol, park=True): + """ + `elute` will perform elution from the deepwell extraciton plate to the + final clean elutions PCR plate to complete the extraction protocol. + :param vol (float): The amount of volume to aspirate from the elution + buffer source and dispense to each well containing + beads. + :param park (boolean): Whether to save sample-corresponding tips + between adding elution buffer and transferring + supernatant to the final clean elutions PCR + plate. + """ + + # resuspend beads in elution + if magdeck.status == 'enagaged': + magdeck.disengage() + for i, (m, spot) in enumerate(zip(mag_samples_m, parking_spots)): + _pick_up(m300) + side = 1 if i % 2 == 0 else -1 + loc = m.bottom(0.5).move(Point(x=side*2)) + m300.aspirate(vol, elution_solution) + m300.move_to(m.center()) + m300.dispense(vol, loc) + m300.mix(mix_reps, 0.8*vol, loc) + m300.blow_out(m.bottom(5)) + m300.air_gap(20) + if park: + m300.drop_tip(spot) + else: + _drop(m300) + + ctx.delay(minutes=5, msg='Delay for 5 minutes for elution') + magdeck.engage(height=MAG_HEIGHT) + ctx.delay(minutes=settling_time, msg='Incubating on MagDeck for \ +' + str(settling_time) + ' minutes.') + + for i, (m, e, spot) in enumerate( + zip(mag_samples_m, elution_samples_m, parking_spots)): + if park: + _pick_up(m300, spot) + else: + _pick_up(m300) + side = -1 if i % 2 == 0 else 1 + loc = m.bottom(0.5).move(Point(x=side*2)) + m300.transfer(vol, loc, e.bottom(5), air_gap=20, new_tip='never') + m300.blow_out(e.top(-2)) + m300.air_gap(20) + m300.drop_tip() + + """ + Here is where you can call the methods defined above to fit your specific + protocol. The normal sequence is: + """ + bind(binding_buffer_vol, park=park_tips) + wash(wash1_vol, wash1, park=park_tips) + wash(wash2_vol, wash2, park=park_tips) + wash(wash3_vol, wash3, park=park_tips) + ctx.delay(minutes=5, msg='Incubate for 5 minutes to dry beads') + elute(elution_vol, park=park_tips) + + # track final used tip + if tip_track and not ctx.is_simulating(): + if not os.path.isdir(folder_path): + os.mkdir(folder_path) + data = {'tips300': tip_log['count'][m300]} + with open(tip_file_path, 'w') as outfile: + json.dump(data, outfile) diff --git a/protocols/sci-omegabiotek-extraction-fa/.hide-from-search b/protocols/sci-omegabiotek-extraction-fa/.hide-from-search new file mode 100644 index 0000000000..e69de29bb2 diff --git a/protocols/sci-omegabiotek-extraction-fa/README.md b/protocols/sci-omegabiotek-extraction-fa/README.md new file mode 100644 index 0000000000..5a42b5dbe8 --- /dev/null +++ b/protocols/sci-omegabiotek-extraction-fa/README.md @@ -0,0 +1,99 @@ +# Mag-Bind® Blood & Tissue DNA HDQ 96 Kit (Fully Automated) + +### Author +[Opentrons (verified)](https://opentrons.com/) + +# Opentrons has launched a new Protocol Library. You should use the [new page for this protocol](library.opentrons.com/p/sci-omegabiotek-extraction-fa). This page won’t be available after January 31st, 2024. + +## Categories +* Nucleic Acid Extraction & Purification + * RNA Extraction + +## Description +After lysing samples, your OT-2 can fully automate the entire Omega Bio-tek Mag-Bind® Blood & Tissue DNA HDQ 96 Kit. Buffer systems tailored specifically for each type of starting material are added to samples to undergo lysis. Samples are then mixed with HDQ Binding Buffer and Mag-Bind® Particles HDQ to bind magnetic beads to DNA. DNA is eluted in the Elution Buffer after rapid wash steps. + +Results of the Opentrons Science team's internal testing of this protocol on the OT-2 are shown below: + +![results](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/sci-omegabiotek-extraction/Screen+Shot+2021-06-29+at+2.44.45+PM.png) + +Explanation of complex parameters below: +* `Number of samples`: Specify the number of samples this run (1-96 and divisible by 8, i.e. whole columns at a time). +* `Deepwell type`: Specify which well plate will be mounted on the magnetic module. +* `Reservoir Type`: Specify which reservoir will be employed. +* `Starting Volume`: Specify starting volume of sample (ul). +* `Elution Volume`: Specify elution volume (ul). +* `Park Tips`: Specify whether to park tips or drop tips. +* `Mag Deck Generation`: Specify whether GEN1 or GEN2 magnetic module will be used. +* `P300 Multi Channel Pipette Mount`: Specify whether the P300 multi channel pipette will be on the left or right mount. + + +--- + +### Modules +* [Magnetic Module (GEN2)](https://shop.opentrons.com/collections/hardware-modules/products/magdeck) + + +### Labware +* [NEST 96 Wellplate 2mL](https://shop.opentrons.com/collections/lab-plates/products/nest-0-2-ml-96-well-deep-well-plate-v-bottom) +* [USA Scientific 96 Wellplate 2.4mL](https://labware.opentrons.com/?category=wellPlate) +* [NEST 12 Reservoir 15mL](https://shop.opentrons.com/collections/reservoirs/products/nest-12-well-reservoir-15-ml) +* [USA Scientific 12 Reservoir 22mL](https://labware.opentrons.com/?category=reservoir) +* [Opentrons 96 tiprack 300ul](https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-300ul-tips) +* [Opentrons 96 Aluminum block Nest Wellplate 100ul](https://labware.opentrons.com/opentrons_96_aluminumblock_nest_wellplate_100ul?category=aluminumBlock) + +### Pipettes +* [P300 Multi Channel Pipette](https://shop.opentrons.com/collections/ot-2-robot/products/8-channel-electronic-pipette) + +### Reagents +* [Omega Bio-tek](https://www.omegabiotek.com/product/mag-bind-hdq-blood-dna-96-kit/?cn-reloaded=1) + +--- + +### Deck Setup + +![deck layout](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/sci-omegabiotek-extraction/Screen+Shot+2021-06-29+at+5.29.44+PM.png) + +### Reagent Setup + +* Reservoir 1: Slot 2 + +![reservoir 1](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/sci-omegabiotek-extraction/Screen+Shot+2021-06-29+at+2.36.37+PM.png) + +* Reservoir 2: Slot 3 + +![reservoir 2](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/sci-omegabiotek-extraction/Screen+Shot+2021-06-29+at+2.36.45+PM.png) + +--- + +### Protocol Steps +1. Binding buffer is mixed +2. Binding buffer added to samples +3. Binding buffer and sample mixed +4. Samples will be mixed with parked tips +5. Engage magnetic module +6. Incubate 7 minutes +7. Remove supernatant +8. Wash with wash buffer 1 and mix +9. Engage magnetic module +10. Delay 7 minutes +11. Remove supernatant +12. Disengage magnet +13. Repeat steps 8-11 with wash buffer 2 and 3 +14. Elution solution added to sample and mixed +15. Delay 5 minutes for elution +16. Elute added to aluminum block + +### 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 +sci-omegabiotek-extraction diff --git a/protocols/sci-omegabiotek-extraction-fa/fields.json b/protocols/sci-omegabiotek-extraction-fa/fields.json new file mode 100644 index 0000000000..93f49fd50c --- /dev/null +++ b/protocols/sci-omegabiotek-extraction-fa/fields.json @@ -0,0 +1,65 @@ +[ + { + "type": "int", + "label": "Number of Samples", + "name": "num_samples", + "default": 96 + }, + { + "type": "dropDown", + "label": "Deepwell Type", + "name": "deepwell_type", + "options": [ + { "label": "NEST 96 Wellplate 2mL", "value": "nest_96_wellplate_2ml_deep" }, + { "label": "USA Scientific 96 Wellplate 2.4mL", "value": "usascientific_96_wellplate_2.4ml_deep" } + ] + }, + { + "type": "dropDown", + "label": "Reservoir Type", + "name": "res_type", + "options": [ + { "label": "NEST 12 Reservoir 15mL", "value": "nest_12_reservoir_15ml" }, + { "label": "USA Scientific 12 Reservoir 22mL", "value": "usascientific_12_reservoir_22ml" } + ] + }, + { + "type": "int", + "label": "Starting Volume", + "name": "starting_vol", + "default": 430 + }, + { + "type": "int", + "label": "Elution Volume", + "name": "elution_vol", + "default": 50 + }, + { + "type": "dropDown", + "label": "Park Tips?", + "name": "park_tips", + "options": [ + { "label": "Yes, park tips", "value": true }, + { "label": "No, do not park tips", "value": false } + ] + }, + { + "type": "dropDown", + "label": "Mag Deck Generation", + "name": "mag_gen", + "options": [ + { "label": "GEN1", "value": "magdeck" }, + { "label": "GEN2", "value": "magnetic module gen2" } + ] + }, + { + "type": "dropDown", + "label": "P300 Multi Mount", + "name": "m300_mount", + "options": [ + { "label": "Left", "value": "left" }, + { "label": "Right", "value": "right" } + ] + } +] diff --git a/protocols/sci-omegabiotek-extraction-fa/sci-omegabiotek-extraction-fa.ot2.apiv2.py b/protocols/sci-omegabiotek-extraction-fa/sci-omegabiotek-extraction-fa.ot2.apiv2.py new file mode 100644 index 0000000000..be94787832 --- /dev/null +++ b/protocols/sci-omegabiotek-extraction-fa/sci-omegabiotek-extraction-fa.ot2.apiv2.py @@ -0,0 +1,405 @@ +from opentrons.types import Point +import math +from opentrons import types +import os +import json + + +metadata = { + 'protocolName': 'Mag-Bind® Blood & Tissue DNA HDQ 96 Kit', + 'author': 'Opentrons ', + 'source': 'Custom Protocol Request', + 'apiLevel': '2.4' +} + + +# Start protocol +def run(ctx): + + [num_samples, deepwell_type, res_type, starting_vol, + elution_vol, park_tips, mag_gen, m300_mount] = get_values( # noqa: F821 + 'num_samples', 'deepwell_type', 'res_type', 'starting_vol', + 'elution_vol', 'park_tips', 'mag_gen', 'm300_mount') + + if num_samples % 8 != 0: + raise Exception("Enter a sample number wholly divisible by 8") + if not 0 <= num_samples <= 96: + raise Exception("Enter a sample number between 1-96") + + if mag_gen == 'magdeck': + MAG_HEIGHT = 13.6 + else: + MAG_HEIGHT = 6.8 + + """ + Here is where you can change the locations of your labware and modules + (note that this is the recommended configuration) + """ + magdeck = ctx.load_module(mag_gen, '6') + magdeck.disengage() + magplate = magdeck.load_labware(deepwell_type, 'deepwell plate') + # tempdeck = ctx.load_module('Temperature Module Gen2', '1') + elutionplate = ctx.load_labware( + 'opentrons_96_aluminumblock_nest_wellplate_100ul', + '1') + waste = ctx.load_labware('nest_1_reservoir_195ml', '9', + 'Liquid Waste').wells()[0].top() + res2 = ctx.load_labware(res_type, '3', 'reagent reservoir 2') + res1 = ctx.load_labware(res_type, '2', 'reagent reservoir 1') + num_cols = math.ceil(num_samples/8) + tips300 = [ctx.load_labware('opentrons_96_tiprack_300ul', slot, + '200µl filtertiprack') + for slot in ['5', '7', '8', '10', '11']] + if park_tips: + parkingrack = ctx.load_labware( + 'opentrons_96_tiprack_300ul', '4', 'tiprack for parking') + parking_spots = parkingrack.rows()[0][:num_cols] + else: + tips300.insert(0, ctx.load_labware('opentrons_96_tiprack_300ul', '4', + '200µl filtertiprack')) + parking_spots = [None for none in range(12)] + + # load P300M pipette + m300 = ctx.load_instrument( + 'p300_multi_gen2', m300_mount, tip_racks=tips300) + tip_log = {val: {} for val in ctx.loaded_instruments.values()} + + """ + Here is where you can define the locations of your reagents. + """ + binding_buffer = res1.wells()[:4] + elution_solution = res2.wells()[-1] + wash1 = res1.wells()[4:8] + wash2 = res1.wells()[8:] + wash3 = res2.wells()[:4] + + mag_samples_m = magplate.rows()[0][:num_cols] + elution_samples_m = elutionplate.rows()[0][:num_cols] + +# magdeck.disengage() # just in case +# tempdeck.set_temperature(4) + + m300.flow_rate.aspirate = 50 + m300.flow_rate.dispense = 150 + m300.flow_rate.blow_out = 300 + tip_track = False + folder_path = '/data/B' + tip_file_path = folder_path + '/tip_log.json' + tip_log = {'count': {}} + if tip_track and not ctx.is_simulating(): + if os.path.isfile(tip_file_path): + with open(tip_file_path) as json_file: + data = json.load(json_file) + if 'tips300' in data: + tip_log['count'][m300] = data['tips300'] + else: + tip_log['count'][m300] = 0 + else: + tip_log['count'][m300] = 0 + else: + tip_log['count'] = {m300: 0} + + tip_log['tips'] = { + m300: [tip for rack in tips300 for tip in rack.rows()[0]]} + tip_log['max'] = {m300: len(tip_log['tips'][m300])} + + def _pick_up(pip, loc=None): + nonlocal tip_log + if tip_log['count'][pip] == tip_log['max'][pip] and not loc: + ctx.pause('Replace ' + str(pip.max_volume) + 'µl tipracks before \ +resuming.') + pip.reset_tipracks() + tip_log['count'][pip] = 0 + if loc: + pip.pick_up_tip(loc) + else: + pip.pick_up_tip(tip_log['tips'][pip][tip_log['count'][pip]]) + tip_log['count'][pip] += 1 + + switch = True + drop_count = 0 + # number of tips trash will accommodate before prompting user to empty + drop_threshold = 120 + + def _drop(pip): + nonlocal switch + nonlocal drop_count + side = 30 if switch else -18 + drop_loc = ctx.loaded_labwares[12].wells()[0].top().move( + Point(x=side)) + pip.drop_tip(drop_loc) + switch = not switch + if pip.type == 'multi': + drop_count += 8 + else: + drop_count += 1 + if drop_count >= drop_threshold: + m300.home() + ctx.pause('Please empty tips from waste before resuming.') + ctx.home() # home before continuing with protocol + drop_count = 0 + + waste_vol = 0 + waste_threshold = 185000 + + def remove_supernatant(vol, park=False): + """ + `remove_supernatant` will transfer supernatant from the deepwell + extraction plate to the liquid waste reservoir. + :param vol (float): The amount of volume to aspirate from all deepwell + sample wells and dispense in the liquid waste. + :param park (boolean): Whether to pick up sample-corresponding tips + in the 'parking rack' or to pick up new tips. + """ + + def _waste_track(vol): + nonlocal waste_vol + if waste_vol + vol >= waste_threshold: + m300.home() + ctx.pause('Please empty liquid waste (slot 11) before \ +resuming.') + ctx.home() # home before continuing with protocol + waste_vol = 0 + waste_vol += vol + + m300.flow_rate.aspirate = 30 + num_trans = math.ceil(vol/200) + vol_per_trans = vol/num_trans + for i, (m, spot) in enumerate(zip(mag_samples_m, parking_spots)): + if park: + _pick_up(m300, spot) + else: + _pick_up(m300) + side = -1 if i % 2 == 0 else 1 + loc = m.bottom(0.5).move(Point(x=side*2)) + for _ in range(num_trans): + _waste_track(vol_per_trans) + if m300.current_volume > 0: + # void air gap if necessary + m300.dispense(m300.current_volume, m.top()) + m300.move_to(m.center()) + m300.transfer(vol_per_trans, loc, waste, new_tip='never', + air_gap=20) + m300.blow_out(waste) + m300.air_gap(20) + _drop(m300) + m300.flow_rate.aspirate = 150 + + def resuspend_pellet(well, pip, mvol, reps=5): + """ + 'resuspend_pellet' will forcefully dispense liquid over pellet after + the magdeck engage in order to more thoroughly resuspend the pellet. + param well: The current well that the resuspension will occur in. + param pip: The pipet that is currently attached/ being used. + param mvol: The volume that is transferred before the mixing steps. + param reps: The number of mix repetitions that should occur. Note~ + During each mix rep, there are 2 cycles of aspirating from center, + dispensing at the top and 2 cycles of aspirating from center, + dispensing at the bottom (5 mixes total) + """ + + rightLeft = int(str(well).split(' ')[0][1:]) % 2 + """ + 'rightLeft' will determine which value to use in the list of 'top' and + 'bottom' (below), based on the column of the 'well' used. + In the case that an Even column is used, the first value of 'top' and + 'bottom' will be used, otherwise, the second value of each will be used + """ + center = well.bottom().move(types.Point(x=0, y=0, z=0.1)) + top = [ + well.bottom().move(types.Point(x=-3.8, y=3.8, z=0.1)), + well.bottom().move(types.Point(x=3.8, y=3.8, z=0.1)) + ] + bottom = [ + well.bottom().move(types.Point(x=-3.8, y=-3.8, z=0.1)), + well.bottom().move(types.Point(x=3.8, y=-3.8, z=0.1)) + ] + + pip.flow_rate.dispense = 500 + pip.flow_rate.aspirate = 150 + + mix_vol = 0.9 * mvol + + pip.move_to(center) + for _ in range(reps): + for _ in range(2): + pip.aspirate(mix_vol, center) + pip.dispense(mix_vol, top[rightLeft]) + for _ in range(2): + pip.aspirate(mix_vol, center) + pip.dispense(mix_vol, bottom[rightLeft]) + + def bind(vol, park=True): + """ + `bind` will perform magnetic bead binding on each sample in the + deepwell plate. Each channel of binding beads will be mixed before + transfer, and the samples will be mixed with the binding beads after + the transfer. The magnetic deck activates after the addition to all + samples, and the supernatant is removed after bead bining. + :param vol (float): The amount of volume to aspirate from the elution + buffer source and dispense to each well containing + beads. + :param park (boolean): Whether to save sample-corresponding tips + between adding elution buffer and transferring + supernatant to the final clean elutions PCR + plate. + """ + latest_chan = -1 + for i, (well, spot) in enumerate(zip(mag_samples_m, parking_spots)): + if park: + _pick_up(m300, spot) + else: + _pick_up(m300) + num_trans = math.ceil(vol/200) + vol_per_trans = vol/num_trans + asp_per_chan = (0.95*res1.wells()[0].max_volume)//(vol_per_trans*8) + for t in range(num_trans): + chan_ind = int((i*num_trans + t)//asp_per_chan) + source = binding_buffer[chan_ind] + if m300.current_volume > 0: + # void air gap if necessary + m300.dispense(m300.current_volume, source.top()) + if chan_ind > latest_chan: # mix if accessing new channel + for _ in range(5): + m300.aspirate(180, source.bottom(0.5)) + m300.dispense(180, source.bottom(5)) + latest_chan = chan_ind + m300.transfer(vol_per_trans, source, well.top(), air_gap=20, + new_tip='never') + if t < num_trans - 1: + m300.air_gap(20) + m300.mix(5, 200, well) + + m300.blow_out(well.top(-2)) + m300.air_gap(20) + # removed if statement; tips will be parked for mixing + m300.drop_tip(spot) + # else: + # _drop(m300) + # ctx.delay(minutes=10, msg='Bind off-deck on a heater/shaker') + num_mixes = 5 + ctx.comment(f'\nMixing the plate {num_mixes} times\n') + for _ in range(num_mixes): + for well, spot in zip(mag_samples_m, parking_spots): + _pick_up(m300, spot) + m300.mix(5, 200, well) + m300.blow_out(well.top(-2)) + m300.air_gap(20) + m300.drop_tip(spot) + magdeck.engage(height=MAG_HEIGHT) + ctx.delay(minutes=7, msg='Incubating on MagDeck for seven minutes.') + + # remove initial supernatant + remove_supernatant(vol+starting_vol, park=park) + + def wash(vol, source, park=True, resuspend=True): + """ + `wash` will perform bead washing for the extraction protocol. + :param vol (float): The amount of volume to aspirate from each + source and dispense to each well containing beads. + :param source (List[Well]): A list of wells from where liquid will be + aspirated. If the length of the source list + > 1, `wash` automatically calculates + the index of the source that should be + accessed. + :param mix_reps (int): The number of repititions to mix the beads with + specified wash buffer (ignored if resuspend is + False). + :param park (boolean): Whether to save sample-corresponding tips + between adding wash buffer and removing + supernatant. + :param resuspend (boolean): Whether to resuspend beads in wash buffer. + """ + + if resuspend and magdeck.status == 'engaged': + magdeck.disengage() + + num_trans = math.ceil(vol/200) + vol_per_trans = vol/num_trans + for i, (m, spot) in enumerate(zip(mag_samples_m, parking_spots)): + _pick_up(m300) + # side = 1 if i % 2 == 0 else -1 + # loc = m.bottom(0.5).move(Point(x=side*2)) + src = source[i//(12//len(source))] + for n in range(num_trans): + if m300.current_volume > 0: + m300.dispense(m300.current_volume, src.top()) + m300.transfer(vol_per_trans, src, m.top(), air_gap=20, + new_tip='never') + if n < num_trans - 1: # only air_gap if going back to source + m300.air_gap(20) + if resuspend: + resuspend_pellet(m, m300, 180) + + m300.blow_out(m.top()) + m300.air_gap(20) + if park: + m300.drop_tip(spot) + else: + _drop(m300) + + if magdeck.status == 'disengaged': + magdeck.engage(height=MAG_HEIGHT) + + ctx.delay(minutes=7, msg='Incubating on MagDeck for seven minutes.') + + remove_supernatant(vol, park=park) + + def elute(vol, park=True): + """ + `elute` will perform elution from the deepwell extraciton plate to the + final clean elutions PCR plate to complete the extraction protocol. + :param vol (float): The amount of volume to aspirate from the elution + buffer source and dispense to each well containing + beads. + :param park (boolean): Whether to save sample-corresponding tips + between adding elution buffer and transferring + supernatant to the final clean elutions PCR + plate. + """ + + # resuspend beads in elution + if magdeck.status == 'enagaged': + magdeck.disengage() + for i, (m, spot) in enumerate(zip(mag_samples_m, parking_spots)): + _pick_up(m300) + side = 1 if i % 2 == 0 else -1 + loc = m.bottom(0.5).move(Point(x=side*2)) + m300.aspirate(vol, elution_solution) + m300.move_to(m.center()) + m300.dispense(vol, loc) + m300.mix(15, 0.8*vol, loc) + m300.blow_out(m.bottom(5)) + m300.air_gap(20) + if park: + m300.drop_tip(spot) + else: + _drop(m300) + + ctx.delay(minutes=5, msg='Delay for 5 minutes for elution') + magdeck.engage(height=MAG_HEIGHT) + ctx.delay(minutes=7, msg='Incubating on MagDeck for seven minutes.') + + for i, (m, e, spot) in enumerate( + zip(mag_samples_m, elution_samples_m, parking_spots)): + if park: + _pick_up(m300, spot) + else: + _pick_up(m300) + side = -1 if i % 2 == 0 else 1 + loc = m.bottom(0.5).move(Point(x=side*2)) + m300.transfer(vol, loc, e.bottom(5), air_gap=20, new_tip='never') + m300.blow_out(e.top(-2)) + m300.air_gap(20) + m300.drop_tip() + + """ + Here is where you can call the methods defined above to fit your specific + protocol. The normal sequence is: + """ + bind(370, park=park_tips) + wash(500, wash1, park=park_tips) + wash(500, wash2, park=park_tips) + wash(500, wash3, park=park_tips) + ctx.delay(minutes=5, msg='Incubate for 5 minutes to dry beads') + elute(elution_vol, park=park_tips) diff --git a/protocols/sci-omegabiotek-magbind-total-rna-96/README.md b/protocols/sci-omegabiotek-magbind-total-rna-96/README.md new file mode 100644 index 0000000000..906e5f615e --- /dev/null +++ b/protocols/sci-omegabiotek-magbind-total-rna-96/README.md @@ -0,0 +1,116 @@ +# Mag-Bind® Total RNA 96 Kit + +### Author +[Opentrons (verified)](https://opentrons.com/) + +# Opentrons has launched a new Protocol Library. You should use the [new page for this protocol](library.opentrons.com/p/sci-omegabiotek-magbind-total-rna-96). This page won’t be available after January 31st, 2024. + +## Categories +* Nucleic Acid Extraction & Purification + * RNA Extraction + +## Description +Your OT-2 can automate the Mag-Bind® Viral DNA/RNA 96 Kit. Please see the kit description below found on the [kit website](https://www.omegabiotek.com/product/mag-bind-total-rna-96-kit/): + +"The Mag-Bind® Total RNA 96 Kit provides a novel technology for total RNA isolation. This kit allows the rapid and reliable isolation of high-quality total cellular RNA and viral RNA from a wide variety of cells and tissues. Unlike column-based systems, the binding of nucleic acids to magnetic particles occurs in solution resulting in increased binding kinetics and binding efficiency. Particles are also completely re-suspended during the wash steps of the purification protocol, which improves the removal of contaminants and increases nucleic acid purity. Mag-Bind® Total RNA 96 Kit procedure can be fully automated with most robotic workstations." + +Results of the Opentrons Science team's internal testing of this protocol on the OT-2 are shown below: + +![results](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/sci-omegabiotek-magbind-total-rna-96/Screen+Shot+2021-08-09+at+4.10.56+PM.png) + +![results](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/sci-omegabiotek-magbind-total-rna-96/Screen+Shot+2021-08-09+at+4.11.10+PM.png) + + + +Explanation of complex parameters below: +* `Number of samples`: Specify the number of samples this run (1-96 and divisible by 8, i.e. whole columns at a time). +* `Deepwell type`: Specify which well plate will be mounted on the magnetic module. +* `Reservoir Type`: Specify which reservoir will be employed. +* `Starting Volume`: Specify starting volume of sample (ul). +* `Binding Buffer Volume`: Specify binding buffer volume (ul). +* `Wash Volumes`: Specify each of the three wash volumes (ul). +* `Elution Volume`: Specify elution volume (ul). +* `Settling Time`: Specify settling time for beads (minutes). +* `Mag Deck Generation`: Specify whether GEN1 or GEN2 magnetic module will be used. +* `Park Tips`: Specify whether to park tips or drop tips. +* `Track Tips`: Specify whether to track tips between runs (starting with fresh tips or pick up from last runs tips). +* `Flash`: Specify whether to flash OT-2 lights when the protocol runs out of tips, prompting the user to replenish tips. +* `P300 Multi Channel Pipette Mount`: Specify whether the P300 multi channel pipette will be on the left or right mount. + + +--- + +### Modules +* [Magnetic Module (GEN2)](https://shop.opentrons.com/collections/hardware-modules/products/magdeck) + + +### Labware +* [NEST 96 Wellplate 2mL](https://shop.opentrons.com/collections/lab-plates/products/nest-0-2-ml-96-well-deep-well-plate-v-bottom) +* [USA Scientific 96 Wellplate 2.4mL](https://labware.opentrons.com/?category=wellPlate) +* [NEST 12 Reservoir 15mL](https://shop.opentrons.com/collections/reservoirs/products/nest-12-well-reservoir-15-ml) +* [USA Scientific 12 Reservoir 22mL](https://labware.opentrons.com/?category=reservoir) +* [Opentrons 96 tiprack 300ul](https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-300ul-tips) +* [Opentrons 96 Aluminum block Nest Wellplate 100ul](https://labware.opentrons.com/opentrons_96_aluminumblock_nest_wellplate_100ul?category=aluminumBlock) + +### Pipettes +* [P300 Multi Channel Pipette](https://shop.opentrons.com/collections/ot-2-robot/products/8-channel-electronic-pipette) + +### Reagents +* [Mag-Bind® Total RNA 96 Kit](https://www.omegabiotek.com/product/mag-bind-total-rna-96-kit/) + +--- + +### Deck Setup + +![deck layout](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/528c16/Screen+Shot+2022-03-11+at+3.25.12+PM.png) + +Saliva: add 200uL of saliva + +Bacteria culture: spin down 200uL of culture, wash once in PBS, resuspend in 200uL of chilled PBS + +200uL of sample + 200uL of lysis buffer. Mix thoroughly, add to deep well plate + +Dnase 1 treatment: 49uL of buffer + 1uL of DNAse 1 per sample. +![reagents](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/528c16/Screen+Shot+2022-03-11+at+3.25.34+PM.png) + +![reagent volumes](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/528c16/Screen+Shot+2022-03-11+at+3.26.29+PM.png) + +--- + +### Protocol Steps +1. Binding buffer is mixed +2. Binding buffer added to samples +3. Binding buffer and sample mixed +4. User is instructed to mix samples on heater-shaker. +5. Engage magnetic module +6. Delay 7 minutes +7. Remove supernatant +8. Wash with wash buffer 1 and mix +9. Engage magnetic module +10. Delay 7 minutes +11. Remove supernatant +12. Disengage magnet +13. Repeat steps 8-11 with wash buffer 2 +14. Elution solution added to sample and mixed +15. dnase1 added to sample and mixed +16. Stop solution added to sample and mixed +17. Engage magnet remove supernatant +18. Steps 8-11 with wash buffer 3 and 4 +19. Delay, incubate 7 minutes +20. Elution solution added to sample and mixed +21. Elute added to aluminum block + +### 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 +sci-omegabiotek-magbind-total-rna-96 diff --git a/protocols/sci-omegabiotek-magbind-total-rna-96/fields.json b/protocols/sci-omegabiotek-magbind-total-rna-96/fields.json new file mode 100644 index 0000000000..bd7b1f9384 --- /dev/null +++ b/protocols/sci-omegabiotek-magbind-total-rna-96/fields.json @@ -0,0 +1,114 @@ +[ + { + "type": "int", + "label": "Number of Samples", + "name": "num_samples", + "default": 8 + }, + { + "type": "dropDown", + "label": "Deepwell Type", + "name": "deepwell_type", + "options": [ + { "label": "NEST 96 Wellplate 2mL", "value": "nest_96_wellplate_2ml_deep" }, + { "label": "USA Scientific 96 Wellplate 2.4mL", "value": "usascientific_96_wellplate_2.4ml_deep" } + ] + }, + { + "type": "dropDown", + "label": "Reservoir Type", + "name": "res_type", + "options": [ + { "label": "NEST 12 Reservoir 15mL", "value": "nest_12_reservoir_15ml" }, + { "label": "USA Scientific 12 Reservoir 22mL", "value": "usascientific_12_reservoir_22ml" } + ] + }, + { + "type": "int", + "label": "Starting Volume", + "name": "starting_vol", + "default": 400 + }, + { + "type": "int", + "label": "Binding Buffer Volume", + "name": "binding_buffer_vol", + "default": 320 + }, + { + "type": "int", + "label": "Wash 1 Volume", + "name": "wash1_vol", + "default": 400 + }, + { + "type": "int", + "label": "Wash 2 Volume", + "name": "wash2_vol", + "default": 400 + }, + { + "type": "int", + "label": "Wash 3 Volume", + "name": "wash3_vol", + "default": 300 + }, + + { + "type": "int", + "label": "Wash Mix Repetitions", + "name": "elution_vol", + "default": 50 + }, + { + "type": "int", + "label": "Settling Time (minutes)", + "name": "settling_time", + "default": 7 + }, + { + "type": "dropDown", + "label": "Mag Deck Generation", + "name": "mag_gen", + "options": [ + { "label": "GEN1", "value": "magdeck" }, + { "label": "GEN2", "value": "magnetic module gen2" } + ] + }, + { + "type": "dropDown", + "label": "Park Tips?", + "name": "park_tips", + "options": [ + { "label": "Yes, park tips", "value": true }, + { "label": "No, do not park tips", "value": false } + ] + }, + { + "type": "dropDown", + "label": "Track Tips?", + "name": "tip_track", + "options": [ + { "label": "Yes, track tips", "value": true }, + { "label": "No, do not track tips", "value": false } + ] + }, + { + "type": "dropDown", + "label": "Flash", + "name": "flash", + "options": [ + { "label": "Yes, flash lights", "value": true }, + { "label": "No, do not flash lights", "value": false } + ] + }, + { + "type": "dropDown", + "label": "P300 Multi Mount", + "name": "m300_mount", + "options": [ + { "label": "Left", "value": "left" }, + { "label": "Right", "value": "right" } + ] + } +] diff --git a/protocols/sci-omegabiotek-magbind-total-rna-96/sci-omegabiotek-magbind-total-rna-96.ot2.apiv2.py b/protocols/sci-omegabiotek-magbind-total-rna-96/sci-omegabiotek-magbind-total-rna-96.ot2.apiv2.py new file mode 100644 index 0000000000..cb46ada613 --- /dev/null +++ b/protocols/sci-omegabiotek-magbind-total-rna-96/sci-omegabiotek-magbind-total-rna-96.ot2.apiv2.py @@ -0,0 +1,613 @@ +# flake8: noqa +from opentrons.types import Point +import json +import os +import math +import threading +from time import sleep +from opentrons import types +import numpy as np + +metadata = { + 'protocolName': 'Mag-Bind® Total RNA 96 Kit', + 'author': 'Opentrons ', + 'apiLevel': '2.4' +} + +whichwash = 1 + +# Definitions for deck light flashing +class CancellationToken: + def __init__(self): + self.is_continued = False + + def set_true(self): + self.is_continued = True + + def set_false(self): + self.is_continued = False + + +def turn_on_blinking_notification(hardware, pause): + while pause.is_continued: + hardware.set_lights(rails=True) + sleep(1) + hardware.set_lights(rails=False) + sleep(1) + + +def create_thread(ctx, cancel_token): + t1 = threading.Thread(target=turn_on_blinking_notification, + args=(ctx._hw_manager.hardware, cancel_token)) + t1.start() + return t1 + + +# Start protocol +def run(ctx): + # Setup for flashing lights notification to empty trash + cancellationToken = CancellationToken() + + [num_samples, deepwell_type, res_type, starting_vol, binding_buffer_vol, + wash1_vol, wash2_vol, wash3_vol, elution_vol, settling_time, + mag_gen, park_tips, + tip_track, flash, m300_mount] = get_values( # noqa: F821 + 'num_samples', 'deepwell_type', 'res_type', 'starting_vol', + 'binding_buffer_vol', 'wash1_vol', 'wash2_vol', 'wash3_vol', + 'elution_vol', 'settling_time', 'mag_gen', + 'park_tips', 'tip_track', + 'flash', 'm300_mount') + + if mag_gen == 'magdeck': + MAG_HEIGHT = 13.6 + else: + MAG_HEIGHT = 6.8 + + """ + Here is where you can change the locations of your labware and modules + (note that this is the recommended configuration) + """ + magdeck = ctx.load_module(mag_gen, '6') + magdeck.disengage() + magplate = magdeck.load_labware(deepwell_type, 'deepwell plate') + tempdeck = ctx.load_module('Temperature Module Gen2', '1') + elutionplate = tempdeck.load_labware( + 'opentrons_96_aluminumblock_nest_wellplate_100ul') + waste = ctx.load_labware('nest_1_reservoir_195ml', '9', + 'Liquid Waste').wells()[0].top() + res2 = ctx.load_labware(res_type, '3', 'reagent reservoir 2') + res1 = ctx.load_labware(res_type, '2', 'reagent reservoir 1') + num_cols = math.ceil(num_samples/8) + tips300 = [ctx.load_labware('opentrons_96_tiprack_300ul', slot, + '200µl filtertiprack') + for slot in ['5', '7', '8', '10', '11']] + if park_tips: + parkingrack = ctx.load_labware( + 'opentrons_96_tiprack_300ul', '4', 'tiprack for parking') + parking_spots = parkingrack.rows()[0][:num_cols] + else: + tips300.insert(0, ctx.load_labware('opentrons_96_tiprack_300ul', '4', + '200µl filtertiprack')) + parking_spots = [None for none in range(12)] + + # load P300M pipette + m300 = ctx.load_instrument( + 'p300_multi_gen2', m300_mount, tip_racks=tips300) + + tip_log = {val: {} for val in ctx.loaded_instruments.values()} + + """ + Here is where you can define the locations of your reagents. + """ + binding_buffer = res1.wells()[:3] + wash1 = res1.wells()[3:7] + wash2 = res1.wells()[7:11] + elution_solution = res1.wells()[-1] + dnase1 = [res2.wells()[0]] + stopsolution = [res2.wells()[0:2]] + wash3 = res2.wells()[3:6] + wash4 = res2.wells()[6:10] + mag_samples_m = magplate.rows()[0][:num_cols] + elution_samples_m = elutionplate.rows()[0][:num_cols] + + tempdeck.set_temperature(4) + + m300.flow_rate.aspirate = 50 + m300.flow_rate.dispense = 150 + m300.flow_rate.blow_out = 300 + + folder_path = '/data/B' + tip_file_path = folder_path + '/tip_log.json' + if tip_track and not ctx.is_simulating(): + if os.path.isfile(tip_file_path): + with open(tip_file_path) as json_file: + data = json.load(json_file) + for pip in tip_log: + if pip.name in data: + tip_log[pip]['count'] = data[pip.name] + else: + tip_log[pip]['count'] = 0 + else: + for pip in tip_log: + tip_log[pip]['count'] = 0 + else: + for pip in tip_log: + tip_log[pip]['count'] = 0 + + for pip in tip_log: + if pip.type == 'multi': + tip_log[pip]['tips'] = [tip for rack in pip.tip_racks + for tip in rack.rows()[0]] + else: + tip_log[pip]['tips'] = [tip for rack in pip.tip_racks + for tip in rack.wells()] + tip_log[pip]['max'] = len(tip_log[pip]['tips']) + + def _pick_up(pip, loc=None): + if tip_log[pip]['count'] == tip_log[pip]['max'] and not loc: + ctx.pause('Replace ' + str(pip.max_volume) + 'µl tipracks before \ +resuming.') + pip.reset_tipracks() + tip_log[pip]['count'] = 0 + if loc: + pip.pick_up_tip(loc) + else: + pip.pick_up_tip(tip_log[pip]['tips'][tip_log[pip]['count']]) + tip_log[pip]['count'] += 1 + + switch = True + drop_count = 0 + # number of tips trash will accommodate before prompting user to empty + drop_threshold = 120 + + def _drop(pip): + nonlocal switch + nonlocal drop_count + side = 30 if switch else -18 + drop_loc = ctx.loaded_labwares[12].wells()[0].top().move( + Point(x=side)) + pip.drop_tip(drop_loc) + switch = not switch + if pip.type == 'multi': + drop_count += 8 + else: + drop_count += 1 + if drop_count >= drop_threshold: + # Setup for flashing lights notification to empty trash + if flash: + if not ctx._hw_manager.hardware.is_simulator: + cancellationToken.set_true() + thread = create_thread(ctx, cancellationToken) + m300.home() + ctx.pause('Please empty tips from waste before resuming.') + ctx.home() # home before continuing with protocol + if flash: + cancellationToken.set_false() # stop light flashing after home + thread.join() + drop_count = 0 + + waste_vol = 0 + waste_threshold = 185000 + + def remove_supernatant(vol, park=False): + """ + `remove_supernatant` will transfer supernatant from the deepwell + extraction plate to the liquid waste reservoir. + :param vol (float): The amount of volume to aspirate from all deepwell + sample wells and dispense in the liquid waste. + :param park (boolean): Whether to pick up sample-corresponding tips + in the 'parking rack' or to pick up new tips. + """ + + def _waste_track(vol): + nonlocal waste_vol + if waste_vol + vol >= waste_threshold: + # Setup for flashing lights notification to empty liquid waste + if flash: + if not ctx._hw_manager.hardware.is_simulator: + cancellationToken.set_true() + thread = create_thread(ctx, cancellationToken) + m300.home() + ctx.pause('Please empty liquid waste (slot 11) before \ +resuming.') + + ctx.home() # home before continuing with protocol + if flash: + # stop light flashing after home + cancellationToken.set_false() + thread.join() + + waste_vol = 0 + waste_vol += vol + + m300.flow_rate.aspirate = 30 + num_trans = math.ceil(vol/200) + vol_per_trans = vol/num_trans + for i, (m, spot) in enumerate(zip(mag_samples_m, parking_spots)): + if park: + _pick_up(m300, spot) + else: + _pick_up(m300) + side = -1 if i % 2 == 0 else 1 + loc = m.bottom(0.5).move(Point(x=side*2)) + for _ in range(num_trans): + _waste_track(vol_per_trans) + if m300.current_volume > 0: + # void air gap if necessary + m300.dispense(m300.current_volume, m.top()) + m300.move_to(m.center()) + m300.transfer(vol_per_trans, loc, waste, new_tip='never', + air_gap=20) + m300.blow_out(waste) + m300.air_gap(20) + _drop(m300) + m300.flow_rate.aspirate = 150 + + def resuspend_pellet(well, pip, mvol, reps=5): + """ + 'resuspend_pellet' will forcefully dispense liquid over the pellet after + the magdeck engage in order to more thoroughly resuspend the pellet. + param well: The current well that the resuspension will occur in. + param pip: The pipet that is currently attached/ being used. + param mvol: The volume that is transferred before the mixing steps. + param reps: The number of mix repetitions that should occur. Note~ + During each mix rep, there are 2 cycles of aspirating from center, + dispensing at the top and 2 cycles of aspirating from center, + dispensing at the bottom (5 mixes total) + """ + + rightLeft = int(str(well).split(' ')[0][1:]) % 2 + """ + 'rightLeft' will determine which value to use in the list of 'top' and + 'bottom' (below), based on the column of the 'well' used. + In the case that an Even column is used, the first value of 'top' and + 'bottom' will be used, otherwise, the second value of each will be used. + """ + center = well.bottom().move(types.Point(x=0,y=0,z=0.1)) + top = [ + well.bottom().move(types.Point(x=-3.8,y=3.8,z=0.1)), + well.bottom().move(types.Point(x=3.8,y=3.8,z=0.1)) + ] + bottom = [ + well.bottom().move(types.Point(x=-3.8,y=-3.8,z=0.1)), + well.bottom().move(types.Point(x=3.8,y=-3.8,z=0.1)) + ] + + pip.flow_rate.dispense = 500 + pip.flow_rate.aspirate = 150 + + mix_vol = 0.9 * mvol + + pip.move_to(center) + for _ in range(reps): + for _ in range(2): + pip.aspirate(mix_vol, center) + pip.dispense(mix_vol, top[rightLeft]) + for _ in range(2): + pip.aspirate(mix_vol, center) + pip.dispense(mix_vol, bottom[rightLeft]) + + def bead_mixing(well, pip, mvol, reps=8): + """ + 'bead_mixing' will mix liquid that contains beads. This will be done by + aspirating from the bottom of the well and dispensing from the top as to + mix the beads with the other liquids as much as possible. Aspiration and + dispensing will also be reversed for a short to to ensure maximal mixing. + param well: The current well that the mixing will occur in. + param pip: The pipet that is currently attached/ being used. + param mvol: The volume that is transferred before the mixing steps. + param reps: The number of mix repetitions that should occur. Note~ + During each mix rep, there are 2 cycles of aspirating from bottom, + dispensing at the top and 2 cycles of aspirating from middle, + dispensing at the bottom + """ + center = well.top().move(types.Point(x=0,y=0,z=5)) + aspbot = well.bottom(1) + asptop = well.bottom(10) + disbot = well.bottom(3) + distop = well.top() + + vol = mvol * .9 + + pip.move_to(center) + for _ in range(reps): + pip.aspirate(vol,aspbot) + pip.dispense(vol,distop) + pip.aspirate(vol,asptop) + pip.dispense(vol,disbot) + + + def bind(vol, park=True): + """ + `bind` will perform magnetic bead binding on each sample in the + deepwell plate. Each channel of binding beads will be mixed before + transfer, and the samples will be mixed with the binding beads after + the transfer. The magnetic deck activates after the addition to all + samples, and the supernatant is removed after bead bining. + :param vol (float): The amount of volume to aspirate from the elution + buffer source and dispense to each well containing + beads. + :param park (boolean): Whether to save sample-corresponding tips + between adding elution buffer and transferring + supernatant to the final clean elutions PCR + plate. + """ + latest_chan = -1 + for i, (well, spot) in enumerate(zip(mag_samples_m, parking_spots)): + _pick_up(m300) + num_trans = math.ceil(vol/200) + vol_per_trans = vol/num_trans + for t in range(num_trans): + chan_ind = i//(12//len(binding_buffer)) + source = binding_buffer[chan_ind] + if m300.current_volume > 0: + # void air gap if necessary + m300.dispense(m300.current_volume, source.top()) + if chan_ind > latest_chan: # mix if accessing new channel + bead_mixing(source, m300, 200, reps=4) + latest_chan = chan_ind + m300.transfer(vol_per_trans, source, well.top(), air_gap=20, + new_tip='never') + if t < num_trans - 1: + m300.air_gap(20) + bead_mixing(well, m300, 200, reps=4) + m300.blow_out(well.top(-2)) + m300.air_gap(20) + if park: + m300.drop_tip(spot) + else: + _drop(m300) + + ctx.pause('mix on heater/shaker for 5 minutes') + + BindIncubate = 5 + for binddelay in np.arange(BindIncubate, 0, -1): #Bind delay countdown- BindIncubate minutes long + ctx.delay(minutes=1, msg='Take plate off magdeck and vortex for 10 - 15 seconds.') + + magdeck.engage(height=MAG_HEIGHT) + + for bindi in np.arange(settling_time,0,-0.5): #Settling time delay with countdown timer + ctx.delay(minutes=0.5, msg='There are ' + str(bindi) + ' minutes left in the incubation.') + + # remove initial supernatant + remove_supernatant(vol+starting_vol, park=park) + + def wash(vol, source, mix_reps=15, park=True, resuspend=True): + """ + `wash` will perform bead washing for the extraction protocol. + :param vol (float): The amount of volume to aspirate from each + source and dispense to each well containing beads. + :param source (List[Well]): A list of wells from where liquid will be + aspirated. If the length of the source list + > 1, `wash` automatically calculates + the index of the source that should be + accessed. + :param mix_reps (int): The number of repititions to mix the beads with + specified wash buffer (ignored if resuspend is + False). + :param park (boolean): Whether to save sample-corresponding tips + between adding wash buffer and removing + supernatant. + :param resuspend (boolean): Whether to resuspend beads in wash buffer. + """ + global whichwash # Defines which wash the protocol is on to log on the app + + if source == wash1: + whichwash = 1 + if source == wash2: + whichwash = 2 + if source == wash3: + whichwash = 3 + if source == wash4: + whichwash = 4 + + if resuspend and magdeck.status == 'engaged': + magdeck.disengage() + + num_trans = math.ceil(vol/200) + vol_per_trans = vol/num_trans + for i, (m, spot) in enumerate(zip(mag_samples_m, parking_spots)): + _pick_up(m300) + src = source[i//(12//len(source))] + for n in range(num_trans): + if m300.current_volume > 0: + m300.dispense(m300.current_volume, src.top()) + m300.transfer(vol_per_trans, src, m.top(), air_gap=20, + new_tip='never') + if n < num_trans - 1: # only air_gap if going back to source + m300.air_gap(20) + if resuspend: + resuspend_pellet(m, m300, 180) + m300.blow_out(m.top()) + m300.air_gap(20) + if park: + m300.drop_tip(spot) + else: + _drop(m300) + + if source == wash3: + ctx.delay(minutes=10, msg='Mix off-deck for 10 minutes.') + + if magdeck.status == 'disengaged': + magdeck.engage(height=MAG_HEIGHT) + + for washi in np.arange(settling_time,0,-0.5): + ctx.delay(minutes=0.5, msg='There are ' + str(washi) + ' minutes left in wash ' + str(whichwash) + ' incubation.') + + if source == wash3: + remove_supernatant(602, park=park) + else: + remove_supernatant(vol, park=park) + + if source == wash2: + ctx.delay(minutes=5, msg='Let dry for 5 minutes.') + + def dnase(vol, source, mix_reps=6, park=True, resuspend=True): + + if resuspend and magdeck.status == 'engaged': + magdeck.disengage() + + num_trans = math.ceil(vol/200) + vol_per_trans = vol/num_trans + for i, (m, spot) in enumerate(zip(mag_samples_m, parking_spots)): + _pick_up(m300) + src = source[i//(12//len(source))] + for n in range(num_trans): + if m300.current_volume > 0: + m300.dispense(m300.current_volume, src.top()) + m300.transfer(vol_per_trans, src, m.top(), air_gap=20, + new_tip='never') + if n < num_trans - 1: # only air_gap if going back to source + m300.air_gap(20) + if resuspend: + resuspend_pellet(m, m300, 180) + m300.blow_out(m.top()) + m300.air_gap(20) + if park: + m300.drop_tip(spot) + else: + _drop(m300) + + ctx.delay(minutes=10, msg='Incubating for 10 minutes for DNase 1 treatment.') + + def stop_reaction(vol, source, mix_reps=6, park=True, resuspend=True): + + if resuspend and magdeck.status == 'engaged': + magdeck.disengage() + + num_trans = math.ceil(vol/200) + vol_per_trans = vol/num_trans + for i, (m, spot) in enumerate(zip(mag_samples_m, parking_spots)): + _pick_up(m300) + src = source[i//(12//len(source))] + for n in range(num_trans): + if m300.current_volume > 0: + m300.dispense(m300.current_volume, src.top()) + m300.transfer(vol_per_trans, src, m.top(), air_gap=20, + new_tip='never') + if n < num_trans - 1: # only air_gap if going back to source + m300.air_gap(20) + if resuspend: + resuspend_pellet(m, m300, 150, reps=10) + m300.blow_out(m.top()) + m300.air_gap(20) + if park: + m300.drop_tip(spot) + else: + _drop(m300) + + + ctx.delay(minutes=5) + remove_supernatant(vol, park=park) + + def elute_one(vol, park=True): + """ + `elute_one` will add elution from the reservoir to the deepwell extraciton plate. + :param vol (float): The amount of volume to aspirate from the elution + buffer source and dispense to each well containing + beads. + :param park (boolean): Whether to save sample-corresponding tips + between adding elution buffer and transferring + supernatant to the final clean elutions PCR + plate. + """ + + # resuspend beads in elution + if magdeck.status == 'enagaged': + magdeck.disengage() + for i, (m, spot) in enumerate(zip(mag_samples_m, parking_spots)): + _pick_up(m300) + side = 1 if i % 2 == 0 else -1 + loc = m.bottom(0.5).move(Point(x=side*2)) + m300.aspirate(vol, elution_solution) + m300.move_to(m.center()) + m300.dispense(vol, loc) + resuspend_pellet(m, m300, 180) + m300.blow_out(m.bottom(5)) + m300.air_gap(20) + if park: + m300.drop_tip(spot) + else: + _drop(m300) + for eone in np.arange(5, 0, -0.5): + ctx.delay(minutes=0.5, msg='Vortex off-deck for 30 second increments. ' + str(eone) + ' minutes left.') # noqa: E501 + + def elute(vol, park=True): + """ + `elute` will perform elution from the deepwell extraciton plate to the + final clean elutions PCR plate to complete the extraction protocol. + :param vol (float): The amount of volume to aspirate from the elution + buffer source and dispense to each well containing + beads. + :param park (boolean): Whether to save sample-corresponding tips + between adding elution buffer and transferring + supernatant to the final clean elutions PCR + plate. + """ + + # resuspend beads in elution + if magdeck.status == 'enagaged': + magdeck.disengage() + for i, (m, spot) in enumerate(zip(mag_samples_m, parking_spots)): + _pick_up(m300) + side = 1 if i % 2 == 0 else -1 + loc = m.bottom(0.5).move(Point(x=side*2)) + m300.aspirate(vol, elution_solution) + m300.move_to(m.center()) + m300.dispense(vol, loc) + resuspend_pellet(m, m300, 180) + m300.blow_out(m.bottom(5)) + m300.air_gap(20) + if park: + m300.drop_tip(spot) + else: + _drop(m300) + + elutedelay = 5 #Creates a delay for elution that is elutedelay minutes long # noqa: E501 + for elutebind in np.arange(elutedelay,0,-0.5): + ctx.delay(minutes=0.5, msg='There are ' + str(elutebind) + ' minutes left in the elution attachment step.') # noqa: E501 + magdeck.engage(height=MAG_HEIGHT) + + for elutei in np.arange(settling_time,0,-0.5): #settling time countdown + ctx.delay(minutes=0.5, msg='There are ' + str(elutei) + ' minutes left in the elution incubation.') # noqa: E501 + + for i, (m, e, spot) in enumerate( + zip(mag_samples_m, elution_samples_m, parking_spots)): + if park: + _pick_up(m300, spot) + else: + _pick_up(m300) + side = -1 if i % 2 == 0 else 1 + loc = m.bottom(0.5).move(Point(x=side*2)) + m300.transfer(vol, loc, e.bottom(5), air_gap=20, new_tip='never') + m300.blow_out(e.top(-2)) + m300.air_gap(20) + m300.drop_tip() + + """ + Here is where you can call the methods defined above to fit your specific + protocol. The normal sequence is: + """ + bind(binding_buffer_vol, park=park_tips) + wash(wash1_vol, wash1, park=park_tips) + wash(wash2_vol, wash2, park=park_tips) + elute_one(100, park=park_tips) + # dnase1 treatment + dnase(52, dnase1, park=park_tips) + stop_reaction(150, stopsolution, park=park_tips) + # resume washes + wash(wash3_vol, wash3, park=park_tips) + wash(400, wash4, park=park_tips) + drybeads = 5 # Number of minutes you want to dry for + for beaddry in np.arange(drybeads, 0, -0.5): + ctx.delay(minutes=0.5, + msg='There are ' + str(beaddry) + ' minutes left in the drying step.') # noqa: E501 + elute(elution_vol, park=park_tips) + + # track final used tip + if tip_track and not ctx.is_simulating(): + if not os.path.isdir(folder_path): + os.mkdir(folder_path) + data = {pip.name: tip_log[pip]['count'] for pip in tip_log} + with open(tip_file_path, 'w') as outfile: + json.dump(data, outfile) diff --git a/protocols/sci-omegabiotek-magbind/README.md b/protocols/sci-omegabiotek-magbind/README.md new file mode 100644 index 0000000000..d11dc2626e --- /dev/null +++ b/protocols/sci-omegabiotek-magbind/README.md @@ -0,0 +1,92 @@ +# Mag-Bind® Viral DNA/RNA 96 Kit +### Author +[Opentrons (verified)](https://opentrons.com/) + +# Opentrons has launched a new Protocol Library. You should use the [new page for this protocol](library.opentrons.com/p/sci-omegabiotek-magbind). This page won’t be available after January 31st, 2024. + +## Categories +* Nucleic Acid Extraction & Purification + * RNA Extraction + +## Description +Your OT-2 can automate the Mag-Bind® Viral DNA/RNA 96 Kit. Please see the kit description below found on the [kit website]((https://www.omegabiotek.com/product/mag-bind-viral-dna-rna-96-kit/): + +"Mag-Bind® Viral DNA/RNA Kit is designed for the rapid and reliable isolation of viral RNA and viral DNA from serum, swabs, plasma, saliva, and other body fluids. The Mag-Bind® magnetic beads technology enables purification of high-quality nucleic acids that are free of proteins, nucleases, and other impurities. In addition to easily being adapted with automated systems, this procedure can also be scaled up or down depending on the amount of starting sample. The purified nucleic acids are ready for direct use in downstream applications such as amplification or other enzymatic reactions." + +Results of the Opentrons Science team's internal testing of this protocol on the OT-2 are shown below: + +![results](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/sci-omegabiotek-magbind/Screen+Shot+2021-08-09+at+11.16.53+AM.png) + +Explanation of complex parameters below: +* `Number of samples`: Specify the number of samples this run (1-96 and divisible by 8, i.e. whole columns at a time). +* `Starting Volume`: Specify starting volume of sample (ul). +* `Elution Volume`: Specify elution volume (ul). +* `Park Tips`: Specify whether to park tips or drop tips. +* `Mag Deck Generation`: Specify whether GEN1 or GEN2 magnetic module will be used. +* `P300 Multi Channel Pipette Mount`: Specify whether the P300 multi channel pipette will be on the left or right mount. + + +--- + +### Modules +* [Magnetic Module (GEN2)](https://shop.opentrons.com/collections/hardware-modules/products/magdeck) + + +### Labware +* [NEST 96 Wellplate 2mL](https://shop.opentrons.com/collections/lab-plates/products/nest-0-2-ml-96-well-deep-well-plate-v-bottom) +* [NEST 1 Reservoir 195mL](https://shop.opentrons.com/collections/reservoirs/products/nest-1-well-reservoir-195-ml) +* [NEST 12 Reservoir 15mL](https://shop.opentrons.com/collections/reservoirs/products/nest-12-well-reservoir-15-ml) +* [Opentrons 96 tiprack 300ul](https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-300ul-tips) +* [Opentrons 96 Aluminum block Nest Wellplate 100ul](https://labware.opentrons.com/opentrons_96_aluminumblock_nest_wellplate_100ul?category=aluminumBlock) + +### Pipettes +* [P300 Multi Channel Pipette](https://shop.opentrons.com/collections/ot-2-robot/products/8-channel-electronic-pipette) + +### Reagents +* [Mag-Bind® Viral DNA/RNA 96 Kit](https://www.omegabiotek.com/product/mag-bind-viral-dna-rna-96-kit/) + +--- + +### Deck Setup +Tip rack on Slot 5 is used for tip parking if selected. If not tip parking, place [200ul Opentrons Filter Tip Rack](https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-200ul-filter-tips) in Slot 5. +![deck layout](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/sci-omegabiotek-magbind/Screen+Shot+2021-08-09+at+11.44.26+AM.png) + +### Reagent Setup + +* Reservoir: Slot 2 + +![reservoir 1](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/sci-omegabiotek-magbind/Screen+Shot+2021-08-09+at+11.45.25+AM.png) + +--- + +### Protocol Steps +1. Binding buffer is mixed. +2. Binding buffer added to samples. +3. Binding buffer and sample mixed. +4. Engage magnetic module. +4. Delay for 5 minutes. +5. Supernatant removed. +6. Magnetic module disengaged. +7. Wash 1 added, mixed with samples. +8. Magnetic module engaged, incubated 5 minutes. +9. Supernatant removed. +10. 7-9 repeated for wash buffer 2 and 3. +11. Elution solution added to sample and mixed. +12. Delay 10 minutes for elution. +13. Magnetic module engaged. +16. Elute added to aluminum block (4C) + +### 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 +sci-omegabiotek-magbind diff --git a/protocols/sci-omegabiotek-magbind/fields.json b/protocols/sci-omegabiotek-magbind/fields.json new file mode 100644 index 0000000000..908279c895 --- /dev/null +++ b/protocols/sci-omegabiotek-magbind/fields.json @@ -0,0 +1,47 @@ +[ + { + "type": "int", + "label": "Number of Samples", + "name": "num_samples", + "default": 24 + }, + { + "type": "int", + "label": "Starting Volume", + "name": "starting_vol", + "default": 50 + }, + { + "type": "int", + "label": "Elution Volume", + "name": "elution_vol", + "default": 50 + }, + { + "type": "dropDown", + "label": "Park Tips?", + "name": "park_tips", + "options": [ + { "label": "Yes, park tips", "value": true }, + { "label": "No, do not park tips", "value": false } + ] + }, + { + "type": "dropDown", + "label": "Mag Deck Generation", + "name": "mag_gen", + "options": [ + { "label": "GEN1", "value": "magdeck" }, + { "label": "GEN2", "value": "magnetic module gen2" } + ] + }, + { + "type": "dropDown", + "label": "P300 Multi Mount", + "name": "m300_mount", + "options": [ + { "label": "Left", "value": "left" }, + { "label": "Right", "value": "right" } + ] + } +] diff --git a/protocols/sci-omegabiotek-magbind/sci-omegabiotek-magbind.ot2.apiv2.py b/protocols/sci-omegabiotek-magbind/sci-omegabiotek-magbind.ot2.apiv2.py new file mode 100644 index 0000000000..bcf68d2d82 --- /dev/null +++ b/protocols/sci-omegabiotek-magbind/sci-omegabiotek-magbind.ot2.apiv2.py @@ -0,0 +1,372 @@ +"""Protocol.""" + +from opentrons.types import Point +import os +import math +import json + +metadata = { + 'protocolName': 'Mag-Bind® Viral DNA/RNA 96 Kit', + 'author': 'Opentrons ', + 'apiLevel': '2.4' +} + + +# Start protocol +def run(ctx): + """Protocol.""" + [num_samples, starting_vol, + elution_vol, park_tips, mag_gen, m300_mount] = get_values( # noqa: F821 + "num_samples", "starting_vol", + "elution_vol", "park_tips", "mag_gen", "m300_mount") + + # EXCEPTIONS + if num_samples % 8 != 0: + raise Exception("Enter a sample number wholly divisible by 8") + if not 0 <= num_samples <= 96: + raise Exception("Enter a sample number between 1-96") + + if mag_gen == 'magdeck': + MAG_HEIGHT = 13.6 + else: + MAG_HEIGHT = 6.8 + + # GLOBAL VARIABLES + binding_buffer_vol = 125 + wash1_vol = wash2_vol = wash3_vol = 200 + mix_reps = 10 + settling_time = 5 + tip_track = False + + """ + Here is where you can change the locations of your labware and modules + (note that this is the recommended configuration) + """ + magdeck = ctx.load_module(mag_gen, '3') + magdeck.disengage() + magplate = magdeck.load_labware('nest_96_wellplate_2ml_deep', + 'deepwell plate') + tempdeck = ctx.load_module('Temperature Module Gen2', '1') + elutionplate = tempdeck.load_labware( + 'opentrons_96_aluminumblock_nest_wellplate_100ul', + 'elution plate') + waste = ctx.load_labware('nest_1_reservoir_195ml', '6', + 'Liquid Waste').wells()[0].top() +# res2 = ctx.load_labware( +# 'nest_12_reservoir_15ml', '3', 'reagent reservoir 2') + res1 = ctx.load_labware( + 'nest_12_reservoir_15ml', '2', 'reagent reservoir 1') + num_cols = math.ceil(num_samples/8) + tips300 = [ctx.load_labware('opentrons_96_tiprack_300ul', slot, + '200µl filtertiprack') + for slot in ['4', '7', '8', '9', '10', '11']] + if park_tips: + parkingrack = ctx.load_labware( + 'opentrons_96_tiprack_300ul', '5', 'tiprack for parking') + parking_spots = parkingrack.rows()[0][:num_cols] + else: + tips300.insert(0, ctx.load_labware('opentrons_96_tiprack_300ul', '5', + '200µl filtertiprack')) + parking_spots = [None for none in range(12)] + + # load P300M pipette + m300 = ctx.load_instrument( + 'p300_multi_gen2', m300_mount, tip_racks=tips300) + + """ + Here is where you can define the locations of your reagents. + """ + binding_buffer = res1.wells()[:2] + elution_solution = res1.wells()[-1] + wash1 = res1.wells()[2:4] + wash2 = res1.wells()[4:6] + wash3 = res1.wells()[6:8] + + mag_samples_m = magplate.rows()[0][:num_cols] + elution_samples_m = elutionplate.rows()[0][:num_cols] + + # magdeck.disengage() # just in case + tempdeck.set_temperature(4) + + m300.flow_rate.aspirate = 50 + m300.flow_rate.dispense = 150 + m300.flow_rate.blow_out = 300 + + folder_path = '/data/B' + tip_file_path = folder_path + '/tip_log.json' + tip_log = {'count': {}} + if tip_track and not ctx.is_simulating(): + if os.path.isfile(tip_file_path): + with open(tip_file_path) as json_file: + data = json.load(json_file) + if 'tips300' in data: + tip_log['count'][m300] = data['tips300'] + else: + tip_log['count'][m300] = 0 + else: + tip_log['count'][m300] = 0 + else: + tip_log['count'] = {m300: 0} + + tip_log['tips'] = { + m300: [tip for rack in tips300 for tip in rack.rows()[0]]} + tip_log['max'] = {m300: len(tip_log['tips'][m300])} + + def _pick_up(pip, loc=None): + nonlocal tip_log + if tip_log['count'][pip] == tip_log['max'][pip] and not loc: + ctx.pause('Replace ' + str(pip.max_volume) + 'µl tipracks before \ +resuming.') + pip.reset_tipracks() + tip_log['count'][pip] = 0 + if loc: + pip.pick_up_tip(loc) + else: + pip.pick_up_tip(tip_log['tips'][pip][tip_log['count'][pip]]) + tip_log['count'][pip] += 1 + + switch = True + drop_count = 0 + # number of tips trash will accommodate before prompting user to empty + drop_threshold = 120 + + def _drop(pip): + nonlocal switch + nonlocal drop_count + side = 30 if switch else -18 + drop_loc = ctx.loaded_labwares[12].wells()[0].top().move( + Point(x=side)) + pip.drop_tip(drop_loc) + switch = not switch + drop_count += 8 + if drop_count == drop_threshold: + # Setup for flashing lights notification to empty trash + m300.home() + ctx.pause('Please empty tips from waste before resuming.') + + ctx.home() # home before continuing with protocol + drop_count = 0 + + waste_vol = 0 + waste_threshold = 185000 + + def remove_supernatant(vol, park=False): + """`remove_supernatant` will transfer supernatant. + + `remove_supernatant` will transfer supernatant from the deepwell + extraction plate to the liquid waste reservoir. + :param vol (float): The amount of volume to aspirate from all deepwell + sample wells and dispense in the liquid waste. + :param park (boolean): Whether to pick up sample-corresponding tips + in the 'parking rack' or to pick up new tips. + """ + + def _waste_track(vol): + nonlocal waste_vol + if waste_vol + vol >= waste_threshold: + # Setup for flashing lights notification to empty liquid waste + m300.home() + ctx.pause('Please empty liquid waste (slot 11) before \ +resuming.') + + ctx.home() # home before continuing with protocol + waste_vol = 0 + waste_vol += vol + + m300.flow_rate.aspirate = 30 + num_trans = math.ceil(vol/200) + vol_per_trans = vol/num_trans + for i, (m, spot) in enumerate(zip(mag_samples_m, parking_spots)): + if park: + _pick_up(m300, spot) + else: + _pick_up(m300) + side = -1 if i % 2 == 0 else 1 + loc = m.bottom(0.5).move(Point(x=side*2)) + for _ in range(num_trans): + _waste_track(vol_per_trans) + if m300.current_volume > 0: + # void air gap if necessary + m300.dispense(m300.current_volume, m.top()) + m300.move_to(m.center()) + m300.transfer(vol_per_trans, loc, waste, new_tip='never', + air_gap=20) + m300.blow_out(waste) + m300.air_gap(20) + _drop(m300) + m300.flow_rate.aspirate = 150 + + def bind(vol, park=True): + """`bind` will bind magnetic beads on each sample in deepwell plate. + + Each channel of binding beads will be mixed before + transfer, and the samples will be mixed with the binding beads after + the transfer. The magnetic deck activates after the addition to all + samples, and the supernatant is removed after bead bining. + + :param vol (float): The amount of volume to aspirate from the elution + buffer source and dispense to each well containing + beads. + :param park (boolean): Whether to save sample-corresponding tips + between adding elution buffer and transferring + supernatant to the final clean elutions PCR + plate. + """ + latest_chan = -1 + for i, (well, spot) in enumerate(zip(mag_samples_m, parking_spots)): + if park: + _pick_up(m300, spot) + else: + _pick_up(m300) + num_trans = math.ceil(vol/200) + vol_per_trans = vol/num_trans + asp_per_chan = 14000//(vol_per_trans*8) + for t in range(num_trans): + chan_ind = int((i*num_trans + t)//asp_per_chan) + source = binding_buffer[chan_ind] + if m300.current_volume > 0: + # void air gap if necessary + m300.dispense(m300.current_volume, source.top()) + if chan_ind > latest_chan: # mix if accessing new channel + for _ in range(5): + m300.aspirate(180, source.bottom(0.5)) + m300.dispense(180, source.bottom(5)) + latest_chan = chan_ind + m300.transfer(vol_per_trans, source, well.top(), air_gap=20, + new_tip='never') + if t < num_trans - 1: + m300.air_gap(20) + m300.mix(5, 200, well) + m300.blow_out(well.top(-2)) + m300.air_gap(20) + if park: + m300.drop_tip(spot) + else: + _drop(m300) + + magdeck.engage(height=MAG_HEIGHT) + ctx.delay(minutes=settling_time, msg='Incubating on MagDeck for \ +' + str(settling_time) + ' minutes.') + + # remove initial supernatant + remove_supernatant(vol+starting_vol, park=park) + + def wash(vol, source, mix_reps=15, park=True, resuspend=True): + """`wash` will perform bead washing for the extraction protocol. + + :param vol (float): The amount of volume to aspirate from each + source and dispense to each well containing beads. + :param source (List[Well]): A list of wells from where liquid will be + aspirated. If the length of the source list + > 1, `wash` automatically calculates + the index of the source that should be + accessed. + :param mix_reps (int): The number of repititions to mix the beads with + specified wash buffer (ignored if resuspend is + False). + :param park (boolean): Whether to save sample-corresponding tips + between adding wash buffer and removing + supernatant. + :param resuspend (boolean): Whether to resuspend beads in wash buffer. + """ + if resuspend and magdeck.status == 'engaged': + magdeck.disengage() + + num_trans = math.ceil(vol/200) + vol_per_trans = vol/num_trans + for i, (m, spot) in enumerate(zip(mag_samples_m, parking_spots)): + _pick_up(m300) + side = 1 if i % 2 == 0 else -1 + loc = m.bottom(0.5).move(Point(x=side*2)) + src = source[i//(12//len(source))] + for n in range(num_trans): + if m300.current_volume > 0: + m300.dispense(m300.current_volume, src.top()) + m300.transfer(vol_per_trans, src, m.top(), air_gap=20, + new_tip='never') + if n < num_trans - 1: # only air_gap if going back to source + m300.air_gap(20) + if resuspend: + m300.mix(mix_reps, 150, loc) + m300.blow_out(m.top()) + m300.air_gap(20) + if park: + m300.drop_tip(spot) + else: + _drop(m300) + + if magdeck.status == 'disengaged': + magdeck.engage(height=MAG_HEIGHT) + + ctx.delay(minutes=settling_time, msg='Incubating on MagDeck for \ +' + str(settling_time) + ' minutes.') + + remove_supernatant(vol, park=park) + + def elute(vol, park=True): + """`elute` will perform elution from the deepwell extraciton plate. + + `elute` will perform elution from the deepwell extraciton plate to the + final clean elutions PCR plate to complete the extraction protocol. + :param vol (float): The amount of volume to aspirate from the elution + buffer source and dispense to each well containing + beads. + :param park (boolean): Whether to save sample-corresponding tips + between adding elution buffer and transferring + supernatant to the final clean elutions PCR + plate. + """ + # resuspend beads in elution + if magdeck.status == 'enagaged': + magdeck.disengage() + for i, (m, spot) in enumerate(zip(mag_samples_m, parking_spots)): + _pick_up(m300) + side = 1 if i % 2 == 0 else -1 + loc = m.bottom(0.5).move(Point(x=side*2)) + m300.aspirate(vol, elution_solution) + m300.move_to(m.center()) + m300.dispense(vol, loc) + m300.mix(mix_reps, 0.8*vol, loc) + m300.blow_out(m.bottom(5)) + m300.air_gap(20) + if park: + m300.drop_tip(spot) + else: + _drop(m300) + + ctx.delay(minutes=10, msg='Beads sitting for 10 minutes for elution') + magdeck.engage(height=MAG_HEIGHT) + ctx.delay(minutes=2, msg='Incubating on MagDeck for \ +' + str(settling_time) + ' minutes.') + + for i, (m, e, spot) in enumerate( + zip(mag_samples_m, elution_samples_m, parking_spots)): + if park: + _pick_up(m300, spot) + else: + _pick_up(m300) + side = -1 if i % 2 == 0 else 1 + loc = m.bottom(0.5).move(Point(x=side*2)) + m300.transfer(vol, loc, e.bottom(5), air_gap=20, new_tip='never') + m300.blow_out(e.top(-2)) + m300.air_gap(20) + m300.drop_tip() + + """ + Here is where you can call the methods defined above to fit your specific + protocol. The normal sequence is: + """ + bind(binding_buffer_vol, park=park_tips) + wash(wash1_vol, wash1, park=park_tips) + wash(wash2_vol, wash2, park=park_tips) + wash(wash3_vol, wash3, park=park_tips) + ctx.delay(minutes=1, msg='Beads drying for 1 minutes') + elute(elution_vol, park=park_tips) + + # track final used tip + if tip_track and not ctx.is_simulating(): + if not os.path.isdir(folder_path): + os.mkdir(folder_path) + data = {'tips300': tip_log['count'][m300]} + with open(tip_file_path, 'w') as outfile: + json.dump(data, outfile) diff --git a/protocols/sci-promega-magazorb-dna-mini-prep-kit/README.md b/protocols/sci-promega-magazorb-dna-mini-prep-kit/README.md new file mode 100644 index 0000000000..d193061751 --- /dev/null +++ b/protocols/sci-promega-magazorb-dna-mini-prep-kit/README.md @@ -0,0 +1,97 @@ +# Promega MagaZorb® DNA Mini-Prep Kit + +### Author +[Opentrons (verified)](https://opentrons.com/) + +# Opentrons has launched a new Protocol Library. You should use the [new page for this protocol](library.opentrons.com/p/sci-promega-magazorb-dna-mini-prep-kit). This page won’t be available after January 31st, 2024. + +## Categories +* Nucleic Acid Extraction & Purification + * DNA Extraction + +## Description +Your OT-2 can fully automate the entire Promega MagaZorb® DNA Mini-Prep Kit. +Results of the Opentrons Science team's internal testing of this protocol on the OT-2 are shown below: + +![results](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/sci-promega-magazorb-dna-mini-prep-kit/promega-magazordb-results.png) + +Explanation of complex parameters below: +* `Number of samples`: Specify the number of samples this run (1-96 and divisible by 8, i.e. whole columns at a time). +* `Deepwell type`: Specify which well plate will be mounted on the magnetic module. +* `Reservoir Type`: Specify which reservoir will be employed. +* `Starting Volume`: Specify starting volume of sample (ul). +* `Binding buffer volume`: Specify the volume of binding buffer to use (ul). +* `Elution Volume`: Specify elution volume (ul). +* `Park Tips`: Specify whether to park tips or drop tips. +* `P300 Multi Channel Pipette Mount`: Specify whether the P300 multi channel pipette will be on the left or right mount. + + +--- + +### Modules +* [Magnetic Module (GEN2)](https://shop.opentrons.com/collections/hardware-modules/products/magdeck) + +### Labware +* [NEST 96 Wellplate 2mL](https://shop.opentrons.com/collections/lab-plates/products/nest-0-2-ml-96-well-deep-well-plate-v-bottom) +* [USA Scientific 96 Wellplate 2.4mL](https://labware.opentrons.com/?category=wellPlate) +* [NEST 12 Reservoir 15mL](https://shop.opentrons.com/collections/reservoirs/products/nest-12-well-reservoir-15-ml) +* [USA Scientific 12 Reservoir 22mL](https://labware.opentrons.com/?category=reservoir) +* [Opentrons 200uL Filter Tips](https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-200ul-filter-tips) +* [Opentrons 96 Aluminum block Nest Wellplate 100ul](https://labware.opentrons.com/opentrons_96_aluminumblock_nest_wellplate_100ul?category=aluminumBlock) + +### Pipettes +* [P300 Multi Channel Pipette](https://shop.opentrons.com/collections/ot-2-robot/products/8-channel-electronic-pipette) + +### Reagents +* [Promega MagaZorb® DNA Mini-Prep Kit](https://www.promega.com/products/nucleic-acid-extraction/genomic-dna/magazorb-dna-mini-prep-kit/?catNum=MB1004) + +--- + +### Deck Setup + +* Tip rack on Slot 4 is used for tip parking if selected. + +![deck layout](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/sci-promega-magazorb-dna-mini-prep-kit/promega-extraction-layout.png) + +### Reagent Setup + +* Reservoir 1: Slot 2 + +![reservoir 1](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/sci-promega-magazorb-dna-mini-prep-kit/res1.png) + +* Reservoir 2: Slot 3 + +![reservoir 2](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/sci-promega-magazorb-dna-mini-prep-kit/res2.png) + +--- + +### Protocol Steps +1. Binding buffer is mixed 5 times. +2. Binding buffer is added to samples on deep well plate on the magnetic module. +3. Magnetic module is engaged and incubated for 7 minutes. +4. Supernatant is removed and dropped into the liquid waste container. +5. Add Wash Buffer and resuspend by mixing. +6. Remove supernatant to liquid waste container. +7. Perform second wash (repeats step 5-6 with second wash buffer set). +8. Incubate for 1 minute to dry beads. +9. Elution solution is added to the samples. +10. Beads are resuspended in elution solution. +11. Incubates elution solution for 5 minutes. +12. Magnetic module is engaged and incubates for 7 minutes (variable settling time). +13. Elution samples are transferred to elution plate in Slot 1. + + +### 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 +sci-promega-magazorb-dna-mini-prep-kit diff --git a/protocols/sci-promega-magazorb-dna-mini-prep-kit/fields.json b/protocols/sci-promega-magazorb-dna-mini-prep-kit/fields.json new file mode 100644 index 0000000000..a4fe7a27d2 --- /dev/null +++ b/protocols/sci-promega-magazorb-dna-mini-prep-kit/fields.json @@ -0,0 +1,111 @@ +[ + { + "type": "int", + "label": "number of samples + controls (1-96)", + "name": "num_samples", + "default": 8 + }, + { + "type": "dropDown", + "label": "96-deepwell plate type", + "name": "deepwell_type", + "options": [ + {"label": "NEST", "value": "nest_96_wellplate_2ml_deep"}, + {"label": "USA Scientific", "value": "usascientific_96_wellplate_2.4ml_deep"} + ] + }, + { + "type": "dropDown", + "label": "12-well reservoir type", + "name": "res_type", + "options": [ + {"label": "NEST", "value": "nest_12_reservoir_15ml"}, + {"label": "USA Scientific", "value": "usascientific_12_reservoir_22ml"} + ] + }, + { + "type": "float", + "label": "intitial volume (sample + lysis buffer, in ul)", + "name": "starting_vol", + "default": 440.0 + }, + { + "type": "float", + "label": "binding buffer volume (in ul)", + "name": "binding_buffer_vol", + "default": 600.0 + }, + { + "type": "float", + "label": "wash 1 volume (in ul, up to 500ul)", + "name": "wash1_vol", + "default": 500.0 + }, + { + "type": "float", + "label": "wash 2 volume (in ul, up to 500ul)", + "name": "wash2_vol", + "default": 500.0 + }, + { + "type": "float", + "label": "wash 3 volume (in ul, up to 500ul)", + "name": "wash3_vol", + "default": 500.0 + }, + { + "type": "float", + "label": "final elution volume (in ul)", + "name": "elution_vol", + "default": 50.0 + }, + { + "type": "int", + "label": "mix repetitions for bead resuspension", + "name": "mix_reps", + "default": 10 + }, + { + "type": "float", + "label": "bead settling time (in minutes)", + "name": "settling_time", + "default": 2.0 + }, + { + "type": "dropDown", + "label": "park tips", + "name": "park_tips", + "options": [ + {"label": "yes", "value": true}, + {"label": "no", "value": false} + ] + }, + { + "type": "dropDown", + "label": "track tips across protocol runs", + "name": "tip_track", + "options": [ + {"label": "no", "value": false}, + {"label": "yes", "value": true} + ] + }, + { + "type": "dropDown", + "label": "flash robot on pause", + "name": "flash", + "options": [ + {"label": "no", "value": false}, + {"label": "yes", "value": true} + ] + }, + { + "type": "dropDown", + "label": "P300 Multi Channel Pipette Mount", + "name": "p300_mount", + "options": [ + {"label": "Left", "value": "left"}, + {"label": "Right", "value": "right"} + ] + } + ] + \ No newline at end of file diff --git a/protocols/sci-promega-magazorb-dna-mini-prep-kit/sci-promega-magazorb-dna-mini-prep-kit.ot2.apiv2.py b/protocols/sci-promega-magazorb-dna-mini-prep-kit/sci-promega-magazorb-dna-mini-prep-kit.ot2.apiv2.py new file mode 100644 index 0000000000..6e32ca9339 --- /dev/null +++ b/protocols/sci-promega-magazorb-dna-mini-prep-kit/sci-promega-magazorb-dna-mini-prep-kit.ot2.apiv2.py @@ -0,0 +1,486 @@ +from opentrons.types import Point +import json +import os +import math +import threading +from time import sleep +from opentrons import types + + +metadata = { + 'protocolName': 'MagaZorb® DNA Mini-Prep Kit', + 'author': 'Opentrons ', + 'apiLevel': '2.4' +} + + +""" +Here is where you can modify the magnetic module engage height: +""" +MAG_HEIGHT = 13.6 + + +# Definitions for deck light flashing +class CancellationToken: + def __init__(self): + self.is_continued = False + + def set_true(self): + self.is_continued = True + + def set_false(self): + self.is_continued = False + + +def turn_on_blinking_notification(hardware, pause): + while pause.is_continued: + hardware.set_lights(rails=True) + sleep(1) + hardware.set_lights(rails=False) + sleep(1) + + +def create_thread(ctx, cancel_token): + t1 = threading.Thread(target=turn_on_blinking_notification, + args=(ctx._hw_manager.hardware, cancel_token)) + t1.start() + return t1 + + +# Start protocol +def run(ctx): + # Setup for flashing lights notification to empty trash + cancellationToken = CancellationToken() + + [num_samples, deepwell_type, res_type, starting_vol, binding_buffer_vol, + wash1_vol, wash2_vol, wash3_vol, elution_vol, mix_reps, settling_time, + park_tips, tip_track, flash, p300_mount] = get_values( # noqa: F821 + 'num_samples', 'deepwell_type', 'res_type', 'starting_vol', + 'binding_buffer_vol', 'wash1_vol', 'wash2_vol', 'wash3_vol', + 'elution_vol', 'mix_reps', 'settling_time', 'park_tips', 'tip_track', + 'flash', 'p300_mount') + + """ + Here is where you can change the locations of your labware and modules + (note that this is the recommended configuration) + """ + magdeck = ctx.load_module('magdeck', '6') + magdeck.disengage() + magplate = magdeck.load_labware(deepwell_type, 'deepwell plate') +# tempdeck = ctx.load_module('Temperature Module Gen2', '1') + elutionplate = ctx.load_labware( + 'opentrons_96_aluminumblock_nest_wellplate_100ul', + '1') + waste = ctx.load_labware('nest_1_reservoir_195ml', '9', + 'Liquid Waste').wells()[0].top() + res2 = ctx.load_labware(res_type, '3', 'reagent reservoir 2') + res1 = ctx.load_labware(res_type, '2', 'reagent reservoir 1') + num_cols = math.ceil(num_samples/8) + tips300 = [ctx.load_labware('opentrons_96_tiprack_300ul', slot, + '200µl filtertiprack') + for slot in ['5', '7', '8', '10', '11']] + if park_tips: + parkingrack = ctx.load_labware( + 'opentrons_96_tiprack_300ul', '4', 'tiprack for parking') + parking_spots = parkingrack.rows()[0][:num_cols] + else: + tips300.insert(0, ctx.load_labware('opentrons_96_tiprack_300ul', '4', + '200µl filtertiprack')) + parking_spots = [None for none in range(12)] + + # load P300M pipette + m300 = ctx.load_instrument( + 'p300_multi_gen2', p300_mount, tip_racks=tips300) + + """ + Here is where you can define the locations of your reagents. + """ + binding_buffer = res1.wells()[:4] + elution_solution = res2.wells()[-1] + wash1 = res1.wells()[4:10] + wash2 = res2.wells()[:6] + + center = magplate['A1'].bottom().move(types.Point(x=0, y=0, z=0.1)) + topright = magplate['A1'].bottom().move(types.Point(x=3.8, y=3.8, z=0.1)) + # topleft = magplate['A1'].bottom().move(types.Point(x=-3.8, y=3.8, z=0.1)) + bottomright = magplate['A1'].bottom().move(types.Point(x=3.8, y=-3.8, + z=0.1)) + # bottomleft = magplate['A1'].bottom().move(types.Point(x=-3.8, y=-3.8, + # z=0.1)) + + mag_samples_m = magplate.rows()[0][:num_cols] + elution_samples_m = elutionplate.rows()[0][:num_cols] + +# magdeck.disengage() # just in case +# tempdeck.set_temperature(4) + + m300.flow_rate.aspirate = 50 + m300.flow_rate.dispense = 150 + m300.flow_rate.blow_out = 300 + + folder_path = '/data/B' + tip_file_path = folder_path + '/tip_log.json' + tip_log = {'count': {}} + if tip_track and not ctx.is_simulating(): + if os.path.isfile(tip_file_path): + with open(tip_file_path) as json_file: + data = json.load(json_file) + if 'tips300' in data: + tip_log['count'][m300] = data['tips300'] + else: + tip_log['count'][m300] = 0 + else: + tip_log['count'][m300] = 0 + else: + tip_log['count'] = {m300: 0} + + tip_log['tips'] = { + m300: [tip for rack in tips300 for tip in rack.rows()[0]]} + tip_log['max'] = {m300: len(tip_log['tips'][m300])} + + def _pick_up(pip, loc=None): + nonlocal tip_log + if tip_log['count'][pip] == tip_log['max'][pip] and not loc: + ctx.pause('Replace ' + str(pip.max_volume) + 'µl tipracks before \ +resuming.') + pip.reset_tipracks() + tip_log['count'][pip] = 0 + if loc: + pip.pick_up_tip(loc) + else: + pip.pick_up_tip(tip_log['tips'][pip][tip_log['count'][pip]]) + tip_log['count'][pip] += 1 + + switch = True + drop_count = 0 + # number of tips trash will accommodate before prompting user to empty + drop_threshold = 120 + + def _drop(pip): + nonlocal switch + nonlocal drop_count + side = 30 if switch else -18 + drop_loc = ctx.loaded_labwares[12].wells()[0].top().move( + Point(x=side)) + pip.drop_tip(drop_loc) + switch = not switch + if pip.type == 'multi': + drop_count += 8 + else: + drop_count += 1 + if drop_count >= drop_threshold: + # Setup for flashing lights notification to empty trash + if flash: + if not ctx._hw_manager.hardware.is_simulator: + cancellationToken.set_true() + thread = create_thread(ctx, cancellationToken) + m300.home() + ctx.pause('Please empty tips from waste before resuming.') + ctx.home() # home before continuing with protocol + if flash: + cancellationToken.set_false() # stop light flashing after home + thread.join() + drop_count = 0 + + waste_vol = 0 + waste_threshold = 185000 + + def remove_supernatant(vol, park=False): + """ + `remove_supernatant` will transfer supernatant from the deepwell + extraction plate to the liquid waste reservoir. + :param vol (float): The amount of volume to aspirate from all deepwell + sample wells and dispense in the liquid waste. + :param park (boolean): Whether to pick up sample-corresponding tips + in the 'parking rack' or to pick up new tips. + """ + + def _waste_track(vol): + nonlocal waste_vol + if waste_vol + vol >= waste_threshold: + # Setup for flashing lights notification to empty liquid waste + if flash: + if not ctx._hw_manager.hardware.is_simulator: + cancellationToken.set_true() + thread = create_thread(ctx, cancellationToken) + m300.home() + ctx.pause('Please empty liquid waste (slot 11) before \ +resuming.') + + ctx.home() # home before continuing with protocol + if flash: + # stop light flashing after home + cancellationToken.set_false() + thread.join() + + waste_vol = 0 + waste_vol += vol + + m300.flow_rate.aspirate = 30 + num_trans = math.ceil(vol/200) + vol_per_trans = vol/num_trans + for i, (m, spot) in enumerate(zip(mag_samples_m, parking_spots)): + if park: + _pick_up(m300, spot) + else: + _pick_up(m300) + side = -1 if i % 2 == 0 else 1 + loc = m.bottom(0.5).move(Point(x=side*2)) + for _ in range(num_trans): + _waste_track(vol_per_trans) + if m300.current_volume > 0: + # void air gap if necessary + m300.dispense(m300.current_volume, m.top()) + m300.move_to(m.center()) + m300.transfer(vol_per_trans, loc, waste, new_tip='never', + air_gap=10) + m300.blow_out(waste) + m300.air_gap(20) + _drop(m300) + m300.flow_rate.aspirate = 150 + + def bind(vol, park=True): + """ + `bind` will perform magnetic bead binding on each sample in the + deepwell plate. Each channel of binding beads will be mixed before + transfer, and the samples will be mixed with the binding beads after + the transfer. The magnetic deck activates after the addition to all + samples, and the supernatant is removed after bead bining. + :param vol (float): The amount of volume to aspirate from the elution + buffer source and dispense to each well containing + beads. + :param park (boolean): Whether to save sample-corresponding tips + between adding elution buffer and transferring + supernatant to the final clean elutions PCR + plate. + """ + latest_chan = -1 + for i, (well, spot) in enumerate(zip(mag_samples_m, parking_spots)): + if park: + _pick_up(m300, spot) + else: + _pick_up(m300) + num_trans = math.ceil(vol/200) + vol_per_trans = vol/num_trans + asp_per_chan = (0.95*res1.wells()[0].max_volume)//(vol_per_trans*8) + for t in range(num_trans): + chan_ind = int((i*num_trans + t)//asp_per_chan) + source = binding_buffer[chan_ind] + if m300.current_volume > 0: + # void air gap if necessary + m300.dispense(m300.current_volume, source.top()) + if chan_ind > latest_chan: # mix if accessing new channel + for _ in range(5): + m300.aspirate(180, source.bottom(0.5)) + m300.dispense(180, source.bottom(5)) + latest_chan = chan_ind + m300.transfer(vol_per_trans, source, well.top(), air_gap=20, + new_tip='never') + if t < num_trans - 1: + m300.air_gap(20) + # m300.mix(5, 200, well) + m300.blow_out(well.top(-2)) + m300.air_gap(20) + if park: + m300.drop_tip(spot) + else: + _drop(m300) + + ctx.pause('mix off deck on a shaker for 10 minutes') + magdeck.engage(height=MAG_HEIGHT) + ctx.delay(minutes=settling_time, msg='Incubating on MagDeck for \ +' + str(settling_time) + ' minutes.') + + # remove initial supernatant + remove_supernatant(vol+starting_vol, park=park) + + def wash(vol, source, mix_reps=15, park=True, resuspend=True): + """ + `wash` will perform bead washing for the extraction protocol. + :param vol (float): The amount of volume to aspirate from each + source and dispense to each well containing beads. + :param source (List[Well]): A list of wells from where liquid will be + aspirated. If the length of the source list + > 1, `wash` automatically calculates + the index of the source that should be + accessed. + :param mix_reps (int): The number of repititions to mix the beads with + specified wash buffer (ignored if resuspend is + False). + :param park (boolean): Whether to save sample-corresponding tips + between adding wash buffer and removing + supernatant. + :param resuspend (boolean): Whether to resuspend beads in wash buffer. + """ + + if resuspend and magdeck.status == 'engaged': + magdeck.disengage() + + num_trans = math.ceil(vol/200) + vol_per_trans = vol/num_trans + for i, (m, spot) in enumerate(zip(mag_samples_m, parking_spots)): + _pick_up(m300) + # side = 1 if i % 2 == 0 else -1 + # loc = m.bottom(0.5).move(Point(x=side*2)) + src = source[i//(12//len(source))] + for n in range(num_trans): + if m300.current_volume > 0: + m300.dispense(m300.current_volume, src.top()) + m300.transfer(vol_per_trans, src, m.top(), air_gap=20, + new_tip='never') + if n < num_trans - 1: # only air_gap if going back to source + m300.air_gap(20) + if resuspend: + # m300.mix(mix_reps, 150, loc) + m300.flow_rate.dispense = 500 + + m300.aspirate(180, center) + m300.dispense(180, topright) + m300.aspirate(180, center) + m300.dispense(180, topright) + m300.aspirate(180, center) + m300.dispense(180, bottomright) + m300.aspirate(180, center) + m300.dispense(180, bottomright) + m300.aspirate(180, center) + m300.dispense(180, topright) + m300.aspirate(180, center) + m300.dispense(180, topright) + m300.aspirate(180, center) + m300.dispense(180, bottomright) + m300.aspirate(180, center) + m300.dispense(180, bottomright) + m300.aspirate(180, center) + m300.dispense(180, topright) + m300.aspirate(180, center) + m300.dispense(180, topright) + m300.aspirate(180, center) + m300.dispense(180, bottomright) + m300.aspirate(180, center) + m300.dispense(180, bottomright) + m300.aspirate(180, center) + m300.dispense(180, topright) + m300.aspirate(180, center) + m300.dispense(180, topright) + m300.aspirate(180, center) + m300.dispense(180, bottomright) + m300.aspirate(180, center) + m300.dispense(180, bottomright) + + m300.flow_rate.dispense = 150 + m300.blow_out(m.top()) + m300.air_gap(20) + if park: + m300.drop_tip(spot) + else: + _drop(m300) + + if magdeck.status == 'disengaged': + magdeck.engage(height=MAG_HEIGHT) + + ctx.delay(minutes=settling_time, msg='Incubating on MagDeck for \ +' + str(settling_time) + ' minutes.') + + remove_supernatant(vol, park=park) + + def elute(vol, park=True): + """ + `elute` will perform elution from the deepwell extraciton plate to the + final clean elutions PCR plate to complete the extraction protocol. + :param vol (float): The amount of volume to aspirate from the elution + buffer source and dispense to each well containing + beads. + :param park (boolean): Whether to save sample-corresponding tips + between adding elution buffer and transferring + supernatant to the final clean elutions PCR + plate. + """ + + # resuspend beads in elution + if magdeck.status == 'enagaged': + magdeck.disengage() + for i, (m, spot) in enumerate(zip(mag_samples_m, parking_spots)): + _pick_up(m300) + side = 1 if i % 2 == 0 else -1 + loc = m.bottom(0.5).move(Point(x=side*2)) + m300.aspirate(vol, elution_solution) + m300.move_to(m.center()) + m300.dispense(vol, loc) + # m300.mix(mix_reps, 0.8*vol, loc) + m300.flow_rate.dispense = 500 + + m300.aspirate(180, center) + m300.dispense(180, topright) + m300.aspirate(180, center) + m300.dispense(180, topright) + m300.aspirate(180, center) + m300.dispense(180, bottomright) + m300.aspirate(180, center) + m300.dispense(180, bottomright) + m300.aspirate(180, center) + m300.dispense(180, topright) + m300.aspirate(180, center) + m300.dispense(180, topright) + m300.aspirate(180, center) + m300.dispense(180, bottomright) + m300.aspirate(180, center) + m300.dispense(180, bottomright) + m300.aspirate(180, center) + m300.dispense(180, topright) + m300.aspirate(180, center) + m300.dispense(180, topright) + m300.aspirate(180, center) + m300.dispense(180, bottomright) + m300.aspirate(180, center) + m300.dispense(180, bottomright) + m300.aspirate(180, center) + m300.dispense(180, topright) + m300.aspirate(180, center) + m300.dispense(180, topright) + m300.aspirate(180, center) + m300.dispense(180, bottomright) + m300.aspirate(180, center) + m300.dispense(180, bottomright) + + m300.flow_rate.dispense = 150 + m300.blow_out(m.bottom(5)) + m300.air_gap(20) + if park: + m300.drop_tip(spot) + else: + _drop(m300) + + ctx.delay(minutes=5, msg='Incubating for elution for 5 minutes') + magdeck.engage(height=MAG_HEIGHT) + ctx.delay(minutes=settling_time, msg='Incubating on MagDeck for \ +' + str(settling_time) + ' minutes.') + + for i, (m, e, spot) in enumerate( + zip(mag_samples_m, elution_samples_m, parking_spots)): + if park: + _pick_up(m300, spot) + else: + _pick_up(m300) + side = -1 if i % 2 == 0 else 1 + loc = m.bottom(0.5).move(Point(x=side*2)) + m300.transfer(vol, loc, e.bottom(5), air_gap=20, new_tip='never') + m300.blow_out(e.top(-2)) + m300.air_gap(20) + m300.drop_tip() + + """ + Here is where you can call the methods defined above to fit your specific + protocol """ + bind(binding_buffer_vol, park=park_tips) + wash(wash1_vol, wash1, park=park_tips) + wash(wash2_vol, wash2, park=park_tips) + ctx.delay(minutes=1, msg='Incubate for 1 minutes to dry beads') + elute(elution_vol, park=park_tips) + + # track final used tip + if tip_track and not ctx.is_simulating(): + if not os.path.isdir(folder_path): + os.mkdir(folder_path) + data = {'tips300': tip_log['count'][m300]} + with open(tip_file_path, 'w') as outfile: + json.dump(data, outfile) diff --git a/protocols/sci-zymo-directzol-magbead/README.md b/protocols/sci-zymo-directzol-magbead/README.md new file mode 100644 index 0000000000..78970cb76d --- /dev/null +++ b/protocols/sci-zymo-directzol-magbead/README.md @@ -0,0 +1,104 @@ +# Zymo Research Direct-zol™-96 MagBead RNA Kit + +### Author +[Opentrons (verified)](https://opentrons.com/) + +# Opentrons has launched a new Protocol Library. You should use the [new page for this protocol](library.opentrons.com/p/sci-zymo-directzol-magbead). This page won’t be available after January 31st, 2024. + +## Categories +* Nucleic Acid Extraction & Purification + * RNA Extraction + +## Description +Your OT-2 can fully automate the entire Zymo Research Direct-zol™-96 MagBead RNA Kit. +Results of the Opentrons Science team's internal testing of this protocol on the OT-2 are shown below: + +![results](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/sci-zymo-directzol-magbead/Screen+Shot+2021-07-27+at+11.12.53+AM.png) + +![results](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/sci-zymo-directzol-magbead/Screen+Shot+2021-07-27+at+11.13.04+AM.png) + +Explanation of complex parameters below: +* `Number of samples`: Specify the number of samples this run (1-96 and divisible by 8, i.e. whole columns at a time). +* `Deepwell type`: Specify which well plate will be mounted on the magnetic module. +* `Reservoir Type`: Specify which reservoir will be employed. +* `Starting Volume`: Specify starting volume of sample (ul). +* `Elution Volume`: Specify elution volume (ul). +* `Park Tips`: Specify whether to park tips or drop tips. +* `Mag Deck Generation`: Specify whether GEN1 or GEN2 magnetic module will be used. +* `P300 Multi Channel Pipette Mount`: Specify whether the P300 multi channel pipette will be on the left or right mount. + + +--- + +### Modules +* [Magnetic Module (GEN2)](https://shop.opentrons.com/collections/hardware-modules/products/magdeck) +* [Temperature Module (GEN2)](https://shop.opentrons.com/products/tempdeck?_gl=1*fess6p*_gcl_aw*R0NMLjE2MjIwMzI4MjQuQ2p3S0NBanc0N2VGQmhBOUVpd0F5OGt6TkpCLTRGNUJPc2pZbHUxSEJMZS0wX09rNVZWTll4MmZZMXN3VGlkS1pkcGdPT202S1B4OWtSb0N0cndRQXZEX0J3RQ..*_ga*MTM2NTEwNjE0OS4xNjIxMzYxMzU4*_ga_GNSMNLW4RY*MTYyNzM5OTA1Ny4yMjcuMS4xNjI3Mzk5MDcxLjA.&_ga=2.80196951.1136571263.1627304996-1365106149.1621361358) + + +### Labware +* [NEST 96 Wellplate 2mL](https://shop.opentrons.com/collections/lab-plates/products/nest-0-2-ml-96-well-deep-well-plate-v-bottom) +* [USA Scientific 96 Wellplate 2.4mL](https://labware.opentrons.com/?category=wellPlate) +* [NEST 12 Reservoir 15mL](https://shop.opentrons.com/collections/reservoirs/products/nest-12-well-reservoir-15-ml) +* [USA Scientific 12 Reservoir 22mL](https://labware.opentrons.com/?category=reservoir) +* [Opentrons 200uL Filter Tips](https://shop.opentrons.com/collections/opentrons-tips/products/opentrons-200ul-filter-tips) +* [Opentrons 96 Aluminum block Nest Wellplate 100ul](https://labware.opentrons.com/opentrons_96_aluminumblock_nest_wellplate_100ul?category=aluminumBlock) + +### Pipettes +* [P300 Multi Channel Pipette](https://shop.opentrons.com/collections/ot-2-robot/products/8-channel-electronic-pipette) + +### Reagents +* [Zymo Research Direct-zol™-96 MagBead RNA Kit](https://files.zymoresearch.com/protocols/_r2100_r2101_r2102_r2103_r2104_r2105_direct-zol-96_magbead_rna.pdf) + +--- + +### Deck Setup + +* Tip rack on Slot 4 is used for tip parking if selected. + +![deck layout](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/sci-zymo-directzol-magbead/Screen+Shot+2021-07-27+at+11.06.38+AM.png) + +### Reagent Setup + +* Reservoir 1: Slot 2 + +![reservoir 1](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/sci-zymo-directzol-magbead/Screen+Shot+2021-07-27+at+11.07.19+AM.png) + +* Reservoir 2: Slot 3 + +![reservoir 2](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/sci-zymo-directzol-magbead/Screen+Shot+2021-07-27+at+11.07.29+AM.png) + +--- + +### Protocol Steps +1. Temperature module is set to 4 C +2. Binding buffer is mixed to resuspend beads +3. Binding buffer is added to sample +4. Protocol is paused and user is prompted to mix for 10 minutes on heater shaker +5. Incubate on magnetic beads for 7 minutes +6. Supernatant is removed +7. Samples are washed +8. Beads are resuspended, magnetic module engaged +9. 7 minute incubation +10. Supernatant removed +11. Magnetic module disengaged +12. 7-11 repeated 3X +13. Dnase added to samples, mixed +14. Samples incubate 10 minutes with occasional mixing +15. Stop reaction added to samples +16. Elution solution added to samples and moved to temperature module + + +### 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 +sci-zymo-directzol-magbead diff --git a/protocols/sci-zymo-directzol-magbead/fields.json b/protocols/sci-zymo-directzol-magbead/fields.json new file mode 100644 index 0000000000..1d794805ec --- /dev/null +++ b/protocols/sci-zymo-directzol-magbead/fields.json @@ -0,0 +1,65 @@ +[ + { + "type": "int", + "label": "Number of Samples", + "name": "num_samples", + "default": 8 + }, + { + "type": "dropDown", + "label": "Deepwell Type", + "name": "deepwell_type", + "options": [ + { "label": "NEST 96 Wellplate 2mL", "value": "nest_96_wellplate_2ml_deep" }, + { "label": "USA Scientific 96 Wellplate 2.4mL", "value": "usascientific_96_wellplate_2.4ml_deep" } + ] + }, + { + "type": "dropDown", + "label": "Reservoir Type", + "name": "res_type", + "options": [ + { "label": "NEST 12 Reservoir 15mL", "value": "nest_12_reservoir_15ml" }, + { "label": "USA Scientific 12 Reservoir 22mL", "value": "usascientific_12_reservoir_22ml" } + ] + }, + { + "type": "int", + "label": "Starting Volume", + "name": "starting_vol", + "default": 400 + }, + { + "type": "int", + "label": "Elution Volume", + "name": "elution_vol", + "default": 50 + }, + { + "type": "dropDown", + "label": "Park Tips?", + "name": "park_tips", + "options": [ + { "label": "Yes, park tips", "value": true }, + { "label": "No, do not park tips", "value": false } + ] + }, + { + "type": "dropDown", + "label": "Mag Deck Generation", + "name": "mag_gen", + "options": [ + { "label": "GEN1", "value": "magdeck" }, + { "label": "GEN2", "value": "magnetic module gen2" } + ] + }, + { + "type": "dropDown", + "label": "P300 Multi Mount", + "name": "m300_mount", + "options": [ + { "label": "Left", "value": "left" }, + { "label": "Right", "value": "right" } + ] + } +] diff --git a/protocols/sci-zymo-directzol-magbead/sci-zymo-directzol-magbead.ot2.apiv2.py b/protocols/sci-zymo-directzol-magbead/sci-zymo-directzol-magbead.ot2.apiv2.py new file mode 100644 index 0000000000..ad62034b8b --- /dev/null +++ b/protocols/sci-zymo-directzol-magbead/sci-zymo-directzol-magbead.ot2.apiv2.py @@ -0,0 +1,505 @@ +from opentrons.types import Point +import json +import os +import math +from opentrons import types + + +metadata = { + 'protocolName': 'Zymo Research Direct-zol™-96 MagBead RNA Kit', + 'author': 'Opentrons ', + 'apiLevel': '2.4' +} + + +# Start protocol +def run(ctx): + + [num_samples, deepwell_type, res_type, starting_vol, + elution_vol, park_tips, mag_gen, m300_mount] = get_values( # noqa: F821 + 'num_samples', 'deepwell_type', 'res_type', 'starting_vol', + 'elution_vol', 'park_tips', 'mag_gen', 'm300_mount') + + if num_samples % 8 != 0: + raise Exception("Enter a sample number wholly divisible by 8") + if not 0 <= num_samples <= 96: + raise Exception("Enter a sample number between 1-96") + + if mag_gen == 'magdeck': + MAG_HEIGHT = 13.6 + else: + MAG_HEIGHT = 6.8 + + settling_time = 7 + + """ + Here is where you can change the locations of your labware and modules + (note that this is the recommended configuration) + """ + magdeck = ctx.load_module(mag_gen, '6') + magdeck.disengage() + magplate = magdeck.load_labware(deepwell_type, 'deepwell plate') + tempdeck = ctx.load_module('Temperature Module Gen2', '1') + elutionplate = tempdeck.load_labware( + 'opentrons_96_aluminumblock_nest_wellplate_100ul') + waste = ctx.load_labware('nest_1_reservoir_195ml', '9', + 'Liquid Waste').wells()[0].top() + res2 = ctx.load_labware(res_type, '3', 'reagent reservoir 2') + res1 = ctx.load_labware(res_type, '2', 'reagent reservoir 1') + num_cols = math.ceil(num_samples/8) + tips300 = [ctx.load_labware('opentrons_96_tiprack_300ul', slot, + '200µl filtertiprack') + for slot in ['5', '7', '8', '10', '11']] + if park_tips: + parkingrack = ctx.load_labware( + 'opentrons_96_tiprack_300ul', '4', 'tiprack for parking') + parking_spots = parkingrack.rows()[0][:num_cols] + else: + tips300.insert(0, ctx.load_labware('opentrons_96_tiprack_300ul', '4', + '200µl filtertiprack')) + parking_spots = [None for none in range(12)] + + # load P300M pipette + m300 = ctx.load_instrument( + 'p300_multi_gen2', m300_mount, tip_racks=tips300) + + tip_log = {val: {} for val in ctx.loaded_instruments.values()} + + """ + Here is where you can define the locations of your reagents. + """ + binding_buffer = res1.wells()[:4] + wash1 = res1.wells()[4:8] + wash2 = res1.wells()[8:] + dnase1 = [res2.wells()[0]] + stopreaction = res2.wells()[1:5] + wash3 = res2.wells()[5:9] + elution_solution = res2.wells()[-1] + wash4 = res2.wells()[9:11] + + mag_samples_m = magplate.rows()[0][:num_cols] + elution_samples_m = elutionplate.rows()[0][:num_cols] + +# magdeck.disengage() # just in case + tempdeck.set_temperature(4) + + m300.flow_rate.aspirate = 50 + m300.flow_rate.dispense = 150 + m300.flow_rate.blow_out = 300 + tip_track = False + + folder_path = '/data/B' + tip_file_path = folder_path + '/tip_log.json' + if tip_track and not ctx.is_simulating(): + if os.path.isfile(tip_file_path): + with open(tip_file_path) as json_file: + data = json.load(json_file) + for pip in tip_log: + if pip.name in data: + tip_log[pip]['count'] = data[pip.name] + else: + tip_log[pip]['count'] = 0 + else: + for pip in tip_log: + tip_log[pip]['count'] = 0 + else: + for pip in tip_log: + tip_log[pip]['count'] = 0 + + for pip in tip_log: + if pip.type == 'multi': + tip_log[pip]['tips'] = [tip for rack in pip.tip_racks + for tip in rack.rows()[0]] + else: + tip_log[pip]['tips'] = [tip for rack in pip.tip_racks + for tip in rack.wells()] + tip_log[pip]['max'] = len(tip_log[pip]['tips']) + + def _pick_up(pip, loc=None): + if tip_log[pip]['count'] == tip_log[pip]['max'] and not loc: + ctx.pause('Replace ' + str(pip.max_volume) + 'µl tipracks before \ +resuming.') + pip.reset_tipracks() + tip_log[pip]['count'] = 0 + if loc: + pip.pick_up_tip(loc) + else: + pip.pick_up_tip(tip_log[pip]['tips'][tip_log[pip]['count']]) + tip_log[pip]['count'] += 1 + + switch = True + drop_count = 0 + # number of tips trash will accommodate before prompting user to empty + drop_threshold = 120 + + def _drop(pip): + nonlocal switch + nonlocal drop_count + side = 30 if switch else -18 + drop_loc = ctx.loaded_labwares[12].wells()[0].top().move( + Point(x=side)) + pip.drop_tip(drop_loc) + switch = not switch + if pip.type == 'multi': + drop_count += 8 + else: + drop_count += 1 + if drop_count >= drop_threshold: + # Setup for flashing lights notification to empty trash + m300.home() + ctx.pause('Please empty tips from waste before resuming.') + ctx.home() # home before continuing with protocol + drop_count = 0 + + waste_vol = 0 + waste_threshold = 185000 + + def remove_supernatant(vol, park=False): + """ + `remove_supernatant` will transfer supernatant from the deepwell + extraction plate to the liquid waste reservoir. + :param vol (float): The amount of volume to aspirate from all deepwell + sample wells and dispense in the liquid waste. + :param park (boolean): Whether to pick up sample-corresponding tips + in the 'parking rack' or to pick up new tips. + """ + + def _waste_track(vol): + nonlocal waste_vol + if waste_vol + vol >= waste_threshold: + # Setup for flashing lights notification to empty liquid waste + + m300.home() + ctx.pause('Please empty liquid waste (slot 11) before \ +resuming.') + ctx.home() # home before continuing with protocol + waste_vol = 0 + waste_vol += vol + + m300.flow_rate.aspirate = 30 + num_trans = math.ceil(vol/200) + vol_per_trans = vol/num_trans + for i, (m, spot) in enumerate(zip(mag_samples_m, parking_spots)): + if park: + _pick_up(m300, spot) + else: + _pick_up(m300) + side = -1 if i % 2 == 0 else 1 + loc = m.bottom(0.5).move(Point(x=side*2)) + for _ in range(num_trans): + _waste_track(vol_per_trans) + if m300.current_volume > 0: + # void air gap if necessary + m300.dispense(m300.current_volume, m.top()) + m300.move_to(m.center()) + m300.transfer(vol_per_trans, loc, waste, new_tip='never', + air_gap=20) + m300.blow_out(waste) + m300.air_gap(20) + _drop(m300) + m300.flow_rate.aspirate = 150 + + def resuspend_pellet(well, pip, mvol, reps=5): + """ + 'resuspend_pellet' will forcefully dispense liquid over the + pellet after the magdeck engage in order to more thoroughly resuspend + the pellet.param well: The current well that the resuspension will + occur in. param pip: The pipet that is currently attached/ being used. + param mvol: The volume that is transferred before the mixing steps. + param reps: The number of mix repetitions that should occur. Note~ + During each mix rep, there are 2 cycles of aspirating from center, + dispensing at the top and 2 cycles of aspirating from center, + dispensing at the bottom (5 mixes total) + """ + + rightLeft = int(str(well).split(' ')[0][1:]) % 2 + """ + 'rightLeft' will determine which value to use in the list of 'top' and + 'bottom' (below), based on the column of the 'well' used. + In the case that an Even column is used, the first value of 'top' and + 'bottom' will be used, otherwise, + the second value of each will be used. + """ + center = well.bottom().move(types.Point(x=0, y=0, z=0.1)) + top = [ + well.bottom().move(types.Point(x=-3.8, y=3.8, z=0.1)), + well.bottom().move(types.Point(x=3.8, y=3.8, z=0.1)) + ] + bottom = [ + well.bottom().move(types.Point(x=-3.8, y=-3.8, z=0.1)), + well.bottom().move(types.Point(x=3.8, y=-3.8, z=0.1)) + ] + + pip.flow_rate.dispense = 500 + pip.flow_rate.aspirate = 150 + + mix_vol = 0.9 * mvol + + pip.move_to(center) + for _ in range(reps): + for _ in range(2): + pip.aspirate(mix_vol, center) + pip.dispense(mix_vol, top[rightLeft]) + for _ in range(2): + pip.aspirate(mix_vol, center) + pip.dispense(mix_vol, bottom[rightLeft]) + + def bind(vol, park=True): + """ + `bind` will perform magnetic bead binding on each sample in the + deepwell plate. Each channel of binding beads will be mixed before + transfer, and the samples will be mixed with the binding beads after + the transfer. The magnetic deck activates after the addition to all + samples, and the supernatant is removed after bead bining. + :param vol (float): The amount of volume to aspirate from the elution + buffer source and dispense to each well containing + beads. + :param park (boolean): Whether to save sample-corresponding tips + between adding elution buffer and transferring + supernatant to the final clean elutions PCR + plate. + """ + latest_chan = -1 + for i, (well, spot) in enumerate(zip(mag_samples_m, parking_spots)): + _pick_up(m300) + num_trans = math.ceil(vol/200) + vol_per_trans = vol/num_trans + asp_per_chan = (0.95*res1.wells()[0].max_volume)//(vol_per_trans*8) + for t in range(num_trans): + chan_ind = int((i*num_trans + t)//asp_per_chan) + source = binding_buffer[chan_ind] + if m300.current_volume > 0: + # void air gap if necessary + m300.dispense(m300.current_volume, source.top()) + if chan_ind > latest_chan: # mix if accessing new channel + for _ in range(5): + m300.aspirate(180, source.bottom(0.5)) + m300.dispense(180, source.bottom(5)) + latest_chan = chan_ind + m300.transfer(vol_per_trans, source, well.top(), air_gap=20, + new_tip='never') + if t < num_trans - 1: + m300.air_gap(20) + # m300.mix(5, 200, well) + m300.blow_out(well.top(-2)) + m300.air_gap(20) + if park: + m300.drop_tip(spot) + else: + _drop(m300) + ctx.pause('mix for 10 minutes off-deck in a heatershaker') + magdeck.engage(height=MAG_HEIGHT) + ctx.delay(minutes=settling_time, msg='Incubating on MagDeck for \ +' + str(settling_time) + ' minutes.') + + # remove initial supernatant + remove_supernatant(vol+starting_vol, park=park) + + def wash(vol, source, mix_reps=15, park=True, resuspend=True): + """ + `wash` will perform bead washing for the extraction protocol. + :param vol (float): The amount of volume to aspirate from each + source and dispense to each well containing beads. + :param source (List[Well]): A list of wells from where liquid will be + aspirated. If the length of the source list + > 1, `wash` automatically calculates + the index of the source that should be + accessed. + :param mix_reps (int): The number of repititions to mix the beads with + specified wash buffer (ignored if resuspend is + False). + :param park (boolean): Whether to save sample-corresponding tips + between adding wash buffer and removing + supernatant. + :param resuspend (boolean): Whether to resuspend beads in wash buffer. + """ + + if resuspend and magdeck.status == 'engaged': + magdeck.disengage() + + num_trans = math.ceil(vol/200) + vol_per_trans = vol/num_trans + for i, (m, spot) in enumerate(zip(mag_samples_m, parking_spots)): + _pick_up(m300) + # side = 1 if i % 2 == 0 else -1 + # loc = m.bottom(0.5).move(Point(x=side*2)) + src = source[i//(12//len(source))] + for n in range(num_trans): + if m300.current_volume > 0: + m300.dispense(m300.current_volume, src.top()) + m300.transfer(vol_per_trans, src, m.top(), air_gap=20, + new_tip='never') + if n < num_trans - 1: # only air_gap if going back to source + m300.air_gap(20) + if resuspend: + # m300.mix(mix_reps, 150, loc) + resuspend_pellet(m, m300, 180) + m300.blow_out(m.top()) + m300.air_gap(20) + if park: + m300.drop_tip(spot) + else: + _drop(m300) + + if magdeck.status == 'disengaged': + magdeck.engage(height=MAG_HEIGHT) + + ctx.delay(minutes=settling_time, msg='Incubating on MagDeck for \ +' + str(settling_time) + ' minutes.') + + remove_supernatant(vol, park=park) + + def dnase(vol, source, mix_reps=6, park=True, resuspend=True): + + if resuspend and magdeck.status == 'engaged': + magdeck.disengage() + + num_trans = math.ceil(vol/200) + vol_per_trans = vol/num_trans + for i, (m, spot) in enumerate(zip(mag_samples_m, parking_spots)): + _pick_up(m300) + # side = 1 if i % 2 == 0 else -1 + # loc = m.bottom(0.5).move(Point(x=side*2)) + src = source[i//(12//len(source))] + for n in range(num_trans): + if m300.current_volume > 0: + m300.dispense(m300.current_volume, src.top()) + m300.transfer(vol_per_trans, src, m.top(), air_gap=20, + new_tip='never') + if n < num_trans - 1: # only air_gap if going back to source + m300.air_gap(20) + if resuspend: + # m300.mix(mix_reps, 30, loc) + resuspend_pellet(m, m300, 50) + m300.blow_out(m.top()) + m300.air_gap(20) + if park: + m300.drop_tip(spot) + else: + _drop(m300) + + ctx.pause(''' + Incubating for 10 minutes for DNase 1 treatment + with occasional mixing. + ''') + + def stop_reaction(vol, source, mix_reps=6, park=True, resuspend=True): + + if resuspend and magdeck.status == 'engaged': + magdeck.disengage() + + num_trans = math.ceil(vol/200) + vol_per_trans = vol/num_trans + for i, (m, spot) in enumerate(zip(mag_samples_m, parking_spots)): + _pick_up(m300) + # side = 1 if i % 2 == 0 else -1 + # loc = m.bottom(0.5).move(Point(x=side*2)) + src = source[i//(12//len(source))] + for n in range(num_trans): + if m300.current_volume > 0: + m300.dispense(m300.current_volume, src.top()) + m300.transfer(vol_per_trans, src, m.top(), air_gap=20, + new_tip='never') + if n < num_trans - 1: # only air_gap if going back to source + m300.air_gap(20) + if resuspend: + # m300.mix(mix_reps, 50, loc) + resuspend_pellet(m, m300, 180) + m300.blow_out(m.top()) + m300.air_gap(20) + if park: + m300.drop_tip(spot) + else: + _drop(m300) + + ctx.pause(''' + Incubating for 10 minutes with + occasional mixing for stop reaction + ''') + + if magdeck.status == 'disengaged': + magdeck.engage(height=MAG_HEIGHT) + + ctx.delay(minutes=settling_time, msg='Incubating on MagDeck for \ +' + str(settling_time) + ' minutes.') + + remove_supernatant(vol, park=park) + + def elute(vol, park=True): + """ + `elute` will perform elution from the deepwell extraciton plate to the + final clean elutions PCR plate to complete the extraction protocol. + :param vol (float): The amount of volume to aspirate from the elution + buffer source and dispense to each well containing + beads. + :param park (boolean): Whether to save sample-corresponding tips + between adding elution buffer and transferring + supernatant to the final clean elutions PCR + plate. + """ + + # resuspend beads in elution + if magdeck.status == 'enagaged': + magdeck.disengage() + for i, (m, spot) in enumerate(zip(mag_samples_m, parking_spots)): + _pick_up(m300) + side = 1 if i % 2 == 0 else -1 + loc = m.bottom(0.5).move(Point(x=side*2)) + m300.aspirate(vol, elution_solution) + m300.move_to(m.center()) + m300.dispense(vol, loc) + # m300.mix(mix_reps, 0.8*vol, loc) + resuspend_pellet(m, m300, 50) + m300.blow_out(m.bottom(5)) + m300.air_gap(20) + if park: + m300.drop_tip(spot) + else: + _drop(m300) + + magdeck.engage(height=MAG_HEIGHT) + ctx.delay(minutes=settling_time, msg='Incubating on MagDeck for \ +' + str(settling_time) + ' minutes.') + + for i, (m, e, spot) in enumerate( + zip(mag_samples_m, elution_samples_m, parking_spots)): + if park: + _pick_up(m300, spot) + else: + _pick_up(m300) + side = -1 if i % 2 == 0 else 1 + loc = m.bottom(0.5).move(Point(x=side*2)) + m300.transfer(vol, loc, e.bottom(5), air_gap=20, new_tip='never') + m300.blow_out(e.top(-2)) + m300.air_gap(20) + m300.drop_tip() + + """ + Here is where you can call the methods defined above to fit your specific + protocol. The normal sequence is: + """ + bind(430, park=park_tips) + ctx.comment('\n\n\n') + wash(500, wash1, park=park_tips) + ctx.comment('\n\n\n') + wash(500, wash2, park=park_tips) + ctx.comment('\n\n\n') + wash(500, wash3, park=park_tips) + ctx.comment('\n\n\n') + wash(300, wash4, park=park_tips) + ctx.comment('\n\n\n') + # dnase1 treatment + dnase(50, dnase1, park=park_tips) + ctx.comment('\n\n\n') + stop_reaction(500, stopreaction, park=park_tips) + ctx.comment('\n\n\n') + ctx.delay(minutes=10, msg="dry beads for 10 minute") + elute(elution_vol, park=park_tips) + + # track final used tip + if tip_track and not ctx.is_simulating(): + if not os.path.isdir(folder_path): + os.mkdir(folder_path) + data = {pip.name: tip_log[pip]['count'] for pip in tip_log} + with open(tip_file_path, 'w') as outfile: + json.dump(data, outfile) diff --git a/protocols/swift-2s-turbo-pt1/.feature b/protocols/swift-2s-turbo-pt1/.feature new file mode 100644 index 0000000000..e69de29bb2 diff --git a/protocols/swift-2s-turbo-pt1/README.md b/protocols/swift-2s-turbo-pt1/README.md new file mode 100644 index 0000000000..ff09ff2b86 --- /dev/null +++ b/protocols/swift-2s-turbo-pt1/README.md @@ -0,0 +1,124 @@ +# Swift 2S Turbo DNA Library Kit Protocol: Part 1/3 - Enzymatic Prep & Ligation + +### Author +[Opentrons (verified)](https://opentrons.com/) + +### Partner +[Swift Biosciences](https://swiftbiosci.com/) + +# Opentrons has launched a new Protocol Library. You should use the [new page for this protocol](library.opentrons.com/p/swift-2s-turbo-pt1). This page won’t be available after January 31st, 2024. + +## Categories +* Featured + * NGS Library Prep: Swift 2S Turbo + + +## Description +![Swift Biosciences](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/swift-2s-protocol/swift_logo.jpg) + +Part 1 of 3: Enzymatic Prep & Ligation + + +With this protocol, your [OT-2](https://shop.opentrons.com/collections/ot-2-robot/products/ot-2) can perform the [Swift 2S Turbo DNA Library Kit](https://swiftbiosci.com/swift-2s-turbo-dna-library-kits/). For more information about the Swift 2S Turbo Kit and the [Swift 2S Turbo Unique Dual Indexing Primer Kit](https://shop.opentrons.com/products/swift-2s-turbo-unique-dual-indexing-primer-kit-96-rxns?_pos=1&_sid=f1fb599e7&_ss=r) on the OT-2, please see our Application Note here: [Rapid high quality next generation sequencing library preparation with Swift 2S Turbo DNA Library Kits on the Opentrons OT-2](https://opentrons-landing-img.s3.amazonaws.com/bundles/swift_automated_ngs_application_note.pdf) + + +In this part of the protocol, your OT-2 will complete the enzymatic prep portion and the initial steps of the ligation portion prior to adding your samples to a thermocycler, as described in the [Swift 2S Turbo Kit Guide](https://swiftbiosci.com/wp-content/uploads/2019/11/PRT-001-2S-Turbo-DNA-Library-Kit-Rev-1.pdf). + + +At the completion of this step, you will add your samples to the thermocycler. Once the thermocycler step is complete, continue with [Part 2 of the protocol](https://protocols.opentrons.com/protocol/swift-2s-turbo-pt2). + + +Links: +* [Part 1: Enzymatic Prep & Ligation](https://protocols.opentrons.com/protocol/swift-2s-turbo-pt1) +* [Part 2: Ligation Clean-Up & PCR Prep](https://protocols.opentrons.com/protocol/swift-2s-turbo-pt2) +* [Part 3: Final Clean-Up](https://protocols.opentrons.com/protocol/swift-2s-turbo-pt3) + + + +**Note:** This workflow replaces the Reagent K2 in the Enzymatic Prep Master Mix with Reagent DE in order to reduce the risk of over fragmentation. For more information, please see [this note.](https://swiftbiosci.com/wp-content/uploads/2019/12/PRT-022-Swift-Deceleration-Module-Rev-1.pdf) + +--- +![Materials Needed](https://s3.amazonaws.com/opentrons-protocol-library-website/custom-README-images/001-General+Headings/materials.png) + +To purchase consumables, labware, or pipettes, please visit our [online store](https://shop.opentrons.com/) or contact our sales team at [info@opentrons.com](mailto:info@opentrons.com) + + +**Attention**: You can now purchase all of the consumables needed to run this protocol by [clicking here](https://shop.opentrons.com/products/ngs-library-prep-workstation-consumables-refill). + +* [Opentrons OT-2](https://shop.opentrons.com/collections/ot-2-robot/products/ot-2) +* [Opentrons OT-2 Run App (Version 3.15.0 or later)](https://opentrons.com/ot-app/) +* [Swift 2S Turbo DNA Library Kit](https://swiftbiosci.com/swift-2s-turbo-dna-library-kits/) +* [Swift 2S Turbo Unique Dual Indexing Primer Kit](https://shop.opentrons.com/products/swift-2s-turbo-unique-dual-indexing-primer-kit-96-rxns?_pos=1&_sid=f1fb599e7&_ss=r) +* [Omega Mag-Bind TotalPure NGS Kit](https://shop.opentrons.com/collections/verified-reagents/products/mag-bind-total-pure-ngs) +* [Opentrons Temperature Module with Aluminum Block Set](https://shop.opentrons.com/collections/hardware-modules/products/tempdeck) +* [Opentrons Magnetic Module](https://shop.opentrons.com/collections/hardware-modules/products/magdeck) +* [Opentrons P20 Single-Channel Pipette](https://shop.opentrons.com/collections/ot-2-pipettes/products/single-channel-electronic-pipette) or Opentrons P50 Single-Channel Pipette* +* [Opentrons P300 Multi-Channel Pipette](https://shop.opentrons.com/collections/ot-2-robot/products/8-channel-electronic-pipette) +* [Opentrons Tips](https://shop.opentrons.com/collections/opentrons-tips) +* [NEST 96-Well PCR Plate](https://shop.opentrons.com/collections/lab-plates/products/nest-0-1-ml-96-well-pcr-plate-full-skirt) +* [NEST 12-Well Reservoir, 15mL](https://shop.opentrons.com/collections/reservoirs/products/nest-12-well-reservoir-15-ml) +* [NEST 2mL Tubes](https://shop.opentrons.com/collections/tubes/products/nest-2-0-ml-sample-vial) +* Samples, resuspended in Low EDTA TE, bringing the total volume to 16µL +* PCR Strip(s), *optional* + + +\*Opentrons now sells the P20 Single-Channel Pipette in place of the P50 Single-Channel Pipette. If you have the P50 Single-Channel Pipette, you can use it for this protocol. + + +Full setup for the entire protocol: + +![Full Deck Layout](https://s3.amazonaws.com/opentrons-protocol-library-website/custom-README-images/swift-2s-protocol/deck_layout_names.png) + +![Layout of Reagents](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/swift-2s-protocol/labware_layout.jpeg) + + + + +--- +![Setup](https://s3.amazonaws.com/opentrons-protocol-library-website/custom-README-images/001-General+Headings/Setup.png) + + +*Specific to Part 1 of 3* + + +Slot 1: [NEST 96-Well PCR Plate](https://shop.opentrons.com/collections/lab-plates/products/nest-0-1-ml-96-well-pcr-plate-full-skirt) (or PCR Strips) on top of [96-Well Aluminum Block](https://shop.opentrons.com/collections/racks-and-adapters/products/aluminum-block-set) with samples +* 8 Samples: Column 1 +* 16 Samples: Columns 1 & 2 +* 24 Samples: Columns 1, 2, & 3 + +Slot 3: [Opentrons Temperature Module with 24-Well Aluminum Block](https://shop.opentrons.com/collections/hardware-modules/products/tempdeck) and [NEST 2mL Tubes](https://shop.opentrons.com/collections/tubes/products/nest-2-0-ml-sample-vial) with master mixes (for more information on master mixes, [click here](https://opentrons-protocol-library-website.s3.amazonaws.com/Technical+Notes/swift-2s-turbo-pt1/Swift+2S+Turbo+Master+Mix+Volumes.xlsx)) +* A1: Enzymatic Prep Master Mix +* A2: Ligation Master Mix +* A3: (**used in Part 2**) PCR Master Mix +* B1: (**used in Part 2**) Indexing Reagent 1 (in original container); loaded sequentially (Reagent 2 - B2; Reagent 3 - B3...) + + +Slot 5: [Opentrons Tips](https://shop.opentrons.com/collections/opentrons-tips) + + + + +__Using the customizations fields, below set up your protocol.__ +* **Pipette and Tip Type**: Select which pipette (P50 Single-Channel or P20 Single-Channel) and corresponding tips to be used for this protocol. **The pipette should be attached to the left mount.** +* **Number of Samples**: Specify the number of samples (8, 16 or 24) you'd like to run. + + + + +### Robot +* [OT-2](https://opentrons.com/ot-2) + +## Process + +1. Input your protocol parameters. +2. Download your protocol. +3. Upload your protocol into the [OT App](https://opentrons.com/ot-app). +4. Set up your deck according to the deck map. +5. 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). +6. 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 +Swift-2S-Turbo-pt1 diff --git a/protocols/swift-2s-turbo-pt1/fields.json b/protocols/swift-2s-turbo-pt1/fields.json new file mode 100644 index 0000000000..c290ca6312 --- /dev/null +++ b/protocols/swift-2s-turbo-pt1/fields.json @@ -0,0 +1,24 @@ +[ + { + "type": "dropDown", + "label": "Pipette and Tip Type", + "name": "pip_tip", + "options": [ + {"label": "P50 & 50µL/300µL Tips", "value": "p50_single opentrons_96_tiprack_300ul"}, + {"label": "P50 & 200µL Filter Tips", "value": "p50_single opentrons_96_filtertiprack_200ul"}, + {"label": "P20 & 10µL/20µL Tips", "value": "p20_single_gen2 opentrons_96_tiprack_20ul"}, + {"label": "P20 & 20µL Filter Tips", "value": "p20_single_gen2 opentrons_96_filtertiprack_20ul"}, + {"label": "P20 & 10µL Filter Tips", "value": "p20_single_gen2 opentrons_96_filtertiprack_10ul"} + ] + }, + { + "type": "dropDown", + "label": "Number of Samples", + "name": "samps", + "options": [ + {"label": "8", "value": "8"}, + {"label": "16", "value": "16"}, + {"label": "24", "value": "24"} + ] + } +] diff --git a/protocols/swift-2s-turbo-pt1/swift-2s-turbo-pt1.ot2.apiv2.py b/protocols/swift-2s-turbo-pt1/swift-2s-turbo-pt1.ot2.apiv2.py new file mode 100644 index 0000000000..918e8b7702 --- /dev/null +++ b/protocols/swift-2s-turbo-pt1/swift-2s-turbo-pt1.ot2.apiv2.py @@ -0,0 +1,157 @@ +import os +import csv + +metadata = { + 'protocolName': 'Swift 2S Turbo DNA Library Kit Protocol: Part 1/3 - \ + Enzymatic Prep & Ligation', + 'author': 'Opentrons ', + 'source': 'Protocol Library', + 'apiLevel': '2.10' +} + + +def run(protocol): + [pip_tip, samps] = get_values( # noqa: F821 + 'pip_tip', 'samps') + + pip_type, tip_name = pip_tip.split() + + # Labware Setup + small_tips = protocol.load_labware(tip_name, '5') + + small_pip = protocol.load_instrument( + pip_type, 'left') + + tempdeck = protocol.load_module('Temperature Module', '3') + + cool_reagents = tempdeck.load_labware( + 'opentrons_24_aluminumblock_generic_2ml_screwcap', + 'Opentrons 24-Well Aluminum Block') + + reaction_plate = protocol.load_labware( + 'opentrons_96_aluminumblock_nest_wellplate_100ul', '1') + + # Tip tracking between runs + if not protocol.is_simulating(): + file_path = '/data/csv/tiptracking.csv' + file_dir = os.path.dirname(file_path) + # check for file directory + if not os.path.exists(file_dir): + os.makedirs(file_dir) + # check for file; if not there, create initial tip count tracking + if not os.path.isfile(file_path): + with open(file_path, 'w') as outfile: + outfile.write("0, 0\n") + + tip_count_list = [] + if protocol.is_simulating(): + tip_count_list = [0, 0] + else: + with open(file_path) as csv_file: + csv_reader = csv.reader(csv_file, delimiter=',') + tip_count_list = next(csv_reader) + + spip_count = int(tip_count_list[0]) + bpip_count = int(tip_count_list[1]) + + # Reagent Setup + enzymatic_prep_mm = cool_reagents.wells_by_name()['A1'] + ligation_mm = cool_reagents.wells_by_name()['A2'] + + # Destination of input DNA samples and samples on the magnetic module + enzymatic_prep_samples = reaction_plate.columns()[0] + samps = int(samps) + if samps > 8: + enzymatic_prep_samples += reaction_plate.columns()[1] + if samps > 16: + enzymatic_prep_samples += reaction_plate.columns()[2] + + # Actively cool the samples and enzymes + tempdeck.set_temperature(4) + + # Make sure to vortex mastermix right before the run + # Custom transfer function for accounting for various volumes + + def small_pick_up(): + nonlocal spip_count + + if spip_count == 96: + small_pip.home() + protocol.pause('Out of tips. Please replace tips in slot 5 and \ + click RESUME.') + small_tips.reset() + + small_pip.pick_up_tip(small_tips.wells()[spip_count]) + + spip_count += 1 + + def vol_trans(vol, src, dest): + if pip_type[1:3] == '50': + if not small_pip.hw_pipette['has_tip']: + small_pick_up() + small_pip.transfer(vol, src, dest, new_tip='never') + else: + if tip_name[-4:-2] == '20': + if vol < 20: + small_pick_up() + small_pip.transfer(vol, src, dest, new_tip='never') + else: + while vol >= 15: + if not small_pip.hw_pipette['has_tip']: + small_pick_up() + small_pip.transfer(15, src, dest, new_tip='never') + vol -= 15 + if vol >= 15: + small_pip.drop_tip() + else: + while vol > 8: + if not small_pip.hw_pipette['has_tip']: + small_pick_up() + small_pip.transfer(8, src, dest, new_tip='never') + small_pip.drop_tip() + vol -= 8 + small_pick_up() + small_pip.transfer(vol, src, dest, new_tip='never') + + # if using the P20, change the aspirate/dispense/blow out rates + if pip_type == 'p20_single_gen2': + small_pip.flow_rate.aspirate = 25 + small_pip.flow_rate.dispense = 50 + small_pip.flow_rate.blow_out = 1000 + + # Dispense Enzymatic Prep Master Mix to the samples + for well in enzymatic_prep_samples: + vol_trans(14, enzymatic_prep_mm.bottom(0.2), well.top(-12)) + small_pip.blow_out() + small_pip.mix(2, small_pip.max_volume/2, well.top(-13.5)) + small_pip.move_to(well.top(-12)) + protocol.delay(seconds=0.5) + small_pip.blow_out() + small_pip.drop_tip() + + # Run Enzymatic Prep Profile + protocol.pause('Enzymatic prep complete. Please place sample plate in \ + thermocycler and run program according to Swift 2S Turbo manual. When \ + complete, return samples to OT-2 deck for ligation prep and click RESUME.') + + # Transfer Ligation Master Mix to the samples + + small_pick_up() + small_pip.mix(10, small_pip.max_volume/2, ligation_mm) + small_pip.blow_out(ligation_mm.top()) + + for well in enzymatic_prep_samples: + vol_trans(30, ligation_mm, well.top(-7)) + small_pip.blow_out() + small_pip.mix(2, small_pip.max_volume/2, well.top(-13.5)) + small_pip.blow_out(well.top(-7)) + small_pip.drop_tip() + + protocol.comment("Add samples to the thermocycler for ligation. \ + Temp deck will remain on at 4C") + + # write updated tipcount to CSV + new_tip_count = str(spip_count)+", "+str(bpip_count)+"\n" + if not protocol.is_simulating(): + with open(file_path, 'w') as outfile: + outfile.write(new_tip_count) diff --git a/protocols/swift-fully-automated/README.md b/protocols/swift-fully-automated/README.md new file mode 100644 index 0000000000..c818c20c5a --- /dev/null +++ b/protocols/swift-fully-automated/README.md @@ -0,0 +1,136 @@ +# Swift 2S Turbo DNA Library Kit Protocol: Fully Automated + +### Author +[Opentrons (verified)](https://opentrons.com/) + +### Partner +[Swift Biosciences](https://swiftbiosci.com/) + +# Opentrons has launched a new Protocol Library. You should use the [new page for this protocol](library.opentrons.com/p/swift-fully-automated). This page won’t be available after January 31st, 2024. + +## Categories +* NGS Library Prep + * Swift 2S Turbo + + +## Description +![Swift Biosciences](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/swift-2s-protocol/swift_logo.jpg) + + +With this protocol, your [OT-2](https://shop.opentrons.com/collections/ot-2-robot/products/ot-2) can **fully automate** the entire [Swift 2S Turbo DNA Library Kit](https://swiftbiosci.com/swift-2s-turbo-dna-library-kits/). Simply press start and your OT-2 can automate this entire workflow without any hands-on requirement - from enzymatic prep to sequence ready libraries! Up to 16 libraries can be prepared in under 3 hours. + + +For more information about the Swift 2S Turbo Kit and the [Swift 2S Turbo Unique Dual Indexing Primer Kit](https://shop.opentrons.com/products/swift-2s-turbo-unique-dual-indexing-primer-kit-96-rxns?_pos=1&_sid=f1fb599e7&_ss=r) on the OT-2, please see our Application Note here: [Rapid high quality next generation sequencing library preparation with Swift 2S Turbo DNA Library Kits on the Opentrons OT-2](https://opentrons-landing-img.s3.amazonaws.com/bundles/swift_automated_ngs_application_note.pdf)
+
+**Update (April 12, 2021)**: This protocol has been updated to fix an issue with the final elution destination when selecting 16 samples.
+**Update (April 13, 2021)**: This protocol has been updated to accommodate the GEN2 Magnetic Module and fix an issue when using 200µL filter tips.
+**Update (September 2, 2021)**: This protocol has been updated to allow for the [GEN2 P300 8-Channel Pipette](https://shop.opentrons.com/collections/ot-2-robot/products/8-channel-electronic-pipette) and has fixed an issue when using 16 samples that caused the 8-channel pipette to go to the wrong source wells during step 1220. + + +--- +![Materials Needed](https://s3.amazonaws.com/opentrons-protocol-library-website/custom-README-images/001-General+Headings/materials.png) + +To purchase consumables, labware, or pipettes, please visit our [online store](https://shop.opentrons.com/) or contact our sales team at [info@opentrons.com](mailto:info@opentrons.com) + + +**Attention**: You can now purchase all of the consumables needed to run this protocol by [clicking here](https://shop.opentrons.com/products/ngs-library-prep-workstation-consumables-refill). + +* [Opentrons OT-2](https://shop.opentrons.com/collections/ot-2-robot/products/ot-2) +* [Opentrons OT-2 Run App (Version 3.15.0 or later)](https://opentrons.com/ot-app/) +* [Swift 2S Turbo DNA Library Kit](https://swiftbiosci.com/swift-2s-turbo-dna-library-kits/) +* [Swift 2S Turbo Unique Dual Indexing Primer Kit](https://shop.opentrons.com/products/swift-2s-turbo-unique-dual-indexing-primer-kit-96-rxns?_pos=1&_sid=f1fb599e7&_ss=r) +* [Omega Mag-Bind TotalPure NGS Kit](https://shop.opentrons.com/collections/verified-reagents/products/mag-bind-total-pure-ngs) +* [Opentrons Thermocycler Module](https://shop.opentrons.com/collections/hardware-modules/products/thermocycler-module) +* [Opentrons Temperature Module with Aluminum Block Set](https://shop.opentrons.com/collections/hardware-modules/products/tempdeck) +* [Opentrons Magnetic Module](https://shop.opentrons.com/collections/hardware-modules/products/magdeck) +* [Opentrons P20 Single-Channel Pipette](https://shop.opentrons.com/collections/ot-2-pipettes/products/single-channel-electronic-pipette) or Opentrons P50 Single-Channel Pipette* +* [Opentrons P300 Multi-Channel Pipette](https://shop.opentrons.com/collections/ot-2-robot/products/8-channel-electronic-pipette) +* [Opentrons Tips](https://shop.opentrons.com/collections/opentrons-tips) +* [NEST 96-Well PCR Plate](https://shop.opentrons.com/collections/lab-plates/products/nest-0-1-ml-96-well-pcr-plate-full-skirt) +* [NEST 12-Well Reservoir, 15mL](https://shop.opentrons.com/collections/reservoirs/products/nest-12-well-reservoir-15-ml) +* [NEST 2mL Tubes](https://shop.opentrons.com/collections/tubes/products/nest-2-0-ml-sample-vial) +* Samples, resuspended in Low EDTA TE, bringing the total volume to 19.5µL + + + +\*Opentrons now sells the P20 Single-Channel Pipette in place of the P50 Single-Channel Pipette. If you have the P50 Single-Channel Pipette, you can use it for this protocol. + + +Full setup for the entire protocol: + +![Full Deck Layout](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/swift-2s-protocol/swift-fa-layout.png) + +![Layout of Reagents](https://opentrons-protocol-library-website.s3.amazonaws.com/custom-README-images/swift-2s-protocol/swift-fa-labware.jpeg) + + + + +--- +![Setup](https://s3.amazonaws.com/opentrons-protocol-library-website/custom-README-images/001-General+Headings/Setup.png) + + +Slot 1: [NEST 96-Well PCR Plate](https://shop.opentrons.com/collections/lab-plates/products/nest-0-1-ml-96-well-pcr-plate-full-skirt) on [Opentrons Magnetic Module](https://shop.opentrons.com/collections/hardware-modules/products/magdeck) + + +Slot 2: [NEST 12-Well Reservoir](https://shop.opentrons.com/collections/reservoirs/products/nest-12-well-reservoir-15-ml) with Reagents +* A2: Magnetic Beads; recommended volume: 3-4mL +* A3: 80% Ethanol Solution, Freshly Prepared; recommended volume: 9-10mL +* A4: 80% Ethanol Solution, Freshly Prepared (if running 16 samples); recommended volume: 9-10mL +* A6: Low EDTA TE Buffer; recommended volume: 3mL + + +Slot 3: [Opentrons Temperature Module with 24-Well Aluminum Block](https://shop.opentrons.com/collections/hardware-modules/products/tempdeck) and [NEST 2mL Tubes](https://shop.opentrons.com/collections/tubes/products/nest-2-0-ml-sample-vial) with master mixes (for more information on master mixes, [click here](https://opentrons-protocol-library-website.s3.amazonaws.com/Technical+Notes/swift-fully-automated/Swift+2s+Turbo+Fully+Automated+MasterMix+Volumes.xlsx)) and indices (if automating index addition) +* A1: Enzymatic Prep Master Mix +* A2: Ligation Master Mix +* A3: PCR Master Mix +* B1: Indexing Reagent 1 (in original container); loaded sequentially (Reagent 2 - B2; Reagent 3 - B3...) + + +Slot 4: [Opentrons Tips for Single-Channel Pipette](https://shop.opentrons.com/collections/opentrons-tips) + + +Slot 5: [Opentrons Tips for P300 8-Channel Pipette](https://shop.opentrons.com/collections/opentrons-tips) + + +Slot 6: [Opentrons Tips for P300 8-Channel Pipette](https://shop.opentrons.com/collections/opentrons-tips) + + +Slot 9: [Opentrons Tips for P300 8-Channel Pipette](https://shop.opentrons.com/collections/opentrons-tips) + + + +Slot 7/8/10/11: [Opentrons Thermocycler Module](https://shop.opentrons.com/collections/hardware-modules/products/thermocycler-module) with samples in a [NEST 96-Well PCR Plate](https://shop.opentrons.com/collections/lab-plates/products/nest-0-1-ml-96-well-pcr-plate-full-skirt) +* 8 Samples: Column 1 +* 16 Samples: Columns 1 & 2 + + + +__Using the customizations fields, below set up your protocol.__ +* **Number of Samples**: Specify the number of samples (8 or 16) you'd like to run. +* **Pipette and Tip Type**: Select which pipette (P50 Single-Channel or P20 Single-Channel) and corresponding tips to be used for this protocol. **The pipette should be attached to the left mount.** +* **P300 8-Channel Pipette Tip Type**: Select which tips (Filter/Non-Filter) for P300 8-Channel Pipette +* **Automate Indexing**: Specify whether the indices should be added to the samples with the OT-2, or manually. +* **Number of PCR Cycles**: See suggested cycles [here](https://opentrons-protocol-library-website.s3.amazonaws.com/Technical+Notes/swift-fully-automated/Swift+Fully+Automated+-+PCR+Cycles+Recommendation.xlsx). See Swift 2S Turbo manual for more detailed information. +* **Fragmentation Time**: Fragmentation time varies depending on *1)* Lot number of the kit and *2)* whether the desired insert size is 200bp or 350bp. Please refer to the manual and Lot number on your kit for more information. + + + +**Note**: The final 20µL elution will be transferred to Column 3 if running 8 samples or Columns 5 & 6 if running 16 samples of the PCR plate on the Thermocycler + +### Robot +* [OT-2](https://opentrons.com/ot-2) + +## Process + +1. Input your protocol parameters. +2. Download your protocol. +3. Upload your protocol into the [OT App](https://opentrons.com/ot-app). +4. Set up your deck according to the deck map. +5. 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). +6. 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 +swift-fully-automated diff --git a/protocols/swift-fully-automated/fields.json b/protocols/swift-fully-automated/fields.json new file mode 100644 index 0000000000..0c1890da53 --- /dev/null +++ b/protocols/swift-fully-automated/fields.json @@ -0,0 +1,71 @@ +[ + { + "type": "dropDown", + "label": "Number of Samples", + "name": "no_samps", + "options": [ + {"label": "8", "value": "8"}, + {"label": "16", "value": "16"} + ] + }, + { + "type": "dropDown", + "label": "Single Pipette and Tip Type", + "name": "pip_tip", + "options": [ + {"label": "P50 & 50µL/300µL Tips", "value": "p50_single opentrons_96_tiprack_300ul"}, + {"label": "P50 & 200µL Filter Tips", "value": "p50_single opentrons_96_filtertiprack_200ul"}, + {"label": "P20 & 10µL/20µL Tips", "value": "p20_single_gen2 opentrons_96_tiprack_20ul"}, + {"label": "P20 & 20µL Filter Tips", "value": "p20_single_gen2 opentrons_96_filtertiprack_20ul"}, + {"label": "P20 & 10µL Filter Tips", "value": "p20_single_gen2 opentrons_96_filtertiprack_10ul"} + ] + }, + { + "type": "dropDown", + "label": "P300 8-Channel Pipette Type", + "name": "p300gen", + "options": [ + {"label": "GEN1", "value": "p300_multi"}, + {"label": "GEN2", "value": "p300_multi_gen2"} + ] + }, + { + "type": "dropDown", + "label": "P300 8-Channel Pipette Tip Type", + "name": "p300tips", + "options": [ + {"label": "Opentrons 200µL Filter Tips", "value": "opentrons_96_filtertiprack_200ul"}, + {"label": "Opentrons 300µL Tips", "value": "opentrons_96_tiprack_300ul"} + ] + }, + { + "type": "dropDown", + "label": "Magnetic Module", + "name": "magmod", + "options": [ + {"label": "GEN1", "value": "magnetic module"}, + {"label": "GEN2", "value": "magnetic module gen2"} + ] + }, + { + "type": "dropDown", + "label": "Automate Indexing", + "name": "a_index", + "options": [ + {"label": "Yes", "value": "yes"}, + {"label": "No", "value": "no"} + ] + }, + { + "type": "int", + "label": "Number of Thermocycles", + "name": "cycles", + "default": 5 + }, + { + "type": "int", + "label": "Fragmentation Time", + "name": "f_time", + "default": 10 + } +] diff --git a/protocols/swift-fully-automated/swift-2s-turbo-fully-automated.ot2.apiv2.py b/protocols/swift-fully-automated/swift-2s-turbo-fully-automated.ot2.apiv2.py new file mode 100644 index 0000000000..b314d38220 --- /dev/null +++ b/protocols/swift-fully-automated/swift-2s-turbo-fully-automated.ot2.apiv2.py @@ -0,0 +1,427 @@ +metadata = { + 'protocolName': 'Swift 2S Turbo DNA Library Kit Protocol: Fully Automated', + 'author': 'Opentrons ', + 'source': 'Protocol Library', + 'apiLevel': '2.10' +} + + +def run(protocol): + [no_samps, pip_tip, p300gen, p300tips, magmod, + a_index, cycles, f_time] = get_values( # noqa: F821 + 'no_samps', 'pip_tip', 'p300gen', 'p300tips', 'magmod', + 'a_index', 'cycles', 'f_time') + + # raise exceptions + if cycles < 3 or cycles > 15: + raise Exception('Number of Thermocycles should be between 3 and 15.') + + if f_time < 6 or f_time > 30: + raise Exception('Fragmentation Time should be between 6 & 30 minutes.') + + # labware setup + pip_type, tip_name = pip_tip.split() + + s_tips = [protocol.load_labware(tip_name, '4')] + p300tips = [protocol.load_labware( + p300tips, s) for s in ['5', '6', '9']] + + small_pip = protocol.load_instrument(pip_type, 'left', tip_racks=s_tips) + p300 = protocol.load_instrument(p300gen, 'right', tip_racks=p300tips) + + rt_reagents = protocol.load_labware('nest_12_reservoir_15ml', '2') + + magdeck = protocol.load_module(magmod, '1') + mag_plate = magdeck.load_labware('nest_96_wellplate_100ul_pcr_full_skirt') + + tempdeck = protocol.load_module('Temperature Module', '3') + cool_reagents = tempdeck.load_labware( + 'opentrons_24_aluminumblock_generic_2ml_screwcap') + + thermocycler = protocol.load_module('thermocycler') + reaction_plate = thermocycler.load_labware( + 'nest_96_wellplate_100ul_pcr_full_skirt') + + # Reagent Setup + enzymatic_prep_mm = cool_reagents.wells_by_name()['A1'] + ligation_mm = cool_reagents.wells_by_name()['A2'] + pcr_mm = cool_reagents.wells_by_name()['A3'] + beads = rt_reagents.wells_by_name()['A2'] + ethanol = rt_reagents.wells_by_name()['A3'] + ethanol2 = rt_reagents.wells_by_name()['A4'] + te = rt_reagents.wells_by_name()['A6'] + waste = rt_reagents.wells_by_name()['A11'] + waste2 = rt_reagents.wells_by_name()['A12'] + + # Well Setup + tc_samps = reaction_plate.columns_by_name() + mag_cols = mag_plate.columns_by_name() + + if no_samps == '8': + enzymatic_prep_samples = tc_samps['1'] + enzymatic_300 = [enzymatic_prep_samples[0]] + pcr_prep_samples = tc_samps['2'] + pcr_300 = [pcr_prep_samples[0]] + purified_samples = [tc_samps['3'][0]] + # samps_300 = purified_samples[0] + mag_samples = mag_cols['1'] + mag_300 = [mag_samples[0]] + mag_pure = [mag_cols['2'][0]] + else: + enzymatic_prep_samples = tc_samps['1'] + tc_samps['2'] + enzymatic_300 = [tc_samps['1'][0], tc_samps['2'][0]] + pcr_prep_samples = tc_samps['3'] + tc_samps['4'] + pcr_300 = [tc_samps['3'][0], tc_samps['4'][0]] + purified_samples = [tc_samps['5'][0], tc_samps['6'][0]] + # samps_300 = tc_samps['6'][0] + tc_samps['7'][0] + mag_samples = mag_cols['1'] + mag_cols['2'] + mag_300 = [mag_cols['1'][0], mag_cols['2'][0]] + mag_pure = [mag_cols['3'][0], mag_cols['4'][0]] + + small_pip.flow_rate.aspirate = 150 + small_pip.flow_rate.dispense = 300 + small_pip.flow_rate.blow_out = 300 + + # Create function for transferring with single pipette in different configs + small_max = int(tip_name.split('_')[-1][:-2]) + if small_max > 100: + small_max = 50 + s_vol = small_max * 0.8 + + def vol_trans(vol, src, dest): + nonlocal small_max + nonlocal s_vol + + if vol <= small_max: + small_pip.transfer(vol, src, dest, new_tip='never') + else: + while vol > s_vol: + small_pip.transfer(s_vol, src, dest, new_tip='never') + small_pip.blow_out(dest) + small_pip.drop_tip() + vol -= s_vol + small_pip.pick_up_tip() + small_pip.transfer(vol, src, dest, new_tip='never') + + # Actively cool the samples and enzymes + tempdeck.set_temperature(4) + thermocycler.set_block_temperature(4) + + # Make sure to vortex mastermix right before the run + # Dispense Enzymatic Prep Master Mix to the samples + for well in enzymatic_prep_samples: + small_pip.pick_up_tip() + vol_trans(10.5, enzymatic_prep_mm.bottom(0.2), well) + small_pip.blow_out() + small_pip.mix(2, 10, well.top(-13.5)) + small_pip.move_to(well.top(-12)) + protocol.delay(seconds=0.5) + small_pip.blow_out() + small_pip.drop_tip() + + # Run Enzymatic Prep Profile + thermocycler.close_lid() + thermocycler.set_lid_temperature(70) + thermocycler.set_block_temperature(32, hold_time_minutes=f_time) + thermocycler.set_block_temperature(65, hold_time_minutes=30) + thermocycler.set_block_temperature(4) + thermocycler.deactivate_lid() + thermocycler.open_lid() + + # Transfer Ligation Master Mix to the samples + + small_pip.pick_up_tip() + small_pip.mix(5, s_vol, ligation_mm) + small_pip.blow_out(ligation_mm.top()) + + for well in enzymatic_prep_samples: + if not small_pip.hw_pipette['has_tip']: + small_pip.pick_up_tip() + vol_trans(30, ligation_mm, well.top(-7)) + small_pip.mix(2, s_vol, well.top(-13.5)) + small_pip.blow_out(well.top(-7)) + small_pip.drop_tip() + + thermocycler.set_block_temperature(20, hold_time_minutes=20) + thermocycler.set_block_temperature(4) + + """Ligation Purification""" + # Transfer samples to the Magnetic Module + p300.flow_rate.aspirate = 10 + for enz_samp, mag_samp in zip(enzymatic_300, mag_300): + p300.pick_up_tip() + p300.aspirate(60, enz_samp) + p300.dispense(60, mag_samp.top(-4)) + p300.blow_out(mag_samp.top(-4)) + p300.drop_tip() + + # Transfer beads to the samples on the Magnetic Module + p300.flow_rate.aspirate = 75 + p300.pick_up_tip() + p300.mix(10, 200, beads) + + for mag_samp in mag_300: + if not p300.hw_pipette['has_tip']: + p300.pick_up_tip() + p300.flow_rate.aspirate = 10 + p300.flow_rate.dispense = 10 + p300.aspirate(48, beads) + p300.default_speed = 50 + p300.move_to(mag_samp.top(-2)) + p300.default_speed = 400 + p300.dispense(48, mag_samp.top(-5)) + p300.blow_out() + p300.flow_rate.aspirate = 50 + p300.flow_rate.dispense = 50 + p300.mix(10, 80, mag_samp.top(-13.5)) + p300.blow_out(mag_samp.top(-5)) + p300.drop_tip() + + # Incubating for 5 minutes + protocol.comment("Incubating for 5 minutes.") + protocol.delay(minutes=5) + + # Engage Magnetic Module + magdeck.engage() + protocol.comment("Engaging Magnetic Module and incubating for 6 minutes.") + protocol.delay(minutes=6) + + # Remove supernatant + p300.flow_rate.aspirate = 20 + p300.flow_rate.dispense = 50 + + for mag_samp in mag_300: + p300.pick_up_tip() + p300.aspirate(108, mag_samp.bottom(2)) + p300.dispense(108, waste.bottom(1.5)) + p300.drop_tip() + + # Wash samples 2X with 180uL of 80% EtOH + p300.default_speed = 200 + p300.flow_rate.aspirate = 75 + p300.flow_rate.dispense = 50 + + for _ in range(2): + for mag_samp in mag_300: + if not p300.hw_pipette['has_tip']: + p300.pick_up_tip() + p300.aspirate(10, ethanol.top()) + p300.aspirate(180, ethanol) + p300.air_gap(5) + p300.dispense(210, mag_samp.top(-2)) + if no_samps == '8': + protocol.delay(seconds=15) + for mag_samp in mag_300: + if not p300.hw_pipette['has_tip']: + p300.pick_up_tip() + p300.aspirate(5, mag_samp.top()) + p300.aspirate(190, mag_samp) + p300.air_gap(5) + p300.dispense(210, waste.bottom(1.5)) + p300.drop_tip() + + # remove residual ethanol + for mag_samp in mag_300: + p300.pick_up_tip() + p300.aspirate(30, mag_samp.bottom(-0.5)) + p300.air_gap(5) + p300.drop_tip() + + protocol.comment("Letting beads dry for 30 seconds.") + protocol.delay(seconds=30) + magdeck.disengage() + + # Elute clean ligation product + for mag_samp in mag_300: + p300.pick_up_tip() + p300.aspirate(22, te) + p300.dispense(22, mag_samp.top(-12)) + p300.blow_out(mag_samp.top()) + p300.flow_rate.aspirate = 100 + p300.flow_rate.dispense = 200 + p300.mix(10, 20, mag_samp.top(-13.5)) + p300.blow_out(mag_samp.top()) + p300.flow_rate.aspirate = 75 + p300.flow_rate.dispense = 50 + p300.drop_tip() + + # Incubate for 2 minutes + protocol.comment("Incubating for 2 minutes.") + protocol.delay(minutes=2) + + # Engage Magnetic Module + protocol.comment("Engaging Magnetic Module and incubating for 6 minutes.") + magdeck.engage() + protocol.delay(minutes=6) + + # Transfer clean samples to aluminum block plate. + for mag_samp, pcr_samp in zip(mag_300, pcr_300): + p300.pick_up_tip() + p300.aspirate(22, mag_samp.bottom(0.25)) + p300.dispense(22, pcr_samp) + p300.blow_out(pcr_samp.top()) + p300.drop_tip() + + # Disengage Magnetic Module ofr PCR purification protocol + magdeck.disengage() + + """PCR Prep""" + # Transfer Dual Indexes to the sample + # Primer screw tubes are shallow !!!! + if a_index == 'yes': + x = int(no_samps) + primers = [w for row in cool_reagents.rows()[1:] for w in row][:x] + for primer, well in zip(primers, pcr_prep_samples): + small_pip.pick_up_tip() + small_pip.aspirate(5, primer.top(-24)) + small_pip.dispense(5, well) + small_pip.drop_tip() + else: + protocol.pause('You selected "No" to automated indexing. Please add \ + indices to samples. When ready to continue, click RESUME.') + + # Transfer PCR Master Mix to the samples + + small_pip.pick_up_tip() + small_pip.mix(6, s_vol, pcr_mm) + + for well in pcr_prep_samples: + if not small_pip.hw_pipette['has_tip']: + small_pip.pick_up_tip() + vol_trans(25, pcr_mm, well) + small_pip.mix(5, s_vol, well.top(-13.5)) + small_pip.blow_out(well.top(-12)) + small_pip.drop_tip() + + plate_temp = 4 + t_holds = [[98, 30], [98, 10], [60, 30], [68, 60]] + # number of cycles is a parameter named 'cycles' + cycled_steps = [ + {'temperature': t_holds[1][0], 'hold_time_seconds': t_holds[1][1]}, + {'temperature': t_holds[2][0], 'hold_time_seconds': t_holds[2][1]}, + {'temperature': t_holds[3][0], 'hold_time_seconds': t_holds[3][1]} + ] + + # Set PRE temp + thermocycler.set_block_temperature(plate_temp) + + # Set LID temp + thermocycler.set_lid_temperature(105) + thermocycler.close_lid() + + # Set hold 1 temp + thermocycler.set_block_temperature( + t_holds[0][0], hold_time_seconds=t_holds[0][1]) + + # Loop through temp profile + thermocycler.execute_profile(steps=cycled_steps, repetitions=cycles) + + # Set POST temp + thermocycler.set_block_temperature(plate_temp) + thermocycler.open_lid() + + """PCR Purication""" + # Transfer samples to the Magnetic Module + p300.flow_rate.aspirate = 10 + for src, dest in zip(pcr_300, mag_pure): + p300.pick_up_tip() + p300.aspirate(60, src) + p300.dispense(60, dest.top(-4)) + p300.blow_out(dest.top(-4)) + p300.drop_tip() + + # Transfer beads to the samples + p300.flow_rate.aspirate = 75 + p300.pick_up_tip() + p300.mix(5, 60, beads) + + for mag_samps in mag_pure: + if not p300.hw_pipette['has_tip']: + p300.pick_up_tip() + p300.flow_rate.aspirate = 10 + p300.flow_rate.dispense = 10 + p300.aspirate(32.5, beads) + p300.default_speed = 50 + p300.move_to(mag_samps.top(-2)) + p300.default_speed = 400 + p300.dispense(32.5, mag_samps.top(-12)) + p300.flow_rate.aspirate = 50 + p300.flow_rate.dispense = 50 + p300.blow_out() + p300.mix(10, 60, mag_samps.top(-13.5)) + p300.blow_out(mag_samps.top(-12)) + p300.drop_tip() + + # Incubate for 5 minutes, then engage Magnetic Module and incubate + protocol.comment('Incubating for 5 minutes.') + protocol.delay(minutes=5) + + magdeck.engage() + protocol.delay(minutes=5) + + # Aspirate supernatant + for mag_samps in mag_pure: + p300.pick_up_tip() + p300.aspirate(82.5, mag_samps.bottom(2)) + p300.dispense(82.5, waste2) + p300.drop_tip() + + # Wash samples 2x with 180ul of 80% EtOH + for _ in range(2): + for mag_samps in mag_pure: + if not p300.hw_pipette['has_tip']: + p300.pick_up_tip() + p300.aspirate(5, ethanol2.top()) + p300.aspirate(180, ethanol2) + p300.air_gap(10) + p300.dispense(200, mag_samps.top(-2)) + if no_samps == '8': + protocol.delay(seconds=15) + for mag_samps in mag_pure: + if not p300.hw_pipette['has_tip']: + p300.pick_up_tip() + p300.aspirate(5, mag_samps.top()) + p300.aspirate(190, mag_samps.bottom(1.5)) + p300.air_gap(5) + p300.dispense(210, waste2) + p300.drop_tip() + + # Remove residual 80% EtOH + for mag_samps in mag_pure: + p300.pick_up_tip() + p300.aspirate(30, mag_samps.bottom(-0.5)) + p300.air_gap(5) + p300.drop_tip() + + protocol.delay(minutes=1) + magdeck.disengage() + + # Elute clean product + for mag_samps in mag_pure: + p300.pick_up_tip() + p300.aspirate(22, te) + p300.dispense(22, mag_samps.top(-12)) + p300.blow_out(mag_samps.top()) + p300.mix(10, 20, mag_samps.top(-13.5)) + p300.blow_out(mag_samps.top()) + p300.drop_tip() + + # Incubate for 2 minutes, then engage Magnetic Module + protocol.comment("Incubating for 4 minutes, \ + then engaging Magnetic Module.") + protocol.delay(minutes=4) + + magdeck.engage() + protocol.delay(minutes=5) + + # Transfer clean samples to aluminum block plate. + for mag_samps, p_samps in zip(mag_pure, purified_samples): + p300.pick_up_tip() + p300.aspirate(20, mag_samps) + p300.dispense(22, p_samps.top(-12)) + p300.blow_out() + p300.drop_tip() + + protocol.comment('Swift 2S Turbo DNA Library Kit completed. \ + Store freshly prepared libraries at 4C (-20C for long term), \ + or proceed to quantification.')