Labs

Lab writeups:

  • Week 1 Lab: Pipetting

    Prelab Dilution Practice 1 Scenario: The stock concentration of a mystery substance (MS) is 5 M. Dilute to 100 µM (0.1 mM) using serial dilutions. 5 M = 5,000,000 µM Step 1: 500× dilution 5,000,000 µM / 10,000 µM = 500

  • Week 10 Lab: Mass Spectrometry

    Lab 10 Overview In this lab, we used several types of mass spectrometry techniques at the Waters Immerse Lab in Cambridge to analyze proteins and large biomolecular complexes. The experiments focused on measuring protein molecular weight, protein folding and structure, peptide sequencing, and oligomeric assembly states.

  • Week 11 Lab: Bioproduction and Cloud Labs

    Lab 11 Part A At some point during the global artwork process, I drew a little turtle in the bottom left of the top left plate. It later evolved into the border for the 2026 media lab side of the design but some of the pixels still exist. I loved seeing the artwork evolve over time and seeing what each person created and how, sometimes, people would join together asynchronously to complete designs. I wished the cooldown time was a little less; the 20-second period was more fun for individual creations but the longer time was better for collaboration and competition.

  • Week 12 Lab: Golden Gate Assembly and CRISPR

    Lab 12 Ice’s Lab

  • Week 2 Lab: DNA Gel Art

    Lab 2 Benchling & In-silico Gel Art: Recap This week, we made gel electrophoresis art using Lambda phage DNA and ten restriction enzymes. Gel electrophoresis uses a positive charge to pull negatively charged DNA through a conductive gel. Longer strands move slower and shorter strands move faster meaning that different lengths of DNA fragments will appear as different bars in your gel. To use this in an artistic context we take our input Lambda DNA and cut it to different lengths using different restriction enzymes which allows us to have coarse control over where these bars end up and thus we can make art with it. I have decided to really commit to my favorite animal, turtles, this semester and try to have a turtle-inspired theme to all of my projects. In an ideal world this is what I wanted my gel art to look like.

  • Week 3 Lab: Lab Opentrons Art

    Lab 3 Lab Recap This week, we programmed the Opentrons liquid handling robot to create fluorescent protein masterpieces. I was really looking forward to this lab and even did last week homework about expressing GFP in E.Coli. Rather than using the GFP, I found we used a variety of different colors of superfluorescent proteins. Ronan’s webtool [1] made it really easy to visualize a design, and we could even upload images to serve as a template for our designs. I decided to go all in on turtles and make a turtles all the way down image featuring a turtle with a globe for its shell. This was the original image, from my collection of Turtle CADS:

  • Week 6 Lab: Gibson Assembly

    Lab6 For lab this week we conducted a Gibson assembly to change the color of the purple Acropora millepora chromoprotein to a different mutant colors. I worked with Sean Murphy and Terry Luo, and we selected purple, orange, and light pink but ended up with 9 different petridishes to test our whole process, including: 4 x Purified DNA -> Gibson Assembly -> Transformation (but all mixed up and at much too low concentrations, there are four of these because one is all backbone) 3 x DNA straight from PCR -> Gibson Assembly -> Transformation (much higher concentrations but not purified) 1 x A mix of all of our purified DNA to see if we could get the concentration high enough and just see what happened 1 x A test with just the template plasmid A lot went wrong, so we really tried to troubleshoot.

  • Week 7 Lab: Neuromorphic Circuits

    Lab7 This week we designed our own intracellular artificial neural network using plasmids from the Ron Weiss lab and human embryonic kidney cells. I worked with Sean Murphy and Terry Luo and together we designed a comet. The heatmap had a high prediction value in a square region in the bottom left corner, which then narrowed down and then expanded like the tail of a comet.

  • Week 9 Lab: Cell Free

    Lab9 In lab this week we learned about protein purification through a demo, then we mostly worked on our final projects. Here’s some more information about mine Final project - First DNA Twist Order For my final project, I want to make a “hydration” checking wearable device. Originally, I wanted to sense increased sodium levels insweat but that proved to be difficult so instead I’m approximating increased hydration risk by just detecting lactate. I want this to be a cell free system to make it more compatible with a safe wearable device.

Subsections of Labs

Week 1 Lab: Pipetting

cover image

Prelab

Dilution Practice 1

Scenario: The stock concentration of a mystery substance (MS) is 5 M. Dilute to 100 µM (0.1 mM) using serial dilutions.

5 M = 5,000,000 µM

Step 1: 500× dilution

5,000,000 µM / 10,000 µM = 500

This corresponds to a 1:499 dilution.

  • 2 µL stock + 998 µL water = 10,000 µM

Step 2: 100× dilution

10,000 µM / 100 µM = 100

This corresponds to a 1:99 dilution.

  • 10 µL of 10,000 µM + 990 µL water = 100 µM

Dilution Practice 2

Given:

  • Stock concentration = 5 M
  • Molar mass = 532 g/mol

Stock Concentration

5 mol/L × 532 g/mol = 2660 g/L
2660 g/L ÷ 1000 = 2.66 g/mL

Serial dilution plan (5 M to 100 µM)

Overall dilution:

5,000,000 µM / 100 µM = 50,000

Dilution plan:

  • 1:100 to 50,000 µM
  • 1:50 to 1,000 µM
  • 1:10 to 100 µM

This would use 3 dilution steps and the P10, P200, and P1000 pipettes

Final Reaction

Total volume: 60 µL
Final MS concentration: 40 µM

