Subsections of Alayah Hines — HTGAA Spring 2026

Homework

Weekly homework submissions:

  • Week 1 HW: Principles and Practices

    HW1 Ultra-efficient DNA Synthesis Machine My research is on designing a DNA synthesis machine that can reduce the cost and time to produce long strands of arbitrary DNA sequences. Right now we’re aiming for megabase strands of DNA but the goal of the project is to eventually get to the Gb range and establish a technology that can scale and improve similar to transistors in Moore’s Law. For context, I work mostly on the mechanical side and hope to learn more about the biochemistry and synthetic biology in general from this class.

  • Week 2 HW: DNA Read, Write, and Edit

    HW2 Part 1: Benchling & In-silico Gel Art 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 HW: Lab Automation

    HW3 Lab Preparation: Opentrons Artwork 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:

Subsections of Homework

Week 1 HW: Principles and Practices

cover image

HW1

Ultra-efficient DNA Synthesis Machine

My research is on designing a DNA synthesis machine that can reduce the cost and time to produce long strands of arbitrary DNA sequences. Right now we’re aiming for megabase strands of DNA but the goal of the project is to eventually get to the Gb range and establish a technology that can scale and improve similar to transistors in Moore’s Law. For context, I work mostly on the mechanical side and hope to learn more about the biochemistry and synthetic biology in general from this class.

Most of today’s DNA synthesis tools and services are good at making short DNA pieces, from hundreds to thousands of bps, but as strands get longer, they become much harder and costlier to produce. As an example, Integrated DNA Technologies sells ~125-3,000 bp fragments for uses like cloning single genes and antibody research, the cost is around $0.07-$0.20 per base pair.

Short and mid-length sequences are still really useful:

  • 20–100 bp pieces are used for primers to amplify DNA or guide RNA design

  • 1,000–3,000 bp can code for single proteins or small metabolic pathways

  • 10,000–100,000 bp pieces could represent entire operons

Once hit the megabase range and beyond, you can do a whole lot more:

  • A typical bacterial genome like E. coli is ~1–13Mbp

  • Yeast has a genome around 12Mbp long

  • A gigabase approaches the size of large eukaryotic chromosomes

  • 3.2Gbp is the size of the human genome

The goal is not just to achieve longer strands, but to make long, accurate DNA affordable and reliable, opening the door to lots more possibilities.

Governance/Policy

At the gigabase scale, DNA synthesis moves beyond individual genes and can be used to create entire genomes or chromosomes, which raises new safety, security, and ethical considerations. The main governance challenge for lowering the barrier to creating these large constructs is: how this technology and its outputs be developed and deployed responsibly as its capabilities scale.

Goal

Enable the constructive use of large-scale DNA synthesis while preventing misuse or unintended harm enabled by scale and accessibility.

Governance should aim to prevent malfeasance enabled by longer DNA constructs. This involves:

  • Preventing the synthesis of harmful DNA sequences
  • Reducing the risk posed by unintentional misuse
  • Ensuring that increased automation does not eliminate safety checks and that safety checks adapt to the technology

One way to enable this is through system-level design. The hierarchy of controls encourages eliminating risk before having to rely on training or user intent. By incorporating safety checks, containment options, and traceability mechanisms directly into hardware, safe operation becomes the default outcome. Without governance and training, things can still go wrong, and although accessibility is powerful, there should be limits set to ensure compliance and training. In case something goes wrong, there should be an established line of accountability and transparency with oversight.

Governance Actions

To ensure that large-scale DNA synthesis develops in a safe and constructive way there should be a mix of technical, institutional, and regulatory governance actions.

