Week 3 HW

Part 1: Code

Velcro DNA

from opentrons import types

import string

metadata = { ‘protocolName’: ‘{YOUR NAME} - Opentrons Art - HTGAA’, ‘author’: ‘HTGAA’, ‘source’: ‘HTGAA 2026’, ‘apiLevel’: ‘2.20’ }

Z_VALUE_AGAR = 2.0 POINT_SIZE = 1

egfp_points = [(-12.65,31.05), (-10.35,31.05), (-8.05,31.05), (-5.75,31.05), (-3.45,31.05), (-1.15,31.05), (1.15,31.05), (3.45,31.05), (5.75,31.05), (8.05,31.05), (10.35,31.05), (12.65,31.05), (14.95,31.05), (-24.15,28.75), (-17.25,28.75), (-14.95,28.75), (-12.65,28.75), (-10.35,28.75), (-8.05,28.75), (-5.75,28.75), (-3.45,28.75), (-1.15,28.75), (1.15,28.75), (3.45,28.75), (5.75,28.75), (8.05,28.75), (10.35,28.75), (12.65,28.75), (14.95,28.75), (17.25,28.75), (-21.85,26.45), (-19.55,26.45), (19.55,26.45), (21.85,26.45), (33.35,17.25), (-31.05,14.95), (31.05,14.95), (-33.35,12.65), (-3.45,12.65), (-1.15,12.65), (1.15,12.65), (3.45,12.65), (31.05,12.65), (-35.65,10.35), (-5.75,10.35), (-3.45,10.35), (-1.15,10.35), (1.15,10.35), (3.45,10.35), (5.75,10.35), (31.05,10.35), (33.35,10.35), (-35.65,8.05), (35.65,8.05), (-10.35,5.75), (10.35,5.75), (37.95,5.75), (-37.95,3.45), (37.95,3.45), (-37.95,1.15), (-12.65,1.15), (14.95,1.15), (37.95,1.15), (-37.95,-1.15), (-19.55,-1.15), (-17.25,-1.15), (-14.95,-1.15), (17.25,-1.15), (19.55,-1.15), (21.85,-1.15), (37.95,-1.15), (-37.95,-3.45), (37.95,-3.45), (-37.95,-5.75), (37.95,-5.75), (-37.95,-8.05), (37.95,-8.05), (-37.95,-10.35), (37.95,-10.35), (35.65,-12.65), (-35.65,-14.95), (35.65,-14.95), (-35.65,-17.25), (35.65,-17.25)] mlychee_tf_points = [(-26.45,28.75), (26.45,28.75), (-28.75,26.45), (-26.45,26.45), (-24.15,26.45), (24.15,26.45), (26.45,26.45), (28.75,26.45), (-31.05,24.15), (24.15,24.15), (26.45,24.15), (31.05,24.15), (-33.35,21.85), (-31.05,21.85), (26.45,21.85), (31.05,21.85), (33.35,21.85), (-33.35,19.55), (-31.05,19.55), (28.75,19.55), (31.05,19.55), (33.35,19.55), (-31.05,17.25), (-14.95,17.25), (-12.65,17.25), (-10.35,17.25), (10.35,17.25), (12.65,17.25), (14.95,17.25), (31.05,17.25), (-17.25,14.95), (-14.95,14.95), (-12.65,14.95), (-10.35,14.95), (10.35,14.95), (12.65,14.95), (14.95,14.95), (17.25,14.95), (26.45,14.95), (-19.55,12.65), (-14.95,12.65), (-12.65,12.65), (-10.35,12.65), (10.35,12.65), (12.65,12.65), (14.95,12.65), (19.55,12.65), (26.45,12.65), (-26.45,10.35), (-21.85,10.35), (-12.65,10.35), (-10.35,10.35), (10.35,10.35), (12.65,10.35), (19.55,10.35), (21.85,10.35), (26.45,10.35), (28.75,10.35), (-31.05,8.05), (-28.75,8.05), (-26.45,8.05), (-21.85,8.05), (-19.55,8.05), (-12.65,8.05), (10.35,8.05), (12.65,8.05), (19.55,8.05), (21.85,8.05), (26.45,8.05), (28.75,8.05), (31.05,8.05), (-33.35,5.75), (-31.05,5.75), (-28.75,5.75), (-26.45,5.75), (-21.85,5.75), (-14.95,5.75), (-12.65,5.75), (12.65,5.75), (14.95,5.75), (17.25,5.75), (21.85,5.75), (26.45,5.75), (28.75,5.75), (31.05,5.75), (-31.05,3.45), (-28.75,3.45), (-26.45,3.45), (-19.55,3.45), (-17.25,3.45), (-14.95,3.45), (14.95,3.45), (17.25,3.45), (19.55,3.45), (26.45,3.45), (28.75,3.45), (31.05,3.45), (33.35,3.45), (-33.35,1.15), (-31.05,1.15), (-28.75,1.15), (-26.45,1.15), (26.45,1.15), (28.75,1.15), (31.05,1.15), (33.35,1.15), (-33.35,-1.15), (-31.05,-1.15), (-28.75,-1.15), (-26.45,-1.15), (26.45,-1.15), (28.75,-1.15), (31.05,-1.15), (33.35,-1.15), (-35.65,-3.45), (-33.35,-3.45), (-31.05,-3.45), (-28.75,-3.45), (-26.45,-3.45), (-24.15,-3.45), (24.15,-3.45), (26.45,-3.45), (28.75,-3.45), (31.05,-3.45), (33.35,-3.45), (-33.35,-5.75), (-31.05,-5.75), (-28.75,-5.75), (-26.45,-5.75), (-24.15,-5.75), (-21.85,-5.75), (-19.55,-5.75), (19.55,-5.75), (21.85,-5.75), (24.15,-5.75), (26.45,-5.75), (28.75,-5.75), (31.05,-5.75), (33.35,-5.75), (-33.35,-8.05), (-31.05,-8.05), (-28.75,-8.05), (-26.45,-8.05), (-24.15,-8.05), (-21.85,-8.05), (-19.55,-8.05), (-5.75,-8.05), (-3.45,-8.05), (3.45,-8.05), (5.75,-8.05), (19.55,-8.05), (21.85,-8.05), (24.15,-8.05), (26.45,-8.05), (28.75,-8.05), (31.05,-8.05), (33.35,-8.05), (-33.35,-10.35), (-31.05,-10.35), (-28.75,-10.35), (-26.45,-10.35), (-24.15,-10.35), (-21.85,-10.35), (-19.55,-10.35), (-5.75,-10.35), (-3.45,-10.35), (3.45,-10.35), (5.75,-10.35), (19.55,-10.35), (21.85,-10.35), (24.15,-10.35), (26.45,-10.35), (28.75,-10.35), (31.05,-10.35), (33.35,-10.35), (-31.05,-12.65), (-28.75,-12.65), (-26.45,-12.65), (-24.15,-12.65), (-21.85,-12.65), (-19.55,-12.65), (19.55,-12.65), (21.85,-12.65), (24.15,-12.65), (26.45,-12.65), (28.75,-12.65), (31.05,-12.65), (33.35,-12.65), (-33.35,-14.95), (-31.05,-14.95), (-28.75,-14.95), (-26.45,-14.95), (-24.15,-14.95), (-21.85,-14.95), (-19.55,-14.95), (-17.25,-14.95), (19.55,-14.95), (21.85,-14.95), (24.15,-14.95), (26.45,-14.95), (28.75,-14.95), (31.05,-14.95), (-28.75,-17.25), (-26.45,-17.25), (-24.15,-17.25), (-21.85,-17.25), (-19.55,-17.25), (-17.25,-17.25), (17.25,-17.25), (19.55,-17.25), (21.85,-17.25), (24.15,-17.25), (26.45,-17.25), (28.75,-17.25), (31.05,-17.25), (-28.75,-19.55), (-26.45,-19.55), (-24.15,-19.55), (-21.85,-19.55), (-19.55,-19.55), (-17.25,-19.55), (-14.95,-19.55), (14.95,-19.55), (17.25,-19.55), (19.55,-19.55), (21.85,-19.55), (24.15,-19.55), (26.45,-19.55), (28.75,-19.55), (-26.45,-21.85), (-24.15,-21.85), (-21.85,-21.85), (-19.55,-21.85), (-17.25,-21.85), (-14.95,-21.85), (-12.65,-21.85), (12.65,-21.85), (14.95,-21.85), (17.25,-21.85), (19.55,-21.85), (21.85,-21.85), (24.15,-21.85), (26.45,-21.85), (28.75,-21.85), (31.05,-21.85), (33.35,-21.85), (-31.05,-24.15), (-28.75,-24.15), (-26.45,-24.15), (-24.15,-24.15), (-21.85,-24.15), (-19.55,-24.15), (-17.25,-24.15), (-14.95,-24.15), (-12.65,-24.15), (-10.35,-24.15), (12.65,-24.15), (14.95,-24.15), (17.25,-24.15), (19.55,-24.15), (21.85,-24.15), (24.15,-24.15), (26.45,-24.15), (28.75,-24.15), (31.05,-24.15), (-28.75,-26.45), (-26.45,-26.45), (-24.15,-26.45), (-21.85,-26.45), (-19.55,-26.45), (-17.25,-26.45), (-14.95,-26.45), (-12.65,-26.45), (-10.35,-26.45), (-8.05,-26.45), (-5.75,-26.45), (-3.45,-26.45), (-1.15,-26.45), (1.15,-26.45), (3.45,-26.45), (5.75,-26.45), (8.05,-26.45), (10.35,-26.45), (12.65,-26.45), (14.95,-26.45), (17.25,-26.45), (19.55,-26.45), (21.85,-26.45), (24.15,-26.45), (26.45,-26.45), (28.75,-26.45), (-26.45,-28.75), (-24.15,-28.75), (-21.85,-28.75), (-19.55,-28.75), (-17.25,-28.75), (-14.95,-28.75), (-12.65,-28.75), (-10.35,-28.75), (-8.05,-28.75), (-5.75,-28.75), (-3.45,-28.75), (-1.15,-28.75), (1.15,-28.75), (3.45,-28.75), (5.75,-28.75), (8.05,-28.75), (10.35,-28.75), (12.65,-28.75), (14.95,-28.75), (17.25,-28.75), (19.55,-28.75), (21.85,-28.75), (24.15,-28.75), (26.45,-28.75), (-24.15,-31.05), (-21.85,-31.05), (-19.55,-31.05), (-17.25,-31.05), (-14.95,-31.05), (-12.65,-31.05), (-10.35,-31.05), (-8.05,-31.05), (-5.75,-31.05), (-3.45,-31.05), (-1.15,-31.05), (1.15,-31.05), (3.45,-31.05), (5.75,-31.05), (8.05,-31.05), (10.35,-31.05), (12.65,-31.05), (14.95,-31.05), (17.25,-31.05), (19.55,-31.05), (21.85,-31.05), (24.15,-31.05), (-21.85,-33.35), (-19.55,-33.35), (-17.25,-33.35), (-14.95,-33.35), (-12.65,-33.35), (-10.35,-33.35), (-8.05,-33.35), (-5.75,-33.35), (-3.45,-33.35), (-1.15,-33.35), (1.15,-33.35), (3.45,-33.35), (5.75,-33.35), (8.05,-33.35), (10.35,-33.35), (12.65,-33.35), (14.95,-33.35), (17.25,-33.35), (19.55,-33.35), (21.85,-33.35), (-17.25,-35.65), (-14.95,-35.65), (-12.65,-35.65), (-10.35,-35.65), (-8.05,-35.65), (-5.75,-35.65), (-3.45,-35.65), (-1.15,-35.65), (1.15,-35.65), (3.45,-35.65), (5.75,-35.65), (8.05,-35.65), (10.35,-35.65), (12.65,-35.65), (14.95,-35.65), (17.25,-35.65), (-10.35,-37.95), (-8.05,-37.95), (-5.75,-37.95), (-3.45,-37.95), (-1.15,-37.95), (1.15,-37.95), (3.45,-37.95), (5.75,-37.95), (8.05,-37.95), (10.35,-37.95)] tagrfp_points = [(24.15,28.75), (-14.95,26.45), (-12.65,26.45), (-10.35,26.45), (-8.05,26.45), (-5.75,26.45), (-3.45,26.45), (-1.15,26.45), (1.15,26.45), (3.45,26.45), (5.75,26.45), (8.05,26.45), (10.35,26.45), (12.65,26.45), (14.95,26.45), (17.25,26.45), (-24.15,24.15), (-21.85,24.15), (-19.55,24.15), (-17.25,24.15), (-14.95,24.15), (-8.05,24.15), (-5.75,24.15), (-3.45,24.15), (3.45,24.15), (5.75,24.15), (8.05,24.15), (14.95,24.15), (17.25,24.15), (19.55,24.15), (21.85,24.15), (-24.15,21.85), (-19.55,21.85), (-14.95,21.85), (-8.05,21.85), (-5.75,21.85), (-3.45,21.85), (1.15,21.85), (3.45,21.85), (5.75,21.85), (8.05,21.85), (10.35,21.85), (14.95,21.85), (17.25,21.85), (19.55,21.85), (24.15,21.85), (-28.75,19.55), (-26.45,19.55), (-24.15,19.55), (-21.85,19.55), (-19.55,19.55), (19.55,19.55), (21.85,19.55), (24.15,19.55), (26.45,19.55), (-26.45,17.25), (-24.15,17.25), (26.45,17.25), (28.75,17.25), (-28.75,14.95), (-26.45,14.95), (-24.15,14.95), (-28.75,12.65), (-17.25,12.65), (17.25,12.65), (-31.05,10.35), (-28.75,10.35), (-19.55,10.35), (-33.35,8.05), (-17.25,5.75), (-35.65,3.45), (35.65,3.45), (-33.35,-17.25)] mruby2_points = [(-17.25,26.45), (-12.65,24.15), (-10.35,24.15), (10.35,24.15), (12.65,24.15), (-17.25,21.85), (-12.65,21.85), (-10.35,21.85), (12.65,21.85), (-17.25,19.55), (17.25,19.55), (-33.35,17.25), (-28.75,17.25), (-21.85,17.25), (-19.55,17.25), (19.55,17.25), (21.85,17.25), (-21.85,14.95), (21.85,14.95), (-31.05,12.65), (-33.35,10.35), (33.35,8.05), (-35.65,5.75), (35.65,5.75), (-12.65,3.45), (-21.85,1.15), (-19.55,1.15), (-17.25,1.15), (-14.95,1.15), (19.55,1.15), (21.85,1.15), (-21.85,-1.15), (-35.65,-8.05), (-35.65,-10.35), (35.65,-10.35), (-35.65,-12.65), (33.35,-17.25), (-33.35,-19.55), (33.35,-19.55)] mkate2_points = [(-1.15,24.15), (1.15,24.15), (-1.15,21.85), (-5.75,19.55), (-3.45,19.55), (-1.15,19.55), (1.15,19.55), (3.45,19.55), (5.75,19.55), (-5.75,17.25), (-3.45,17.25), (-1.15,17.25), (1.15,17.25), (3.45,17.25), (5.75,17.25), (-5.75,14.95), (-3.45,14.95), (-1.15,14.95), (1.15,14.95), (3.45,14.95), (5.75,14.95), (-5.75,12.65), (5.75,12.65), (-8.05,-3.45), (-5.75,-3.45), (-3.45,-3.45), (-1.15,-3.45), (1.15,-3.45), (3.45,-3.45), (5.75,-3.45), (8.05,-3.45), (-8.05,-5.75), (-5.75,-5.75), (-3.45,-5.75), (-1.15,-5.75), (1.15,-5.75), (3.45,-5.75), (5.75,-5.75), (8.05,-5.75), (-8.05,-8.05), (-1.15,-8.05), (1.15,-8.05), (8.05,-8.05), (-8.05,-10.35), (-1.15,-10.35), (1.15,-10.35), (8.05,-10.35), (-8.05,-12.65), (-5.75,-12.65), (-3.45,-12.65), (-1.15,-12.65), (1.15,-12.65), (3.45,-12.65), (5.75,-12.65), (8.05,-12.65), (-5.75,-14.95), (-3.45,-14.95), (-1.15,-14.95), (1.15,-14.95), (3.45,-14.95), (5.75,-14.95), (-1.15,-17.25), (1.15,-17.25), (-1.15,-19.55), (1.15,-19.55), (-8.05,-21.85), (-5.75,-21.85), (-3.45,-21.85), (-1.15,-21.85), (1.15,-21.85), (3.45,-21.85), (5.75,-21.85), (8.05,-21.85)] mkate2_tf_points = [(-21.85,21.85), (21.85,21.85), (24.15,17.25), (24.15,14.95), (28.75,14.95), (-26.45,12.65), (28.75,12.65), (-10.35,8.05), (-19.55,5.75), (19.55,5.75), (33.35,5.75), (-33.35,3.45), (-21.85,3.45), (21.85,3.45), (-35.65,1.15), (17.25,1.15), (35.65,1.15), (-35.65,-1.15), (35.65,-1.15), (35.65,-3.45), (-35.65,-5.75), (35.65,-5.75), (35.65,-8.05), (-33.35,-12.65), (33.35,-14.95), (-31.05,-17.25), (-31.05,-19.55), (31.05,-19.55), (-33.35,-21.85), (-31.05,-21.85), (-28.75,-21.85)] mko2_points = [(-14.95,19.55), (-12.65,19.55), (-10.35,19.55), (-8.05,19.55), (8.05,19.55), (10.35,19.55), (12.65,19.55), (14.95,19.55), (-17.25,17.25), (-8.05,17.25), (8.05,17.25), (17.25,17.25), (-19.55,14.95), (-8.05,14.95), (8.05,14.95), (19.55,14.95), (-24.15,12.65), (-21.85,12.65), (-8.05,12.65), (8.05,12.65), (21.85,12.65), (24.15,12.65), (-24.15,10.35), (-8.05,10.35), (8.05,10.35), (24.15,10.35), (-24.15,8.05), (-8.05,8.05), (-5.75,8.05), (-3.45,8.05), (-1.15,8.05), (1.15,8.05), (3.45,8.05), (5.75,8.05), (8.05,8.05), (24.15,8.05), (-24.15,5.75), (-8.05,5.75), (-5.75,5.75), (-3.45,5.75), (-1.15,5.75), (1.15,5.75), (3.45,5.75), (5.75,5.75), (8.05,5.75), (24.15,5.75), (-24.15,3.45), (-10.35,3.45), (-8.05,3.45), (-5.75,3.45), (-3.45,3.45), (-1.15,3.45), (1.15,3.45), (3.45,3.45), (5.75,3.45), (8.05,3.45), (10.35,3.45), (12.65,3.45), (24.15,3.45), (-24.15,1.15), (-10.35,1.15), (-8.05,1.15), (-5.75,1.15), (-3.45,1.15), (-1.15,1.15), (1.15,1.15), (3.45,1.15), (5.75,1.15), (8.05,1.15), (10.35,1.15), (12.65,1.15), (24.15,1.15), (-24.15,-1.15), (-12.65,-1.15), (-10.35,-1.15), (-8.05,-1.15), (-5.75,-1.15), (-3.45,-1.15), (-1.15,-1.15), (1.15,-1.15), (3.45,-1.15), (5.75,-1.15), (8.05,-1.15), (10.35,-1.15), (12.65,-1.15), (14.95,-1.15), (24.15,-1.15), (-21.85,-3.45), (-19.55,-3.45), (-17.25,-3.45), (-14.95,-3.45), (-12.65,-3.45), (-10.35,-3.45), (10.35,-3.45), (12.65,-3.45), (14.95,-3.45), (17.25,-3.45), (19.55,-3.45), (21.85,-3.45), (-17.25,-5.75), (-14.95,-5.75), (-12.65,-5.75), (-10.35,-5.75), (10.35,-5.75), (12.65,-5.75), (14.95,-5.75), (17.25,-5.75), (-17.25,-8.05), (-14.95,-8.05), (-12.65,-8.05), (-10.35,-8.05), (10.35,-8.05), (12.65,-8.05), (14.95,-8.05), (17.25,-8.05), (-17.25,-10.35), (-14.95,-10.35), (-12.65,-10.35), (-10.35,-10.35), (10.35,-10.35), (12.65,-10.35), (14.95,-10.35), (17.25,-10.35), (-17.25,-12.65), (-14.95,-12.65), (-12.65,-12.65), (-10.35,-12.65), (10.35,-12.65), (12.65,-12.65), (14.95,-12.65), (17.25,-12.65), (-14.95,-14.95), (-12.65,-14.95), (-10.35,-14.95), (-8.05,-14.95), (8.05,-14.95), (10.35,-14.95), (12.65,-14.95), (14.95,-14.95), (17.25,-14.95), (-14.95,-17.25), (-12.65,-17.25), (-10.35,-17.25), (-8.05,-17.25), (-5.75,-17.25), (-3.45,-17.25), (3.45,-17.25), (5.75,-17.25), (8.05,-17.25), (10.35,-17.25), (12.65,-17.25), (14.95,-17.25), (-12.65,-19.55), (-10.35,-19.55), (-8.05,-19.55), (-5.75,-19.55), (-3.45,-19.55), (3.45,-19.55), (5.75,-19.55), (8.05,-19.55), (10.35,-19.55), (12.65,-19.55), (-10.35,-21.85), (10.35,-21.85), (-8.05,-24.15), (-5.75,-24.15), (-3.45,-24.15), (-1.15,-24.15), (1.15,-24.15), (3.45,-24.15), (5.75,-24.15), (8.05,-24.15), (10.35,-24.15)]