ReagentStock concentrationDesired concentrationVolume (µL)
Loading dye6X1X10
MS100 µM40 µM24
dH₂On/an/a26

Making 100 µM stock makes it easier to pipette and lets you make multiple final concentrations. Making 40 µM directly via serial dilution would require weird dilution ratios and introduce additional error.

Lab

In lab this week, we learned how to use pipettes and the basics of running a gel. It was my first time using a pipette and I quickly realized that my hands were not quite as steady as I wanted them to be. We didn’t follow the lab protocol exactly, it was more about trying all of the different pipettes and learning how they operate. I work with inkjets in my research but I didn’t realize that you could create beautiful tiny droplets by hand as well. Using the P20 I could create droplets only slightly larger than the ones my single-nozzle inkjets create.

My goal was to make a colorful picture in a petri dish similar to the dot paintings with the sequins. I began by using the P1000, but this was much too coarse and oftentimes my dots would bleed into each other, so I switched to a P200 and found I had much more control. I created a couple of abstract pieces whilst getting the hang of the pipettes.

art image

art image

Then we ran a gel and though we’re going more in detail in lab during week 2 it was cool to learn about how to set up a gel and the concept of ladders. I thought that ladders would be absolute, like physical markings on the side of the machine but it’s incredible that ladders are run beside your sample because it’s so context dependent. We also learned that you can recover a specific part of your sample from the gel, but that this is a lot of work compared to other methods. I’m looking forward to learning more about the process in lab next week.

gel image

Sources

AI Prompts -“Help me do math in mark down, make me a markdown math cheat sheet, I’m doing unit conversions and serial dilutions” -“Help me add images in markdown, how to add image in different upstream folder”

Week 10 Lab: Mass Spectrometry

waters lab visit

Lab 10

Overview

In this lab, we used several types of mass spectrometry techniques at the Waters Immerse Lab in Cambridge to analyze proteins and large biomolecular complexes. The experiments focused on measuring protein molecular weight, protein folding and structure, peptide sequencing, and oligomeric assembly states.

The primary protein analyzed throughout the lab was enhanced Green Fluorescent Protein (eGFP), which was studied using multiple workflows on the Waters Xevo G3 QTof and Waters BioAccord LC-MS systems. We also analyzed Keyhole Limpet Hemocyanin (KLH) using charge detection mass spectrometry (CDMS).


Part I — Intact Protein Molecular Weight Measurement

In the first experiment, intact eGFP was analyzed on the Waters Xevo G3 QTof LC-MS system under denaturing conditions. The protein sample was first buffer exchanged into ammonium acetate using spin columns and then injected into the LC-MS system.

The liquid chromatography system separated the sample before electrospray ionization and mass analysis. Because the LC solvents and acidic conditions denatured the protein, eGFP unfolded during analysis and produced a broad charge state distribution.

Using the measured mass-to-charge (m/z) values and charge states, we calculated the molecular weight of eGFP and compared it to the predicted molecular weight from the amino acid sequence.

This experiment demonstrated how LC-MS can accurately determine intact protein mass and confirm protein identity.


Part II — Native vs. Denatured Protein Structure

In the second experiment, eGFP was analyzed in both native and denatured forms using direct infusion mass spectrometry on the Waters Xevo G3 QTof.

The native protein remained folded in ammonium acetate buffer and produced lower charge states because fewer protonation sites were exposed. After adding formic acid, the protein unfolded and produced broader, higher charge state distributions.

Comparing the native and denatured spectra showed how protein structure affects electrospray ionization behavior and charge state formation.

This experiment demonstrated that mass spectrometry can provide information not only about molecular weight, but also about higher-order protein structure and folding state.


Part III — Peptide Mapping and Protein Sequencing

In the third experiment, eGFP was digested with trypsin to generate smaller peptide fragments. Trypsin cleaves proteins after lysine (K) and arginine (R) residues, producing predictable peptide fragments.

The peptide mixture was analyzed using the Waters BioAccord LC-MS system. Liquid chromatography separated the peptides, and tandem mass spectrometry fragmented selected peptide ions to determine amino acid sequences.

Using peptide masses and fragmentation spectra, we generated a peptide map of eGFP and confirmed the primary amino acid sequence of the protein.

This experiment demonstrated how LC-MS/MS can identify proteins, determine peptide sequences, and measure sequence coverage.


Part IV — Charge Detection Mass Spectrometry of KLH

In the final experiment, Keyhole Limpet Hemocyanin (KLH) was analyzed using the Waters Xevo CDMS system.

KLH forms extremely large oligomeric protein complexes in the megadalton mass range, which are difficult to analyze using conventional mass spectrometry because their charge states overlap heavily.

Charge detection mass spectrometry (CDMS) directly measures both the charge and mass of individual ions, allowing accurate mass measurements of very large protein assemblies.

Using CDMS, we identified multiple oligomeric states of KLH, including decamers and larger multidecameric complexes.

This experiment demonstrated how advanced mass spectrometry methods can analyze extremely large biomolecular assemblies that are inaccessible using standard LC-MS techniques.


Conclusion

Overall, this lab introduced several important applications of mass spectrometry in modern biochemistry and biotechnology.

Using the Waters Xevo G3 QTof, Waters BioAccord, and Waters Xevo CDMS systems, we measured:

  • Intact protein molecular weight
  • Protein folding and structure
  • Peptide sequences
  • Oligomeric assembly states

These experiments demonstrated how mass spectrometry can provide structural, molecular, and sequence-level information about biological molecules with high sensitivity and precision.