Hardware-Level Constraints on Maximum Assembly Length

  • Purpose Currently, DNA synthesis limits are largely economic and biochemical but they could be enforced by hardware limits

  • Design Mechanical or software-enforced limits on assembly length, these would be enforced by governance and added by design choices made by manufacturers and research labs building synthesis platforms.

  • Assumptions One assumption is that limiting the strand length meaningfully reduces misuse risk. I don’t know where this limit would be set at but it’s possible that you could get around this or that the set length can still lead to misuse. It is also assumed that this wouldn’t hinder legitimate research.

  • Risks of Failure & “Success” As mentioned before, you could find ways to misuse shorter strands or combine shorter strands into longer ones. Or this length could keep legitimate research from occurring successfully.

Sequence Screening and Logging

  • Purpose Many DNA synthesis companies perform sequence screening to flag known pathogenic or regulated sequences. If synthesis moves toward in-house and machine-based systems, this screening could still take place or even be extended to logging

  • Design Automated sequence screening could occur within each synthesis machine with flags dispersed or hardware/software locks enabled if needed. It might also be wise to log synthesized sequences above a certain size threshold. This can be implemented by academic institutions, commercial developers, and funding agencies. When working in MIT nano, your process must be approved by a committee before you begin and EHS reviews new and acceptable chemicals, this would work the same way.

  • Assumptions This assumes that known harmful sequences can be meaningfully identified. And that users will accept limited logging in exchange for access.

  • Risks of Failure & “Success” It is possible that screening can miss novel or emergent risks. Or that logging could raise intellectual-property concerns. If “too successful,” logging could discourage exploratory research using these systems.

Tiered Access

  • Purpose I think one of the best ways to govern this technology is with a tiered access model where synthesis capabilities scale with demonstrated ability, infrastructure, and oversight.

  • Design You could start with basic access for short and mid-length synthesis, with fairly open access to this. Then more advanced capabilities could be unlocked by agreeing to institutional reviews, trainings, and safety approval, along with oversight by universities or national research bodies. It might even be better to have a centralized location with the extra advanced machines with specialized oversight on them though still granting access.

  • Assumptions This assumes that governing institutions can fairly evaluate readiness and risk and that training and review improve safety outcomes. It also assumes that access tiers won’t become arbitrary gatekeeping, and won’t come down to the same financial barriers in place now.

  • Risks of Failure & “Success” This could disadvantage smaller or less well-funded labs, and “success” might slow innovation if approval processes lag behind technology.

Does the option:Hardware/Software ConstraintsScreening/LoggingTiered Access
Enhance Biosecurity
• By preventing incidents122
• By helping respond312
Foster Lab Safety
• By preventing incidents222
• By helping respond312
Protect the environment
• By preventing incidents132
• By helping respond322
Other considerations
• Minimizing costs and burdens to stakeholders132
• Feasibility?122
• Not impede research232
• Promote constructive applications221

Based on the scoring, I would prioritize a combined approach using sequence screening and logging (Option 2) and tiered access (Option 3). Together, these options provide the strongest balance between preventing misuse, enabling response if something goes wrong, and still enabling legitimate research.

Option 2 performs best in terms of biosecurity and response. As DNA synthesis moves toward in-house, automated, and large-scale systems, maintaining some form of sequence screening becomes increasingly important. Screening and logging help ensure that synthesis at larger scales includes visibility and accountability. It also enables backtracking to find problems or errors, which is important when failures or misuse may not be immediately obvious.

Option 3 complements this by recognizing that not all synthesis capabilities carry the same level of risk. A tiered access model allows safe DNA synthesis to remain relatively open, while reserving the most powerful capabilities for users and institutions with appropriate infrastructure, training, and oversight.

Week 2 Lecture Prep

Homework Questions from Professor Jacobson:

  • 1: DNA polymerase has an error rate of 1:10^6. With the 3.2 Gb human genome, that’s ~3,200 errors per replication. Biology fixes this discrepancy using polymerase proofreading and the MutS repair system, which functions likea multi-stage error-correction protocol to drop the effective mutation rate.
  • 2: If an average human protein has around 400 amino acids, then redundancy allows for 400!/(20!)20 which is on the order of ~10501 DNA sequences to code for an average protein. But many versions fail because RNA secondary structures physically block ribosomes, or sequences trigger RNA cleavage and codon bias issues.

