Element sources:
FoxA2 CDS: rat NM_012743, positions 190–1569 (1380 nt), stop codon removed
mCherry: Shaner et al. (2004)
All other elements identical to Construct 1
LOCUS FoxA2_RFP_IVT_template 3739 bp DNA linear
DEFINITION FoxA2-mCherry fusion IVT template in pTwist Amp High Copy
ACCESSION .
VERSION .
KEYWORDS FoxA2; mCherry; RFP; IVT; mRNA; dopaminergic; PC12
SOURCE synthetic construct
ORGANISM synthetic construct
FEATURES Location/Qualifiers
misc_feature 1..10
/label="5prime_buffer"
promoter 11..27
/label="T7_promoter"
5'UTR 28..71
/label="5prime_UTR"
regulatory 72..80
/label="Kozak"
CDS 78..1457
/label="FoxA2_CDS"
/note="rat NM_012743, stop codon removed"
misc_feature 1458..1481
/label="GGGSGGGGS_linker"
CDS 1482..2198
/label="mCherry"
/note="Shaner et al. 2004"
misc_feature 2199..2201
/label="stop_codon"
/note="TAA"
3'UTR 2202..2295
/label="3prime_UTR"
misc_feature 2296..2303
/label="3prime_buffer"
/note="GCGGCCGC"
ORIGIN
1 aaaacccaaa taatacgact cactataggg aaataagaga gaaaagaaga gtaagaagaa
61 atataagagc cgccaccatg ctgggagcag tgaagatgga agggcacgag ccatccgact
121 ggttcagctc tggggaggcc gcaggctcgg cctctgagac tccggcgggc accgagtccc
181 cccattccag cgcttctccg tgtcaggagc acaagcgagg tggcctgagc gagctgaagg
241 gaacacctgc ctctgcgctg agtcctccgg agccggcgcc ctcgcctggg cagcagcagc
301 aggctgcagc ccacctgctg gtcccacctc accatcctgg cctgccacca gaggcccacc
361 tgaagcccga gcaccattac gccttcaacc accccttctc tatcaacaac ctcatgtcct
421 ccgagcagca acatcatcac agccaccacc accatcagcc ccacaaaatg gacctcaaga
481 cctacgaaca ggtcatgcac taccctgggg gctacggttc ccccatgcca ggcagcttgg
541 ccatgggccc agtcacgaac aaagccggcc tggatgcctc gcccctggct gcagacactt
601 cctactacca gggagtgtac tccaggccta ttatgaactc gtcctaaggc ggcggctccg
661 gcggcggctc catggtgagc aagggcgagg aggataacat ggccatcatc aaggagttca
721 tgcgcttcaa ggtgcacatg gagggctccg tgaacggcca cgagttcgag atcgagggcg
781 agggcgaggg ccgcccctac gagggcaccc agaccgccaa gctgaaggtg accaagggcg
841 gcccgctgcc cttcgcctgg gacatcctgt cccctcagtt catgtacggc tccaaggcct
901 acgtgaagca ccccgccgac atccccgact acttgaagct gtccttcccc gagggcttca
961 agtgggagcg cgtgatgaac ttcgaggacg gcggcgtggt gaccgtgacc caggactcct
1021 ccctgcagga cggcgagttc atctacaagg tgaagctgcg cggcaccaac ttcccctccg
1081 acggccccgt aatgcagaag aagaccatgg gctgggaggc ctccaccgag cggatgtacc
1141 ccgaggacgg cgccctgaag ggcgagatca agcagaggct gaagctgaag gacggcggcc
1201 actacgacgc cgaggtcaag accacctaca aggccaagaa gcccgtgcag ctgcccggcg
1261 cctacaacgt caacatcaag ctggacatca cctcccacaa cgaggactac accatcgtgg
1321 agcagtacga gcgcgccgag ggccgccact ccaccggcgg catggacgag ctgtacaagt
1381 aatgccttct gcggggcttg ccttctggcc atgcccttct tctctccctt gcacctgtac
1441 ctcttggtct ttgaataaag cctgagtagg aagtgagggt gaagagcctg cacctcggcg
1501 cggccgc
//These constructs are ordered, validated, and codon optimized via Twist Bioscience. Below are some evidences of the validation:
Custom labware for Opentrons OT-2 3D-printed custom labware microfluidic plate with inlets and outlets for OT2.
The design was first prototyped via Flui3D:
They were tested and designed to fit within a single-well plate in its first iteration.
The following are then prototyped and modeled in Blender, 3D-printed, and then converted into Opentrons JSON using Labware Creator.
Opentrons OT-2 Deck Layout Design Experimental Protocol and Automated Workflows Here is a simplified version of the experimental protocol - more detailed version in appendix.
Step 1 — Sequence design and SecureDNA screening Method: Sequences designed in Benchling. All sequences submitted to SecureDNA for screening prior to ordering.
Automation: Manual — Benchling platform
Plate: N/A
Expected result: Sequences cleared — no sequences of concern identified
Timeline: Day 1 — 2 hours
Step 2 — Twist Bioscience DNA order ###eSer
Method: Insert sequences submitted to Twist Bioscience as clonal gene orders in pTwist Amp High Copy. Two constructs ordered: Nurr1-GFP IVT template and FoxA2-RFP IVT template.
Automation: Twist online ordering portal
Plate: N/A (Twist ships as glycerol stock or resuspended plasmid)
Expected result: Plasmid delivery in 7-10 business days
Timeline: Day 1 — 30 minutes submission
Step 3 — Cell-free mRNA expression validation Method: Upon receipt of Twist plasmids, validate construct expression using cell-free protein synthesis (CFPS) before committing to full IVT and PC12 transfection. Plasmid transcribed in vitro using HiScribe T7 kit. Resulting mRNA added to cell-free expression system. GFP and mCherry fluorescence measured to confirm both fusion proteins are produced.
Automation: Echo525 — acoustic liquid transfer of CFPS reagents to 384 Greiner black-well clear-bottom plate ; PHERAstar FSX — fluorescence detection (GFP: ex 488/em 520; mCherry: ex 555/em 610)
Plate: 384 Greiner black-well clear-bottom
Expected result: Fluorescence signal above background in construct wells; no signal in no-template controls
Timeline: Day 10-11 (upon Twist delivery)
Method: Both Twist plasmids transformed into NEB 10-beta competent E. coli. Overnight culture on LB + ampicillin (100 µg/ml) plates. 3-6 colonies picked per construct for overnight liquid culture.
Automation: Manual transformation; Cytomat shaking incubator for overnight bacterial growth
Plate: N/A (standard Petri dishes)
Expected result: 10-100 colonies per construct
Timeline: Day 10-11
Step 5 — Miniprep and sequencing verification Method: GeneJET Miniprep Kit. Elute in 50 µl elution buffer. Quantify by Nanodrop. Send one sample per construct for Sanger sequencing. Verify T7 promoter, 5’UTR, Kozak, CDS, linker junction, fluorescent protein, stop codon, and 3’UTR all intact.
Automation: HiG Centrifuge for miniprep spins
Plate: N/A
Expected result: >50 ng/µl, A260/280 ratio 1.8-2.0. Sequencing confirms all junctions correct.
Timeline: Day 12-13
Step 6 — Template linearisation and IVT Method: Plasmid linearised by KpnI digestion (1 hour, 37°C). Linearisation verified on 1% agarose gel. Purified by GeneJET PCR purification. IVT performed using HiScribe T7 High Yield RNA Synthesis Kit (2 hours, 37°C). TURBO DNase added to remove template (15 min). Poly-A tail added enzymatically using E. coli Poly-A Polymerase (NEB M0276, 45 min). mRNA purified by RNeasy Mini Kit. Quantified by Nanodrop. Quality verified on agarose gel.
Automation: Inheco Plate Incubator for IVT reaction; HiG Centrifuge for RNeasy spins
Plate: N/A (microcentrifuge tubes — RNase-free)
Expected result: Single clean mRNA band on gel. Yield 50-100 µg per reaction. A260/280 ~2.0.
Timeline: Day 14 — full day
Step 7 — PC12 cell thawing and expansion Method: PC12 CRL-1721 (suspension variant) thawed from liquid nitrogen into warm growth medium (DMEM + 10% horse serum + 5% FBS + 1% P/S). Expanded in T25 flask. Passage 15-25 cells used throughout.
Automation: Manual — laminar flow hood and CO2 incubator
Plate: T25 flask
Expected result: Cells attach as clusters; healthy morphology by Day 2
Timeline: Day 1 (parallel with DNA work)
Step 8 — Plate coating (PDL + Collagen Type I) Method: 6-well plates coated sequentially. PDL (50 µg/ml) applied for 1 hour at RT, aspirated, dried. Collagen Type I (10 µg/ml in PBS) applied overnight at 4°C. Residual collagen left on surface — not washed.
Automation: Opentrons OT-2 with P300 single channel — PDL and collagen dispense steps
Plate: Corning 6-well flat bottom plate
Expected result: Uniform coating visible; cells will adhere and extend neurites
Timeline: Day 7-8
Step 9 — PC12 cell plating and NGF differentiation Method: Cells broken up using syringe (18G x2, 22G x3, 25G x3). Counted by haemocytometer. Plated at 50,000 cells/well in growth medium. After 24h, switched to differentiation medium (DMEM + 1% horse serum + 1% P/S + 100 ng/ml rat NGF). Media changed every 48h with fresh NGF for 14 days.
Automation: Opentrons OT-2 — media change steps (aspirate 1ml, dispense 1ml fresh NGF medium per well, 6 wells per run, every 48h)
Plate: Corning 6-well flat bottom plate
Expected result: Neurites visible by Day 10-11; mature network by Day 14
Timeline: Days 8-22
Step 10 — Daily mRNA transfection (Days 15-21) Method: Per well: Tube A — 25 µl Opti-MEM + 500 ng mRNA total (250 ng Nurr1-GFP + 250 ng FoxA2-RFP for experimental wells). Tube B — 25 µl Opti-MEM + 1.5 µl MessengerMAX. Combine, incubate 5 min. Remove half media from well. Add complex dropwise. Rock plate. Incubate 4 hours. Replace with fresh NGF differentiation medium. Repeat daily for 7 days.
Automation: Opentrons OT-2 — complex addition, half-media removal, fresh medium addition
Plate: Corning 6-well flat bottom
Expected result: GFP and RFP nuclear fluorescence visible from Day 16. Yellow overlap cells (both TFs) appear by Day 17-18.
Timeline: Days 15-21 daily
Step 11 — Live fluorescence imaging Method: Cells imaged at 10x and 20x on fluorescence microscope. GFP channel (ex 488/em 520) for Nurr1-GFP. RFP channel (ex 555/em 610) for FoxA2-RFP. Merged image assessed for yellow double-positive cells. GFP and RFP signal in nucleus confirms correct transcription factor localisation.
Automation: Spark Plate Reader — fluorescence quantification in plate format (if 96-well plate format used); manual fluorescence microscope for imaging
Plate: 96-round-axygen-pdw11cs-halfdeep for Spark quantification of conditioned media samples
Expected result: 20-40% cells GFP+, 20-40% RFP+, 10-20% yellow double-positive
Timeline: Days 16, 18, 20
Step 12 — TH immunostaining (Day 20) Method: Cells fixed with 4% PFA (15 min RT). Washed 3x PBS. Permeabilised with 0.25% Triton X-100 (10 min). Blocked with 3% BSA (1 hour). Anti-TH primary antibody (1:500, overnight 4°C). Secondary antibody Alexa Fluor 647 (1:500, 1 hour RT). DAPI (1:1000, 5 min). Imaged on fluorescence microscope. Far-red channel (Alexa 647) does not overlap with GFP or mCherry.
Automation: Manual immunostaining
Plate: Corning 6-well
Expected result: Nurr1-GFP + FoxA2-RFP co-transfected wells show 3-5x higher TH fluorescence than single-TF or negative controls
Timeline: Day 20-21
Step 13 — Dopamine ELISA (Days 18 and 21) Method: Replace medium with serum-free DMEM 2 hours before collection. Add 56 mM KCl to stimulate dopamine release (15 min). Collect 200 µl conditioned medium per well into pre-chilled tubes. Centrifuge 300 x g for 5 min. Transfer supernatant. Run high-sensitivity dopamine ELISA (Eagle Biosciences) following kit protocol. Read absorbance at 450 nm.
Automation: Opentrons OT-2 — media collection and transfer to 96-well ELISA plate; Spark Plate Reader — absorbance at 450 nm; Plateloc — seal ELISA plate during incubation steps
Plate: 96-round-axygen-pdw11cs-halfdeep (sample collection); 96-Armadillo-PCR-AB2396X (ELISA)
Expected result: Nurr1-GFP + FoxA2-RFP wells show 3-5x dopamine above baseline. Target: 5-50 nM.
Timeline: Days 18 and 21
Step 14 — Closed-loop Opentrons RL experiment (Day 21) Method: Python script on Opentrons OT-2. Baseline ELISA read → deliver dopamine stimulus (1 µM start) → 15 min incubation → collect media sample → ELISA read → Python threshold decision → escalate to 5 µM if above threshold or maintain. Repeat 3-5 cycles.
Automation: Opentrons OT-2 — all liquid handling; Spark Plate Reader — ELISA absorbance reads between cycles
Plate: Corning 6-well (cells); 96-Armadillo-PCR-AB2396X (ELISA reads)
Expected result: Measurable dopamine concentration change with each stimulus cycle. Loop runs without error. State signal varies with stimulus.
Timeline: Day 21 — 6-8 hour session
Example code for automated RL chemical delivery and signal readout The example code aims to deliver:
Baseline media sampling for ELISA Dopamine stimulus delivery Post-stimulus media sampling Fresh media replenishment between cycles The python RL agent will attempt to read ELISA dopamine concentration values (either entered manually between cycles, or via plate reader API if available) and decides the next stimulus concentration based on threshold logic (Aim 1) or Q-learning (extending Aim 2)
This may be adapted to be used with custom labware in the future, currently it uses the following commercially available well plates and tip racks:
Slot 1: NEST 12-well reservoir — reagents
A1 = Dopamine 1 µM (in DMEM + 0.1 mg/ml ascorbic acid)
A2 = Dopamine 5 µM (in DMEM + 0.1 mg/ml ascorbic acid)
A3 = Dopamine 10 µM (in DMEM + 0.1 mg/ml ascorbic acid)
A4 = PBS wash buffer
A5 = Fresh differentiation medium + NGF (100 ng/ml)
A6 = Waste
Slot 2: Corning 6-well plate — PC12 cells
Wells A1-A3: experimental wells (Nurr1-GFP + FoxA2-RFP)
Wells B1-B3: control wells (NGF only / GFP only / RFP only)
Slot 3: 96-well flat bottom plate — ELISA sample collection
Row A: Cycle 0 baseline samples (wells A1-A6 from cell plate)
Row B: Cycle 1 post-stimulus samples
Row C: Cycle 2 post-stimulus samples
Row D: Cycle 3 post-stimulus samples
Row E: Cycle 4 post-stimulus samples
Row F: Cycle 5 post-stimulus samples
Slot 4: Opentrons 96 tip rack (300 µl)
Slot 5: Opentrons 96 tip rack (300 µl) — second rack for long sessions
from opentrons import protocol_api
import time
# ============================================================
# METADATA
# ============================================================
metadata = {
'apiLevel': '2.13',
'protocolName': 'Organoid-lab-on-a-chip:RL-Loop',
'author': 'Jenn Leung',
'description': (
'Closed-loop dopamine reinforcement learning in NGF-differentiated '
'PC12 cells transfected with Nurr1-GFP and FoxA2-RFP mRNA. '
'Opentrons delivers dopamine stimuli and collects media samples. '
'ELISA reads dopamine concentration as the RL state signal.'
)
}
# ============================================================
# EXPERIMENTAL PARAMETERS — edit these before each run
# ============================================================
# Number of RL cycles to run (each cycle = stimulus delivery + wait + sample)
N_CYCLES = 5
# Incubation time after each dopamine stimulus (minutes)
INCUBATION_MIN = 15
# Volume to sample for ELISA per well (µl)
SAMPLE_VOLUME_UL = 150
# Volume of dopamine stimulus to deliver per well (µl)
STIMULUS_VOLUME_UL = 100
# Volume of fresh media to add after each cycle (µl)
MEDIA_REPLENISH_UL = 500
# Dopamine concentration threshold for reward decision (nM)
# Set this based on your Day 18 baseline ELISA reading
REWARD_THRESHOLD_NM = 15.0
# Starting stimulus — 'low', 'medium', or 'high'
INITIAL_STIMULUS = 'low'
# Wells to treat as experimental (Nurr1-GFP + FoxA2-RFP)
EXPERIMENTAL_WELLS = ['A1', 'A2', 'A3']
# Wells to treat as controls
CONTROL_WELLS = ['B1', 'B2', 'B3']
# All wells combined
ALL_WELLS = EXPERIMENTAL_WELLS + CONTROL_WELLS
# ============================================================
# RL AGENT — Threshold Logic (Aim 1)
# ============================================================
class ThresholdRLAgent:
"""
Simple threshold-based RL agent for Aim 1.
Logic:
- If dopamine above threshold → reward (escalate to next stimulus level)
- If dopamine below threshold → withhold (maintain or reduce stimulus)
State: dopamine concentration (nM) from ELISA
Action: stimulus concentration to deliver next cycle
"""
def __init__(self, threshold_nm, initial_stimulus='low'):
self.threshold_nm = threshold_nm
self.stimulus_levels = {
'none': 0,
'low': 1, # 1 µM dopamine
'medium': 5, # 5 µM dopamine
'high': 10 # 10 µM dopamine
}
self.current_stimulus = initial_stimulus
self.history = []
def decide(self, dopamine_nm):
"""
Given current dopamine reading, decide next stimulus.
Args:
dopamine_nm (float): dopamine concentration in nM from ELISA
Returns:
str: stimulus level for next cycle ('low', 'medium', 'high')
float: reward value (+1, 0, or -1)
"""
reward = 0.0
if dopamine_nm >= self.threshold_nm:
reward = 1.0
# Escalate to next level if not already at max
if self.current_stimulus == 'low':
next_stimulus = 'medium'
elif self.current_stimulus == 'medium':
next_stimulus = 'high'
else:
next_stimulus = 'high' # Already at max — maintain
else:
reward = -0.5
# Reduce or maintain
if self.current_stimulus == 'high':
next_stimulus = 'medium'
elif self.current_stimulus == 'medium':
next_stimulus = 'low'
else:
next_stimulus = 'low'
self.history.append({
'dopamine_nm': dopamine_nm,
'stimulus': self.current_stimulus,
'reward': reward,
'next_stimulus': next_stimulus
})
self.current_stimulus = next_stimulus
return next_stimulus, reward
def get_stimulus_reservoir(self, stimulus_level):
"""Return reservoir well for given stimulus level."""
mapping = {
'low': 'A1', # 1 µM
'medium': 'A2', # 5 µM
'high': 'A3' # 10 µM
}
return mapping.get(stimulus_level, 'A1')
def print_summary(self):
"""Print RL session summary."""
print("\n" + "="*60)
print("RL SESSION SUMMARY")
print("="*60)
print(f"Threshold: {self.threshold_nm} nM")
print(f"Cycles completed: {len(self.history)}")
print(f"\nCycle-by-cycle results:")
print(f"{'Cycle':>6} {'Dopamine (nM)':>14} {'Stimulus':>10} {'Reward':>8} {'Next':>10}")
print("-"*55)
for i, h in enumerate(self.history):
print(
f"{i+1:>6} "
f"{h['dopamine_nm']:>14.1f} "
f"{h['stimulus']:>10} "
f"{h['reward']:>8.1f} "
f"{h['next_stimulus']:>10}"
)
total_reward = sum(h['reward'] for h in self.history)
print(f"\nTotal reward: {total_reward:.1f}")
print("="*60)
# ============================================================
# RL AGENT — Q-Learning (Aim 2 extension)
# ============================================================
class QLearningRLAgent:
"""
Q-learning agent for Aim 2 — more sophisticated RL.
State space: dopamine concentration binned into discrete levels
Action space: stimulus concentrations (none, low, medium, high)
Q-table updated after each cycle using Bellman equation.
Epsilon-greedy exploration allows agent to occasionally try
non-optimal actions to discover better strategies.
"""
def __init__(self, threshold_nm, alpha=0.1, gamma=0.9, epsilon=0.2):
"""
Args:
threshold_nm: reward threshold in nM
alpha: learning rate (0-1) — how fast Q-values update
gamma: discount factor (0-1) — how much future rewards matter
epsilon: exploration rate (0-1) — random action probability
"""
import numpy as np
self.np = np
self.threshold_nm = threshold_nm
self.alpha = alpha
self.gamma = gamma
self.epsilon = epsilon
# State bins — dopamine concentration ranges (nM)
self.state_bins = [0, 5, 10, 20, 40, 80, float('inf')]
self.n_states = len(self.state_bins) - 1
# Actions
self.actions = ['none', 'low', 'medium', 'high']
self.n_actions = len(self.actions)
# Q-table initialised to zero
self.q_table = np.zeros((self.n_states, self.n_actions))
self.history = []
self.current_state = 0
def get_state(self, dopamine_nm):
"""Bin continuous dopamine reading into discrete state."""
for i in range(len(self.state_bins) - 1):
if self.state_bins[i] <= dopamine_nm < self.state_bins[i + 1]:
return i
return self.n_states - 1
def get_reward(self, dopamine_before, dopamine_after):
"""
Reward based on change in dopamine release.
Positive reward for increase above threshold.
Negative reward for decrease.
"""
delta = dopamine_after - dopamine_before
if dopamine_after >= self.threshold_nm and delta > 0:
return 1.0
elif delta > 5:
return 0.5
elif delta < -5:
return -0.5
else:
return 0.0
def choose_action(self, state):
"""Epsilon-greedy action selection."""
import random
if random.random() < self.epsilon:
return random.randint(0, self.n_actions - 1)
return int(self.np.argmax(self.q_table[state]))
def update(self, state, action_idx, reward, next_state):
"""Q-learning update rule (Bellman equation)."""
current_q = self.q_table[state, action_idx]
max_next_q = self.np.max(self.q_table[next_state])
new_q = current_q + self.alpha * (
reward + self.gamma * max_next_q - current_q
)
self.q_table[state, action_idx] = new_q
def decide(self, dopamine_before, dopamine_after):
"""Full Q-learning update and next action decision."""
state = self.get_state(dopamine_before)
next_state = self.get_state(dopamine_after)
reward = self.get_reward(dopamine_before, dopamine_after)
# Get action that was taken (stored from previous cycle)
action_idx = getattr(self, '_last_action_idx', 1)
# Update Q-table
self.update(state, action_idx, reward, next_state)
# Choose next action
next_action_idx = self.choose_action(next_state)
self._last_action_idx = next_action_idx
next_action = self.actions[next_action_idx]
self.history.append({
'dopamine_before': dopamine_before,
'dopamine_after': dopamine_after,
'state': state,
'next_state': next_state,
'reward': reward,
'next_action': next_action
})
return next_action, reward
def get_stimulus_reservoir(self, stimulus_level):
mapping = {
'none': None,
'low': 'A1',
'medium': 'A2',
'high': 'A3'
}
return mapping.get(stimulus_level)
def print_q_table(self):
"""Print current Q-table values."""
print("\nQ-TABLE (rows=states, cols=actions)")
print(f"{'State (nM)':>15}", end="")
for a in self.actions:
print(f"{a:>10}", end="")
print()
state_labels = ['0-5', '5-10', '10-20', '20-40', '40-80', '80+']
for i, label in enumerate(state_labels):
print(f"{label:>15}", end="")
for j in range(self.n_actions):
print(f"{self.q_table[i,j]:>10.3f}", end="")
print()
# ============================================================
# MAIN PROTOCOL
# ============================================================
def run(protocol: protocol_api.ProtocolContext):
# ----------------------------------------------------------
# LABWARE SETUP
# ----------------------------------------------------------
# Tip racks
tiprack_1 = protocol.load_labware(
'opentrons_96_tiprack_300ul', 4,
label='Tip Rack 1'
)
tiprack_2 = protocol.load_labware(
'opentrons_96_tiprack_300ul', 5,
label='Tip Rack 2'
)
# Reagent reservoir (NEST 12-well)
reservoir = protocol.load_labware(
'nest_12_reservoir_15ml', 1,
label='Reagent Reservoir'
)
# PC12 cell plate (6-well)
cell_plate = protocol.load_labware(
'corning_6_wellplate_16.8ml_flat', 2,
label='PC12 Cell Plate'
)
# ELISA sample collection plate (96-well flat)
elisa_plate = protocol.load_labware(
'corning_96_well_plate_360ul_flat', 3,
label='ELISA Sample Plate'
)
# ----------------------------------------------------------
# REAGENT POSITIONS
# ----------------------------------------------------------
dopamine_1uM = reservoir['A1'] # Low stimulus
dopamine_5uM = reservoir['A2'] # Medium stimulus
dopamine_10uM = reservoir['A3'] # High stimulus
pbs_wash = reservoir['A4'] # PBS wash
fresh_medium = reservoir['A5'] # Fresh NGF differentiation medium
waste = reservoir['A6'] # Liquid waste
stimulus_wells = {
'low': dopamine_1uM,
'medium': dopamine_5uM,
'high': dopamine_10uM
}
# ----------------------------------------------------------
# PIPETTE SETUP
# ----------------------------------------------------------
p300 = protocol.load_instrument(
'p300_single_gen2',
mount='right',
tip_racks=[tiprack_1, tiprack_2]
)
# ----------------------------------------------------------
# ELISA PLATE MAP
# Row A = baseline (cycle 0)
# Row B = cycle 1
# Row C = cycle 2 ... etc.
# Columns 1-3 = experimental wells A1,A2,A3
# Columns 4-6 = control wells B1,B2,B3
# ----------------------------------------------------------
elisa_row_letters = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H']
def get_elisa_well(cycle, well_index):
"""
Get ELISA plate well for a given cycle and cell plate well.
cycle 0 = baseline, cycle 1-5 = post-stimulus
well_index 0-5 corresponds to A1,A2,A3,B1,B2,B3
"""
row = elisa_row_letters[cycle]
col = well_index + 1
return elisa_plate[f'{row}{col}']
# ----------------------------------------------------------
# RL AGENT INITIALISATION
# Change QLearningRLAgent to ThresholdRLAgent for Aim 1
# ----------------------------------------------------------
agent = ThresholdRLAgent(
threshold_nm=REWARD_THRESHOLD_NM,
initial_stimulus=INITIAL_STIMULUS
)
# ----------------------------------------------------------
# HELPER FUNCTIONS
# ----------------------------------------------------------
def collect_sample(cell_well, elisa_well, volume_ul):
"""
Collect conditioned medium sample from cell well
and transfer to ELISA plate.
Always uses a fresh tip.
"""
p300.pick_up_tip()
p300.aspirate(volume_ul, cell_plate[cell_well].bottom(z=2))
p300.dispense(volume_ul, elisa_well)
p300.blow_out(elisa_well)
p300.drop_tip()
def deliver_stimulus(cell_well, stimulus_level, volume_ul):
"""
Deliver dopamine stimulus to cell well.
Always uses a fresh tip.
"""
if stimulus_level == 'none':
protocol.comment(f' Withholding stimulus for {cell_well}')
return
source = stimulus_wells[stimulus_level]
p300.pick_up_tip()
p300.aspirate(volume_ul, source)
p300.dispense(volume_ul, cell_plate[cell_well].bottom(z=3))
# Gentle mix — 3 times at 80 µl to avoid disturbing cells
p300.mix(3, 80, cell_plate[cell_well].bottom(z=3))
p300.blow_out(cell_plate[cell_well].top(z=-5))
p300.drop_tip()
def replenish_medium(cell_well, volume_ul):
"""
Add fresh differentiation medium + NGF to well.
Always uses a fresh tip.
"""
p300.pick_up_tip()
# Aspirate from side to avoid disturbing cells/neurites
p300.aspirate(volume_ul, fresh_medium)
# Dispense gently to side of well, not directly onto cells
p300.dispense(volume_ul, cell_plate[cell_well].bottom(z=5))
p300.drop_tip()
def get_dopamine_reading():
"""
Pause protocol and prompt user to enter ELISA reading.
In Aim 2, this would be replaced by a direct plate reader API call.
Returns:
float: dopamine concentration in nM
"""
protocol.pause(
'ELISA READING REQUIRED\n'
'Run ELISA on collected samples now.\n'
'Note dopamine concentration (nM) for experimental wells.\n'
'Resume protocol when ready.'
)
# In a real run, you would either:
# (a) manually note the reading and resume
# (b) integrate with Spark Plate Reader API to read automatically
# Returning a placeholder here — replace with actual reading logic
# For automated integration:
# from spark_api import SparkReader
# reader = SparkReader()
# reading = reader.read_absorbance(plate=elisa_plate, wavelength=450)
# dopamine_nm = calculate_from_standard_curve(reading)
# return dopamine_nm
return 0.0 # Replace with actual reading
# ----------------------------------------------------------
# PROTOCOL EXECUTION
# ----------------------------------------------------------
protocol.comment("="*60)
protocol.comment("ASSEMBLOID AGENCY — BIOCHEMICAL RL LOOP")
protocol.comment(f"Cycles: {N_CYCLES}")
protocol.comment(f"Incubation per cycle: {INCUBATION_MIN} min")
protocol.comment(f"Reward threshold: {REWARD_THRESHOLD_NM} nM")
protocol.comment(f"Initial stimulus: {INITIAL_STIMULUS}")
protocol.comment("="*60)
# ----------------------------------------------------------
# STEP 1: COLLECT BASELINE SAMPLES (Cycle 0)
# ----------------------------------------------------------
protocol.comment("\n--- BASELINE SAMPLING (Cycle 0) ---")
all_wells = EXPERIMENTAL_WELLS + CONTROL_WELLS
for well_idx, well in enumerate(all_wells):
elisa_dest = get_elisa_well(cycle=0, well_index=well_idx)
protocol.comment(f' Collecting baseline from {well} → ELISA {elisa_dest}')
collect_sample(well, elisa_dest, SAMPLE_VOLUME_UL)
# Prompt for baseline ELISA reading
protocol.pause(
'BASELINE ELISA\n'
'Run ELISA on Row A of sample plate.\n'
'Record baseline dopamine (nM) for each well.\n'
'This sets your reference point for RL decisions.\n'
'Resume when ready.'
)
# ----------------------------------------------------------
# STEP 2: DELIVER INITIAL STIMULUS
# ----------------------------------------------------------
protocol.comment(f"\n--- INITIAL STIMULUS DELIVERY ({INITIAL_STIMULUS}) ---")
current_stimulus = INITIAL_STIMULUS
for well in EXPERIMENTAL_WELLS:
protocol.comment(f' Delivering {current_stimulus} dopamine to {well}')
deliver_stimulus(well, current_stimulus, STIMULUS_VOLUME_UL)
# Controls receive PBS instead of dopamine
for well in CONTROL_WELLS:
protocol.comment(f' PBS to control well {well}')
p300.pick_up_tip()
p300.aspirate(STIMULUS_VOLUME_UL, pbs_wash)
p300.dispense(STIMULUS_VOLUME_UL, cell_plate[well].bottom(z=3))
p300.drop_tip()
# ----------------------------------------------------------
# STEP 3: RL CYCLES
# ----------------------------------------------------------
dopamine_before = REWARD_THRESHOLD_NM # Starting estimate — updated by ELISA
for cycle in range(1, N_CYCLES + 1):
protocol.comment(f"\n{'='*60}")
protocol.comment(f"RL CYCLE {cycle} of {N_CYCLES}")
protocol.comment(f"Current stimulus: {current_stimulus}")
protocol.comment(f"{'='*60}")
# ---- INCUBATION ----
protocol.comment(f" Incubating {INCUBATION_MIN} minutes...")
protocol.delay(
minutes=INCUBATION_MIN,
msg=f'RL Cycle {cycle} — stimulus incubation. '
f'Keep cells on deck. Resume automatically.'
)
# ---- COLLECT POST-STIMULUS SAMPLES ----
protocol.comment(f" Collecting post-stimulus samples (Cycle {cycle})...")
for well_idx, well in enumerate(all_wells):
elisa_dest = get_elisa_well(cycle=cycle, well_index=well_idx)
protocol.comment(f' {well} → ELISA {elisa_dest}')
collect_sample(well, elisa_dest, SAMPLE_VOLUME_UL)
# ---- GET ELISA READING ----
# In Aim 1: manual ELISA run, user enters reading, resumes
# In Aim 2: automated plate reader API call
dopamine_after = get_dopamine_reading()
# ---- RL DECISION ----
protocol.comment(f"\n RL DECISION:")
protocol.comment(f" Dopamine before: {dopamine_before:.1f} nM")
protocol.comment(f" Dopamine after: {dopamine_after:.1f} nM")
next_stimulus, reward = agent.decide(dopamine_after)
protocol.comment(f" Reward: {reward:.1f}")
protocol.comment(f" Next stimulus: {next_stimulus}")
# ---- REPLENISH MEDIUM ----
protocol.comment(" Replenishing medium...")
for well in all_wells:
replenish_medium(well, MEDIA_REPLENISH_UL)
# ---- DELIVER NEXT STIMULUS ----
if cycle < N_CYCLES:
protocol.comment(f" Delivering {next_stimulus} stimulus...")
for well in EXPERIMENTAL_WELLS:
deliver_stimulus(well, next_stimulus, STIMULUS_VOLUME_UL)
for well in CONTROL_WELLS:
p300.pick_up_tip()
p300.aspirate(STIMULUS_VOLUME_UL, pbs_wash)
p300.dispense(STIMULUS_VOLUME_UL, cell_plate[well].bottom(z=3))
p300.drop_tip()
# Update tracking variables
dopamine_before = dopamine_after
current_stimulus = next_stimulus
# ----------------------------------------------------------
# STEP 4: FINAL SUMMARY
# ----------------------------------------------------------
agent.print_summary()
protocol.comment("\n" + "="*60)
protocol.comment("RL SESSION COMPLETE")
protocol.comment(f"Total cycles completed: {N_CYCLES}")
protocol.comment("ELISA sample plate is ready for final analysis.")
protocol.comment("Return cells to incubator if further culture needed.")
protocol.comment("="*60)
protocol.pause(
'SESSION COMPLETE\n'
'Collect ELISA sample plate for final analysis.\n'
'Return PC12 cell plate to incubator.\n'
'Check RL summary printed to console.'
)
# ============================================================
# STANDALONE SIMULATION MODE
# Run this file directly (not via Opentrons App) to simulate
# the RL agent logic without hardware
# ============================================================
if __name__ == '__main__':
"""
Simulate the RL agent logic offline.
Useful for testing threshold and Q-learning parameters
before running on the actual OT-2.
Usage:
python assembloid_rl_protocol.py
"""
print("ASSEMBLOID AGENCY — RL Agent Simulation (no hardware)")
print("="*60)
# Simulated dopamine readings (nM) — replace with real ELISA values
simulated_readings = [8.2, 12.4, 18.6, 24.3, 38.7, 41.2]
# Test threshold agent
print("\n--- THRESHOLD AGENT SIMULATION ---")
threshold_agent = ThresholdRLAgent(
threshold_nm=15.0,
initial_stimulus='low'
)
for i, reading in enumerate(simulated_readings[1:], 1):
stimulus, reward = threshold_agent.decide(reading)
print(
f"Cycle {i}: "
f"dopamine={reading:.1f} nM | "
f"reward={reward:.1f} | "
f"next stimulus={stimulus}"
)
threshold_agent.print_summary()
# Test Q-learning agent
print("\n--- Q-LEARNING AGENT SIMULATION ---")
try:
import numpy as np
q_agent = QLearningRLAgent(
threshold_nm=15.0,
alpha=0.1,
gamma=0.9,
epsilon=0.2
)
q_agent._last_action_idx = 1 # Start with 'low'
readings_before = simulated_readings[:-1]
readings_after = simulated_readings[1:]
for i, (before, after) in enumerate(
zip(readings_before, readings_after), 1
):
action, reward = q_agent.decide(before, after)
print(
f"Cycle {i}: "
f"before={before:.1f} nM | "
f"after={after:.1f} nM | "
f"reward={reward:.1f} | "
f"next={action}"
)
q_agent.print_q_table()
except ImportError:
print("numpy not available — skipping Q-learning simulation")
print("Install with: pip install numpy")
Step 15 — Data analysis and RL loop evaluation Method: Dopamine concentration values from each ELISA cycle plotted against cycle number. Q-values assessed for threshold convergence. Fluorescence data quantified for transfection efficiency. TH immunostaining quantified by mean fluorescence intensity per condition.
Automation: Python (pandas, matplotlib, numpy) for data processing and visualisation
Plate: N/A
Expected result: Positive correlation between dual-TF transfection and dopamine release. RL loop demonstrates state-dependent stimulus delivery.
Timeline: Day 22-23
Example ELISA Plate Layout (96-well, Day 21) 1 2 3 4 5 6 7 8 9 10 11 12
A [STD1] [STD1] [STD2] [STD2] [STD3] [STD3] [STD4] [STD4] [STD5] [STD5] [STD6] [STD6]
B [STD7] [STD7] [STD8] [STD8] [BLK] [BLK] [NC1] [NC1] [NC2] [NC2] [NC3] [NC3]
C [GFP] [GFP] [RFP] [RFP] [N+F1] [N+F1] [N+F2] [N+F2] [RL-0] [RL-0] [RL-1] [RL-1]
D [RL-2] [RL-2] [RL-3] [RL-3] [RL-4] [RL-4] [RL-5] [RL-5] [SPARE][SPARE][SPARE][SPARE]
LEGEND:
STD1-8 = Dopamine standard curve (0, 0.5, 1, 2, 5, 10, 25, 50 nM)
BLK = Blank (media only, no cells)
NC1-3 = Negative controls (no mRNA transfection — NGF only wells)
GFP = Nurr1-GFP only transfected
RFP = FoxA2-RFP only transfected
N+F1/2 = Nurr1-GFP + FoxA2-RFP co-transfected (technical replicates)
RL-0 = Pre-RL baseline sample
RL-1..5 = Successive RL cycle post-stimulus samples
SPARE = Reserve wells
Technique Checklist Industry Partner Connections Partner Relevance Twist Bioscience Direct — ordering both IVT template constructs Opentrons Direct — OT-2 as primary automation platform for RL loop, media changes, ELISA New England Biolabs Direct — HiScribe T7 IVT kit, Poly-A Polymerase, KpnI, competent cells Thermo Fisher Scientific Direct — MessengerMAX, Opti-MEM, DMEM, RNeasy, TURBO DNase, PFA Millipore Sigma Direct — PDL, dopamine HCl, LB broth SecureDNA Direct — sequence screening prior to Twist order Asimov (Kernel Platform) Potential — genetic circuit design and construct optimisation for Aim 2 GRAB-DA sensor construct Helix Nano Potential — lipid nanoparticle delivery optimisation for more efficient mRNA transfection in Aim 2 microfluidic format
Technique Expansion onon
1. In Vitro Transcription (IVT) In vitro transcription is a cell-free method for producing RNA from a DNA template using a bacteriophage RNA polymerase — in this project, T7 RNA polymerase from the HiScribe T7 High Yield RNA Synthesis Kit (New England Biolabs). The linearised plasmid template is incubated with T7 polymerase, nucleotide triphosphates (ATP, CTP, GTP, UTP), and reaction buffer, and the polymerase reads the DNA strand from the T7 promoter sequence and synthesises a complementary RNA strand with high processivity, producing up to 100 µg of mRNA from a single 20 µl reaction. Following transcription, the DNA template is removed by TURBO DNase treatment, and a poly-A tail of approximately 150-200 adenosine residues is added enzymatically using E. coli Poly-A Polymerase, which stabilises the mRNA and enhances translation efficiency in mammalian cells. The mRNA is purified using the RNeasy Mini Kit and quality-checked by Nanodrop spectrophotometry (A260/280 ratio ~2.0 indicates pure RNA) and agarose gel electrophoresis (single clean band indicates intact, non-degraded product). IVT is the core production step that converts the Twist-synthesised DNA template into transfectable mRNA, and its success is entirely dependent on maintaining RNase-free conditions throughout — any contamination with RNases, which are ubiquitous on surfaces and skin, will degrade the mRNA and result in failed transfection with no fluorescence and no dopaminergic differentiation.
2. Lipid Nanoparticle mRNA Transfection (MessengerMAX) Lipofectamine MessengerMAX is an ionisable lipid transfection reagent specifically engineered for mRNA delivery into mammalian cells, addressing the fundamental challenge that mRNA — being large, negatively charged, and membrane-impermeant — cannot cross the cell membrane unaided. When mixed with mRNA in Opti-MEM at low pH, the ionisable lipids spontaneously self-assemble around the mRNA cargo, forming lipid nanoparticles approximately 100-200 nm in diameter whose positively charged outer surface is electrostatically attracted to the negatively charged cell membrane. The cell internalises the nanoparticle through endocytosis, forming an endosome, and the acidic endosomal environment (pH ~5-6) causes the MessengerMAX lipids to become more charged and destabilise the endosomal membrane — this endosomal escape step releases the mRNA into the cytoplasm where ribosomes can access it for translation. MessengerMAX is specifically preferred over DNA-optimised reagents such as Lipofectamine 2000 because mRNA is significantly more fragile than DNA and degrades rapidly in acidic endosomes if escape is delayed — MessengerMAX’s ionisable lipid formulation is optimised for rapid endosomal escape and designed for repeat daily transfection over 7 consecutive days, which is required by the Kim et al. (2017) protocol because the mRNA degrades within 24-48 hours in the cytoplasm and must be continuously replenished to maintain Nurr1 and FoxA2 protein levels sufficient for sustained dopaminergic differentiation.
SECTION 6: PROJECT VALIDATION 6a — Validation Choice Cell-free mRNA expression (CFPS) is selected as the primary validation experiment because it tests the core functional assumption of the entire project — that the Twist-synthesised DNA constructs produce correctly folded, fluorescent Nurr1-GFP and FoxA2-RFP fusion proteins when transcribed and translated — before any PC12 cells are involved. This is the most efficient validation gate: if the constructs fail to produce fluorescent protein in a cell-free system, there is no point proceeding to the more complex and time-consuming PC12 transfection experiment, and the result unambiguously points to a construct-level problem rather than a cell biology problem.
6b — Validation Protocol Receive Twist plasmid delivery — resuspend both constructs to 100 ng/µl in TE buffer Linearise 1 µg of each plasmid with KpnI (1 hour, 37°C) in CutSmart Buffer Heat inactivate at 65°C for 20 minutes Purify linearised template with GeneJET PCR Purification Kit, elute in RNase-free water Set up IVT reaction (HiScribe T7 kit): 1 µg linearised template, NTPs, T7 polymerase, buffer — 20 µl total, 2 hours at 37°C Add 2 µl TURBO DNase, incubate 15 minutes at 37°C Purify mRNA with RNeasy Mini Kit, elute in 30 µl RNase-free water Quantify mRNA by Nanodrop — record concentration and A260/280 Run 1 µl on 1% agarose gel — confirm single clean band Prepare cell-free expression reactions in 384 Greiner black-well clear-bottom plate:Well A1-A4: Nurr1-GFP mRNA (500 ng) + CFPS master mix (10 µl total) Well B1-B4: FoxA2-RFP mRNA (500 ng) + CFPS master mix Well C1-C4: No template control (RNase-free water + CFPS master mix) Well D1-D4: Positive control (commercial GFP mRNA + CFPS master mix) Seal plate with A4s breathable seal using Plateloc Incubate 2-4 hours at 37°C in Inheco Plate Incubator Read fluorescence on PHERAstar FSX: GFP channel (ex 488/em 520), mCherry channel (ex 555/em 610) Compare signal-to-background ratio — target >3:1 for positive validation 6c — Techniques Used Cell-free protein synthesis (CFPS) is an in vitro reconstitution of the transcription and translation machinery that allows gene expression to be measured outside of living cells, using a concentrated lysate of E. coli or wheat germ ribosomes, tRNA, amino acids, energy regeneration system, and cofactors. In this validation, the mRNA produced by IVT is directly added to the CFPS master mix, bypassing the need for any transfection and allowing the construct’s coding capacity to be assessed in a controlled, cell-free environment within 2-4 hours rather than the 16-24 hours required for mammalian cell expression. The PHERAstar FSX plate reader is used to detect GFP and mCherry fluorescence in the 384-well plate format, providing quantitative fluorescence readout that distinguishes between correctly folded fluorescent fusion proteins and non-fluorescent or misfolded products — a positive result (GFP signal from Nurr1-GFP mRNA, mCherry signal from FoxA2-RFP mRNA, above the no-template control) confirms that both the IVT reaction and the fusion protein coding sequences are functional before any PC12 cells are used. This CFPS validation step is particularly critical for detecting linker junction frameshifts that would result in Nurr1 or FoxA2 protein being made but GFP or mCherry being absent — a scenario that would produce no fluorescence despite successful transfection, making it impossible to distinguish from a failed transfection without this prior validation.
6d — Hypothetical Data Hypothetical CFPS validation fluorescence results:
Condition GFP signal (RFU) mCherry signal (RFU) Nurr1-GFP mRNA 4850 ± 320 180 ± 45 FoxA2-RFP mRNA 210 ± 38 6240 ± 415 No template control 195 ± 28 165 ± 32 GFP positive control 5120 ± 280 190 ± 40
Hypothetical dopamine ELISA results (Day 21):
Condition Dopamine released (nM) Negative control (NGF only) 3.2 ± 0.8 GFP mRNA only 3.8 ± 0.9 Nurr1-GFP only 7.4 ± 1.2 FoxA2-RFP only 6.9 ± 1.4 Nurr1-GFP + FoxA2-RFP 18.6 ± 2.3
Hypothetical RL loop dopamine readings across 5 cycles (Day 21):
RL Cycle Stimulus delivered (µM) Dopamine measured (nM) Reward decision 0 (baseline) — 18.6 — 1 1.0 24.3 Threshold met → escalate 2 5.0 38.7 Threshold met → maintain 3 5.0 41.2 Threshold met → maintain 4 5.0 35.8 Threshold met → maintain 5 5.0 39.4 Threshold met → maintain
Troubleshooting The most critical failure point in this experiment is mRNA degradation by RNase contamination — a single moment of carelessness with non-sterile tips or unwashed bench surfaces can destroy the entire mRNA preparation silently, with no visible indication until the experiment fails. If no fluorescence is observed in PC12 cells after transfection, the first diagnostic step should always be to run the remaining mRNA on an agarose gel — smearing rather than a clean band indicates degradation, and a fresh IVT batch should be prepared before attempting transfection again. A second significant risk is the linker junction frameshift — if the stop codon was not correctly removed from the Nurr1 or FoxA2 CDS before the linker, the ribosome will terminate at Nurr1 or FoxA2 and never produce the fluorescent protein, resulting in TH upregulation and dopamine production but no fluorescence, which would be invisible without TH staining as a parallel readout. If fluorescence is observed but dopamine ELISA shows no increase above baseline, the most likely explanations are that the fusion protein is expressed but misfolded and unable to bind DNA, that KCl stimulation failed (prepare fresh KCl solution), or that the ELISA kit sensitivity is insufficient — an alternative strategy is to extend the transfection period from 7 to 10 days and add 0.5 mM dibutyryl-cAMP to the differentiation medium as Kim et al. (2017) showed this approximately doubles expression efficiency in rat cells.
References Kim S et al. (2017) Efficient Generation of Dopamine Neurons by Synthetic Transcription Factor mRNAs. Molecular Therapy . PMC5589083. Lee HS et al. (2010) Foxa2 and Nurr1 Synergistically Yield A9 Nigral Dopamine Neurons Exhibiting Improved Differentiation, Function, and Cell Survival. Stem Cells . DOI: 10.1002/stem.294. Wiatrak B et al. (2020) PC12 Cell Line: Cell Types, Coating of Culture Vessels, Differentiation and Other Culture Conditions. Cells 9(4):958. Wong HC et al. (2025) Fluidic Programmable Gravi-maze Array for High Throughput Multiorgan Drug Testing. bioRxiv 2025.06.18.660241. Sari Y et al. (2024) Comprehensive evaluation of T7 promoter for enhanced yield and quality in mRNA production. Scientific Reports . PMC11053036. Kozak M (1987) An analysis of 5’-noncoding sequences from 208 human messenger RNAs. Nucleic Acids Research 15(20):8125-8148. Cormack BP et al. (1996) FACS-optimized mutants of the green fluorescent protein (GFP). Gene 173(1):33-38. Shaner NC et al. (2004) Improved monomeric red, orange and yellow fluorescent proteins derived from Discosoma sp. red fluorescent protein. Nature Biotechnology 22(12):1567-1572. Kagan BJ et al. (2022) In vitro neurons learn and exhibit sentience when embodied in a simulated game-world. Neuron 115(19):3414-3434. (DishBrain/Cortical Labs) Studier FW and Moffatt BA (1986) Use of bacteriophage T7 RNA polymerase to direct selective high-level expression of cloned genes. Journal of Molecular Biology 189(1):113-130. Prasher DC et al. (1992) Primary structure of the Aequorea victoria green-fluorescent protein. Gene 111(2):229-233. Supplies and Budget Item Supplier Est. Cost (GBP) Link Nurr1-GFP IVT template (pTwist Amp High Copy) Twist Bioscience £150-200 twist.com FoxA2-RFP IVT template (pTwist Amp High Copy) Twist Bioscience £150-200 twist.com HiScribe T7 High Yield RNA Synthesis Kit NEB (E2040S) £150-180 neb.com E. coli Poly-A Polymerase NEB (M0276S) £50-70 neb.com TURBO DNase Thermo Fisher (AM2238) £60-80 thermofisher.com RNeasy Mini Kit (50 preps) Qiagen (74104) £80-100 qiagen.com RNase-free water (500 ml) Thermo Fisher (AM9937) £25-35 thermofisher.com NEB 10-beta Competent E. coli NEB (C3019H) £50-70 neb.com GeneJET Miniprep Kit (50 preps) Thermo Fisher (K0503) £60-80 thermofisher.com KpnI restriction enzyme NEB (R0142S) £30-40 neb.com GeneJET PCR Purification Kit Thermo Fisher (K0701) £60-80 thermofisher.com PC12 cells (CRL-1721) ATCC £400-500 atcc.org DMEM high glucose + L-glutamine Thermo Fisher (11965092) £30-45 thermofisher.com Horse serum heat inactivated Thermo Fisher (26050088) £80-120 thermofisher.com FBS heat inactivated Thermo Fisher (10500064) £60-100 thermofisher.com NGF 2.5S rat origin Alomone Labs (N-100) £80-120 alomone.com Poly-D-Lysine Millipore Sigma (P6407) £30-50 sigmaaldrich.com Collagen Type I rat tail Corning (354236) £60-90 fishersci.co.uk Lipofectamine MessengerMAX Thermo Fisher (LMRNA003) £85-100 thermofisher.com Opti-MEM (500 ml) Thermo Fisher (31985062) £30-45 thermofisher.com Dopamine ELISA Kit (High Sensitivity) Eagle Biosciences (EA101RB) £300-400 eaglebiosciences.com Anti-TH antibody Abcam (ab112) £80-110 abcam.com Secondary antibody Alexa Fluor 647 Abcam (ab150083) £60-90 abcam.com 4% Paraformaldehyde Thermo Fisher (28908) £40-60 thermofisher.com Dopamine hydrochloride Millipore Sigma (H8502) £30-50 sigmaaldrich.com Corning 6-well plates Corning (3516) £20-30 fishersci.co.uk 96-well flat bottom plates (ELISA) Corning (3596) £15-20 fishersci.co.uk 384 Greiner black-well clear-bottom Greiner Bio-One £30-50 gbo.com RNase-free tubes and tips Thermo Fisher (AM12450) £40-60 thermofisher.com LB Broth + Agar + Ampicillin Millipore Sigma £40-60 sigmaaldrich.com Miscellaneous consumables Various £80-120 — TOTAL ESTIMATED £2,290-3,155
Proposal generated May 2026. All sequences designed in Benchling. SecureDNA screening to be completed prior to Twist order submission. IBC notification filed before transfection work commences. —
Appendix ##### Experimental Protocol
###### 1. Overview and Scientific Rationale
This protocol describes a complete experime
ntal workflow for: (1) generating synthetic mRNA encoding the dopaminergic transcription factors Nurr1 and FoxA2; (2) transfecting NGF-differentiated PC12 rat pheochromocytoma cells; (3) verifying dopaminergic differentiation via dopamine ELISA and TH immunostaining; and (4) implementing a minimal closed-loop chemical reinforcement learning (RL) system using the Opentrons liquid handling robot.
The approach is based on Kim et al. (2017) who demonstrated that synthetic mRNA transfection of Nurr1 and FoxA2 into rat neural precursor cells generates functional dopaminergic neurons exhibiting electrophysiological and biochemical properties characteristic of midbrain dopamine neurons. This protocol adapts their methodology for PC12 cells as a BSL-1 compatible, immortalised dopaminergic model system.
###### 1.1 Scientific Background
PC12 cells are an immortalised rat adrenal pheochromocytoma cell line that synthesise and store catecholamines, predominantly dopamine. Upon NGF treatment they extend neurites and acquire a sympathetic neuron-like phenotype. The addition of Nurr1 and FoxA2 mRNA pushes these cells further toward authentic midbrain dopaminergic identity by activating the full dopamine synthesis machinery including tyrosine hydroxylase (TH), dopamine transporter (DAT), and vesicular monoamine transporter 2 (VMAT2).
###### 1.2 Chemical Reinforcement Learning Concept
The closed-loop RL system uses Opentrons to deliver dopamine pulses as reward signals to the differentiated PC12 cell culture. Dopamine release from cells is measured by ELISA as the state readout. If dopamine release exceeds a defined threshold following a stimulus, a reward pulse is delivered. This creates a minimal biological RL loop in which cellular dopaminergic activity is the state variable and exogenous dopamine delivery is the reward signal.
###### 2. Safety
###### 2.1 Biosafety Classification
All components of this protocol are BSL-1 safe:
###### 2.2 Personal Protective Equipment
Lab coat, nitrile gloves, and eye protection at all times
All cell work performed in laminar flow biosafety cabinet (Class II)
Dopamine: prepare in fume hood, avoid skin contact, protect from light
RNA work: always use RNase-free consumables, change gloves frequently
All liquid waste decontaminated with 10% bleach before disposal
###### 3. Materials and Equipment
###### 3.1 Cell Line
###### 3.2 Constructs (from Twist Bioscience)
NOTE: All constructs use Kim et al. (2017) UTR design: T7 promoter + Xenopus 5'UTR + Kozak + CDS + custom 3'UTR. Poly-A tail added enzymatically post-IVT.
###### 3.3 Reagents
###### 3.4 Equipment
Laminar flow biosafety cabinet (Class II)
CO2 incubator (37°C, 5% CO2)
Centrifuge
Plate reader (absorbance and fluorescence)
Opentrons OT-2 or Flex with P300 single channel pipette
Fluorescence microscope
Nanodrop spectrophotometer
Water bath (37°C)
Thermal cycler (for optional PCR verification)
Agarose gel electrophoresis system
###### 3.5 Consumables
6-well plates (PDL/laminin coated)
96-well plates (for ELISA)
T25 and T75 flasks
RNase-free tubes and tips (all RNA work)
Standard filtered pipette tips
15 ml and 50 ml centrifuge tubes
Cryovials (for cell stock preparation)
###### 4. Media and Reagent Preparation
###### 4.1 Growth Medium
DMEM high glucose
10% horse serum (heat inactivated)
5% FBS (heat inactivated)
1% Penicillin/Streptomycin
NOTE: Warm to 37°C before use. Store at 4°C for up to 4 weeks.
###### 4.2 Differentiation Medium
DMEM high glucose
1% horse serum (heat inactivated)
1% Penicillin/Streptomycin
50 ng/ml NGF 2.5S (add fresh at each media change)
NOTE: Prepare NGF working stock fresh from aliquots. Never refreeze thawed NGF.
###### 4.3 NGF Stock Solution
Reconstitute NGF in sterile PBS + 0.1% BSA to 100 µg/ml
Aliquot into single-use volumes (typically 5-10 µl)
Store at -80°C
Dilute to working concentration (50-100 ng/ml) in differentiation medium immediately before use
###### 4.4 Dopamine Working Solution
Dissolve dopamine hydrochloride in sterile PBS to 10 mM stock
Add ascorbic acid to 0.1 mg/ml final concentration
Prepare fresh on day of experiment
Keep on ice, protect from light, use within 4 hours
Prepare working dilutions: 1 µM, 5 µM, 10 µM in differentiation medium
NOTE: Dopamine oxidises rapidly. Yellow/brown discolouration indicates degradation — discard and prepare fresh.
###### 5. Part 1 — Bacterial Transformation and Plasmid Preparation
Timeline: Days 1-4. Perform for all three constructs simultaneously.
###### 5.1 Transformation (Day 1)
Remove NEB 10-beta competent cells from -80°C, thaw on ice 10 minutes
Add 1-2 µl plasmid DNA (from Twist delivery) to competent cells
Flick gently to mix — do not vortex
Incubate on ice 30 minutes
Heat shock at 42°C for exactly 45 seconds
Return immediately to ice for 2 minutes
Add 250 µl LB broth (no ampicillin)
Incubate at 37°C for 1 hour shaking at 200 rpm
Spread onto LB agar + ampicillin (100 µg/ml) plates
Incubate overnight at 37°C
###### 5.2 Colony Picking and Overnight Culture (Day 2)
Check plates — expect 10-100 colonies per construct
Pick 3-6 individual well-separated colonies per construct
Inoculate each into 5 ml LB broth + ampicillin (100 µg/ml) in 15 ml tube
Grow overnight at 37°C shaking at 200 rpm
###### 5.3 Miniprep (Day 3)
Follow GeneJET Miniprep Kit protocol exactly
Elute in 50 µl elution buffer
Measure concentration by Nanodrop — aim for >50 ng/µl
Check A260/280 ratio — should be 1.8-2.0
Send one sample per construct for Sanger sequencing
Store at -20°C
###### 5.4 Sequencing Verification (Day 4)
Align sequencing results against Benchling sequences. Confirm:
T7 promoter intact: TAATACGACTCACTATA
5'UTR intact: AAATAAGAGAGAAAAGAAGAGTAAGAAGAAATATAAGAGCC
Kozak + ATG intact: GCCACCATG
CDS correct with no frameshifts or premature stop codons
3'UTR intact
NOTE: Do not proceed to IVT until sequencing confirms all three constructs are correct.
###### 6. Part 2 — In Vitro Transcription (IVT) and mRNA Preparation
Timeline: Day 5. Perform in RNase-free conditions throughout. Change gloves frequently.
###### 6.1 Template Linearisation
Set up KpnI digestion for each construct:
2 µg plasmid DNA
2 µl CutSmart Buffer (10x)
1 µl KpnI enzyme
Make up to 20 µl with RNase-free water
Incubate 1 hour at 37°C
Heat inactivate 20 minutes at 65°C
Verify linearisation on 1% agarose gel — should show single linear band
Purify linearised template using GeneJET PCR Purification Kit
Elute in RNase-free water, quantify by Nanodrop
NOTE: Linearisation is critical — circular template produces run-on transcripts that reduce mRNA quality.
###### 6.2 IVT Reaction (HiScribe T7 Kit)
Following Kim et al. (2017) protocol with HiScribe T7 High Yield RNA Synthesis Kit:
Assemble on ice in RNase-free tube:
Mix gently by flicking — do not vortex
Incubate at 37°C for 2 hours
Add 2 µl TURBO DNase, mix gently, incubate 15 minutes at 37°C
NOTE: DNase step removes DNA template — essential to prevent DNA contamination of your mRNA product.
###### 6.3 Poly-A Tailing (E. coli Poly-A Polymerase)
Following Kim et al. (2017) — poly-A added enzymatically post-IVT:
To the 20 µl IVT product add:
4 µl 10x E. coli Poly-A Polymerase Reaction Buffer
2 µl ATP (10 mM)
2 µl E. coli Poly-A Polymerase
12 µl RNase-free water (total reaction 40 µl)
Incubate 45 minutes at 37°C
NOTE: This enzymatically adds ~150-200 A's — better than DNA-encoded poly-A for translation efficiency.
###### 6.4 mRNA Purification (RNeasy Kit)
Follow RNeasy Mini Kit protocol for RNA cleanup
Elute in 50 µl RNase-free water
Quantify by Nanodrop — note A260/280 and A260/230 ratios
Run 1 µl on agarose gel to verify mRNA integrity — should show single band
Aliquot into single-use volumes
Store at -80°C
NOTE: Expected yield: 50-100 µg mRNA per 20 µl IVT reaction. A260/280 should be ~2.0.
###### 7. Part 3 — PC12 Cell Culture and NGF Differentiation
Timeline: Days 1-14. Run in parallel with bacterial/IVT work.
###### 7.1 Thawing PC12 Cells (Day 1)
Warm growth medium to 37°C
Remove PC12 vial from liquid nitrogen, thaw quickly in 37°C water bath
Transfer dropwise into 9 ml warm growth medium in 15 ml tube — add medium slowly
Centrifuge 200 x g for 5 minutes
Aspirate supernatant carefully
Resuspend pellet in 5 ml warm growth medium
Transfer to T25 flask
Incubate at 37°C, 5% CO2
Check next day — cells should be attached
###### 7.2 Plate Coating (Day 7)
Prepare PDL solution: 50 µg/ml in sterile water
Add 1 ml per well of 6-well plate
Incubate 1 hour at room temperature
Aspirate PDL completely
Wash 3x with sterile water
Allow to dry completely in laminar flow hood
Prepare laminin solution: 10 µg/ml in PBS
Add 1 ml per well
Incubate overnight at 37°C
NOTE: PDL coating is essential for PC12 Adh adhesion. Laminin significantly improves neurite extension and process stability.
###### 7.3 Cell Plating and Differentiation (Day 8)
Aspirate laminin solution — do not wash, leave residual laminin
Trypsinise PC12 cells from flask
Count using haemocytometer
Plate at 50,000 cells/well in growth medium
Incubate overnight
Day 9: Replace with differentiation medium containing 50 ng/ml NGF
Days 9-15: Change half the medium every 2-3 days with fresh NGF
NOTE: Always add medium to the side of the well — never directly onto cells. Neurites are fragile.
###### 8. Part 4 — mRNA Transfection
Timeline: Day 15 onwards. Daily transfection for 5-7 days following Kim et al. (2017).
###### 8.1 Experimental Groups
###### 8.2 Daily Transfection Protocol (Kim et al. Method)
Perform daily for 5-7 consecutive days starting Day 15:
###### Prepare mRNA-MessengerMAX complex (per well):
Dilute mRNA in Opti-MEM: 500 ng total mRNA in 25 µl Opti-MEM
For Nurr1 + FoxA2 wells: 250 ng Nurr1 mRNA + 250 ng FoxA2 mRNA
For GFP wells: 500 ng GFP mRNA
Dilute MessengerMAX: 1.5 µl MessengerMAX in 25 µl Opti-MEM
Incubate separately 5 minutes at room temperature
Combine mRNA and MessengerMAX dilutions
Mix gently by pipetting 3-4 times — do not vortex
Incubate 5 minutes at room temperature
###### Transfect cells:
Aspirate half the medium from each well carefully
Add transfection complex dropwise to cells
Rock plate gently to distribute
Incubate 4 hours at 37°C, 5% CO2
Replace with fresh differentiation medium + NGF
NOTE: Following Kim et al. (2017): daily transfection is required because mRNA degrades within 24-48 hours. Adding db-cAMP (0.5 mM) alongside transfection significantly improves expression efficiency in rat cells — add to differentiation medium if available.
###### 8.3 Transfection Timeline
###### 9. Part 5 — Verification of Dopaminergic Differentiation
###### 9.1 TH Immunostaining
Tyrosine hydroxylase (TH) is the rate-limiting enzyme in dopamine synthesis. Increased TH expression confirms successful dopaminergic differentiation.
Aspirate medium and wash cells 2x with PBS
Fix with 4% paraformaldehyde for 15 minutes at room temperature
Wash 3x with PBS
Permeabilise with 0.25% Triton X-100 in PBS for 10 minutes
Wash 3x with PBS
Block with 3% BSA in PBS for 1 hour at room temperature
Add anti-TH primary antibody (1:500 in blocking buffer)
Incubate overnight at 4°C
Wash 3x with PBS
Add FITC-conjugated secondary antibody (1:500) for 1 hour at room temperature in dark
Wash 3x with PBS
Add DAPI (1:1000) for 5 minutes
Wash 2x with PBS
Image on fluorescence microscope
Positive result: increased TH+ green fluorescence in Nurr1 + FoxA2 wells compared to GFP control.
###### 9.2 Dopamine ELISA
Primary readout for both differentiation verification and chemical RL loop. Follows methodology used in the PC12 dopamine literature (Eagle Biosciences High Sensitivity Dopamine ELISA Kit).
At least 2 hours before ELISA: replace medium with 1 ml fresh DMEM without serum
Stimulate with 56 mM KCl for 15 minutes to trigger dopamine release
Collect conditioned medium into RNase-free tube
Centrifuge at 300 x g for 5 minutes to remove cell debris
Transfer supernatant — use immediately or store at -80°C
Follow Eagle Biosciences ELISA kit protocol exactly
Read plate at 450 nm on plate reader
Calculate dopamine concentration from standard curve
###### 10. Part 6 — Chemical Reinforcement Learning with Opentrons
Timeline: Day 21. Perform after dopamine ELISA confirms differentiation is successful.
###### 10.1 Opentrons Deck Setup
###### 10.2 RL Loop Logic
The Opentrons Python script implements the following logic:
Baseline read: collect 50 µl conditioned medium, transfer to ELISA plate
Define reward threshold: dopamine concentration above X nM (determined from Day 18 baseline ELISA)
Deliver stimulus: Opentrons dispenses 100 µl dopamine solution (start at 1 µM)
Incubation: 15 minutes
State read: collect medium sample for ELISA
Decision: if dopamine above threshold → escalate to 5 µM; if below → maintain or withhold
Repeat for 3-5 cycles per session
###### 10.3 Opentrons Python Protocol
###### 10.4 Data Recording
Record for every RL session:
Date and time of each dopamine delivery
Dopamine concentration dispensed (µM)
Volume delivered (µl)
ELISA dopamine reading (nM) before and after each pulse
Cell passage number
Days post transfection
Days post NGF differentiation
Any observations about cell morphology
###### 11. Troubleshooting
###### 12. Complete Experiment Timeline
###### 13. Key References
1. Kim S et al. (2017) Efficient Generation of Dopamine Neurons by Synthetic Transcription Factor mRNAs. Molecular Therapy. PMC5589083.
2. Sari Y, Sousa Rosa S et al. (2024) Comprehensive evaluation of T7 promoter for enhanced yield and quality in mRNA production. Scientific Reports. PMC11053036.
3. Lee HS et al. (2010) Foxa2 and Nurr1 Synergistically Yield A9 Nigral Dopamine Neurons Exhibiting Improved Differentiation, Function, and Cell Survival. Stem Cells. PMID:20049900.
4. Yang K et al. (2019) Synaptic dopamine release is positively regulated by SNAP-25 that involves in benzo[a]pyrene-induced neurotoxicity. Chemosphere 237:124378.
5. Homberg JR et al. (2016) The role of the dopamine D1 receptor in social cognition: studies using a novel genetic rat model. Disease Models & Mechanisms 9:1147-1158.
6. Wiatrak B et al. (2020) PC12 Cell Line: Cell Types, Coating of Culture Vessels, Differentiation and Other Culture Conditions. Cells 9(4):958.
7. Greene LA, Tischler AS (1976) Establishment of a noradrenergic clonal line of rat adrenal pheochromocytoma cells which respond to nerve growth factor. PNAS 73:2424-2428.
###### 14. Experimental Notes
###### Observations:
| RL Component | Biological Implementation |
| --- | --- |
| State | Dopamine concentration measured by ELISA from conditioned media |
| Action | Opentrons delivers dopamine pulse to culture well |
| Reward signal | Dopamine above threshold triggers further stimulation |
| Suppression signal | Below threshold — withhold stimulus |
| Learning readout | Shift in baseline dopamine release over multiple sessions |
| Component | BSL Classification | Notes |
| --- | --- | --- |
| PC12 cells (CRL-1721) | BSL-1 | Rat, non-human, non-primate |
| Nurr1 mRNA | BSL-1 | Synthetic mRNA, no pathogen sequences |
| FoxA2 mRNA | BSL-1 | Synthetic mRNA, no pathogen sequences |
| GFP mRNA | BSL-1 | Control, no pathogen sequences |
| Lipofectamine MessengerMAX | BSL-1 | Chemical transfection reagent |
| Dopamine HCl | BSL-1 | Standard laboratory chemical |
| E. coli (NEB 10-beta) | BSL-1 | Non-pathogenic laboratory strain |
| Item | Supplier | Catalogue Number |
| --- | --- | --- |
| PC12 (CRL-1721) | ATCC | CRL-1721 |
| Note: standard PC12 not Adh variant — responds to NGF | | |
| Construct | Vector | Purpose |
| --- | --- | --- |
| rNurr1_mRNA_template_FINAL | pTwist Amp High Copy | IVT template for Nurr1 mRNA |
| rFoxA2_mRNA_template_FINAL | pTwist Amp High Copy | IVT template for FoxA2 mRNA |
| GFP_mRNA_template_FINAL | pTwist Amp High Copy | IVT template for GFP control mRNA |
| Reagent | Supplier | Notes |
| --- | --- | --- |
| DMEM high glucose with L-glutamine | Thermo Fisher | Base medium |
| Horse serum, heat inactivated | Thermo Fisher | 10% for growth, 1% for differentiation |
| FBS, heat inactivated | Thermo Fisher | 5% for growth |
| Penicillin/Streptomycin | Thermo Fisher | 100 U/ml + 100 µg/ml |
| PBS | Thermo Fisher | Sterile, calcium/magnesium-free |
| NGF 2.5S | Alomone / Sigma | 50-100 ng/ml working; store -80°C in BSA |
| BSA | Sigma | 0.1% for NGF dilution and storage |
| Poly-D-Lysine (PDL) | Sigma | 50 µg/ml coating solution |
| Laminin | Sigma/Thermo | 10 µg/ml coating solution |
| LB Broth | Sigma | Bacterial culture |
| LB Agar | Sigma | Bacterial plating |
| Ampicillin | Sigma | 100 µg/ml for bacterial selection |
| Lipofectamine MessengerMAX | Thermo Fisher | mRNA-specific transfection reagent |
| Opti-MEM | Thermo Fisher | For transfection complex preparation |
| HiScribe T7 High Yield RNA Synthesis Kit | NEB | IVT reaction |
| E. coli Poly-A Polymerase | NEB M0276 | Post-IVT poly-A addition |
| RNeasy Mini Kit | Qiagen | mRNA purification |
| RNase-free water | Thermo Fisher | All RNA steps |
| RNase inhibitor | NEB / Thermo | mRNA protection |
| KpnI restriction enzyme | NEB | Template linearisation |
| CutSmart Buffer | NEB | KpnI digestion |
| GeneJET Miniprep Kit | Thermo Fisher | Plasmid extraction |
| Dopamine hydrochloride | Sigma | Prepare fresh; store -80°C |
| Ascorbic acid | Sigma | 0.1 mg/ml; prevents dopamine oxidation |
| Dopamine ELISA Kit (High Sensitivity) | Eagle Biosciences / Abcam | Quantitative dopamine readout |
| Anti-TH antibody | Abcam | For differentiation verification |
| Secondary antibody (FITC) | Abcam | Fluorescent detection |
| DAPI | Thermo Fisher | Nuclear counterstain |
| 4% Paraformaldehyde | Sigma | Cell fixation |
| Triton X-100 | Sigma | Cell permeabilisation |
| Competent E. coli NEB 10-beta | NEB | Transformation |
| Component | Volume |
| --- | --- |
| RNase-free water | To 20 µl total |
| 10x T7 RNA Polymerase Buffer | 2 µl |
| ATP (100 mM) | 2 µl |
| CTP (100 mM) | 2 µl |
| GTP (100 mM) | 2 µl |
| UTP (100 mM) | 2 µl |
| Linearised DNA template (1 µg/µl) | 1 µl |
| T7 RNA Polymerase Mix | 2 µl |
| Day | Expected Observation |
| --- | --- |
| 9 | Cells healthy, attached, no visible neurites |
| 10-11 | Short process initiation visible |
| 12-13 | Clear neurite extensions 1-2 cell lengths |
| 14-15 | Mature neurite network, differentiation established |
| Well | Condition | mRNA transfected | Purpose |
| --- | --- | --- | --- |
| A1 | Negative control | None | Baseline PC12 |
| A2 | Transfection control | GFP mRNA only | Confirms transfection efficiency |
| A3 | Experimental | Nurr1 + FoxA2 mRNA | Dopaminergic differentiation |
| A4 | Experimental replicate | Nurr1 + FoxA2 mRNA | Technical replicate |
| A5 | Single factor control | Nurr1 mRNA only | Shows FoxA2 requirement |
| A6 | Single factor control | FoxA2 mRNA only | Shows Nurr1 requirement |
| Day | Action |
| --- | --- |
| 15 | First transfection — all wells |
| 16 | Second transfection + first TH staining check (optional) |
| 17 | Third transfection |
| 18 | Fourth transfection + first dopamine ELISA |
| 19 | Fifth transfection |
| 20 | Final transfection + TH immunostaining |
| 21 | Chemical RL experiment |
| Condition | Expected dopamine (relative) |
| --- | --- |
| Negative control (no mRNA) | Baseline (low) |
| GFP control | Similar to negative control |
| Nurr1 only | Modest increase over baseline |
| FoxA2 only | Modest increase over baseline |
| Nurr1 + FoxA2 | Significantly elevated — 3-5x baseline (Kim et al.) |
| Deck Position | Labware | Contents |
| --- | --- | --- |
| 1 | NEST 12-well reservoir | Dopamine working solutions (1, 5, 10 µM) + PBS wash |
| 2 | Corning 96-well flat plate | PC12 cells (transferred from 6-well) |
| 3 | Opentrons 96 tip rack (300 µl) | Standard tips |
| 4 | NEST 12-well reservoir (waste) | Aspirate waste |