Week 11 Lab: Bioproduction and Cloud Labs

WOrk in PrOgresS

Lab 11

Part A

At some point during the global artwork process, I drew a little turtle in the bottom left of the top left plate. It later evolved into the border for the 2026 media lab side of the design but some of the pixels still exist. I loved seeing the artwork evolve over time and seeing what each person created and how, sometimes, people would join together asynchronously to complete designs. I wished the cooldown time was a little less; the 20-second period was more fun for individual creations but the longer time was better for collaboration and competition.

WOrk in PrOgresS

Part B

  1. Referencing the cell-free protein synthesis reaction composition (the middle box outlined in yellow on the image above, also listed below), provide a 1-2 sentence description of what each component’s role is in the cell-free reaction.

E. coli Lysate

  • BL21 (DE3) Star Lysate (includes T7 RNA Polymerase) Provides the transcription and translation machinery (ribosomes, enzymes, tRNAs), with T7 RNA polymerase enabling strong expression from T7 promoters.

Salt/Buffer

  • Potassium Glutamate Maintains intracellular-like ionic conditions that stabilize enzymes and ribosomes for efficient protein synthesis.

  • HEPES-KOH pH 7.5 Buffers the reaction to maintain a stable pH optimal for enzymatic activity.

  • Magnesium Glutamate Supplies Mg²⁺ ions, which are essential cofactors for ribosomes, RNA polymerase, and ATP-dependent reactions.

  • Potassium phosphate monobasic Contributes to buffering capacity and provides phosphate for metabolic processes.

  • Potassium phosphate dibasic Works with the monobasic form to stabilize pH and maintain phosphate balance.

Energy / Nucleotide System

  • Ribose Serves as a substrate for nucleotide regeneration through metabolic pathways.

  • Glucose Provides a sustained energy source via glycolysis to extend reaction lifetime.

  • AMP Acts as a precursor that can be phosphorylated to generate ATP for energy and transcription.

  • CMP Precursor to CTP, required for RNA synthesis.

  • GMP Precursor to GTP, necessary for transcription and translation.

  • UMP Precursor to UTP, another essential RNA building block.

  • Guanine A nucleobase that can be converted into GMP/GTP via salvage pathways in the lysate.

Translation Mix (Amino Acids)

  • 17 Amino Acid Mix Provides most amino acids needed for protein synthesis.

  • Tyrosine Added separately due to solubility limitations in mixed amino acid stocks.

  • Cysteine Added separately because it is chemically unstable and prone to oxidation.

Additives

  • Nicotinamide Supports redox balance by maintaining NAD⁺/NADH-dependent metabolic activity for energy regeneration.

Backfill

  • Nuclease Free Water Adjusts reaction volume without introducing nucleases that could degrade DNA or RNA.
  1. Describe the main differences between the 1-hour optimized PEP-NTP master mix and the 20-hour NMP-Ribose-Glucose master mix shown in the Google Slide above.

The 1-hour PEP-NTP system uses phosphoenolpyruvate (PEP) and pre-supplied NTPs to drive rapid, high-level protein expression, but it depletes energy quickly and accumulates inhibitory byproducts. The 20-hour NMP–ribose–glucose system relies on nucleotide monophosphates and metabolic substrates to regenerate energy and NTPs over time, enabling slower but more sustained protein production. This results in a tradeoff between fast, short-lived expression and longer-lasting, more stable reactions

Part C

  1. Given the 6 fluorescent proteins we used for our collaborative painting, identify and explain at least one biophysical or functional property of each protein that affects expression or readout in cell-free systems.

Fluorescent protein properties:

sfGFP

  • sfGFP has enhanced folding efficiency, allowing it to maintain high fluorescence even under suboptimal cell-free conditions.

mRFP1

  • mRFP1 has a slow chromophore maturation time, which delays fluorescence development despite successful protein expression.

mKO2

  • mKO2 matures relatively quickly but can be sensitive to environmental factors like pH, affecting its fluorescence intensity.

mTurquoise2

  • mTurquoise2 is highly bright but depends strongly on proper folding and oxygen availability for chromophore formation.

mScarlet-I

  • mScarlet-I has high brightness and improved maturation speed, but still requires efficient folding for optimal fluorescence.

Electra2

  • Electra2 is engineered for high brightness and stability but may place higher demands on cellular resources, making it sensitive to energy availability.
  1. Create a hypothesis for how adjusting one or more reagents in the cell-free mastermix could improve a specific biophysical or functional property you identified above, in order to maximize fluorescence over a 36-hour incubation. Clearly state the protein, the reagent(s), and the expected effect.

Increasing glucose concentration in reactions expressing mRFP1 will extend energy availability and reaction lifetime, allowing more protein to fully mature and increasing total fluorescence over 36 hours.

  1. The second phase of this lab will be to define the precise reagent concentrations for your cell-free experiment. You will be assigned artwork wells with specific fluorescent proteins and receive an email with instructions this week (by April 24).

Week 12 Lab: Golden Gate Assembly and CRISPR

WOrk in PrOgresS

Lab 12

Ice’s Lab

Week 2 Lab: DNA Gel Art

cover image

Lab 2

Benchling & In-silico Gel Art: Recap

This week, we made gel electrophoresis art using Lambda phage DNA and ten restriction enzymes. Gel electrophoresis uses a positive charge to pull negatively charged DNA through a conductive gel. Longer strands move slower and shorter strands move faster meaning that different lengths of DNA fragments will appear as different bars in your gel. To use this in an artistic context we take our input Lambda DNA and cut it to different lengths using different restriction enzymes which allows us to have coarse control over where these bars end up and thus we can make art with it. I have decided to really commit to my favorite animal, turtles, this semester and try to have a turtle-inspired theme to all of my projects. In an ideal world this is what I wanted my gel art to look like.

