Labs

Lab writeups:

  • Week 1 Lab: Pipetting

  • Week 2 Lab: Restriction Digests

    Protocol Part 0: Design Note: Ignore EcoRI lane: for visualization Note: We are using DNA from mycobacteriophage Kampy Part 1a: Gel prep Setting up a 1% agarose gel:

  • Week 3 Lab: Automation

    Design Python Code from opentrons import types metadata = { # see https://docs.opentrons.com/v2/tutorial.html#tutorial-metadata 'author': '', 'protocolName': '', 'description': '', 'source': 'HTGAA 2026 Opentrons Lab', 'apiLevel': '2.20' } ############################################################################## ### Robot deck setup constants - don't change these ############################################################################## TIP_RACK_DECK_SLOT = 9 COLORS_DECK_SLOT = 6 AGAR_DECK_SLOT = 5 PIPETTE_STARTING_TIP_WELL = 'A1' well_colors = { 'A1' : 'Red', 'B1' : 'Green', 'C1' : 'Orange' } def run(protocol): ############################################################################## ### Load labware, modules and pipettes ############################################################################## # Tips tips_20ul = protocol.load_labware('opentrons_96_tiprack_20ul', TIP_RACK_DECK_SLOT, 'Opentrons 20uL Tips') # Pipettes pipette_20ul = protocol.load_instrument("p20_single_gen2", "right", [tips_20ul]) # Modules temperature_module = protocol.load_module('temperature module gen2', COLORS_DECK_SLOT) # Temperature Module Plate temperature_plate = temperature_module.load_labware('opentrons_96_aluminumblock_generic_pcr_strip_200ul', 'Cold Plate') # Choose where to take the colors from color_plate = temperature_plate # Agar Plate agar_plate = protocol.load_labware('htgaa_agar_plate', AGAR_DECK_SLOT, 'Agar Plate') ## TA MUST CALIBRATE EACH PLATE! # Get the top-center of the plate, make sure the plate was calibrated before running this center_location = agar_plate['A1'].top() pipette_20ul.starting_tip = tips_20ul.well(PIPETTE_STARTING_TIP_WELL) ############################################################################## ### Patterning ############################################################################## ### ### Helper functions for this lab ### # pass this e.g. 'Red' and get back a Location which can be passed to aspirate() def location_of_color(color_string): for well,color in well_colors.items(): if color.lower() == color_string.lower(): return color_plate[well] raise ValueError(f"No well found with color {color_string}") # For this lab, instead of calling pipette.dispense(1, loc) use this: dispense_and_detach(pipette, 1, loc) def dispense_and_detach(pipette, volume, location): """ Move laterally 5mm above the plate (to avoid smearing a drop); then drop down to the plate, dispense, move back up 5mm to detach drop, and stay high to be ready for next lateral move. 5mm because a 4uL drop is 2mm diameter; and a 2deg tilt in the agar pour is >3mm difference across a plate. """ assert(isinstance(volume, (int, float))) above_location = location.move(types.Point(z=location.point.z + 5)) # 5mm above pipette.move_to(above_location) # Go to 5mm above the dispensing location pipette.dispense(volume, location) # Go straight downwards and dispense pipette.move_to(above_location) # Go straight up to detach drop and stay high ### ### YOUR CODE HERE to create your design ### pipette_20ul.pick_up_tip() pipette_20ul.aspirate(17, location_of_color('Red')) cursor = center_location.move(types.Point(x=-17.6, y=28.6)) # draw stars for i in range(3): dispense_and_detach(pipette_20ul, 1, cursor) cursor = center_location.move(types.Point(x=cursor.point.x, y=cursor.point.y-2.2)) dispense_and_detach(pipette_20ul, 1, cursor) cursor = center_location.move(types.Point(x=cursor.point.x-4.4, y=cursor.point.y-2.2)) for j in range(5): dispense_and_detach(pipette_20ul, 1, cursor) cursor = center_location.move(types.Point(x=cursor.point.x+2.2, y=cursor.point.y)) cursor = center_location.move(types.Point(x=cursor.point.x-8.8, y=cursor.point.y-2.2)) for j in range(3): dispense_and_detach(pipette_20ul, 1, cursor) cursor = center_location.move(types.Point(x=cursor.point.x+2.2, y=cursor.point.y)) cursor = center_location.move(types.Point(x=cursor.point.x-8.8, y=cursor.point.y-2.2)) for j in range(5): dispense_and_detach(pipette_20ul, 1, cursor) cursor = center_location.move(types.Point(x=cursor.point.x+2.2, y=cursor.point.y)) cursor = center_location.move(types.Point(x=cursor.point.x-6.6, y=cursor.point.y-2.2)) dispense_and_detach(pipette_20ul, 1, cursor) cursor = center_location.move(types.Point(x=cursor.point.x, y=cursor.point.y-2.2)) dispense_and_detach(pipette_20ul, 1, cursor) if i < 2: pipette_20ul.aspirate(17, location_of_color('Red')) cursor = center_location.move(types.Point(x=cursor.point.x+17.6, y=cursor.point.y+13.2)) # draw stripes pipette_20ul.aspirate(15, location_of_color('Red')) cursor = center_location.move(types.Point(x=cursor.point.x-50.6, y=cursor.point.y-6.6)) # two stripes for i in range(2): # six rows per stripe for j in range(6): # two refills per row for k in range(2): # fifteen dots per refill for l in range(15): dispense_and_detach(pipette_20ul, 1, cursor) cursor = center_location.move(types.Point(x=cursor.point.x+2.2, y=cursor.point.y)) pipette_20ul.aspirate(15, location_of_color('Red')) if j < 5: cursor = center_location.move(types.Point(x=-33, y=cursor.point.y-2.2)) if i < 1: cursor = center_location.move(types.Point(x=-33, y=cursor.point.y-6.6)) # Don't forget to end with a drop_tip() pipette_20ul.drop_tip()

  • Week 4 Lab: ProteinsI

    See Week 4 Homework tab for lab work.

  • Week 5 Lab: Proteins II

    See Week 4 Homework tab for lab work.

  • Week 6 Lab: Assembly

    PCR Setup Purple and Orange NFW – added fwd - Pu, added fwd - O, added rev – same for both, added Master mix – added Template plasmid – added Calculated PCR params and started running Need to add DPN1 to digest the template DNA from the PCRs for w/out template DPN1 currently at -20 BEL – thaw for a bit 1 ul DPN1 to ea rxn (put back into freezer)

Subsections of Labs

Week 1 Lab: Pipetting

cover image cover image

Week 2 Lab: Restriction Digests

Protocol

Part 0: Design

image image Note: Ignore EcoRI lane: for visualization Note: We are using DNA from mycobacteriophage Kampy

Part 1a: Gel prep

Setting up a 1% agarose gel:

  • 0.5 g agarose to plastic flask
  • 50 ml 1x TAE to agarose in flask
  • Microwave the mixture 1:30 / until agarose dissolves
  • Sideways gel tray in box, pour hot agarose/TAE, add comb
  • Let set 30 min

Part 1b: Restriction Digest

Chemicals

  • 1X Lambda DNA
  • 1 uL of each enzyme: EcoRI-HF, HindIII-HF, BamHI-HF, KpnI-HF, EcoRV-HF, SacI-HF, SalI-HF
  • Nuclease-free water Equipment and Consumables
  • -20ºC freezer
  • Incubator (or use a thermocycler or heat block
  • “PCR tube rack” (pipette tip holder)

Digest requirements

  • 3 ul 0.5 ug/uL DNA – final conc 1.5 ug/20 ul total
  • 2 uL 10x buffer
  • 1 uL 20 units/uL enzyme – final conc 15 units
  • NFW: enough to make 20 uL total mixture

our DNA = 324 ng/uL = 0.324 ug/uL– to get 1.5 ug, we need 4.62 uL of DNA


Plan for Mixtures

  • 4.62 uL DNA

  • 2 ul 10x buffer

  • BstXI: to get final amt 15 ug – 37 – H buffer

    • 1.5 ul of 10 u/ul
    • 11.88 uL NFW
  • KpnI: to get final amt 15 ug – 37 – MC buffer

    • use 1.25 ul of 12 u/ul
    • 12.13 uL
  • SfiI: to get final amt 15 ug – 50 – B buffer

    • use 1.5 ul of 10 u/ul
    • 11.88 uL NFW

Incubate at temp – 1 hr

Notes/Scratch work

Done: NFW, DNA, Buffer, Enzyme

Running

  • BstXI – + assoc buffer – 37oC

    • stock buffer: promega 10x
    • enzyme: 10 u / ul
  • BstXI – + assoc buffer – 37oC

  • KpnI – + assoc buffer – 37oC

    • stock buffer: promega 10x buffer
    • enzyme: 12 u / ul
  • SfiI – + assoc buffer – 50oC

    • stock buffer: promega 10x
    • enzyme: 10 u / ul

See chart on site for reagent concs and quantities

Part 2: Gel Run

  • pour TAE over fill line
  • load 12 ul ladder
  • add 4 ul 6x dye to ea. 20 ul digest
  • load 10 ul of the above on the gel
  • set up electrophoresis and run ~30 min
  • let stain in ethidium bromide 20 min
  • image with gel imager

Results

Phage-Gel Phage-Gel

Week 3 Lab: Automation

Design

design

Python Code

from opentrons import types

metadata = {    # see https://docs.opentrons.com/v2/tutorial.html#tutorial-metadata
    'author': '',
    'protocolName': '',
    'description': '',
    'source': 'HTGAA 2026 Opentrons Lab',
    'apiLevel': '2.20'
}

##############################################################################
###   Robot deck setup constants - don't change these
##############################################################################

TIP_RACK_DECK_SLOT = 9
COLORS_DECK_SLOT = 6
AGAR_DECK_SLOT = 5
PIPETTE_STARTING_TIP_WELL = 'A1'

well_colors = {
    'A1' : 'Red',
    'B1' : 'Green',
    'C1' : 'Orange'
}


def run(protocol):
  ##############################################################################
  ###   Load labware, modules and pipettes
  ##############################################################################

  # Tips
  tips_20ul = protocol.load_labware('opentrons_96_tiprack_20ul', TIP_RACK_DECK_SLOT, 'Opentrons 20uL Tips')

  # Pipettes
  pipette_20ul = protocol.load_instrument("p20_single_gen2", "right", [tips_20ul])

  # Modules
  temperature_module = protocol.load_module('temperature module gen2', COLORS_DECK_SLOT)

  # Temperature Module Plate
  temperature_plate = temperature_module.load_labware('opentrons_96_aluminumblock_generic_pcr_strip_200ul',
                                                      'Cold Plate')
  # Choose where to take the colors from
  color_plate = temperature_plate

  # Agar Plate
  agar_plate = protocol.load_labware('htgaa_agar_plate', AGAR_DECK_SLOT, 'Agar Plate')  ## TA MUST CALIBRATE EACH PLATE!
  # Get the top-center of the plate, make sure the plate was calibrated before running this
  center_location = agar_plate['A1'].top()

  pipette_20ul.starting_tip = tips_20ul.well(PIPETTE_STARTING_TIP_WELL)

  ##############################################################################
  ###   Patterning
  ##############################################################################

  ###
  ### Helper functions for this lab
  ###

  # pass this e.g. 'Red' and get back a Location which can be passed to aspirate()
  def location_of_color(color_string):
    for well,color in well_colors.items():
      if color.lower() == color_string.lower():
        return color_plate[well]
    raise ValueError(f"No well found with color {color_string}")

  # For this lab, instead of calling pipette.dispense(1, loc) use this: dispense_and_detach(pipette, 1, loc)
  def dispense_and_detach(pipette, volume, location):
      """
      Move laterally 5mm above the plate (to avoid smearing a drop); then drop down to the plate,
      dispense, move back up 5mm to detach drop, and stay high to be ready for next lateral move.
      5mm because a 4uL drop is 2mm diameter; and a 2deg tilt in the agar pour is >3mm difference across a plate.
      """
      assert(isinstance(volume, (int, float)))
      above_location = location.move(types.Point(z=location.point.z + 5))  # 5mm above
      pipette.move_to(above_location)       # Go to 5mm above the dispensing location
      pipette.dispense(volume, location)    # Go straight downwards and dispense
      pipette.move_to(above_location)       # Go straight up to detach drop and stay high

  ###
  ### YOUR CODE HERE to create your design
  ###

  pipette_20ul.pick_up_tip()
  pipette_20ul.aspirate(17, location_of_color('Red'))

  cursor = center_location.move(types.Point(x=-17.6, y=28.6))

  # draw stars
  for i in range(3):
    dispense_and_detach(pipette_20ul, 1, cursor)
    cursor = center_location.move(types.Point(x=cursor.point.x, y=cursor.point.y-2.2))
    dispense_and_detach(pipette_20ul, 1, cursor)
    cursor = center_location.move(types.Point(x=cursor.point.x-4.4, y=cursor.point.y-2.2))
    for j in range(5):
      dispense_and_detach(pipette_20ul, 1, cursor)
      cursor = center_location.move(types.Point(x=cursor.point.x+2.2, y=cursor.point.y))
    cursor = center_location.move(types.Point(x=cursor.point.x-8.8, y=cursor.point.y-2.2))
    for j in range(3):
      dispense_and_detach(pipette_20ul, 1, cursor)
      cursor = center_location.move(types.Point(x=cursor.point.x+2.2, y=cursor.point.y))
    cursor = center_location.move(types.Point(x=cursor.point.x-8.8, y=cursor.point.y-2.2))
    for j in range(5):
      dispense_and_detach(pipette_20ul, 1, cursor)
      cursor = center_location.move(types.Point(x=cursor.point.x+2.2, y=cursor.point.y))
    cursor = center_location.move(types.Point(x=cursor.point.x-6.6, y=cursor.point.y-2.2))
    dispense_and_detach(pipette_20ul, 1, cursor)
    cursor = center_location.move(types.Point(x=cursor.point.x, y=cursor.point.y-2.2))
    dispense_and_detach(pipette_20ul, 1, cursor)
    if i < 2:
      pipette_20ul.aspirate(17, location_of_color('Red'))
      cursor = center_location.move(types.Point(x=cursor.point.x+17.6, y=cursor.point.y+13.2))

  # draw stripes
  pipette_20ul.aspirate(15, location_of_color('Red'))
  cursor = center_location.move(types.Point(x=cursor.point.x-50.6, y=cursor.point.y-6.6))
  # two stripes
  for i in range(2):
    # six rows per stripe
    for j in range(6):
      # two refills per row
      for k in range(2):
        # fifteen dots per refill
        for l in range(15):
            dispense_and_detach(pipette_20ul, 1, cursor)
            cursor = center_location.move(types.Point(x=cursor.point.x+2.2, y=cursor.point.y))
        pipette_20ul.aspirate(15, location_of_color('Red'))
      if j < 5:
        cursor = center_location.move(types.Point(x=-33, y=cursor.point.y-2.2))
    if i < 1:
      cursor = center_location.move(types.Point(x=-33, y=cursor.point.y-6.6))

  # Don't forget to end with a drop_tip()
  pipette_20ul.drop_tip()

Week 4 Lab: ProteinsI

See Week 4 Homework tab for lab work.

Week 5 Lab: Proteins II

See Week 4 Homework tab for lab work.

Week 6 Lab: Assembly

PCR Calcs

PCR Setup Purple and Orange

  • NFW – added
  • fwd - Pu, added
  • fwd - O, added
  • rev – same for both, added
  • Master mix – added
  • Template plasmid – added

Calculated PCR params and started running

Need to add DPN1 to digest the template DNA from the PCRs for w/out template

  • DPN1 currently at -20 BEL – thaw for a bit

  • 1 ul DPN1 to ea rxn (put back into freezer)

  • incubate 37 45 m or so – standing inc

  • DPN1

  • PCR Cleanup

  • Run gel

PCR Cleanup

  1. Dilute samples with DNA Binding Buffer. Add buffer in a 2:1 ratio of binding buffer to sample for fragments larger than 2kb (e.g. add 54µl Binding buffer to 27µl DNA). For fragments smaller than 2kb add buffer in a 5:1 ratio (e.g. add 135µl Binding buffer to 27µl DNA).
  • add 50 to backbone
  • add 125 ul to others