Homework Questions from Dr. LeProust:

  • 1: Phosphoramidite synthesis
  • 2: Synthesis hits a wall due to an exponential yield drop. Following the (1 - error rate)^N, curve, the probability of a “perfect” strand decreases with every base added.
  • 3: At 2kb, the yield of perfect strands is basically zero. To reach the Gb range, we have to assemble smaller, verified oligos using PCA or Gibson Assembly rather than making them in one shot.

Homework Question from George Church:

  • 1: Phenylalanine, Valine, Threonine, Tryptophan, Isoleucine, Methionine, Histidine, Arginine, Leucine, and Lysine
  • 2: As a fail-safe, the Jurassic Park lysine contingency is flawed because all animals are already naturally unable to synthesize lysine; they get it from food. An escaped organism would do the same and just find lysine-rich food.

Sources

AI Prompts

  • “how long is an average human protein?”
  • “give me some examples of what certain lengths of DNA can achieve?”

Week 2 HW: DNA Read, Write, and Edit

cover image

HW2

Part 1: Benchling & In-silico Gel Art

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

Part 2: Gel Art - Restriction Digests and Gel Electrophoresis

This was my first time going through the whole process of making a gel, but I’ll describe more about the experiment in the lab2 page on my website.

Part 3: DNA Design Challenge

3.1: Choose your protein

For my design challenge homework, I have picked Green Fluorescent Protein (GFP) because I was inspired by the HTGAA website photos, it is great for visualizing gene expression, and I want a second chance at making a turtle this time I want to make a turtle-shaped fluorescence pattern.

Here’s the protein sequence from Uniprot: >sp|P42212|GFP_AEQVI Green fluorescent protein OS=Aequorea victoria OX=6100 GN=GFP PE=1 SV=1 MSKGEELFTGVVPILVELDGDVNGHKFSVSGEGEGDATYGKLTLKFICTTGKLPVPWPTL VTTFSYGVQCFSRYPDHMKQHDFFKSAMPEGYVQERTIFFKDDGNYKTRAEVKFEGDTLV NRIELKGIDFKEDGNILGHKLEYNYNSHNVYIMADKQKNGIKVNFKIRHNIEDGSVQLAD HYQQNTPIGDGPVLLPDNHYLSTQSALSKDPNEKRDHMVLLEFVTAAGITHGMDELYK

3.2: Reverse Translate: Protein (amino acid) sequence to DNA (nucleotide) sequence

I used NCBI to get this reverse translation: >reverse translation of sp|P42212|GFP_AEQVI Green fluorescent protein OS=Aequorea victoria OX=6100 GN=GFP PE=1 SV=1 to a 714 base sequence of most likely codons. atgagcaaaggcgaagaactgtttaccggcgtggtgccgattctggtggaactggatggc gatgtgaacggccataaatttagcgtgagcggcgaaggcgaaggcgatgcgacctatggc aaactgaccctgaaatttatttgcaccaccggcaaactgccggtgccgtggccgaccctg gtgaccacctttagctatggcgtgcagtgctttagccgctatccggatcatatgaaacag catgatttttttaaaagcgcgatgccggaaggctatgtgcaggaacgcaccatttttttt aaagatgatggcaactataaaacccgcgcggaagtgaaatttgaaggcgataccctggtg aaccgcattgaactgaaaggcattgattttaaagaagatggcaacattctgggccataaa ctggaatataactataacagccataacgtgtatattatggcggataaacagaaaaacggc attaaagtgaactttaaaattcgccataacattgaagatggcagcgtgcagctggcggat cattatcagcagaacaccccgattggcgatggcccggtgctgctgccggataaccattat ctgagcacccagagcgcgctgagcaaagatccgaacgaaaaacgcgatcatatggtgctg ctggaatttgtgaccgcggcgggcattacccatggcatggatgaactgtataaa

3.3. Codon optimization