point_name_pairing = [(“egfp”, egfp_points),(“mlychee_tf”, mlychee_tf_points),(“tagrfp”, tagrfp_points),(“mruby2”, mruby2_points),(“mkate2”, mkate2_points),(“mkate2_tf”, mkate2_tf_points),(“mko2”, mko2_points)]

Robot deck setup constants

TIP_RACK_DECK_SLOT = 9 COLORS_DECK_SLOT = 6 AGAR_DECK_SLOT = 5 PIPETTE_STARTING_TIP_WELL = ‘A1’

Place the PCR tubes in this order

well_colors = { ‘A1’: ‘sfGFP’, ‘A2’: ‘mRFP1’, ‘A3’: ‘mKO2’, ‘A4’: ‘Venus’, ‘A5’: ‘mKate2_TF’, ‘A6’: ‘Azurite’, ‘A7’: ‘mCerulean3’, ‘A8’: ‘mClover3’, ‘A9’: ‘mJuniper’, ‘A10’: ‘mTurquoise2’, ‘A11’: ‘mBanana’, ‘A12’: ‘mPlum’, ‘B1’: ‘Electra2’, ‘B2’: ‘mWasabi’, ‘B3’: ‘mScarlet_I’, ‘B4’: ‘mPapaya’, ‘B5’: ’eqFP578’, ‘B6’: ’tdTomato’, ‘B7’: ‘DsRed’, ‘B8’: ‘mKate2’, ‘B9’: ‘EGFP’, ‘B10’: ‘mRuby2’, ‘B11’: ‘TagBFP’, ‘B12’: ‘mChartreuse_TF’, ‘C1’: ‘mLychee_TF’, ‘C2’: ‘mTagBFP2’, ‘C3’: ‘mEGFP’, ‘C4’: ‘mNeonGreen’, ‘C5’: ‘mAzamiGreen’, ‘C6’: ‘mWatermelon’, ‘C7’: ‘avGFP’, ‘C8’: ‘mCitrine’, ‘C9’: ‘mVenus’, ‘C10’: ‘mCherry’, ‘C11’: ‘mHoneydew’, ‘C12’: ‘TagRFP’, ‘D1’: ‘mTFP1’, ‘D2’: ‘Ultramarine’, ‘D3’: ‘ZsGreen1’, ‘D4’: ‘mMiCy’, ‘D5’: ‘mStayGold2’, ‘D6’: ‘PA_GFP’ }