cover image

However, it was really hard to design this with such coarse control, I spent hours on Ronan's website to no avail before eventually deciding on something simpler, my initials: AH.

cover image cover image

Gel Art - Restriction Digests and Gel Electrophoresis

This was my first time making a gel and it was amazing to go through the entire process. I worked with Terry Luo and Sean Murphy, we tried to make an “AH” and ended up with the letters “LU”

cover image

Making gel by mixing 1% agave with conductive liquid (TAE buffer) and DNA stain.

cover image

Pouring gel once cool and inserting comb to create wells and lanes for DNA to travel

cover image cover image

Preparing solutions based on recipe: distilled water + cutsmart buffer + lambda DNA + enzymes

cover image

Putting tubes in incubator

cover image cover image

Preparing final solution for gel: diluting digest with water and adding loading dye

cover image cover image

Loading digest in gel wells, it was really hard to keep my hand steady and not peirce the bottom

cover image

Gel completely set up, starting run

cover image

It only got this far after 45minutes so we ran it as is though more time would've led to more vertical spread

cover image cover image

Viewing results in the transilluminator. It mostly worked but there were a few mistakes. We didn't wait long enough to get a farther vertical spread, and we had some contamination between lanes (likely caused earlier on by forgetting to swap the pipette tip), but overall it was a success. We got "LU" instead of "AH" but this ended up being better because LU stands for love you and it was right before Valentines day.

Week 3 Lab: Lab Opentrons Art

cover image

Lab 3

Lab Recap

This week, we programmed the Opentrons liquid handling robot to create fluorescent protein masterpieces. I was really looking forward to this lab and even did last week homework about expressing GFP in E.Coli. Rather than using the GFP, I found we used a variety of different colors of superfluorescent proteins. Ronan’s webtool [1] made it really easy to visualize a design, and we could even upload images to serve as a template for our designs. I decided to go all in on turtles and make a turtles all the way down image featuring a turtle with a globe for its shell. This was the original image, from my collection of Turtle CADS:

turtle image cad

Once the image was imported, I went to work adjusting it to make my design. I tried to stick to fewer colors just in case we had less than what was on the website, which did not end up being an issue. This is how my image looked in the end:

turtle image pixels

I took the coordinates from this image for each different color and put them into the Colab Python Script. I had to add and change colors to match the ones I used. I originally ran into a problem where I’d tell the robot to fill up the pipette, empty it, then continue attempting to dispense I was able to see this error in the simulation and correct it by adding a loop where, after the pipette was empty (20 dots in my case using a p20 and 1ul droplets) I’d pick up more before continuing. I used the built-in Gemini chatbot to help with this assignment, after explaining the functions I had access to I asked it to use these functions to deposit blue droplets at every coordinate in a list. From there, I used the same functions and procedures to do the rest of my colors. After some troubleshooting, the simulation finally showed me the result I wanted, and the verification also went through. I’ll attach my Python code at the end of this webpage.

colab simulation code

n code:

It was really straightforward to go from my design to the Opentron, at least from my point of view as a student (not sure what magic the TAs and staff work behind the scenes). The machine itself was incredibly precise, not only in movement but also in dispensing.

cover image

Opentrons machine setup for my experiment. All solutions are ready and pipette tips have been moved into position. Gel is set in a 3D printed holder.

cover image

First color dispensing, machine goes back to refill when out of fluid, but this is not because of sensing but instead code we input. It also doesn’t know where the top of the gel is so we calibrated and retuned to find the perfect height to dispense at and the right height to move at to clear the dish walls.

cover image

Before I knew it, the dispensing part was finished, but the cells still needed to be cultured. We dispensed E.Coli capable of producing fluorescent proteins but they still had to incubate overnight so the proteins could be produced

cover image

Here's the final image. And the image of the whole class's work!

cover image

Sources

AI Prompts

  • “Using the functions described in this document, write a loop that deposits blue droplets at every coordinate in a given list”
  • “Use the function to refill the pipette after it’s empty, then continue depositing droplets if there are more droplets than the pipette can hold at once”

Python Code:

from opentrons import types

