Using trackers#

Trackers in PyLabRobot are objects that keep track of the state of the deck throughout a protocol. Two types of trackers currently exist: tip trackers (tracking the presence of tips in tip racks and on the pipetting channels) and volume trackers (tracking the volume in pipetting tips and wells).

from pylabrobot.liquid_handling import LiquidHandler
from pylabrobot.liquid_handling.backends.chatterbox_backend import ChatterBoxBackend
from pylabrobot.resources import (
  TIP_CAR_480_A00,
  HTF_L,
  PLT_CAR_L5AC_A00,
  Cos_96_EZWash,
  set_tip_tracking,
  set_volume_tracking
)
from pylabrobot.resources.hamilton import STARLetDeck

lh = LiquidHandler(backend=ChatterBoxBackend(num_channels=8), deck=STARLetDeck())
await lh.setup()
Setting up the robot.
Resource deck was assigned to the robot.
Resource trash was assigned to the robot.
Setting up the robot.
tip_carrier = TIP_CAR_480_A00(name="tip carrier") # initialize a tip carrier
plt_carrier = PLT_CAR_L5AC_A00(name="plate carrier") # initialize a plate carrier

We enable tip and volume tracking globally using the set_volume_tracking and set_tip_tracking methods.

set_volume_tracking(enabled=True)
set_tip_tracking(enabled=True)

Tip trackers#

The tip tracker is a simple class that keeps track of the current tip, and the previous operations that have been performed on an object. This enables features like return_tips() and automated tip type detection.

Initializing tip racks#

Whether or not tip tracking is turned on, spots on a tip rack initialize with a tip tracker that defaults to having a tip. The tip tracker only comes into play with performing operations.

tip_carrier[0] = tip_rack = HTF_L(name="tip rack")
tip_rack.get_item("A1").tracker.has_tip
True

To initialize a tip rack without tips, pass with_tips=False:

tip_carrier[1] = empty_tip_rack = HTF_L(name="empty tip rack", with_tips=False)
empty_tip_rack.get_item("A1").tracker.has_tip
False

To “empty” a tip rack after initialization, use the empty() method. To “fill” a tip rack after initialization, use the fill() method.

empty_tip_rack.fill()
empty_tip_rack.get_item("A1").tracker.has_tip
True
empty_tip_rack.empty()
empty_tip_rack.get_item("A1").tracker.has_tip
False
lh.deck.assign_child_resource(tip_carrier, rails=3)
Resource tip carrier was assigned to the robot.

Tip tracker errors#

The tip tracker is most useful for catching hardware errors before they happen. With tip tracking turned on, the following errors can be raised:

from pylabrobot.resources.errors import HasTipError, NoTipError

NoTipError when picking up a tip#

This error is raised when the tip tracker is trying to access a spot that has no tip.

await lh.pick_up_tips(tip_rack[0])
await lh.drop_tips(empty_tip_rack[0])

try:
  await lh.pick_up_tips(tip_rack[0])
except NoTipError as e:
  print("As expected:", e)
Picking up tips [Pickup(resource=TipSpot(name=tip rack_tipspot_0_0, location=(007.200, 068.300, -83.500), size_x=9.0, size_y=9.0, size_z=0, category=tip_spot), offset=None, tip=HamiltonTip(HIGH_VOLUME, has_filter=True, maximal_volume=1065, fitting_depth=8, total_tip_length=95.1, pickup_method=OUT_OF_RACK))].
Dropping tips [Drop(resource=TipSpot(name=empty tip rack_tipspot_0_0, location=(007.200, 068.300, -83.500), size_x=9.0, size_y=9.0, size_z=0, category=tip_spot), offset=None, tip=HamiltonTip(HIGH_VOLUME, has_filter=True, maximal_volume=1065, fitting_depth=8, total_tip_length=95.1, pickup_method=OUT_OF_RACK))].
As expected: Tip spot does not have a tip.

HasTipError when dropping a tip#

This error is raised when the tip tracker is trying to access a spot that has a tip.

await lh.pick_up_tips(tip_rack[1])

