コード例 #1
0
 def newSolo(self, plateList):
     new_solo = SoloSoft(
         filename=self.filename_prefix + str(len(self.solosofts)) + ".hso",
         plateList=plateList,
         pipeline=[],
     )
     self.solosofts.append(new_solo)
コード例 #2
0
 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"
コード例 #3
0
 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)
コード例 #4
0
 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)
コード例 #5
0
 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",
     ]
コード例 #6
0
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],
    )
コード例 #7
0
#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",
コード例 #8
0
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,
コード例 #9
0
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",
コード例 #10
0
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",
コード例 #11
0
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(
コード例 #12
0
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().
コード例 #13
0
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
        )
コード例 #14
0
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()
コード例 #15
0
"""
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"],
コード例 #16
0
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),
コード例 #17
0
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],
コード例 #18
0
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
        ),
コード例 #19
0
# * 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),
コード例 #20
0
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):
コード例 #21
0
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)
コード例 #22
0
# * 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,
コード例 #23
0
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
コード例 #24
0
    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
        ),
コード例 #26
0
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
コード例 #27
0
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],
コード例 #28
0
# 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