metadata = {    # see https://docs.opentrons.com/v2/tutorial.html#tutorial-metadata
    'author': 'Alayah Hines',
    'protocolName': 'HGTAA Lab3 Turtle',
    'description': 'Makes a cute turtle',
    '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' : 'darkgreen', #swapped
    'B1' : 'Green',
    'C1' : 'Orange',
    'D1' : 'Cyan', # Added
    'E1' : 'Blue', # Added
    'F1' : 'Yellow'
}


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

  ###
  ### Turtle Code Below
  ###

  # Each tuple is (x_offset_mm, y_offset_mm)
  green_coords = [
      (-34.8, 8.4),(20.4, 8.4),(22.8, 8.4),(25.2, 8.4),(27.6, 8.4),(30, 8.4),(32.4, 8.4),(-34.8, 6),(18, 6),(27.6, 6),(30, 6),(32.4, 6),(34.8, 6),(15.6, 3.6),(18, 3.6),(27.6, 3.6),(30, 3.6),(32.4, 3.6),(34.8, 3.6),(37.2, 3.6),(13.2, 1.2),(15.6, 1.2),(18, 1.2),(27.6, 1.2),(30, 1.2),(32.4, 1.2),(34.8, 1.2),(37.2, 1.2),(13.2, -1.2),(15.6, -1.2),(18, -1.2),(20.4, -1.2),(22.8, -1.2),(25.2, -1.2),(27.6, -1.2),(30, -1.2),(32.4, -1.2),(34.8, -1.2),(37.2, -1.2),(13.2, -3.6),(15.6, -3.6),(18, -3.6),(20.4, -3.6),(22.8, -3.6),(25.2, -3.6),(27.6, -3.6),(30, -3.6),(32.4, -3.6),(34.8, -3.6),(37.2, -3.6),(13.2, -6),(15.6, -6),(18, -6),(20.4, -6),(22.8, -6),(25.2, -6),(27.6, -6),(30, -6),(32.4, -6),(34.8, -6),(-32.4, -8.4),(-32.4, -10.8),(-30, -10.8),(-32.4, -13.2),(-30, -13.2),(-27.6, -13.2),(-25.2, -13.2),(-32.4, -15.6),(-30, -15.6),(-27.6, -15.6),(-25.2, -15.6),(-6, -20.4),(-3.6, -20.4),(-1.2, -20.4),(1.2, -20.4),(3.6, -20.4),(6, -20.4),(-6, -22.8),(-3.6, -22.8),(-1.2, -22.8),(1.2, -22.8),(3.6, -22.8),(6, -22.8),(-6, -25.2),(-3.6, -25.2),(-1.2, -25.2),(1.2, -25.2),(3.6, -25.2),(6, -25.2)
  ]

  # Pick up a tip for green color
  pipette_20ul.pick_up_tip()

  # Dispense each green dot
  for i, (x_offset, y_offset) in enumerate(green_coords):
    if i % 20 == 0:
      # Aspirate 20uL or the remaining number of dispenses, whichever is smaller
      pipette_20ul.aspirate(min(20, len(green_coords) - i), location_of_color('Green'))

    adjusted_location = center_location.move(types.Point(x=x_offset, y=y_offset))
    dispense_and_detach(pipette_20ul, 1, adjusted_location)

  # After all green drops are dispensed, drop the tip
  pipette_20ul.drop_tip()

  # --- End of green ---
  # --- Begin Cyan Patterning ---

  cyan_coords = [
      (-20.4, 30),(-18, 30),(-15.6, 30),(-13.2, 30),(-10.8, 30),(-8.4, 30),(-6, 30),(-3.6, 30),(-1.2, 30),(1.2, 30),(3.6, 30),(6, 30),(8.4, 30),(-22.8, 27.6),(10.8, 27.6),(13.2, 27.6),(-25.2, 25.2),(15.6, 25.2),(-27.6, 22.8),(18, 22.8),(-30, 20.4),(20.4, 20.4),(-32.4, 18),(22.8, 18),(-32.4, 15.6),(22.8, 15.6),(-32.4, 13.2),(22.8, 13.2),(-37.2, 10.8),(-34.8, 10.8),(-32.4, 10.8),(20.4, 10.8),(22.8, 10.8),(25.2, 10.8),(27.6, 10.8),(30, 10.8),(32.4, 10.8),(-37.2, 8.4),(-32.4, 8.4),(18, 8.4),(34.8, 8.4),(-37.2, 6),(-32.4, 6),(15.6, 6),(37.2, 6),(-37.2, 3.6),(-34.8, 3.6),(-32.4, 3.6),(13.2, 3.6),(39.6, 3.6),(-34.8, 1.2),(10.8, 1.2),(39.6, 1.2),(-34.8, -1.2),(-30, -1.2),(10.8, -1.2),(39.6, -1.2),(-34.8, -3.6),(-27.6, -3.6),(10.8, -3.6),(39.6, -3.6),(-34.8, -6),(-32.4, -6),(-25.2, -6),(-22.8, -6),(-20.4, -6),(10.8, -6),(37.2, -6),(-34.8, -8.4),(-30, -8.4),(-18, -8.4),(-15.6, -8.4),(-13.2, -8.4),(-10.8, -8.4),(6, -8.4),(8.4, -8.4),(13.2, -8.4),(15.6, -8.4),(18, -8.4),(20.4, -8.4),(22.8, -8.4),(25.2, -8.4),(27.6, -8.4),(30, -8.4),(32.4, -8.4),(34.8, -8.4),(-34.8, -10.8),(-27.6, -10.8),(-25.2, -10.8),(-8.4, -10.8),(-6, -10.8),(-3.6, -10.8),(-1.2, -10.8),(1.2, -10.8),(3.6, -10.8),(13.2, -10.8),(27.6, -10.8),(-34.8, -13.2),(-22.8, -13.2),(-20.4, -13.2),(13.2, -13.2),(27.6, -13.2),(-34.8, -15.6),(-22.8, -15.6),(-20.4, -15.6),(-18, -15.6),(-15.6, -15.6),(-13.2, -15.6),(-10.8, -15.6),(-8.4, -15.6),(8.4, -15.6),(10.8, -15.6),(13.2, -15.6),(27.6, -15.6),(-32.4, -18),(-30, -18),(-27.6, -18),(-25.2, -18),(-8.4, -18),(-6, -18),(-3.6, -18),(-1.2, -18),(1.2, -18),(3.6, -18),(6, -18),(8.4, -18),(15.6, -18),(18, -18),(20.4, -18),(22.8, -18),(25.2, -18),(-8.4, -20.4),(8.4, -20.4),(-8.4, -22.8),(8.4, -22.8),(-8.4, -25.2),(8.4, -25.2),(-6, -27.6),(-3.6, -27.6),(-1.2, -27.6),(1.2, -27.6),(3.6, -27.6),(6, -27.6)
  ]

  # Pick up a tip for Cyan color
  pipette_20ul.pick_up_tip()

  # Dispense each Cyan dot
  for i, (x_offset, y_offset) in enumerate(cyan_coords):
    if i % 20 == 0:
      # Aspirate 20uL or the remaining number of dispenses, whichever is smaller
      pipette_20ul.aspirate(min(20, len(cyan_coords) - i), location_of_color('Cyan'))

    adjusted_location = center_location.move(types.Point(x=x_offset, y=y_offset))
    dispense_and_detach(pipette_20ul, 1, adjusted_location)

  # After all Cyan drops are dispensed, drop the tip
  pipette_20ul.drop_tip()

  # --- End Cyan Patterning ---
  # --- Begin Blue Patterning ---

  blue_coords =  [
      (-18, 27.6),(-15.6, 27.6),(-13.2, 27.6),(-10.8, 27.6),(-8.4, 27.6),(-6, 27.6),(-3.6, 27.6),(-1.2, 27.6),(1.2, 27.6),(3.6, 27.6),(6, 27.6),(8.4, 27.6),(-18, 25.2),(-15.6, 25.2),(-13.2, 25.2),(-10.8, 25.2),(-8.4, 25.2),(-6, 25.2),(-3.6, 25.2),(-1.2, 25.2),(1.2, 25.2),(3.6, 25.2),(6, 25.2),(8.4, 25.2),(-18, 22.8),(-15.6, 22.8),(-13.2, 22.8),(-10.8, 22.8),(-8.4, 22.8),(-6, 22.8),(-3.6, 22.8),(-1.2, 22.8),(1.2, 22.8),(3.6, 22.8),(6, 22.8),(-18, 20.4),(-15.6, 20.4),(-13.2, 20.4),(-10.8, 20.4),(-8.4, 20.4),(-6, 20.4),(-3.6, 20.4),(-1.2, 20.4),(1.2, 20.4),(3.6, 20.4),(-15.6, 18),(-13.2, 18),(-10.8, 18),(-8.4, 18),(-6, 18),(3.6, 18),(-15.6, 15.6),(-13.2, 15.6),(-10.8, 15.6),(3.6, 15.6),(6, 15.6),(8.4, 15.6),(-30, 13.2),(-27.6, 13.2),(-25.2, 13.2),(-22.8, 13.2),(-20.4, 13.2),(6, 13.2),(8.4, 13.2),(10.8, 13.2),(13.2, 13.2),(-30, 10.8),(-27.6, 10.8),(-25.2, 10.8),(-22.8, 10.8),(-20.4, 10.8),(-18, 10.8),(6, 10.8),(8.4, 10.8),(10.8, 10.8),(13.2, 10.8),(15.6, 10.8),(-30, 8.4),(-27.6, 8.4),(-25.2, 8.4),(-22.8, 8.4),(-20.4, 8.4),(-18, 8.4),(6, 8.4),(8.4, 8.4),(10.8, 8.4),(13.2, 8.4),(15.6, 8.4),(-30, 6),(-27.6, 6),(-25.2, 6),(-22.8, 6),(-20.4, 6),(-18, 6),(-1.2, 6),(1.2, 6),(3.6, 6),(6, 6),(8.4, 6),(10.8, 6),(13.2, 6),(20.4, 6),(22.8, 6),(25.2, 6),(-30, 3.6),(-27.6, 3.6),(-25.2, 3.6),(-22.8, 3.6),(-20.4, 3.6),(-18, 3.6),(-15.6, 3.6),(-3.6, 3.6),(-1.2, 3.6),(1.2, 3.6),(3.6, 3.6),(6, 3.6),(8.4, 3.6),(10.8, 3.6),(20.4, 3.6),(-30, 1.2),(-27.6, 1.2),(-25.2, 1.2),(-22.8, 1.2),(-20.4, 1.2),(-18, 1.2),(-15.6, 1.2),(-3.6, 1.2),(-1.2, 1.2),(1.2, 1.2),(3.6, 1.2),(6, 1.2),(8.4, 1.2),(20.4, 1.2),(-27.6, -1.2),(-25.2, -1.2),(-22.8, -1.2),(-20.4, -1.2),(-18, -1.2),(-15.6, -1.2),(-3.6, -1.2),(-1.2, -1.2),(1.2, -1.2),(3.6, -1.2),(6, -1.2),(8.4, -1.2),(-25.2, -3.6),(-22.8, -3.6),(-20.4, -3.6),(-18, -3.6),(-15.6, -3.6),(-13.2, -3.6),(-3.6, -3.6),(-1.2, -3.6),(1.2, -3.6),(3.6, -3.6),(6, -3.6),(8.4, -3.6),(-18, -6),(-15.6, -6),(-13.2, -6),(-3.6, -6),(-1.2, -6),(1.2, -6),(3.6, -6),(6, -6),(8.4, -6),(-3.6, -8.4),(-1.2, -8.4),(1.2, -8.4),(3.6, -8.4)
  ]

  # Pick up a tip for Blue color
  pipette_20ul.pick_up_tip()

  # Dispense each Blue dot
  for i, (x_offset, y_offset) in enumerate(blue_coords):
    if i % 20 == 0:
      # Aspirate 20uL or the remaining number of dispenses, whichever is smaller
      pipette_20ul.aspirate(min(20, len(blue_coords) - i), location_of_color('Blue'))

    adjusted_location = center_location.move(types.Point(x=x_offset, y=y_offset))
    dispense_and_detach(pipette_20ul, 1, adjusted_location)

  # After all Blue drops are dispensed, drop the tip
  pipette_20ul.drop_tip()

  # --- End Blue Patterning ---
  # --- Begin Dark green Patterning ---

  dark_green_coords =  [
      (-20.4, 27.6),(-22.8, 25.2),(-20.4, 25.2),(10.8, 25.2),(13.2, 25.2),(-25.2, 22.8),(-22.8, 22.8),(-20.4, 22.8),(8.4, 22.8),(10.8, 22.8),(13.2, 22.8),(15.6, 22.8),(-27.6, 20.4),(-25.2, 20.4),(-22.8, 20.4),(-20.4, 20.4),(6, 20.4),(8.4, 20.4),(10.8, 20.4),(13.2, 20.4),(15.6, 20.4),(18, 20.4),(-30, 18),(-27.6, 18),(-25.2, 18),(-22.8, 18),(-20.4, 18),(-18, 18),(-3.6, 18),(-1.2, 18),(1.2, 18),(6, 18),(8.4, 18),(10.8, 18),(13.2, 18),(15.6, 18),(18, 18),(20.4, 18),(-30, 15.6),(-27.6, 15.6),(-25.2, 15.6),(-22.8, 15.6),(-20.4, 15.6),(-18, 15.6),(-8.4, 15.6),(-6, 15.6),(-3.6, 15.6),(-1.2, 15.6),(1.2, 15.6),(10.8, 15.6),(13.2, 15.6),(15.6, 15.6),(18, 15.6),(20.4, 15.6),(-18, 13.2),(-15.6, 13.2),(-13.2, 13.2),(-10.8, 13.2),(-8.4, 13.2),(-6, 13.2),(-3.6, 13.2),(-1.2, 13.2),(1.2, 13.2),(3.6, 13.2),(15.6, 13.2),(18, 13.2),(20.4, 13.2),(-15.6, 10.8),(-13.2, 10.8),(-10.8, 10.8),(-8.4, 10.8),(-6, 10.8),(-3.6, 10.8),(-1.2, 10.8),(1.2, 10.8),(3.6, 10.8),(18, 10.8),(-15.6, 8.4),(-13.2, 8.4),(-10.8, 8.4),(-8.4, 8.4),(-6, 8.4),(-3.6, 8.4),(-1.2, 8.4),(1.2, 8.4),(3.6, 8.4),(-15.6, 6),(-13.2, 6),(-10.8, 6),(-8.4, 6),(-6, 6),(-3.6, 6),(-13.2, 3.6),(-10.8, 3.6),(-8.4, 3.6),(-6, 3.6),(-13.2, 1.2),(-10.8, 1.2),(-8.4, 1.2),(-6, 1.2),(-13.2, -1.2),(-10.8, -1.2),(-8.4, -1.2),(-6, -1.2),(-10.8, -3.6),(-8.4, -3.6),(-6, -3.6),(-10.8, -6),(-8.4, -6),(-6, -6),(-8.4, -8.4),(-6, -8.4),(15.6, -10.8),(18, -10.8),(20.4, -10.8),(22.8, -10.8),(25.2, -10.8),(15.6, -13.2),(18, -13.2),(20.4, -13.2),(22.8, -13.2),(25.2, -13.2),(15.6, -15.6),(18, -15.6),(20.4, -15.6),(22.8, -15.6),(25.2, -15.6)
  ]

  # Pick up a tip for Dark green color
  pipette_20ul.pick_up_tip()

  # Dispense each Dark Green dot
  for i, (x_offset, y_offset) in enumerate(dark_green_coords):
    if i % 20 == 0:
      # Aspirate 20uL or the remaining number of dispenses, whichever is smaller
      pipette_20ul.aspirate(min(20, len(dark_green_coords) - i), location_of_color('darkgreen'))

    adjusted_location = center_location.move(types.Point(x=x_offset, y=y_offset))
    dispense_and_detach(pipette_20ul, 1, adjusted_location)

  # After all Dark Green drops are dispensed, drop the tip
  pipette_20ul.drop_tip()
  # --- End Dark Green Patterning ---
  # --- Begin Yellow Patterning  ---

  yellow_points = [
      (22.8, 3.6),(25.2, 3.6),(-32.4, 1.2),(22.8, 1.2),(25.2, 1.2),(-32.4, -1.2),(-32.4, -3.6),(-30, -3.6),(-30, -6),(-27.6, -6),(-27.6, -8.4),(-25.2, -8.4),(-22.8, -8.4),(-20.4, -8.4),(10.8, -8.4),(-22.8, -10.8),(-20.4, -10.8),(-18, -10.8),(-15.6, -10.8),(-13.2, -10.8),(-10.8, -10.8),(6, -10.8),(8.4, -10.8),(10.8, -10.8),(-18, -13.2),(-15.6, -13.2),(-13.2, -13.2),(-10.8, -13.2),(-8.4, -13.2),(-6, -13.2),(-3.6, -13.2),(-1.2, -13.2),(1.2, -13.2),(3.6, -13.2),(6, -13.2),(8.4, -13.2),(10.8, -13.2),(-6, -15.6),(-3.6, -15.6),(-1.2, -15.6),(1.2, -15.6),(3.6, -15.6),(6, -15.6)
  ]

  # Pick up a tip for Yellow color
  pipette_20ul.pick_up_tip()

  # Dispense each Yellow dot
  for i, (x_offset, y_offset) in enumerate(yellow_points):
    if i % 20 == 0:
      # Aspirate 20uL or the remaining number of dispenses, whichever is smaller
      pipette_20ul.aspirate(min(20, len(yellow_points) - i), location_of_color('Yellow'))

    adjusted_location = center_location.move(types.Point(x=x_offset, y=y_offset))
    dispense_and_detach(pipette_20ul, 1, adjusted_location)

  # After all Yellow drops are dispensed, drop the tip
  pipette_20ul.drop_tip()

  # --- End Yellow Patterning (yellow_points) ---

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