try:
  await lh.drop_tips(empty_tip_rack[0])
except HasTipError as e:
  print("As expected:", e)
Picking up tips [Pickup(resource=TipSpot(name=tip rack_tipspot_0_1, location=(007.200, 059.300, -83.500), size_x=9.0, size_y=9.0, size_z=0, category=tip_spot), offset=None, tip=HamiltonTip(HIGH_VOLUME, has_filter=True, maximal_volume=1065, fitting_depth=8, total_tip_length=95.1, pickup_method=OUT_OF_RACK))].
As expected: Tip spot already has a tip.
await lh.drop_tips(empty_tip_rack[1])
Dropping tips [Drop(resource=TipSpot(name=empty tip rack_tipspot_0_1, location=(007.200, 059.300, -83.500), size_x=9.0, size_y=9.0, size_z=0, category=tip_spot), offset=None, tip=HamiltonTip(HIGH_VOLUME, has_filter=True, maximal_volume=1065, fitting_depth=8, total_tip_length=95.1, pickup_method=OUT_OF_RACK))].

NoTipError when dropping a tip#

This error is raised when the tip tracker is trying to use a channel that has no tip.

try:
  await lh.drop_tips(empty_tip_rack[2])
except NoTipError as e:
  print("As expected:", e)
As expected: Channel 0 does not have a tip.

HasTipError when picking up a tip#

This error is raised when the tip tracker is trying to use a channel that has a tip.

await lh.pick_up_tips(tip_rack[2])

try:
  await lh.pick_up_tips(tip_rack[3])
except HasTipError as e:
  print("As expected:", e)
Picking up tips [Pickup(resource=TipSpot(name=tip rack_tipspot_0_2, location=(007.200, 050.300, -83.500), size_x=9.0, size_y=9.0, size_z=0, category=tip_spot), offset=None, tip=HamiltonTip(HIGH_VOLUME, has_filter=True, maximal_volume=1065, fitting_depth=8, total_tip_length=95.1, pickup_method=OUT_OF_RACK))].
As expected: Channel 0 already has a tip.

Disabling the tip tracker#

The tip tracker can be disabled in three different ways, depending on the desired behavior.

Using a context manager#

The pylabrobot.resources.no_tip_tracking() context manager can be used to disable the tip tracker for a set of operations.

Note that we use the pylabrobot.liquid_handling.liquid_handler.LiquidHandler.clear_head_state() method to forget the tips that are currently mounted on the channels. This is needed because even though the tip tracker is disabled, the channels still keep track of the tips that are mounted on them.

lh.clear_head_state()
from pylabrobot.resources import no_tip_tracking

with no_tip_tracking():
  await lh.pick_up_tips(tip_rack[4])
  await lh.pick_up_tips(tip_rack[4], use_channels=[1]) # no error
Picking up tips [Pickup(resource=TipSpot(name=tip rack_tipspot_0_4, location=(007.200, 032.300, -83.500), size_x=9.0, size_y=9.0, size_z=0, category=tip_spot), offset=None, tip=HamiltonTip(HIGH_VOLUME, has_filter=True, maximal_volume=1065, fitting_depth=8, total_tip_length=95.1, pickup_method=OUT_OF_RACK))].
Picking up tips [Pickup(resource=TipSpot(name=tip rack_tipspot_0_4, location=(007.200, 032.300, -83.500), size_x=9.0, size_y=9.0, size_z=0, category=tip_spot), offset=None, tip=HamiltonTip(HIGH_VOLUME, has_filter=True, maximal_volume=1065, fitting_depth=8, total_tip_length=95.1, pickup_method=OUT_OF_RACK))].

For a single tip spot#

The tip tracker can be disabled for a single object by calling pylabrobot.resources.tip_tracker.TipTracker.disable() on the tracker object.

lh.clear_head_state()
tip_rack.get_item(5).tracker.disable()

await lh.pick_up_tips(tip_rack[5])
await lh.pick_up_tips(tip_rack[5], use_channels=[1]) # no error