volume_used = { ’egfp’: 0, ‘mlychee_tf’: 0, ’tagrfp’: 0, ‘mruby2’: 0, ‘mkate2’: 0, ‘mkate2_tf’: 0, ‘mko2’: 0 }

def update_volume_remaining(current_color, quantity_to_aspirate): rows = string.ascii_uppercase for well, color in list(well_colors.items()): if color == current_color: if (volume_used[current_color] + quantity_to_aspirate) > 250: # Move to next well horizontally by advancing row letter, keeping column number row = well[0] col = well[1:]

            # Find next row letter
            next_row = rows[rows.index(row) + 1]
            next_well = f"{next_row}{col}"
            
            del well_colors[well]
            well_colors[next_well] = current_color
            volume_used[current_color] = quantity_to_aspirate
        else:
            volume_used[current_color] += quantity_to_aspirate
        break

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

# 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])

# PCR Plate
temperature_plate = protocol.load_labware('opentrons_96_aluminumblock_generic_pcr_strip_200ul', 6)

# Agar Plate
agar_plate = protocol.load_labware('htgaa_agar_plate', AGAR_DECK_SLOT, 'Agar Plate')
agar_plate.set_offset(x=0.00, y=0.00, z=Z_VALUE_AGAR)

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

# Helper function (dispensing)
def dispense_and_jog(pipette, volume, location):
    assert(isinstance(volume, (int, float)))
    # Go above the location
    above_location = location.move(types.Point(z=location.point.z + 2))
    pipette.move_to(above_location)
    # Go downwards and dispense
    pipette.dispense(volume, location)
    # Go upwards to avoid smearing
    pipette.move_to(above_location)

