I submitted my design but I still have some inquiries about the python file.
fromopentronsimporttypesimportstringmetadata={'protocolName':'Sarah Jimenez - Opentrons Art - HTGAA','author':'HTGAA','source':'HTGAA 2026','apiLevel':'2.20'}Z_VALUE_AGAR=2.0POINT_SIZE=1megfp_points=[(-4.4,24.2),(-2.2,24.2),(0,24.2),(-6.6,22),(-4.4,22),(2.2,22),(-6.6,19.8),(-4.4,19.8),(2.2,19.8),(-6.6,17.6),(-4.4,17.6),(-2.2,17.6),(0,17.6),(2.2,17.6),(-6.6,15.4),(-4.4,15.4),(-2.2,15.4),(-6.6,13.2),(-4.4,13.2),(-6.6,11),(-4.4,11),(-6.6,8.8),(-4.4,8.8),(-6.6,6.6),(-4.4,6.6),(-2.2,6.6),(-6.6,4.4),(-4.4,4.4),(-2.2,4.4),(-6.6,2.2),(-4.4,2.2),(-2.2,2.2),(-6.6,0),(-4.4,0),(-2.2,0),(-6.6,-2.2),(-4.4,-2.2),(-2.2,-2.2),(-6.6,-4.4),(-4.4,-4.4),(-2.2,-4.4),(-6.6,-6.6),(-4.4,-6.6),(-2.2,-6.6),(-6.6,-8.8),(-4.4,-8.8),(-2.2,-8.8),(-6.6,-11),(-4.4,-11),(-2.2,-11),(-6.6,-13.2),(-4.4,-13.2),(-2.2,-13.2),(-6.6,-15.4),(-4.4,-15.4),(-2.2,-15.4),(-4.4,-17.6)]mrfp1_points=[(-2.2,22),(0,22),(-2.2,19.8),(0,19.8),(0,15.4),(2.2,15.4),(-2.2,13.2),(0,13.2),(2.2,13.2),(4.4,13.2),(-2.2,11),(0,11),(2.2,11),(4.4,11),(-2.2,8.8),(0,8.8),(2.2,8.8),(4.4,8.8),(0,6.6),(2.2,6.6)]point_name_pairing=[("megfp",megfp_points),("mrfp1",mrfp1_points)]# Robot deck setup constantsTIP_RACK_DECK_SLOT=9COLORS_DECK_SLOT=6AGAR_DECK_SLOT=5PIPETTE_STARTING_TIP_WELL='A1'# Place the PCR tubes in this orderwell_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={'megfp':0,'mrfp1':0}defupdate_volume_remaining(current_color,quantity_to_aspirate):rows=string.ascii_uppercaseforwell,colorinlist(well_colors.items()):ifcolor==current_color:if(volume_used[current_color]+quantity_to_aspirate)>250:# Move to next well horizontally by advancing row letter, keeping column numberrow=well[0]col=well[1:]# Find next row letternext_row=rows[rows.index(row)+1]next_well=f"{next_row}{col}"delwell_colors[well]well_colors[next_well]=current_colorvolume_used[current_color]=quantity_to_aspirateelse:volume_used[current_color]+=quantity_to_aspiratebreakdefrun(protocol):# Load labware, modules and pipettesprotocol.home()# Tipstips_20ul=protocol.load_labware('opentrons_96_tiprack_20ul',TIP_RACK_DECK_SLOT,'Opentrons 20uL Tips')# Pipettespipette_20ul=protocol.load_instrument("p20_single_gen2","right",[tips_20ul])# Deep Well Platetemperature_plate=protocol.load_labware('nest_96_wellplate_2ml_deep',6)# Agar Plateagar_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 thiscenter_location=agar_plate['A1'].top()pipette_20ul.starting_tip=tips_20ul.well(PIPETTE_STARTING_TIP_WELL)# Helper function (dispensing)defdispense_and_jog(pipette,volume,location):assert(isinstance(volume,(int,float)))# Go above the locationabove_location=location.move(types.Point(z=location.point.z+2))pipette.move_to(above_location)# Go downwards and dispensepipette.dispense(volume,location)# Go upwards to avoid smearingpipette.move_to(above_location)# Helper function (color location)deflocation_of_color(color_string):forwell,colorinwell_colors.items():ifcolor.lower()==color_string.lower():returntemperature_plate[well]raiseValueError(f"No well found with color {color_string}")# Print pattern by iterating over listsfori,(current_color,point_list)inenumerate(point_name_pairing):# Skip the rest of the loop if the list is emptyifnotpoint_list:continue# Get the tip for this run, set the bacteria color, and the aspirate bacteria of choicepipette_20ul.pick_up_tip()max_aspirate=int(18//POINT_SIZE)*POINT_SIZEquantity_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 wayforiinrange(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)ifpipette_20ul.current_volume==0andlen(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 colorpipette_20ul.drop_tip()
Part 2: Opentrons on published science and project
2.1. Automated, high-throughput in-situ hybridization of Lytechinus pictus embryos
This study presents the development of an automated, high-throughput hybridization chain reaction (HT-HCR) pipeline optimized for whole-mount embryos of Lytechinus pictus, addressing a central technical limitation in developmental biology: the low scalability of conventional in situ hybridization. The authors engineered a miniaturized, robotics-based workflow capable of processing large probe sets in 96-well format with minimal reagent volumes and without manual intervention, followed by automated confocal imaging. Using this platform, they generated spatial expression data for over one hundred genes across multiple embryonic stages, encompassing transcription factors, signaling components, and physiological regulators. Importantly, the method preserves spatial resolution while dramatically increasing throughput, thereby enabling systematic construction of spatial gene expression atlases and facilitating integration with perturbation-based studies. Overall, this work represents a methodological advance that bridges classical embryological approaches with scalable spatial transcriptomics, significantly expanding the experimental capacity for gene regulatory network analysis in early development.
2.2. What about the project?
An Opentrons platform could be strategically integrated into the “exchangeable Fabs” workflow to automate and standardize the Design–Build–Test cycle of recombinant Fab production. At the molecular cloning stage, Opentrons could perform high-throughput Golden Gate or Gibson assemblies to systematically combine variable Fab regions with a standardized Fc backbone plasmid, followed by automated bacterial transformation, colony PCR setup, and plasmid prep normalization in 96-well format. For protein production, the system could prepare transfection mixes (e.g., HEK293 or CHO systems), seed cells, and manage media exchanges in small-scale expression screens to optimize Fab yield and stability. Downstream, Opentrons could automate affinity purification workflows (Protein A/G or Ni-NTA for tagged constructs) using magnetic bead–based protocols, ensuring reproducible wash and elution conditions while minimizing reagent waste—particularly relevant for resource-limited laboratories. Finally, in the validation phase, the robot could execute ELISA plate coating, blocking, serial dilutions, and detection antibody incubations to quantitatively screen binding affinity and specificity across multiple designed Fabs in parallel. Overall, implementing Opentrons would increase reproducibility, reduce hands-on time and antibody wastage, and enable scalable, semi-automated screening of in silico–designed Fab variants prior to functional characterization.