tip_rack.get_item(5).tracker.enable()
Picking up tips [Pickup(resource=TipSpot(name=tip rack_tipspot_0_5, location=(007.200, 023.300, -83.500), size_x=9.0, size_y=9.0, size_z=0, category=tip_spot), offset=None, tip=HamiltonTip(HIGH_VOLUME, has_filter=True, maximal_volume=1065, fitting_depth=8, total_tip_length=95.1, pickup_method=OUT_OF_RACK))].
Picking up tips [Pickup(resource=TipSpot(name=tip rack_tipspot_0_5, location=(007.200, 023.300, -83.500), size_x=9.0, size_y=9.0, size_z=0, category=tip_spot), offset=None, tip=HamiltonTip(HIGH_VOLUME, has_filter=True, maximal_volume=1065, fitting_depth=8, total_tip_length=95.1, pickup_method=OUT_OF_RACK))].

For a single tip rack#

Disable the tip tracker for a single tip rack by calling pylabrobot.resources.TipRack.disable_tip_trackers() and pylabrobot.resources.TipRack.enable_tip_trackers() on the tip rack object.

lh.clear_head_state()
tip_rack.disable_tip_trackers()

await lh.pick_up_tips(tip_rack[5])
await lh.pick_up_tips(tip_rack[5], use_channels=[1]) # no error

tip_rack.enable_tip_trackers()
Picking up tips [Pickup(resource=TipSpot(name=tip rack_tipspot_0_5, location=(007.200, 023.300, -83.500), size_x=9.0, size_y=9.0, size_z=0, category=tip_spot), offset=None, tip=HamiltonTip(HIGH_VOLUME, has_filter=True, maximal_volume=1065, fitting_depth=8, total_tip_length=95.1, pickup_method=OUT_OF_RACK))].
Picking up tips [Pickup(resource=TipSpot(name=tip rack_tipspot_0_5, location=(007.200, 023.300, -83.500), size_x=9.0, size_y=9.0, size_z=0, category=tip_spot), offset=None, tip=HamiltonTip(HIGH_VOLUME, has_filter=True, maximal_volume=1065, fitting_depth=8, total_tip_length=95.1, pickup_method=OUT_OF_RACK))].

Globally#

The tip tracker can be disabled globally by using pylabrobot.resources.set_tip_tracking().

lh.clear_head_state()
from pylabrobot.resources import set_tip_tracking

set_tip_tracking(enabled=False)

await lh.pick_up_tips(tip_rack[6])
await lh.pick_up_tips(tip_rack[6], use_channels=[1]) # no error

set_tip_tracking(enabled=True)
Picking up tips [Pickup(resource=TipSpot(name=tip rack_tipspot_0_6, location=(007.200, 014.300, -83.500), size_x=9.0, size_y=9.0, size_z=0, category=tip_spot), offset=None, tip=HamiltonTip(HIGH_VOLUME, has_filter=True, maximal_volume=1065, fitting_depth=8, total_tip_length=95.1, pickup_method=OUT_OF_RACK))].
Picking up tips [Pickup(resource=TipSpot(name=tip rack_tipspot_0_6, location=(007.200, 014.300, -83.500), size_x=9.0, size_y=9.0, size_z=0, category=tip_spot), offset=None, tip=HamiltonTip(HIGH_VOLUME, has_filter=True, maximal_volume=1065, fitting_depth=8, total_tip_length=95.1, pickup_method=OUT_OF_RACK))].

Volume trackers#

The volume tracker is a simple class that keeps track of the current volume, and the previous operations that have been performed on an object. This enables features like automated liquid class selection in STAR, and raises errors before they happen on the robot.

Initializing wells#

Wells automatically initialize with a volume tracker that defaults to having no volume.

plt_carrier[0] = plate = Cos_96_EZWash(name="plate")
plate.get_item("A1").tracker.get_used_volume()
0
plate.get_item("A1").tracker.get_free_volume()
572.5552611167398
from pylabrobot.resources.liquid import Liquid
plate.get_item("A1").tracker.set_liquids([(Liquid.WATER, 10)])
plate.get_item("A1").tracker.get_used_volume(), plate.get_item("A1").tracker.get_free_volume()
(10, 562.5552611167398)
lh.deck.assign_child_resource(plt_carrier, rails=9)
Resource plate carrier was assigned to the robot.