Week 6 Lab: Gibson Assembly

cover image

Lab6

For lab this week we conducted a Gibson assembly to change the color of the purple Acropora millepora chromoprotein to a different mutant colors. I worked with Sean Murphy and Terry Luo, and we selected purple, orange, and light pink but ended up with 9 different petridishes to test our whole process, including: 4 x Purified DNA -> Gibson Assembly -> Transformation (but all mixed up and at much too low concentrations, there are four of these because one is all backbone) 3 x DNA straight from PCR -> Gibson Assembly -> Transformation (much higher concentrations but not purified) 1 x A mix of all of our purified DNA to see if we could get the concentration high enough and just see what happened 1 x A test with just the template plasmid A lot went wrong, so we really tried to troubleshoot.

Part 1: PCR

PCR went quite well, we had no problem preparing for PCR and tests of our PCR product on an e-gel confirmed that we were successful. We had to run two gels because we forgot to run our backbone the first time.

e-gel image e-gel image

e-gel images

When purifying our DNA, we mistakenly disposed of our bound DNA after the wash matrix step. Luckily, we were able to recover it, but suspect putting all of our product into the bio waste container had something to do with our low concentration later on. This step also led to us mixing up our purified DNA such that we could not tell which color was what and morre importantly which tube contained our backbone.