I used a handy website called https://www.novoprolabs.com/tools/codon-optimization to optimize my codon for Escherichia coli (E.coli). I chose this organismbecause it is commonly used in synthetic biology, safe, robust, and easy for people new to the wet lab. Why did I have to optimize it at all? GFP comes from a jellyfish it occurs naturally in that species but not in everything, in order to ensure that it will work well with E.coli I have to pick the codons it prefers (codon bias). This is possible because multiple codons can code for the same amino acid. Codon bias can be a problem if the host organism has low amounts of the matching tRNA. So codon optimization replaces rare codons with preferred codons and can remove unwanted restriction sites. Here’s the optimized sequence: ATGTCTAAAGGCGAAGAACTGTTCACCGGTGTGGTTCCGATCCTGGTCGAGCTGGACGGCGACGTAAACGGCCACAAGT TCTCTGTATCTGGTGAAGGCGAGGGTGATGCAACCTACGGTAAACTGACTCTGAAGTTCATTTGCACTACTGGTAAACT GCCGGTTCCGTGGCCGACTCTGGTCACTACTTTCAGCTACGGTGTACAATGTTTTTCCCGTTACCCGGATCACATGAAG CAGCATGACTTCTTCAAATCTGCTATGCCGGAAGGCTACGTTCAGGAACGCACCATCTTCTTCAAAGACGACGGTAACT ACAAAACTCGCGCTGAGGTTAAGTTTGAAGGCGACACCCTGGTTAATCGTATCGAACTGAAAGGCATTGACTTCAAAGA AGATGGTAACATCCTGGGTCACAAACTGGAATACAACTACAACAGCCATAACGTTTACATCATGGCAGACAAACAGAAA AACGGCATCAAGGTGAACTTCAAAATTCGTCACAATATCGAAGATGGTTCCGTGCAGCTGGCCGATCACTACCAGCAGA ACACTCCGATCGGTGACGGTCCGGTGCTGCTGCCGGACAATCACTATCTGAGCACTCAAAGCGCCCTGAGCAAAGACCC GAACGAAAAACGTGATCACATGGTGCTGCTGGAATTCGTTACCGCGGCAGGCATCACTCACGGCATGGATGAACTGTAT AAA

And stats about what’s changed: CAI before optimization: 0.80 CAI after optimization: 0.83 GC content before optimization: 48.60% GC content after optimization: 49.30%

3.4. You have a sequence! Now what?

Cell-Dependent Expression:

To get the GFP DNA to express in a cell, I would insert the codon-optimized GFP gene into a plasmid and transformed into E. coli. The plasmid includes a promoter that allows the cell to recognize and transcribe the gene. Once inside the bacteria, RNA polymerase transcribes the GFP DNA into mRNA, and ribosomes translate the mRNA into the GFP protein. As the protein folds into its final structure, it begins to fluoresce. In this system, the living cell provides all the machinery needed for transcription and translation.

Cell-Independent Expression:

To get GFP to be produced without living cells, I’d need to mix a cell extract containing ribosomes, enzymes, and tRNAs with the GFP DNA template in a test tube. The extract carries out transcription and translation directly in solution. This allows faster protein production and more control over reaction conditions since there is no need to grow or maintain cells. It is useful for rapid testing of gene designs before moving into full bacterial expression.

Part 4: Prepare a Twist DNA Synthesis Order

I chose a similar protein to the example in class but replaced the sfGFP coding sequence with my regular GFP coding sequence. I wonder what the differences are and if they are different enough to create a pattern with. ANyways here’s my benchling linear map.

cover image cover image