Inspecting volume tracker operation history#

await lh.aspirate(plate["A1"], vols=10)
plate.get_item("A1").tracker.get_used_volume(), plate.get_item("A1").tracker.get_free_volume()
Aspirating [Aspiration(resource=Well(name=plate_well_0_0, location=(009.500, 070.000, 001.000), size_x=9.0, size_y=9.0, size_z=9, category=well), offset=None, tip=HamiltonTip(HIGH_VOLUME, has_filter=True, maximal_volume=1065, fitting_depth=8, total_tip_length=95.1, pickup_method=OUT_OF_RACK), volume=10, flow_rate=None, liquid_height=None, blow_out_air_volume=0, liquid=None)].
(0, 572.5552611167398)
await lh.dispense(plate["A1"], vols=10)
plate.get_item("A1").tracker.get_used_volume(), plate.get_item("A1").tracker.get_free_volume()
Dispensing [Dispense(resource=Well(name=plate_well_0_0, location=(009.500, 070.000, 001.000), size_x=9.0, size_y=9.0, size_z=9, category=well), offset=None, tip=HamiltonTip(HIGH_VOLUME, has_filter=True, maximal_volume=1065, fitting_depth=8, total_tip_length=95.1, pickup_method=OUT_OF_RACK), volume=10, flow_rate=None, liquid_height=None, blow_out_air_volume=0, liquid=None)].
(10, 562.5552611167398)

Volume tracker errors#

from pylabrobot.resources.volume_tracker import TooLittleLiquidError, TooLittleVolumeError

TooLittleLiquidError when dispensing#

This error is raised when the volume tracker is trying to dispense from a tip that has less liquid than the requested volume.

try:
  await lh.dispense(plate["A1"], vols=100) # this is less liquid than is currently in the tip
except TooLittleLiquidError as e:
  print("As expected:", e)
As expected: Container has too little liquid: 100uL > 0uL.

TooLittleVolumeError when aspirating#

This error is raised when the volume tracker is trying to aspirate from a tip that has less free volume than the requested volume.

lh.clear_head_state()
await lh.pick_up_tips(tip_rack[8])
Picking up tips [Pickup(resource=TipSpot(name=tip rack_tipspot_1_0, location=(016.200, 068.300, -83.500), size_x=9.0, size_y=9.0, size_z=0, category=tip_spot), offset=None, tip=HamiltonTip(HIGH_VOLUME, has_filter=True, maximal_volume=1065, fitting_depth=8, total_tip_length=95.1, pickup_method=OUT_OF_RACK))].
# fill the first two columns
for i in range(16):
  plate.get_item(i).tracker.set_liquids([(Liquid.WATER, 100)])

try:
  # aspirate from the first two columns - this is more liquid than the tip can hold
  for i in range(16):
    await lh.aspirate(plate[i], vols=100)
except TooLittleVolumeError as e:
  print("As expected:", e)