centrifuge image

Centrifuge image

When measuring our eluted purified DNA, we ran into some concentration problems. The nanodrop read the concentration of our elution at 2ug/ml, 4ug/ml, 6ug/ml, and 7ug/ml compared to the template at 40ug/ml. Different templates read different amounts, with the lowest only reading around 12ug/ml so this might have been a problem but more than likely we lost some DNA to the trash, whether from when we threw it out or from problems with eluting.

Nanodrop image

Nanodrop Image: our purified DNA saw no real peak, but our PCR product saw a huge peak with only a little bit of noise

For the Gibson Assembly step, we decided to create 9 different products to try our luck at all possible combinations of purified and unpurified DNA, and because we could not distinguish our purified backbone, we used an unpurified backbone for all of them.

Nanodrop image

This is how they came out:

Purple image image

These are the two purples, unpurified on the left and purified on the right

Orange image image

These are the two oranges, unpurified on the left and purified on the right

Light Pink image image

These are the two light pinks, unpurified on the left and purified on the right

Mix image

Here is the mixed one

Backbone image Control image

And here is what we are assuming is the double backbone to the left, and control to the right Overall, we did have success for each of our plates; however, very few of our colonies were transformed as most of them still appeared purple.

Week 7 Lab: Neuromorphic Circuits

