TITLE: Action Spectra protocol for Opentrons OT-1 liquid handling robot 
AUTHORS: andrei.herdean 

[STEPS]
?. OT-1 setup: A3 - box with 1 ml tips B3 - 48 well plate 1D3 - 48 well plate 2C1 - 48 well plate 348 plate 1 setup:    C8 - oxygen optode    D8 - temperature sensor    A7, B7, C7, D7, E7, F7    - blank media    F4, F5, F6    - ddH2O    A8, B8, E8, F8    - empty    All other wells have 1 ml of algae culture48 plate 2 setup:    All wells empty, except:        F2 - temperature sensor        F1 - oxygen optode48 well plate 3 setup:     All wells empty, except:        C8 - oxygen optodes*        B8, D8 - temperature sensors* a fiber optic cable connected to the OL490 is positioned in front of well C8
?. OT-1 protocol:from opentrons import robot, containers, instrumentsrobot.home()#containers to loadplateC1 = containers.load('48-well-plate', 'C1')change_light = containers.load('6-well-plate', 'A1') plateD3 = containers.load('48-well-plate', 'D3')plateB3 = containers.load('48-well-plate', 'B3')tiprack_1 = containers.load('tiprack-1000ul', 'A3')#optode well definitiondark_optode = 'F1'light_optode = 'C8'#pipette definitionp1000 = instruments.Pipette(    axis="b",    max_volume=1000,    tip_racks=[tiprack_1])#how much additional distance to raise the tiprobot.arc_height = 20#starting tip positionp1000.reset()p1000.start_at_tip(tiprack_1['A1'])#Test triggerp1000.touch_tip(change_light.wells('A1'),radius=1.7) # trigger lightp1000.touch_tip(change_light.wells('A1'),radius=1.7) # trigger lightp1000.touch_tip(change_light.wells('A1'),radius=1.7) # trigger lightp1000.touch_tip(change_light.wells('A1'),radius=1.7) # trigger light#START#transfer blank samples (water to optodes)p1000.pick_up_tip()p1000.aspirate(1000, plateB3.wells('A7'))p1000.dispense(1000, plateB3.wells(light_optode))p1000.blow_out()p1000.aspirate(1000, plateB3.wells('B7'))p1000.dispense(1000, plateC1.wells(light_optode))p1000.blow_out()p1000.aspirate(1000, plateB3.wells('C7'))p1000.dispense(1000, plateD3.wells(dark_optode))p1000.blow_out()p1000.delay(seconds=600)#pre-loop#step 1 - empty All light optodep1000.mix(3, 1000, plateB3.wells(light_optode))     p1000.aspirate(1000, plateB3.wells(light_optode))   p1000.dispense(1000, plateB3.wells('A7'))           p1000.blow_out()                                    #step 2 - sample1 in All light optodep1000.mix(3, 1000, plateB3.wells('A1'))             p1000.aspirate(1000, plateB3.wells('A1'))   p1000.dispense(1000, plateB3.wells(light_optode))   p1000.blow_out()                                    p1000.delay(seconds=600)                            #step 3 - empty OL490 p1000.mix(3, 1000, plateC1.wells(light_optode))      p1000.aspirate(1000, plateC1.wells(light_optode))    p1000.dispense(1000, plateB3.wells('B7'))p1000.blow_out()                                    p1000.touch_tip(change_light.wells('A1'),radius=1.7) # trigger light#step 4 - sample in OL 490p1000.mix(3, 1000, plateB3.wells(light_optode)) p1000.aspirate(1000, plateB3.wells(light_optode)) p1000.dispense(1000, plateC1.wells(light_optode))    p1000.blow_out()#Step 5 - sample 2 in All light optodep1000.mix(3, 1000, plateB3.wells('A2'))             p1000.aspirate(1000, plateB3.wells('A2'))   p1000.dispense(1000, plateB3.wells(light_optode))   p1000.blow_out()                                    p1000.delay(seconds=600)#Step 6 - empty Dark optodep1000.mix(3, 1000, plateD3.wells(dark_optode))      p1000.aspirate(1000, plateD3.wells(dark_optode))      p1000.dispense(1000, plateB3.wells('C7'))p1000.blow_out()#Step 7 - Sample 1 in dark optodep1000.mix(3, 1000, plateC1.wells(light_optode))p1000.aspirate(1000, plateC1.wells(light_optode)) p1000.dispense(1000, plateD3.wells(dark_optode))   p1000.blow_out()                                p1000.touch_tip(change_light.wells('A1'),radius=1.7) # trigger light#Step 8 - Sample 2 in OL490p1000.mix(3, 1000, plateB3.wells(light_optode)) p1000.aspirate(1000, plateB3.wells(light_optode)) p1000.dispense(1000, plateC1.wells(light_optode))    p1000.blow_out()#Step 9 - Sample 3 in All light optodep1000.mix(3, 1000, plateB3.wells('A3'))             p1000.aspirate(1000, plateB3.wells('A3'))   p1000.dispense(1000, plateB3.wells(light_optode))   p1000.blow_out()                                    p1000.delay(seconds=600)#Loopdef run_loop(sample_well1 = 'A4', sample_well2 = 'A1'): #00:00    #Step 1 - empty DARK optode    p1000.mix(3, 1000, plateD3.wells(dark_optode))          p1000.aspirate(1000, plateD3.wells(dark_optode))          p1000.dispense(1000, plateB3.wells(sample_well2))    p1000.blow_out()                                    #00:54    #Step 2 - OL490 to Dark    p1000.mix(3, 1000, plateC1.wells(light_optode))     #01:22     p1000.aspirate(1000, plateC1.wells(light_optode))   #01:24       p1000.dispense(1000, plateD3.wells(dark_optode))    #01:31    p1000.blow_out()                                    #01:47    p1000.touch_tip(change_light.wells('A1'),radius=1.7) # trigger light    #Step 3 - ALL light to OL490    p1000.mix(3, 1000, plateB3.wells(light_optode))     p1000.aspirate(1000, plateB3.wells(light_optode))     p1000.dispense(1000, plateC1.wells(light_optode))        p1000.blow_out()                                    #02:41    #Step 4 - new sample in ALL light    p1000.mix(3, 1000, plateB3.wells(sample_well1))                 p1000.aspirate(1000, plateB3.wells(sample_well1))       p1000.dispense(1000, plateB3.wells(light_optode))       p1000.blow_out()                                    #11:26                                        p1000.delay(seconds=600)sample_wells = [name+number for name in 'ABCDEF' for number in '123456']for i in range(3, len(sample_wells)):    run_loop(sample_wells[i], sample_wells[i-3])#Wash procedurep1000.mix(3, 1000, plateB3.wells(light_optode)) p1000.aspirate(1000, plateB3.wells(light_optode)) p1000.dispense(1000, plateB3.wells('F4'))    p1000.blow_out()p1000.return_tip()p1000.pick_up_tip()p1000.aspirate(1000, plateB3.wells('A7')) p1000.dispense(1000, plateB3.wells(light_optode))    p1000.blow_out()p1000.mix(3, 1000, plateB3.wells(light_optode))p1000.aspirate(1000, plateB3.wells(light_optode)) p1000.dispense(1000, plateB3.wells('A7'))    p1000.blow_out()p1000.return_tip()p1000.pick_up_tip()p1000.aspirate(1000, plateB3.wells('D7')) p1000.dispense(1000, plateB3.wells(light_optode))    p1000.blow_out()p1000.mix(3, 1000, plateC1.wells(light_optode))p1000.aspirate(1000, plateC1.wells(light_optode))p1000.dispense(1000, plateB3.wells('F5'))p1000.blow_out()p1000.return_tip()p1000.pick_up_tip()p1000.aspirate(1000, plateB3.wells('B7')) p1000.dispense(1000, plateC1.wells(light_optode))    p1000.blow_out()p1000.mix(3, 1000, plateC1.wells(light_optode))p1000.aspirate(1000, plateC1.wells(light_optode))p1000.dispense(1000, plateB3.wells('B7'))    p1000.blow_out()p1000.return_tip()p1000.pick_up_tip()p1000.aspirate(1000, plateB3.wells('E7')) p1000.dispense(1000, plateC1.wells(light_optode))    p1000.blow_out()#p1000.mix(3, 1000, plateD3.wells(dark_optode))   p1000.aspirate(1000, plateD3.wells(dark_optode))   p1000.dispense(1000, plateB3.wells('F6'))    p1000.blow_out()p1000.return_tip()p1000.pick_up_tip()p1000.aspirate(1000, plateB3.wells('C7')) p1000.dispense(1000, plateD3.wells(dark_optode))       p1000.blow_out()p1000.mix(3, 1000, plateD3.wells(dark_optode))   p1000.aspirate(1000, plateD3.wells(dark_optode))   p1000.dispense(1000, plateB3.wells('C7'))    p1000.blow_out()p1000.return_tip()p1000.pick_up_tip()p1000.aspirate(1000, plateB3.wells('F7')) p1000.dispense(1000, plateD3.wells(dark_optode))       p1000.blow_out()p1000.delay(seconds=600)p1000.aspirate(1000, plateB3.wells(light_optode)) p1000.dispense(1000, plateB3.wells('D7'))    p1000.blow_out()p1000.aspirate(1000, plateC1.wells(light_optode))p1000.dispense(1000, plateB3.wells('E7'))    p1000.blow_out()p1000.aspirate(1000, plateD3.wells(dark_optode))  p1000.dispense(1000, plateB3.wells('F7'))     p1000.blow_out()p1000.return_tip()robot.home()