Aspirating [Aspiration(resource=Well(name=plate_well_0_0, location=(009.500, 070.000, 001.000), size_x=9.0, size_y=9.0, size_z=9, category=well), offset=None, tip=HamiltonTip(HIGH_VOLUME, has_filter=True, maximal_volume=1065, fitting_depth=8, total_tip_length=95.1, pickup_method=OUT_OF_RACK), volume=100, flow_rate=None, liquid_height=None, blow_out_air_volume=0, liquid=None)].
Aspirating [Aspiration(resource=Well(name=plate_well_0_1, location=(009.500, 061.000, 001.000), size_x=9.0, size_y=9.0, size_z=9, category=well), offset=None, tip=HamiltonTip(HIGH_VOLUME, has_filter=True, maximal_volume=1065, fitting_depth=8, total_tip_length=95.1, pickup_method=OUT_OF_RACK), volume=100, flow_rate=None, liquid_height=None, blow_out_air_volume=0, liquid=None)].
Aspirating [Aspiration(resource=Well(name=plate_well_0_2, location=(009.500, 052.000, 001.000), size_x=9.0, size_y=9.0, size_z=9, category=well), offset=None, tip=HamiltonTip(HIGH_VOLUME, has_filter=True, maximal_volume=1065, fitting_depth=8, total_tip_length=95.1, pickup_method=OUT_OF_RACK), volume=100, flow_rate=None, liquid_height=None, blow_out_air_volume=0, liquid=None)].
Aspirating [Aspiration(resource=Well(name=plate_well_0_3, location=(009.500, 043.000, 001.000), size_x=9.0, size_y=9.0, size_z=9, category=well), offset=None, tip=HamiltonTip(HIGH_VOLUME, has_filter=True, maximal_volume=1065, fitting_depth=8, total_tip_length=95.1, pickup_method=OUT_OF_RACK), volume=100, flow_rate=None, liquid_height=None, blow_out_air_volume=0, liquid=None)].
Aspirating [Aspiration(resource=Well(name=plate_well_0_4, location=(009.500, 034.000, 001.000), size_x=9.0, size_y=9.0, size_z=9, category=well), offset=None, tip=HamiltonTip(HIGH_VOLUME, has_filter=True, maximal_volume=1065, fitting_depth=8, total_tip_length=95.1, pickup_method=OUT_OF_RACK), volume=100, flow_rate=None, liquid_height=None, blow_out_air_volume=0, liquid=None)].
Aspirating [Aspiration(resource=Well(name=plate_well_0_5, location=(009.500, 025.000, 001.000), size_x=9.0, size_y=9.0, size_z=9, category=well), offset=None, tip=HamiltonTip(HIGH_VOLUME, has_filter=True, maximal_volume=1065, fitting_depth=8, total_tip_length=95.1, pickup_method=OUT_OF_RACK), volume=100, flow_rate=None, liquid_height=None, blow_out_air_volume=0, liquid=None)].
Aspirating [Aspiration(resource=Well(name=plate_well_0_6, location=(009.500, 016.000, 001.000), size_x=9.0, size_y=9.0, size_z=9, category=well), offset=None, tip=HamiltonTip(HIGH_VOLUME, has_filter=True, maximal_volume=1065, fitting_depth=8, total_tip_length=95.1, pickup_method=OUT_OF_RACK), volume=100, flow_rate=None, liquid_height=None, blow_out_air_volume=0, liquid=None)].
Aspirating [Aspiration(resource=Well(name=plate_well_0_7, location=(009.500, 007.000, 001.000), size_x=9.0, size_y=9.0, size_z=9, category=well), offset=None, tip=HamiltonTip(HIGH_VOLUME, has_filter=True, maximal_volume=1065, fitting_depth=8, total_tip_length=95.1, pickup_method=OUT_OF_RACK), volume=100, flow_rate=None, liquid_height=None, blow_out_air_volume=0, liquid=None)].
Aspirating [Aspiration(resource=Well(name=plate_well_1_0, location=(018.500, 070.000, 001.000), size_x=9.0, size_y=9.0, size_z=9, category=well), offset=None, tip=HamiltonTip(HIGH_VOLUME, has_filter=True, maximal_volume=1065, fitting_depth=8, total_tip_length=95.1, pickup_method=OUT_OF_RACK), volume=100, flow_rate=None, liquid_height=None, blow_out_air_volume=0, liquid=None)].
Aspirating [Aspiration(resource=Well(name=plate_well_1_1, location=(018.500, 061.000, 001.000), size_x=9.0, size_y=9.0, size_z=9, category=well), offset=None, tip=HamiltonTip(HIGH_VOLUME, has_filter=True, maximal_volume=1065, fitting_depth=8, total_tip_length=95.1, pickup_method=OUT_OF_RACK), volume=100, flow_rate=None, liquid_height=None, blow_out_air_volume=0, liquid=None)].
As expected: Container has too little volume: {volume}uL > {self.get_free_volume()}uL.

TooLittleLiquidError when aspirating#