cover image

Lab7

This week we designed our own intracellular artificial neural network using plasmids from the Ron Weiss lab and human embryonic kidney cells. I worked with Sean Murphy and Terry Luo and together we designed a comet. The heatmap had a high prediction value in a square region in the bottom left corner, which then narrowed down and then expanded like the tail of a comet.

Here was our spreadsheet, we used Csy4 as X1, Csy4_rec_CasE as X2, CasE_rec_mNeonGreen as Bias, PgU as X2, and PgU_rec_CasE as X1. We expected something like the bandpass example and used concentrations to make it fall off at higher concentrations of X1 and X2.

spreadsheet image

Here is its predicted associated heatmap

heatmap image

Here’s an image of the Opentrons building it in the Weiss lab

opentrons image

Finally, here’s how it turned out, not quite like the prediction and not quite like the bandpass we were building off of.

actual image

Week 9 Lab: Cell Free

cover image

Lab9

In lab this week we learned about protein purification through a demo, then we mostly worked on our final projects. Here’s some more information about mine

Final project - First DNA Twist Order

cover image

For my final project, I want to make a “hydration” checking wearable device. Originally, I wanted to sense increased sodium levels insweat but that proved to be difficult so instead I’m approximating increased hydration risk by just detecting lactate. I want this to be a cell free system to make it more compatible with a safe wearable device.

Lactate (input signal from sweat) -> Lactate Oxidase (breaks lactate down into) -> Pyruvate (byproduct not used) + H2O2 (which then activates OxyR by oxidizing it) -> OxyR (has two states starts reduced then is oxidized to become active and bind to DNA to activate transcription of PoxyS) -> PoxyS Promoter (controlled by OxyR, switches on reporter gene) -> RNA Aptamer (produced when PoxyS promoter is enabled binds to dye) -> DFHBI Dye (non-fluorescent when bound to RNA Aptamer)

All together it follows this chain: Lactate provides the biological input (increased sweat means increased need for hydration) Lactate Oxidase and H2O2 convert it into a detectable chemical signal OxyR and PoxyS act as switch RNA aptamer and dye generate a fast fluorescent output (that way the glow happens quicker than with protein translation and safer for a wearable because there are no cells)

cover image