Using “Hamilton Liquid Classes” with Pylabrobot#
This notebook demonstrates how to use the Hamilton liquid classes with Pylabrobot’s liquid handling system. “Liquid classes” are essentially a essentially sets of predefined parameters that describe a specific liquid transfer operation (aspirate + dispense). While it is possible to control all parameters explicitly/manually, or to store those in dictionaries of kwargs, using “Hamilton liquid classes” is the historical way many people are used to doing this in Venus. “Hamilton liquid class” refers to the concept of the ‘set of parameters’ as it is used in VENUS.
PyLabRobot has imported many Hamilton liquid classes from VENUS. In this notebook we will show how to use these classes in PylabRobot.
Simple example setup#
%load_ext autoreload
%autoreload 2
Use the STARChatterboxBackend
to test out the liquid classes without connecting to a real Hamilton STAR robot. Switch out the backend to STARBackend
to run on a real robot.
from pylabrobot.liquid_handling import LiquidHandler
from pylabrobot.liquid_handling.backends.hamilton.STAR_chatterbox import STARChatterboxBackend
# from pylabrobot.liquid_handling.backends.hamilton.STAR_backend import STARBackend
from pylabrobot.resources.hamilton import STARLetDeck
backend = STARChatterboxBackend()
# backend = STARBackend()
lh = LiquidHandler(backend=backend, deck=STARLetDeck())
await lh.setup()
from pylabrobot.resources import (
TIP_CAR_480_A00,
PLT_CAR_L5AC_A00,
Cor_96_wellplate_360ul_Fb,
HTF,
)
tip_car = TIP_CAR_480_A00(name="tip carrier")
tip_car[0] = tr = HTF(name="tips_01")
lh.deck.assign_child_resource(tip_car, rails=3)
plt_car = PLT_CAR_L5AC_A00(name="plate carrier")
plt_car[0] = plate = Cor_96_wellplate_360ul_Fb(name="plate_01")
lh.deck.assign_child_resource(plt_car, rails=15)
Picking up tips for the rest of the notebook#
await lh.pick_up_tips(tr["A1:C1"])
C0TTid0001tt01tf1tl0871tv10650tg3tu0
C0TPid0002xp01629 01629 01629 00000&yp1458 1368 1278 0000&tm1 1 1 0&tt01tp2266tz2166th2450td0
Using a predefined Hamilton liquid class#
Pass a predefined Hamilton liquid class to the lh.aspirate
method using the hamilton_liquid_classes
parameter. This parameter is a backend kwarg defined by the STARBackend. This will use the parameters defined in the liquid class for the aspirate operation.
from pylabrobot.liquid_handling.liquid_classes.hamilton.star import HighVolumeFilter_Water_DispenseSurface_Part
await lh.aspirate(
plate["A1:C1"],
vols=[100.0, 50.0, 200.0],
hamilton_liquid_classes=[HighVolumeFilter_Water_DispenseSurface_Part]*3,
)
C0ASid0003at0 0 0 0&tm1 1 1 0&xp04333 04333 04333 00000&yp1457 1367 1277 0000&th2450te2450lp2000 2000 2000 2000&ch000 000 000 000&zl1866 1866 1866 1866&po0100 0100 0100 0100&zu0032 0032 0032 0032&zr06180 06180 06180 06180&zx1866 1866 1866 1866&ip0000 0000 0000 0000&it0 0 0 0&fp0000 0000 0000 0000&av01083 00563 02110 01083&as2500 2500 2500 2500&ta000 000 000 000&ba0000 0000 0000 0000&oa000 000 000 000&lm0 0 0 0&ll1 1 1 1&lv1 1 1 1&zo000 000 000 000&ld00 00 00 00&de0020 0020 0020 0020&wt10 10 10 10&mv00000 00000 00000 00000&mc00 00 00 00&mp000 000 000 000&ms1200 1200 1200 1200&mh0000 0000 0000 0000&gi000 000 000 000&gj0gk0lk0 0 0 0&ik0000 0000 0000 0000&sd0500 0500 0500 0500&se0500 0500 0500 0500&sz0300 0300 0300 0300&io0000 0000 0000 0000&il00000 00000 00000 00000&in0000 0000 0000 0000&
Using a different Hamilton liquid class for each channel#
You can easily pass a list of different Hamilton liquid classes. They will correspond to the channels in the order they are specified.
from pylabrobot.liquid_handling.liquid_classes.hamilton.star import HighVolumeFilter_Water_DispenseSurface_Part, HighVolumeFilter_EtOH_DispenseJet, HighVolumeFilter_DMSO_AliquotDispenseJet_Part
await lh.aspirate(
plate["A1:C1"],
vols=[100.0, 50.0, 200.0],
hamilton_liquid_classes=[
HighVolumeFilter_Water_DispenseSurface_Part,
HighVolumeFilter_EtOH_DispenseJet,
HighVolumeFilter_DMSO_AliquotDispenseJet_Part,
],
)
C0ASid0004at0 0 0 0&tm1 1 1 0&xp04333 04333 04333 00000&yp1457 1367 1277 0000&th2450te2450lp2000 2000 2000 2000&ch000 000 000 000&zl1866 1866 1866 1866&po0100 0100 0100 0100&zu0032 0032 0032 0032&zr06180 06180 06180 06180&zx1866 1866 1866 1866&ip0000 0000 0000 0000&it0 0 0 0&fp0000 0000 0000 0000&av01083 00629 02000 01083&as2500 2500 2500 2500&ta000 050 000 000&ba0000 0000 0500 0000&oa000 000 000 000&lm0 0 0 0&ll1 1 1 1&lv1 1 1 1&zo000 000 000 000&ld00 00 00 00&de0020 0020 0020 0020&wt10 10 10 10&mv00000 00000 00000 00000&mc00 00 00 00&mp000 000 000 000&ms1200 2500 2500 1200&mh0000 0000 0000 0000&gi000 000 000 000&gj0gk0lk0 0 0 0&ik0000 0000 0000 0000&sd0500 0500 0500 0500&se0500 0500 0500 0500&sz0300 0300 0300 0300&io0000 0000 0000 0000&il00000 00000 00000 00000&in0000 0000 0000 0000&
Using custom Hamilton liquid classes#
It is also possible to define your own Hamilton liquid classes. This is useful if you want to use a specific set of parameters that are not available in the predefined classes.
The example below is based on the HighVolumeFilter_Water_DispenseSurface_Part
, but you can easily modify the parameters to suit your needs.
from pylabrobot.liquid_handling.liquid_classes.hamilton import HamiltonLiquidClass
my_custom_hamilton_liquid_class = HamiltonLiquidClass(
curve={
500.0: 518.3,
50.0: 56.3,
0.0: 0.0,
100.0: 108.3,
20.0: 23.9,
1000.0: 1028.5,
200.0: 211.0,
10.0: 12.7,
},
aspiration_flow_rate=250.0,
aspiration_mix_flow_rate=120.0,
aspiration_air_transport_volume=0.0,
aspiration_blow_out_volume=0.0,
aspiration_swap_speed=2.0,
aspiration_settling_time=1.0,
aspiration_over_aspirate_volume=5.0,
aspiration_clot_retract_height=0.0,
dispense_flow_rate=120.0,
dispense_mode=4.0,
dispense_mix_flow_rate=1.0,
dispense_air_transport_volume=30.0,
dispense_blow_out_volume=0.0,
dispense_swap_speed=2.0,
dispense_settling_time=1.0,
dispense_stop_flow_rate=5.0,
dispense_stop_back_volume=0.0,
)
await lh.aspirate(
plate["A1:C1"],
vols=[100.0, 50.0, 200.0],
hamilton_liquid_classes=[my_custom_hamilton_liquid_class]*3,
)
C0ASid0005at0 0 0 0&tm1 1 1 0&xp04333 04333 04333 00000&yp1457 1367 1277 0000&th2450te2450lp2000 2000 2000 2000&ch000 000 000 000&zl1866 1866 1866 1866&po0100 0100 0100 0100&zu0032 0032 0032 0032&zr06180 06180 06180 06180&zx1866 1866 1866 1866&ip0000 0000 0000 0000&it0 0 0 0&fp0000 0000 0000 0000&av01083 00563 02110 01083&as2500 2500 2500 2500&ta000 000 000 000&ba0000 0000 0000 0000&oa000 000 000 000&lm0 0 0 0&ll1 1 1 1&lv1 1 1 1&zo000 000 000 000&ld00 00 00 00&de0020 0020 0020 0020&wt10 10 10 10&mv00000 00000 00000 00000&mc00 00 00 00&mp000 000 000 000&ms1200 1200 1200 1200&mh0000 0000 0000 0000&gi000 000 000 000&gj0gk0lk0 0 0 0&ik0000 0000 0000 0000&sd0500 0500 0500 0500&se0500 0500 0500 0500&sz0300 0300 0300 0300&io0000 0000 0000 0000&il00000 00000 00000 00000&in0000 0000 0000 0000&