This error is raised when trying to dispense into a well that has less free volume than the requested volume.

try:
  await lh.aspirate(plate["A1"], vols=100) # this is less liquid than is currently in the well
except TooLittleLiquidError as e:
  print("As expected:", e)
As expected: Container has too little liquid: 100uL > 0uL.

TooLittleVolumeError when dispensing#

This error is raised when trying to aspirate from a well that has less liquid than the requested volume.

lh.clear_head_state()
await lh.pick_up_tips(tip_rack[9])
Picking up tips [Pickup(resource=TipSpot(name=tip rack_tipspot_1_1, location=(016.200, 059.300, -83.500), size_x=9.0, size_y=9.0, size_z=0, category=tip_spot), offset=None, tip=HamiltonTip(HIGH_VOLUME, has_filter=True, maximal_volume=1065, fitting_depth=8, total_tip_length=95.1, pickup_method=OUT_OF_RACK))].
# fill the first column
for i in range(8):
  plate.get_item(i).tracker.set_liquids([(Liquid.WATER, 100)])

try:
  # aspirate liquid from the first column into the first well
  for i in range(1, 8):
    await lh.aspirate(plate[i], vols=100)
    await lh.dispense(plate["A1"], vols=100)
except TooLittleVolumeError as e:
  print("As expected:", e)