# Helper function (color location)
def location_of_color(color_string):
    for well,color in well_colors.items():
        if color.lower() == color_string.lower():
            return temperature_plate[well]
    raise ValueError(f"No well found with color {color_string}")

# Print pattern by iterating over lists
for i, (current_color, point_list) in enumerate(point_name_pairing):
    # Skip the rest of the loop if the list is empty
    if not point_list:
        continue

    # Get the tip for this run, set the bacteria color, and the aspirate bacteria of choice
    pipette_20ul.pick_up_tip()
    max_aspirate = int(18 // POINT_SIZE) * POINT_SIZE
    quantity_to_aspirate = min(len(point_list)*POINT_SIZE, max_aspirate)
    update_volume_remaining(current_color, quantity_to_aspirate)
    pipette_20ul.aspirate(quantity_to_aspirate, location_of_color(current_color))

    # Iterate over the current points list and dispense them, refilling along the way
    for i in range(len(point_list)):
        x, y = point_list[i]
        adjusted_location = center_location.move(types.Point(x, y))

        dispense_and_jog(pipette_20ul, POINT_SIZE, adjusted_location)
        
        if pipette_20ul.current_volume == 0 and len(point_list[i+1:]) > 0:
            quantity_to_aspirate = min(len(point_list[i:])*POINT_SIZE, max_aspirate)
            update_volume_remaining(current_color, quantity_to_aspirate)
            pipette_20ul.aspirate(quantity_to_aspirate, location_of_color(current_color))

    # Drop tip between each color
    pipette_20ul.drop_tip()

Part 3: Post Lab Questions

  1. Automation Plan for Final Project The integration of automation tools, specifically the Opentrons, aims to minimize human intervention while maximizing precision in complex biological workflows. Below is the proposed strategy for utilizing automation in the final project.

A. Automation in Reaction Synthesis (Opentrons) Utilizing robotic systems to control contamination, increase accuracy, and improve reproducibility in large-scale transformation processes.

Procedures to Automate:

PCR & rt-PCR: Precise master mix preparation and DNA template distribution.

Bacterial Culture: Automated inoculations and serial dilutions.

Molecular Transformation: Systematic development of plasmid constructs.

Hardware Requirements: Custom 3D printed holders for non-standard tubes or specific labware geometries.

B. Automation in Marker Detection Integration of software and specialized hardware to standardize results and eliminate manual bias.

Software Integration: Utilizing ImageJ or Matlab for high-resolution image processing and automated gel electrophoresis analysis.

Quantification: Fluorescence, absorbance, and luminescence assays (e.g., mimicking the workflow of the Varioskan™ ALF Multimode Microplate Reader).

C. Automation in Data Analysis Leveraging computational tools to handle large-scale experimental statistics and expression data.

Tools: RStudio, Python, IBM SPSS Statistics, and Stata.

Applications:

Analyzing gene/protein expression trends.

Biostatistical comparison of experimental results.

  1. Literature Review: Automation in Biological Applications Case Study 1: DNA Assembly (AssemblyTron) Paper: AssemblyTron: flexible automation of DNA assembly with Opentrons OT-2 lab robots (2023)

Summary: This study introduces AssemblyTron, a Python-based package designed to automate the DNA assembly process. It streamlines the construction of plasmids and DNA fragments via homology or Golden Gate assembly.

Impact: Reduces human intervention to a minimum, ensuring high-fidelity assembly.

Link: Read Paper

Case Study 2: SARS-CoV-2 Diagnostic Strategy Paper: Efficient SARS-CoV-2 Quantitative Reverse Transcriptase PCR Saliva Diagnostic Strategy utilizing Open-Source Pipetting Robots

Summary: This research demonstrates a novel RT-qPCR method for saliva samples using open-source robots for the pipetting process.

Impact: Provides a cost-effective, scalable alternative to conventional manual methods while drastically reducing human experimental error.

Link: Read Paper

Case Study 3: Culture Media Inoculation Paper: Automation of inoculation in culture media for the microbiology laboratory

Summary: This article details the blueprint for an automated system dedicated to the inoculation of culture media.

Impact: Covers the entire production chain—from initial inoculation to disposal—significantly reducing contamination risks and mishandling.

Link: Read Paper

Additional Resource Review: Automated high-throughput DNA synthesis and assembly

Link: Read Review