def newSolo(self, plateList): new_solo = SoloSoft( filename=self.filename_prefix + str(len(self.solosofts)) + ".hso", plateList=plateList, pipeline=[], ) self.solosofts.append(new_solo)
def test_filename(self): soloSoft = SoloSoft.SoloSoft("example_filename.hso") assert soloSoft.filename == "example_filename.hso" soloSoft.setFile("new_filename.hso") assert soloSoft.filename == "new_filename.hso" with pytest.raises(TypeError): soloSoft.setFile(1) soloSoft.filename = "once_more.hso" assert soloSoft.filename == "once_more.hso"
def test_plates(self): soloSoft = SoloSoft.SoloSoft(plateList=self.example_platelist) assert soloSoft.plateList == self.example_platelist soloSoft.setPlates([]) assert soloSoft.plateList == [] soloSoft.setPlates(self.example_platelist) assert soloSoft.plateList == self.example_platelist soloSoft.plateList = [] assert soloSoft.plateList == [] soloSoft.plateList = self.example_platelist assert soloSoft.plateList == self.example_platelist with pytest.raises(TypeError): soloSoft.setPlates(3)
def test_pipeline(self): soloSoft = SoloSoft.SoloSoft(pipeline=self.example_pipeline) assert soloSoft.pipeline == self.example_pipeline soloSoft.setPipeline([]) assert soloSoft.pipeline == [] soloSoft.setPipeline(self.example_pipeline) assert soloSoft.pipeline == self.example_pipeline soloSoft.pipeline = [] assert soloSoft.pipeline == [] soloSoft.pipeline = self.example_pipeline assert soloSoft.pipeline == self.example_pipeline with pytest.raises(TypeError): soloSoft.setPipeline(3)
def test_empty(self): soloSoft = SoloSoft.SoloSoft() assert soloSoft.filename == None assert soloSoft.pipeline == [] assert soloSoft.plateList == [ "Empty", "Empty", "Empty", "Empty", "Empty", "Empty", "Empty", "Empty", ]
from liquidhandling import SoftLinx, SoloSoft from liquidhandling import * soloSoft = SoloSoft( filename="cherry_picking_test.hso", plateList=[ "TipBox.50uL.Axygen-EV-50-R-S.tealbox", "Empty", "Empty", "Empty", "Empty", "Empty", "Empty", "Plate.96.Corning-3635.ClearUVAssay", ], ) soloSoft.getTip() soloSoft.aspirate( position="Position8", aspirate_volumes=Plate_96_Corning_3635_ClearUVAssay().setColumn(1, 50), aspirate_shift=[0, 0, 2], ) for i in range(3): soloSoft.dispense( position="Position8", dispense_volumes=Plate_96_Corning_3635_ClearUVAssay().setColumn(2, 10), dispense_shift=[0, 0, 2], )
#Reservoir.12col.Agilent-201256-100.BATSgroup # * Program Variables ------------------ initial_well_volume = 1000 asp_volume = 10 asp_z_shift = .5 # * --------------------------------------- soloSoft = SoloSoft( filename="min_volume_z_shift_test.hso", plateList=[ "Empty", "Empty", "Empty", "Empty", "Empty", "Empty", "TipBox.50uL.Axygen-EV-50-R-S.tealbox", "Plate.96.PlateOne-1833-9600.ConicalBottomStorage", ], ) # soloSoft.getTip("Position7") # for i in range(int(initial_well_volume/(asp_volume*8))+2): # soloSoft.aspirate( # position="Position8", # aspirate_volumes=Reservoir_12col_Agilent_201256_100_BATSgroup().setColumn(1, asp_volume), # aspirate_shift=[0,0,asp_z_shift], # ) # soloSoft.dispense( # position="Position8",
import sys import os from liquidhandling import SoloSoft from liquidhandling import GenericPlate96Well # Initialize Pipeline soloSoft = SoloSoft.SoloSoft( filename="stress_test.hso", plateList=[ "TipBox-200uL Corning 4864", "TipBox-50uL EV-50-R-S", "TipBox-50uL EV-50-R-S", "Empty", "Empty", "Agilent 12 Channel Reservoir (#201256-100) ", "Omni", "Falcon 353916- round 96", ], ) # Main sequence of steps that we need to repeat across multiple rows def sub_pipeline(i, interim_get_tips=False, interim_pause=False): soloSoft.getTip(position="Position2") soloSoft.aspirate( position="Position8", aspirate_shift=[0, 0, 0.2], syringe_speed=50, mix_at_start=True, mix_cycles=5, mix_volume=30,
serial_source_mixing_volume_s2 = 100 serial_source_num_mixes_s2 = 10 serial_destination_mixing_volume_s2 = 100 # Step 3 variables antibiotic_transfer_volume_s3 = 90 antibiotic_mix_volume_s3 = 90 destination_mix_volume_s3 = 100 soloSoft = SoloSoft( filename="steps_1_2_3.hso", plateList=[ "TipBox.200uL.Corning-4864.orangebox", "Empty", "DeepBlock.96.VWR-75870-792.sterile", "Plate.96.Corning-3635.ClearUVAssay", "DeepBlock.96.VWR-75870-792.sterile", "Plate.96.Corning-3635.ClearUVAssay", "Plate.96.Corning-3635.ClearUVAssay", "Empty", ], ) """ STEP 1: INNOCULATE GROWTH PLATE FROM SOURCE BACTERIA PLATE ----------------------------------------------------------------- """ # * Fill 6 columns of empty 96 well plate (corning 3383 or Falcon - ref 353916) with fresh lb media (12 channel in Position 3, column 1) soloSoft.getTip() j = 1 for i in range(1, 7): soloSoft.aspirate( position="Position3",
desired_volume_serial_dilution = 150 default_df = 1 / 10 # Step 3 variables antibiotic_transfer_volume_s3 = 90 antibiotic_mix_volume_s3 = 90 destination_mix_volume_s3 = 120 # * Initialize and set deck layout (both 200uL and 50uL tips included) soloSoft = SoloSoft( filename="generate_protocol.hso", plateList=[ "TipBox.200uL.Corning-4864.orangebox", "Empty", "12 Channel Reservoir", "Corning 3383", "96 Deep Protein", "Corning 3383", "Corning 3383", "TipBox.50uL.Axygen-EV-50-R-S.tealbox", ], ) """ STEP 1: INNOCULATE GROWTH PLATE FROM SOURCE BACTERIA PLATE ----------------------------------------------------------------- """ # * Fill 6 columns of empty 96 well plate (corning 3383 or Falcon - ref 353916) with fresh lb media (12 channel in Position 3, column 1) soloSoft.getTip() j = 1 for i in range(1, 7): soloSoft.aspirate( position="Position3",
glucose_blowoff = 0 glucose_z_shift = 1 muconate_transfer_volume = 10 muconate_blowoff = 0 step3_mix_volume = 50 step3_num_mixes = 3 # * Initialize solosoft and deck layout soloSoft = SoloSoft( filename="day1_step1_TransferCells.hso", plateList=[ "TipBox.200uL.Corning-4864.orangebox", "Empty", "Reservoir.12col.Agilent-201256-100.BATSgroup", "Plate.96.Corning-3635.ClearUVAssay", "Plate.96.PlateOne-1833-9600.ConicalBottomStorage", "Plate.96.PlateOne-1833-9600.ConicalBottomStorage", "TipBox.50uL.Axygen-EV-50-R-S.tealbox", "Empty", ], ) # * STEP 1: Transfer Cells ------------------------------------------------------------ soloSoft.getTip( ) # 200uL tips -> all transfers are same cells, OK to keep same tips for all of step 1 for i in range(1, 3): for j in range(1, 7): soloSoft.aspirate( position="Position3", aspirate_volumes=Reservoir_12col_Agilent_201256_100_BATSgroup(
serial_antibiotic_transfer_volume_s2 = 15 serial_source_mixing_volume_s2 = ( 100 # mix volume in antibiotic stock solution well in 12 channel reservoir ) serial_source_num_mixes_s2 = ( 10 # num mixes in antibiotic stock solutuion well prior to first transfer ) serial_destination_mixing_volume_s2 = 100 soloSoft = SoloSoft( filename="antibiotic_serial_dilution.hso", plateList=[ "TipBox.200uL.Corning-4864.orangebox", "Empty", "DeepBlock.96.VWR-75870-792.sterile", "Plate.96.Corning-3635.ClearUVAssay", "DeepBlock.96.VWR-75870-792.sterile", "Plate.96.Corning-3635.ClearUVAssay", "Plate.96.Corning-3635.ClearUVAssay", "Empty", ], ) # * Fill colums 2-6 of generic 96 well plate with lb media - NOTE: could do this at the same time as media dispensing in step 1 to save tips soloSoft.getTip() for i in range(2, 7): # no need for volume management, drawing from 12 channel at Position 3, 1st row (lb media) soloSoft.aspirate( position="Position3", aspirate_volumes=Reservoir_12col_Agilent_201256_100_BATSgroup().
dilution_mix_volume = 60 num_mixes = 5 default_z_shift = 2 spot_z_shift = 5 spot_volume = 3.5 # * ------------------------------------- soloSoft = SoloSoft( filename="dilute_then_spot.hso", plateList=[ "TipBox.200uL.Corning-4864.orangebox", "Empty", "Reservoir.12col.Agilent-201256-100.BATSgroup", "Empty", "Plate.96.Corning-3635.ClearUVAssay", "Plate.96.Corning-3635.ClearUVAssay", "TipBox.50uL.Axygen-EV-50-R-S.tealbox", "AgarPlate.40mL.OmniTray-242811.ColonyPicker", ], ) # *Dispense diluent into full plate # for now, fill each half of the plate with a different media well and have becca check/refill it between runs. soloSoft.getTip() for i in range(1, 13): if i == 7: media_aspirate_column += ( 1 # switch to new media row for the second half of the plate )
import sys import os from liquidhandling import SoftLinx from liquidhandling import SoloSoft soloSoft = SoloSoft("example.hso") soloSoft.moveArm("Position1") soloSoft.savePipeline() softLinx = SoftLinx("ExampleProtocol", "example_protocol.slvp") softLinx.setPlates({"SoftLinx.PlateCrane.Stack1": "PlateOne 96 V-Bottom"}) softLinx.plateCraneMovePlate(["SoftLinx.PlateCrane.Stack1"], ["SoftLinx.Solo.Position6"]) softLinx.plateCraneMoveCrane("SoftLinx.PlateCrane.Safe") softLinx.soloSoftRun( "C:\\Users\\svcaibio\\Dev\\liquidhandling\\example\\softlinx\\example.hso") softLinx.soloSoftResetTipCount(position=6) softLinx.conditional( conditionalStatement="[SoftLinx.PlateCrane].Speed > 0", branchTrue=[ softLinx.plateCraneMoveCrane("SoftLinx.PlateCrane.Safe", inplace=False) ], branchFalse=[ softLinx.plateCraneMovePlate(["SoftLinx.PlateCrane.Home"], inplace=False) ], ) softLinx.saveProtocol()
""" This is just an example file to test the creation of a manifest file """ import time import datetime from liquidhandling import SoloSoft, SoftLinx # remember to import all the plates that you need manifest_list = [] # generate a Solosoft protocol # initialise soloSoft with an empty deck and no given file name soloSoft = SoloSoft(filename="protocol_wManifest.hso") soloSoft.moveArm(destination="Position1") # add items to the soloSoft pipeline soloSoft.moveArm(destination="TipDisposal") soloSoft.savePipeline() softLinx = SoftLinx("Protocol with Manifest", "protocol_wManifest.slvp") softLinx.setPlates({ "SoftLinx.PlateCrane.Stack1": "Plate.96.PlateOne-1833-9600.ConicalBottomStorage" }) # add each step and add to manifest list if necessary softLinx.soloSoftRun("C:\\labautomation\\instructions\\protocol_wManifest.hso") manifest_list.append("protocol_wManifest.hso") softLinx.plateCraneMovePlate(["SoftLinx.PlateCrane.Stack1"],
import json import jsonref import os from json import dump import errno from jsonschema import validate from liquidhandling import SoloSoft from liquidhandling import GenericPlate96Well soloSoft = SoloSoft.SoloSoft( filename="agilent_rese.hso", plateList=[ "TipBox-Corning 200uL", "Corning 3383", "Corning 3383", "Corning 3383", "Corning 3383", "Z_Agilent_Reservoir_1row", "Corning 3383", "Corning 3635", ], ) soloSoft.loop(6) soloSoft.getTip() # Add 6 aspirate/dispense cycles for i in range(1, 7): soloSoft.aspirate( position="Position6", aspirate_shift=[0, 0, 2], aspirate_volumes=GenericPlate96Well().setColumn(6, 180),
from liquidhandling import * # Program Variables transfer_volume = 20 blowoff_volume = 0 clearance_from_bottom = 3 deep_block_mix_volume = 100 num_mixes = 5 soloSoft = SoloSoft( filename="putida_OD600_step3_TransferBacteria.hso", plateList=[ "TipBox.200uL.Corning-4864.orangebox", "Empty", "Reservoir.12col.Agilent-201256-100.BATSgroup", "Plate.96.Agilent-5043-9310.RoundBottomStorage", "DeepBlock.96.VWR-75870-792.sterile", "Plate.96.Corning-3635.ClearUVAssay", "Plate.96.PlateOne-1833-9600.ConicalBottomStorage", "Empty", ], ) for i in range(1, 13): # i = 1,2,..., 12 soloSoft.getTip( ) # need to get new tips every time -> assumes wells in bacterial suspension not all the same soloSoft.aspirate( position="Position5", aspirate_volumes=DeepBlock_96VWR_75870_792_sterile().setColumn( i, transfer_volume), aspirate_shift=[0, 0, clearance_from_bottom],
aspirate_mix_volume = 20 aspirate_num_mixes = 3 aspirate_syringe_speed = 25 default_z_shift = 0.5 default_blowoff = 0 aspirate_column = 12 dispense_column = 11 # * Initialize solosoft and deck layout soloSoft = SoloSoft( filename="lysis_test.hso", plateList=[ "TipBox.200uL.Corning-4864.orangebox", "Empty", "Reservoir.12col.Agilent-201256-100.BATSgroup", "Plate.96.Corning-3635.ClearUVAssay", "Plate.96.PlateOne-1833-9600.ConicalBottomStorage", "Plate.96.PlateOne-1833-9600.ConicalBottomStorage", "TipBox.50uL.Axygen-EV-50-R-S.tealbox", "Empty", ], ) soloSoft.getTip() for i in range(12): soloSoft.aspirate( position="Position3", aspirate_volumes=Reservoir_12col_Agilent_201256_100_BATSgroup().setColumn( aspirate_column, aspirate_volume ),
# * Program Variables lysis_12_channel_column = 12 lysis_transfer_volume = 22.2 lysis_syringe_speed = 25 lysis_blowoff = 0 reservoir_z_shift = 0.5 # tested with lysis buffer, working dispense_z_shift = 2 # * Initialize solosoft and deck layout soloSoft = SoloSoft( filename="day2_step1_AddLysisBuffer.hso", plateList=[ "TipBox.200uL.Corning-4864.orangebox", "Empty", "Reservoir.12col.Agilent-201256-100.BATSgroup", "Plate.96.Corning-3635.ClearUVAssay", "Plate.96.PlateOne-1833-9600.ConicalBottomStorage", "Plate.96.PlateOne-1833-9600.ConicalBottomStorage", "TipBox.50uL.Axygen-EV-50-R-S.tealbox", "Empty", ], ) # * STEP 1: Add Lysis Buffer from 12 channel reservoir to cell plate for i in range(1, 13): soloSoft.getTip( ) # 200uL ok to aspirate 22.2 uL, NEED NEW TIP FOR EACH TRANSFER soloSoft.aspirate( position="Position3", aspirate_volumes=Reservoir_12col_Agilent_201256_100_BATSgroup(). setColumn(lysis_12_channel_column, lysis_transfer_volume),
current_reservoir_volume = reservoir_volume = 7000 reservoir_aspirate_volume = 180 source_mixing_volume = 100 destination_mixing_volume = 200 source_volume = 20 source_num_mixes = 5 destination_num_mixes = 5 soloSoft = SoloSoft.SoloSoft( filename="hudson_exercise_0001.hso", plateList=[ "TipBox-Corning 200uL", "Empty", "Empty", "Empty", "Empty", "12 Channel Reservoir", "96 Deep Protein", "Corning 3383", ], ) # volumeManager = VolumeManager(ZAgilentReservoir_1row(), 7, 1, 1) #TODO Update placeholder values - https://www.agilent.com/store/en_US/LCat-SubCat1ECS_112089/Reservoirs soloSoft.getTip() # * Fill each row of Plate 8 w/ "aspirate_volume" worth of water from reservoir # TODO Build into api: w/ starting point in the reservoir and range in destination plate j = 1 for i in range(1, 13):
import sys import os from liquidhandling import SoloSoft soloSoft = SoloSoft( filename="example.hso", plateList=[ "TipBox-Corning 200uL", "Corning 3383", "Corning 3383", "Corning 3383", "Corning 3383", "Corning 3383", "Corning 3383", "Corning 3383", ], ) soloSoft.getTip() soloSoft.loop(1) soloSoft.aspirate() soloSoft.dispense() soloSoft.endLoop() soloSoft.moveArm() # print(soloSoft.pipeline) soloSoft.savePipeline(CRLF=True)
# * Program Variables blowoff_volume = 20 num_mixes = 5 # Step 3 variables antibiotic_transfer_volume_s3 = 90 antibiotic_mix_volume_s3 = 90 destination_mix_volume_s3 = 120 soloSoft = SoloSoft( filename="antibiotic_into_culture_plate.hso", plateList=[ "TipBox.200uL.Corning-4864.orangebox", "Empty", "DeepBlock.96.VWR-75870-792.sterile", "Plate.96.Corning-3635.ClearUVAssay", "DeepBlock.96.VWR-75870-792.sterile", "Plate.96.Corning-3635.ClearUVAssay", "Plate.96.Corning-3635.ClearUVAssay", "Empty", ], ) # no need to get tips (just ended at smallest serial dilution) -> work backwards in growth plate soloSoft.getTip() for i in range(6, 0, -1): soloSoft.aspirate( position="Position6", aspirate_volumes=Plate_96_Corning_3635_ClearUVAssay().setColumn( i, antibiotic_transfer_volume_s3), mix_at_start=True,
def generate_steps_1_2_3(treatment, predicted_IC50=None): return_val = "PASS" # * Program variables blowoff_volume = 10 num_mixes = 3 current_media_reservoir_volume = media_reservoir_volume = 7000 reservoir_z_shift = 0.5 # z shift for deep blocks (Deck Positions 3 and 5) lambda6_path = "/lambda_stor/data/hudson/instructions/" # Step 1 variables culture_plate_column_num = 7 # Changed to column 7 for test on 06/15/21 media_transfer_volume_s1 = 60 culture_transfer_volume_s1 = 30 # dilution_media_volume = 198 half_dilution_media_volume = 99 dilution_culture_volume = 22 culture_plate_mix_volume_s1 = ( 30 # best to mix with same volume transferred, ok for min volume ) growth_plate_mix_volume_s1 = 40 # Step 2 variables media_transfer_volume_s2 = ( 108 # two times = 216 uL (will add 24 uL antibiotic for 1:10 dilution) ) first_column_transfer_volume_s2 = ( 120 # two times = 240uL (to equal volume in 1:10 dilution wells) ) serial_antibiotic_transfer_volume_s2 = 24 serial_source_mixing_volume_s2 = 80 serial_source_num_mixes_s2 = 8 serial_destination_mixing_volume_s2 = 100 # Step 3 variables antibiotic_transfer_volume_s3 = 90 antibiotic_mix_volume_s3 = 90 destination_mix_volume_s3 = 100 # * Get location of treatment try: treatment_plate_loc, treatment_column = find_treatment_loc(treatment) except Error as e: print(f"Unale to locate treatment {treatment}") raise # need to know locaton of treatment, rest of protocol useless if not specified # * TODO: handle predicted IC50 # * Create folder to store all instruction files project = "Campaign1" project_desc = "col" + str(culture_plate_column_num) version_num = "v1" timestamp = str(time.time()).split(".")[0] directory_name = f"{project}-{project_desc}-{version_num}-{timestamp}" directory_path = os.path.join( os.path.realpath(os.path.dirname(lambda6_path)), directory_name) print(f"Protocol directory created: {directory_path}") # * create new directory to hold new instructions try: os.makedirs(directory_path, exist_ok=True) except OSError as e: print(e) print( f"failed to create new directory for instructions: {directory_path}" ) """ STEP 1: INNOCULATE GROWTH PLATE FROM SOURCE BACTERIA PLATE ----------------------------------------------------------------- """ # * Initialize soloSoft (step 1) step1_hso_filename = os.path.join(directory_path, "step_1.hso") soloSoft = SoloSoft( filename=step1_hso_filename, plateList=[ "TipBox.180uL.Axygen-EVF-180-R-S.bluebox", "Empty", "DeepBlock.96.VWR-75870-792.sterile", "Plate.96.Corning-3635.ClearUVAssay", "DeepBlock.96.VWR-75870-792.sterile", "Plate.96.Corning-3635.ClearUVAssay", "Plate.96.Corning-3635.ClearUVAssay", "Empty", ], ) # * Fill all columns of empty 96 well plate (corning 3383 or Falcon - ref 353916) with fresh lb media (12 channel in Position 3, column 1) soloSoft.getTip() j = 1 for i in range(1, 7): # first half plate = media from column 1 soloSoft.aspirate( position="Position3", aspirate_volumes=Reservoir_12col_Agilent_201256_100_BATSgroup(). setColumn(1, media_transfer_volume_s1), aspirate_shift=[0, 0, reservoir_z_shift], ) soloSoft.dispense( position="Position4", dispense_volumes=Plate_96_Corning_3635_ClearUVAssay().setColumn( i, media_transfer_volume_s1), dispense_shift=[0, 0, 2], ) for i in range(7, 13): # second half plate = media from column 2 soloSoft.aspirate( position="Position3", aspirate_volumes=Reservoir_12col_Agilent_201256_100_BATSgroup(). setColumn(2, media_transfer_volume_s1), aspirate_shift=[0, 0, reservoir_z_shift], ) soloSoft.dispense( position="Position4", dispense_volumes=Plate_96_Corning_3635_ClearUVAssay().setColumn( i, media_transfer_volume_s1), dispense_shift=[0, 0, 2], ) # * Fill first two columns of culture 10 fold dilution plate with fresh lb media (do in two steps due to 180uL filter tips) for i in range(2): # first column soloSoft.aspirate( position="Position3", aspirate_volumes=Reservoir_12col_Agilent_201256_100_BATSgroup(). setColumn(1, half_dilution_media_volume), aspirate_shift=[0, 0, reservoir_z_shift], ) soloSoft.dispense( position="Position7", dispense_volumes=Plate_96_Corning_3635_ClearUVAssay().setColumn( 1, half_dilution_media_volume), dispense_shift=[0, 0, 2], ) for i in range(2): # second column soloSoft.aspirate( position="Position3", aspirate_volumes=Reservoir_12col_Agilent_201256_100_BATSgroup(). setColumn(2, half_dilution_media_volume), aspirate_shift=[0, 0, reservoir_z_shift], ) soloSoft.dispense( position="Position7", dispense_volumes=Plate_96_Corning_3635_ClearUVAssay().setColumn( 2, half_dilution_media_volume), dispense_shift=[0, 0, 2], ) # * Make culture 10 fold dilution (one column for each half of plate) for i in range(1, 3): soloSoft.aspirate( position="Position5", aspirate_volumes=DeepBlock_96VWR_75870_792_sterile().setColumn( culture_plate_column_num, dilution_culture_volume), aspirate_shift=[0, 0, 2], mix_at_start=True, mix_cycles=num_mixes, mix_volume=culture_plate_mix_volume_s1, dispense_height=2, # pre_aspirate=blowoff_volume, syringe_speed=25, ) soloSoft.dispense( position="Position7", dispense_volumes=Plate_96_Corning_3635_ClearUVAssay().setColumn( i, dilution_culture_volume), dispense_shift=[0, 0, 2], mix_at_finish=True, mix_cycles=num_mixes, mix_volume=culture_plate_mix_volume_s1, aspirate_height=2, syringe_speed=25, # blowoff=blowoff_volume, ) # * Add bacteria from 10 fold diluted culture plate (Position 7, column 1 and 2) to growth plate with fresh media (both halves) for i in range(1, 7): # first half growth plate soloSoft.aspirate( # already mixed the cells, no need to do it before every transfer position="Position7", aspirate_volumes=Plate_96_Corning_3635_ClearUVAssay().setColumn( 1, culture_transfer_volume_s1), aspirate_shift=[ 0, 0, 2, ], # prevents 50 uL tips from going too deep in 96 deep well plate syringe_speed=25, ) soloSoft.dispense( # do need to mix at end of transfer position="Position4", dispense_volumes=Plate_96_Corning_3635_ClearUVAssay().setColumn( i, culture_transfer_volume_s1), mix_at_finish=True, mix_cycles=num_mixes, mix_volume=growth_plate_mix_volume_s1, aspirate_height=2, dispense_shift=[0, 0, 2], syringe_speed=25, ) for i in range(7, 13): # second half growth plate soloSoft.aspirate( # already mixed the cells, no need to do it before every transfer position="Position7", aspirate_volumes=Plate_96_Corning_3635_ClearUVAssay().setColumn( 2, culture_transfer_volume_s1), aspirate_shift=[ 0, 0, 2, ], # prevents 50 uL tips from going too deep in 96 deep well plate syringe_speed=25, ) soloSoft.dispense( # do need to mix at end of transfer position="Position4", dispense_volumes=Plate_96_Corning_3635_ClearUVAssay().setColumn( i, culture_transfer_volume_s1), mix_at_finish=True, mix_cycles=num_mixes, mix_volume=growth_plate_mix_volume_s1, aspirate_height=2, dispense_shift=[0, 0, 2], syringe_speed=25, ) soloSoft.shuckTip() soloSoft.savePipeline() """ STEP 2: PERFORM SERIAL DILUTIONS ON TREATMENT ------------------------------------------------------------------------------- """ # * Initialize soloSoft (step 2) step2_hso_filename = os.path.join(directory_path, "step_2.hso") soloSoft = SoloSoft( filename=step2_hso_filename, plateList=[ "TipBox.180uL.Axygen-EVF-180-R-S.bluebox", "Empty", "DeepBlock.96.VWR-75870-792.sterile", "Plate.96.Corning-3635.ClearUVAssay", "DeepBlock.96.VWR-75870-792.sterile", "Plate.96.Corning-3635.ClearUVAssay", "Plate.96.Corning-3635.ClearUVAssay", "Empty", ], ) # * Fill colums 2-6 of generic 96 well plate with lb media (will use for both halves of plate) soloSoft.getTip() for i in range(2, 7): # draws from both lb media wells to prevent running out of media -> TODO: volume management soloSoft.aspirate( # first lb media well position="Position3", aspirate_volumes=Reservoir_12col_Agilent_201256_100_BATSgroup(). setColumn(1, media_transfer_volume_s2), aspirate_shift=[0, 0, reservoir_z_shift], # pre_aspirate=blowoff_volume, ) soloSoft.dispense( position="Position6", dispense_volumes=Plate_96_Corning_3635_ClearUVAssay().setColumn( i, media_transfer_volume_s2), dispense_shift=[0, 0, 2], # blowoff=blowoff_volume, ) soloSoft.aspirate( # second lb media well position="Position3", aspirate_volumes=Reservoir_12col_Agilent_201256_100_BATSgroup(). setColumn(2, media_transfer_volume_s2), aspirate_shift=[0, 0, reservoir_z_shift], # pre_aspirate=blowoff_volume, ) soloSoft.dispense( position="Position6", dispense_volumes=Plate_96_Corning_3635_ClearUVAssay().setColumn( i, media_transfer_volume_s2), dispense_shift=[0, 0, 2], # blowoff=blowoff_volume, ) # * Transfer undiluted treatment stock solution (12 channel in Position 3, 2rd row) into empty first row of serial dilution plate for i in range(2): soloSoft.aspirate( position=treatment_plate_loc, aspirate_volumes=Reservoir_12col_Agilent_201256_100_BATSgroup(). setColumn(treatment_column, first_column_transfer_volume_s2), pre_aspirate=blowoff_volume, mix_at_start=True, mix_cycles=serial_source_num_mixes_s2, mix_volume=serial_source_mixing_volume_s2, aspirate_shift=[0, 0, reservoir_z_shift], dispense_height=reservoir_z_shift, ) soloSoft.dispense( position="Position6", dispense_volumes=Plate_96_Corning_3635_ClearUVAssay().setColumn( 1, first_column_transfer_volume_s2), dispense_shift=[0, 0, 2], blowoff=blowoff_volume, # mix_at_finish=True, # mix_cycles=num_mixes, # mix_volume=serial_destination_mixing_volume_s2, aspirate_height=2, ) # * Serial dilution within Generic 96 well plate (Corning or Falcon) - mix 5 times before and after transfer for i in range(1, 6): if i == 4: # switch tips half way through to reduce error soloSoft.getTip() soloSoft.aspirate( position="Position6", aspirate_volumes=Plate_96_Corning_3635_ClearUVAssay().setColumn( i, serial_antibiotic_transfer_volume_s2), aspirate_shift=[0, 0, 2], pre_aspirate=blowoff_volume, mix_at_start=True, mix_cycles=num_mixes, mix_volume=serial_destination_mixing_volume_s2, dispense_height=2, ) soloSoft.dispense( position="Position6", dispense_volumes=Plate_96_Corning_3635_ClearUVAssay().setColumn( i + 1, serial_antibiotic_transfer_volume_s2), dispense_shift=[0, 0, 2], blowoff=blowoff_volume, mix_at_finish=True, mix_cycles=num_mixes, mix_volume=serial_destination_mixing_volume_s2, aspirate_height=2, ) # no need to throw away excess volume from last column of serial dilution soloSoft.shuckTip() soloSoft.savePipeline() """ STEP 3: ADD ANTIBIOTIC TO CULTURE PLATES ------------------------------------------------------------------------------------- """ # * Initialize soloSoft (step 3) step3_hso_filename = os.path.join(directory_path, "step_3.hso") soloSoft = SoloSoft( filename=step3_hso_filename, plateList=[ "TipBox.180uL.Axygen-EVF-180-R-S.bluebox", "Empty", "DeepBlock.96.VWR-75870-792.sterile", "Plate.96.Corning-3635.ClearUVAssay", "DeepBlock.96.VWR-75870-792.sterile", "Plate.96.Corning-3635.ClearUVAssay", "Plate.96.Corning-3635.ClearUVAssay", "Empty", ], ) soloSoft.getTip() for i in range(6, 0, -1): # first half of plate if i == 3: # switch tips half way through to reduce error soloSoft.getTip() soloSoft.aspirate( position="Position6", aspirate_volumes=Plate_96_Corning_3635_ClearUVAssay().setColumn( i, antibiotic_transfer_volume_s3), mix_at_start=True, mix_cycles=num_mixes, mix_volume=antibiotic_mix_volume_s3, dispense_height=2, aspirate_shift=[0, 0, 2], ) soloSoft.dispense( position="Position4", dispense_volumes=Plate_96_Corning_3635_ClearUVAssay().setColumn( i, antibiotic_transfer_volume_s3), mix_at_finish=True, mix_cycles=num_mixes, mix_volume=destination_mix_volume_s3, aspirate_height=2, dispense_shift=[0, 0, 2], ) soloSoft.getTip() for i in range(6, 0, -1): # second half of plate if i == 3: # switch tips half way through to reduce error soloSoft.getTip() soloSoft.aspirate( position="Position6", aspirate_volumes=Plate_96_Corning_3635_ClearUVAssay().setColumn( i, antibiotic_transfer_volume_s3), mix_at_start=True, mix_cycles=num_mixes, mix_volume=antibiotic_mix_volume_s3, dispense_height=2, aspirate_shift=[0, 0, 2], ) soloSoft.dispense( position="Position4", dispense_volumes=Plate_96_Corning_3635_ClearUVAssay().setColumn( i + 6, antibiotic_transfer_volume_s3), mix_at_finish=True, mix_cycles=num_mixes, mix_volume=destination_mix_volume_s3, aspirate_height=2, dispense_shift=[0, 0, 2], ) soloSoft.shuckTip() soloSoft.savePipeline() """ ADD ALL STEPS TO SOFTLINX PROTOCOL AND SEND TO HUDSON01 ----------------------------------------------------------------------- """ # initialize softLinx softLinx = SoftLinx("Steps_1_2_3", os.path.join(directory_path, "steps_1_2_3.slvp")) # define starting plate layout softLinx.setPlates( {"SoftLinx.PlateCrane.Stack5": "Plate.96.Corning-3635.ClearUVAssay"}) # restock growth assay plate before run softLinx.plateCraneMovePlate(["SoftLinx.PlateCrane.Stack5"], ["SoftLinx.Solo.Position4"]) softLinx.plateCraneMoveCrane("SoftLinx.PlateCrane.Safe") # run all three liquid handling steps (with paths to .hso files on hudson01) softLinx.soloSoftResetTipCount( 1) # SoloSoft will reset to full tip box before run softLinx.soloSoftRun("C:\\labautomation\\instructions\\" + directory_name + "\\" + os.path.basename(step1_hso_filename)) softLinx.soloSoftRun("C:\\labautomation\\instructions\\" + directory_name + "\\" + os.path.basename(step2_hso_filename)) softLinx.soloSoftRun("C:\\labautomation\\instructions\\" + directory_name + "\\" + os.path.basename(step3_hso_filename)) # move growth plate to Hidex softLinx.plateCraneMovePlate( ["SoftLinx.Solo.Position4"], ["SoftLinx.Hidex.Nest"]) # no need to open hidex softLinx.hidexClose() softLinx.plateCraneMoveCrane("SoftLinx.PlateCrane.Safe") softLinx.hidexRun("Campaign1") # save protocol to write instructions to .slvp file, create .txt manifest, and .ahk remote start file softLinx.saveProtocol() """ SEND NEW INSTRUCTIONS TO WORK CELL (HUDSON01) ------------------------------------------------------------------ """ try: # TODO: change to full path on lambda6 child_message_sender = child_pid = Popen( [ "python", "../../zeromq/lambda6_send_instructions.py", "-d", directory_path, ], start_new_session=True, ).pid print("New instruction directory passed to lambda6_send_message.py") except Error as e: print(e) print("Could not send new instructions to hudson01") return return_val
current_softLinx.plateCraneMovePlate( [full_tip_storage], [empty_tip_location], hasLid=True, ) #softLinx.saveProtocol() # --------------------------------------------------------------------------------------------------- #* Use all tips in a tip box softLinx.soloSoftResetTipCount(6) # automatically reset the tip count (for testing) soloSoft = SoloSoft( filename="use_all_tips.hso", plateList=[ "Empty", "Empty", "Empty", "Empty", "Empty", "TipBox.200uL.Corning-4864.orangebox", "Empty", "Empty", ]) for i in range(1,13): soloSoft.getTip("Position6") soloSoft.shuckTip() soloSoft.savePipeline() #* Test conditional recognition of empty tip box # softLinx.conditional( # conditionalStatement="[SoftLinx.PlateCrane].Speed > 0", # branchTrue=[
import sys from liquidhandling import SoloSoft from liquidhandling import * # Program Variables transfer_volume = 150 blowoff_volume = 0 clearance_from_bottom = 1 soloSoft = SoloSoft( filename="putida_OD600_step4_ClearUVToPlateOneVBottom.hso", plateList=[ "TipBox.200uL.Corning-4864.orangebox", "Empty", "Reservoir.12col.Agilent-201256-100.BATSgroup", "Plate.96.Agilent-5043-9310.RoundBottomStorage", "DeepBlock.96.VWR-75870-792.sterile", "Plate.96.Corning-3635.ClearUVAssay", "Plate.96.PlateOne-1833-9600.ConicalBottomStorage", "Empty", ], ) for i in range(1, 13): # i = 1,2,..., 12 soloSoft.getTip() # need to get new tips every time soloSoft.aspirate( position="Position6", aspirate_volumes=Plate_96_Corning_3635_ClearUVAssay().setColumn( i, transfer_volume ),
import os import sys from liquidhandling import SoloSoft from liquidhandling import * # Program Variables transfer_volume = 180 blowoff_volume = 0 soloSoft = SoloSoft( filename="putida_OD600_DispenseBuffer.hso", plateList=[ "TipBox.200uL.Corning-4864.orangebox", "Empty", "Reservoir.12col.Agilent-201256-100.BATSgroup", "Plate.96.Agilent-5043-9310.RoundBottomStorage", "DeepBlock.96.VWR-75870-792.sterile", "Plate.96.Corning-3635.ClearUVAssay", "Plate.96.PlateOne-1833-9600.ConicalBottomStorage", "Empty", ], ) soloSoft.getTip() for i in range(7, 9): # columns in 12 channel reservoir for j in range(1, 7): # <- columns in round bottom storage soloSoft.aspirate( position="Position3", aspirate_volumes=Reservoir_12col_Agilent_201256_100_BATSgroup().setColumn( i, transfer_volume
from liquidhandling import SoftLinx, SoloSoft from liquidhandling import * # * Program Variables trans_volume = 10 default_z_shift = 0.5 # * Initialize Solo soloSoft = SoloSoft( filename="plate_test_384.hso", plateList=[ "Empty", "Empty", "Empty", "Empty", "Empty", "Empty", "TipBox.50uL.Axygen-EV-50-R-S.tealbox", "Plate.384.Corning-3540.BlackwClearBottomAssay", ], ) soloSoft.getTip("Position7") # * aspirate/dispense column 1, rows A C E G I K M O (odd rows) -> start A1 soloSoft.aspirate( position="Position8", aspirate_volumes=Plate_384_Corning_3540_BlackwClearBottomAssay().setColumn( 1, trans_volume ), aspirate_shift=[0, 0, default_z_shift],
# Step 1 variables culture_plate_column_num = 2 media_transfer_volume_s1 = 60 culture_transfer_volume_s1 = 30 dilution_media_volume = 198 dilution_culture_volume = 22 culture_plate_mix_volume_s1 = 50 growth_plate_mix_volume_s1 = 40 soloSoft = SoloSoft( filename="innoculate_growth_plate.hso", plateList=[ "TipBox.200uL.Corning-4864.orangebox", "Empty", "DeepBlock.96.VWR-75870-792.sterile", "Plate.96.Corning-3635.ClearUVAssay", "DeepBlock.96.VWR-75870-792.sterile", "Plate.96.Corning-3635.ClearUVAssay", "Plate.96.Corning-3635.ClearUVAssay", "Empty", ], ) # * Fill 6 columns of empty 96 well plate (corning 3383 or Falcon - ref 353916) with fresh lb media (12 channel in Position 3, column 1) soloSoft.getTip() j = 1 for i in range(1, 7): soloSoft.aspirate( position="Position3", aspirate_volumes=Reservoir_12col_Agilent_201256_100_BATSgroup().setColumn( 1, media_transfer_volume_s1