Aspirating [Aspiration(resource=Well(name=plate_well_0_1, location=(009.500, 061.000, 001.000), size_x=9.0, size_y=9.0, size_z=9, category=well), offset=None, tip=HamiltonTip(HIGH_VOLUME, has_filter=True, maximal_volume=1065, fitting_depth=8, total_tip_length=95.1, pickup_method=OUT_OF_RACK), volume=100, flow_rate=None, liquid_height=None, blow_out_air_volume=0, liquid=None)].
Dispensing [Dispense(resource=Well(name=plate_well_0_0, location=(009.500, 070.000, 001.000), size_x=9.0, size_y=9.0, size_z=9, category=well), offset=None, tip=HamiltonTip(HIGH_VOLUME, has_filter=True, maximal_volume=1065, fitting_depth=8, total_tip_length=95.1, pickup_method=OUT_OF_RACK), volume=100, flow_rate=None, liquid_height=None, blow_out_air_volume=0, liquid=None)].
Aspirating [Aspiration(resource=Well(name=plate_well_0_2, location=(009.500, 052.000, 001.000), size_x=9.0, size_y=9.0, size_z=9, category=well), offset=None, tip=HamiltonTip(HIGH_VOLUME, has_filter=True, maximal_volume=1065, fitting_depth=8, total_tip_length=95.1, pickup_method=OUT_OF_RACK), volume=100, flow_rate=None, liquid_height=None, blow_out_air_volume=0, liquid=None)].
Dispensing [Dispense(resource=Well(name=plate_well_0_0, location=(009.500, 070.000, 001.000), size_x=9.0, size_y=9.0, size_z=9, category=well), offset=None, tip=HamiltonTip(HIGH_VOLUME, has_filter=True, maximal_volume=1065, fitting_depth=8, total_tip_length=95.1, pickup_method=OUT_OF_RACK), volume=100, flow_rate=None, liquid_height=None, blow_out_air_volume=0, liquid=None)].
Aspirating [Aspiration(resource=Well(name=plate_well_0_3, location=(009.500, 043.000, 001.000), size_x=9.0, size_y=9.0, size_z=9, category=well), offset=None, tip=HamiltonTip(HIGH_VOLUME, has_filter=True, maximal_volume=1065, fitting_depth=8, total_tip_length=95.1, pickup_method=OUT_OF_RACK), volume=100, flow_rate=None, liquid_height=None, blow_out_air_volume=0, liquid=None)].
Dispensing [Dispense(resource=Well(name=plate_well_0_0, location=(009.500, 070.000, 001.000), size_x=9.0, size_y=9.0, size_z=9, category=well), offset=None, tip=HamiltonTip(HIGH_VOLUME, has_filter=True, maximal_volume=1065, fitting_depth=8, total_tip_length=95.1, pickup_method=OUT_OF_RACK), volume=100, flow_rate=None, liquid_height=None, blow_out_air_volume=0, liquid=None)].
Aspirating [Aspiration(resource=Well(name=plate_well_0_4, location=(009.500, 034.000, 001.000), size_x=9.0, size_y=9.0, size_z=9, category=well), offset=None, tip=HamiltonTip(HIGH_VOLUME, has_filter=True, maximal_volume=1065, fitting_depth=8, total_tip_length=95.1, pickup_method=OUT_OF_RACK), volume=100, flow_rate=None, liquid_height=None, blow_out_air_volume=0, liquid=None)].
Dispensing [Dispense(resource=Well(name=plate_well_0_0, location=(009.500, 070.000, 001.000), size_x=9.0, size_y=9.0, size_z=9, category=well), offset=None, tip=HamiltonTip(HIGH_VOLUME, has_filter=True, maximal_volume=1065, fitting_depth=8, total_tip_length=95.1, pickup_method=OUT_OF_RACK), volume=100, flow_rate=None, liquid_height=None, blow_out_air_volume=0, liquid=None)].
Aspirating [Aspiration(resource=Well(name=plate_well_0_5, location=(009.500, 025.000, 001.000), size_x=9.0, size_y=9.0, size_z=9, category=well), offset=None, tip=HamiltonTip(HIGH_VOLUME, has_filter=True, maximal_volume=1065, fitting_depth=8, total_tip_length=95.1, pickup_method=OUT_OF_RACK), volume=100, flow_rate=None, liquid_height=None, blow_out_air_volume=0, liquid=None)].
Dispensing [Dispense(resource=Well(name=plate_well_0_0, location=(009.500, 070.000, 001.000), size_x=9.0, size_y=9.0, size_z=9, category=well), offset=None, tip=HamiltonTip(HIGH_VOLUME, has_filter=True, maximal_volume=1065, fitting_depth=8, total_tip_length=95.1, pickup_method=OUT_OF_RACK), volume=100, flow_rate=None, liquid_height=None, blow_out_air_volume=0, liquid=None)].
Aspirating [Aspiration(resource=Well(name=plate_well_0_6, location=(009.500, 016.000, 001.000), size_x=9.0, size_y=9.0, size_z=9, category=well), offset=None, tip=HamiltonTip(HIGH_VOLUME, has_filter=True, maximal_volume=1065, fitting_depth=8, total_tip_length=95.1, pickup_method=OUT_OF_RACK), volume=100, flow_rate=None, liquid_height=None, blow_out_air_volume=0, liquid=None)].
Dispensing [Dispense(resource=Well(name=plate_well_0_0, location=(009.500, 070.000, 001.000), size_x=9.0, size_y=9.0, size_z=9, category=well), offset=None, tip=HamiltonTip(HIGH_VOLUME, has_filter=True, maximal_volume=1065, fitting_depth=8, total_tip_length=95.1, pickup_method=OUT_OF_RACK), volume=100, flow_rate=None, liquid_height=None, blow_out_air_volume=0, liquid=None)].
Aspirating [Aspiration(resource=Well(name=plate_well_0_7, location=(009.500, 007.000, 001.000), size_x=9.0, size_y=9.0, size_z=9, category=well), offset=None, tip=HamiltonTip(HIGH_VOLUME, has_filter=True, maximal_volume=1065, fitting_depth=8, total_tip_length=95.1, pickup_method=OUT_OF_RACK), volume=100, flow_rate=None, liquid_height=None, blow_out_air_volume=0, liquid=None)].
Dispensing [Dispense(resource=Well(name=plate_well_0_0, location=(009.500, 070.000, 001.000), size_x=9.0, size_y=9.0, size_z=9, category=well), offset=None, tip=HamiltonTip(HIGH_VOLUME, has_filter=True, maximal_volume=1065, fitting_depth=8, total_tip_length=95.1, pickup_method=OUT_OF_RACK), volume=100, flow_rate=None, liquid_height=None, blow_out_air_volume=0, liquid=None)].