Here's my final Fasta file with all the necessary regions: >GFP_hw2 TTTACGGCTAGCTCAGTCCTAGGTATAGTGCTAGCCATTAAAGAGGAGAAAGGTACCATGATGTCTAAAGGCGAAGAAC TGTTCACCGGTGTGGTTCCGATCCTGGTCGAGCTGGACGGCGACGTAAACGGCCACAAGTTCTCTGTATCTGGTGAAGG CGAGGGTGATGCAACCTACGGTAAACTGACTCTGAAGTTCATTTGCACTACTGGTAAACTGCCGGTTCCGTGGCCGACT CTGGTCACTACTTTCAGCTACGGTGTACAATGTTTTTCCCGTTACCCGGATCACATGAAGCAGCATGACTTCTTCAAAT CTGCTATGCCGGAAGGCTACGTTCAGGAACGCACCATCTTCTTCAAAGACGACGGTAACTACAAAACTCGCGCTGAGGT TAAGTTTGAAGGCGACACCCTGGTTAATCGTATCGAACTGAAAGGCATTGACTTCAAAGAAGATGGTAACATCCTGGGT CACAAACTGGAATACAACTACAACAGCCATAACGTTTACATCATGGCAGACAAACAGAAAAACGGCATCAAGGTGAACT TCAAAATTCGTCACAATATCGAAGATGGTTCCGTGCAGCTGGCCGATCACTACCAGCAGAACACTCCGATCGGTGACGG TCCGGTGCTGCTGCCGGACAATCACTATCTGAGCACTCAAAGCGCCCTGAGCAAAGACCCGAACGAAAAACGTGATCAC ATGGTGCTGCTGGAATTCGTTACCGCGGCAGGCATCACTCACGGCATGGATGAACTGTATAAACATCACCATCACCATC ATCACTAACCAGGCATCAAATAAAACGAAAGGCTCAGTCGAAAGACTGGGCCTTTCGTTTTATCTGTTGTTTGTCGGTG AACGCTCTCTACTAGAGTCACACTGGCTCACCTTCGGGTGGGCCTTTCTGCGTTTATA

Here’s my final plasmid:

cover image

Part 5: DNA Read/Write/Edit

5.1 DNA Read

If I could choose DNA to sequence, I would choose synthetic DNA used for digital data storage. DNA data storage is interesting because it treats DNA as away of encoding information, like a hard drive, but at a molecular scale. Sequencing the DNA would allow us to read back the stored data and measure how accurately the system preserves information over time, this seems like an idea straight out of science fiction though it is possible now. To sequence this DNA, I would use Illumina sequencing, a second-generation sequencing technology. It works well for short, synthetic DNA fragments and provides high accuracy at relatively low cost. The input would be the synthetic DNA fragments that encode the information. These fragments wouldneed to be prepared by adding adapter sequences to their ends, amplifying them by PCR, and loading them onto a flow cell. During sequencing, fluorescently labeled nucleotides are incorporated one base at a time, and a camera detects the color signal to determine which base was added. This process converts fluorescence into a digital readout of A, T, C, and G. The output is a large dataset of DNA reads that can be reconstructed into the original digital file.

5.2 DNA Write

If I could synthesize DNA, I would create my turtle-themed GFP expression construct but with multiple colors of fluorescent proteins. I would synthesize codon-optimized Fluorescent Protein genes under the control of a bacterial promoter so that it could be expressed in E. coli. The goal would be to design a system that produces a turtle-shell-like hexagonal fluorescence pattern. This connects synthetic biology with spatial design and pattern formation maybe I could even get a system for animating it and getting the turtle to move. The core sequence would be the coding region, inserted into a plasmid backbone.

To synthesize this DNA, I would use chemical DNA synthesis and fragment assembly. Short DNA oligos are chemically synthesized, assembled into the full gene using overlapping regions, cloned into a plasmid, and sequence-verified. This method is good for constructs around 1 kb, such as GFP. Limitations include cost increasing with length, possible synthesis errors, and longer turnaround times for larger constructs.

5.3 DNA Edit

An interesting DNA edit project would be engineering biological motors or force-generating systems that could act as microscopic actuators. It would be interesting to use the process that proteins such as Kinesin-1 use to convert chemical energy from ATP into mechanical motion along microtubules. By editing the genes that encode these motor proteins, we could potentially tune their speed, force output, or binding properties, creating nanoscale linear motors with maybe even the potential to scale up. Editing their DNA could allow us to design programmable biological actuators for soft robotics, microfluidics, or responsive materials.

To perform this editing, I would use CRISPR-Cas9. I’d design a guide RNA that targets the motor protein gene. Cas9, directed by the guide RNA, cuts the DNA at a specific location. If we want to introduce a modification, such as a mutation that alters motor speed or adds a binding domain, we would also provide a donor DNA template for repair. The inputs include the guide RNA sequence, Cas9, the donor template if inserting changes, and host cells. After editing, the modified cells would express the altered motor protein, and its mechanical properties could be measured experimentally. Limitations include variable editing efficiency and the possibility of off-target edits, but the approach might allow for precise modification of biological force-generating systems.

Sources

AI Prompts

  • “How do you transcribe DNA and translate a protein with a cell-dependent method?”
  • “How do you transcribe DNA and translate a protein with a cell-independent method?”

Week 3 HW: Lab Automation

cover image

HW3

Lab Preparation: Opentrons Artwork

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.

colab simulation 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. Here’s how my final design ended up: I’ll explain more about the process in my lab3 webpage:

cover image

Post-Lab Questions

Bioautomation in the wild [2]

The paper I chose was entitled: “TidyTron: Reducing lab waste using validated wash-and-reuse protocols for common plasticware in Opentrons OT-2 lab robots” authored by Bryant et al. (2023). I chose this paper because it touches on two things I care about, one being minimizing lab waste, and two being washing processes.

In this study, the authors developed an automated system, called TidyTron, that runs on the Opentrons liquid-handling robot and reduces laboratory plastic waste by automating wash-and-reuse protocols for common lab consumables like pipette tips and microplates. Traditionally, many of these are discarded after a single use because of uncertainty about cross-contamination, the authors even state that biotechnology labs generate ~5.5 million tons of plastic waste per year. TidyTron addresses this problem by using the OT-2 to perform consistent and reliable cleaning processes that are tested and validated for effectiveness.

The paper describes how the automated protocols were implemented on the Opentrons to rinse, clean, and sterilize plastics used with DNA solutions or microbial cultures. They evaluated the cleaned materials by measuring residual contamination using colony-forming unit (CFU) counts, quantitative PCR to detect residual DNA, and other metrics to confirm that the robot-washed consumables were equivalent in performance to new plastics. Their results showed that the wash-and-reuse procedures could effectively remove contamination, demonstrating that automation makes reusable workflows both practical and safe. I thought this approach was interesting because it applies automation not to increasing throughput or accuracy, but to sustainability in biological labs. I hope to use a similar system, not for plastic but for metal/more permanent lab equipment, which I’ll build into my DNA dispensing machine.

Bioautomation in my final project

As a mechanical engineer, I am very interested in the bioautomation part of synthetic biology. Two of my three final project ideas either seek to improve or apply bioautomation as a main part of the project. One idea I had was to do what we did in lab this week but in 3D. Two approaches I imagine are either to embed a 3D model in a brick of clear gel, similar to the lasers that can engrave a model into glass, or to build a 3D model out of gel and “paint” different fluorescent proteins around it all completely automated. I can imagine different challenges based on which version I pursue, but this would be nearly impossible without an automated system.

Sources

  • [1] https://opentrons-art.rcdonovan.com/
  • [2] Bryant JA Jr, Longmire C, Sridhar S, Janousek S, Kellinger M, Wright RC. TidyTron: Reducing lab waste using validated wash-and-reuse protocols for common plasticware in Opentrons OT-2 lab robots. SLAS Technol. 2024 Apr;29(2):100107. doi: 10.1016/j.slast.2023.08.007. Epub 2023 Sep 9. PMID: 37696493; PMCID: PMC12212179.

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”

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 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:

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 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()

Subsections of Projects

Individual Final Project

cover image cover image

Group Final Project

cover image cover image