Skip to content
Merged
8 changes: 5 additions & 3 deletions pylabrobot/liquid_handling/liquid_handler.py
Original file line number Diff line number Diff line change
Expand Up @@ -1621,6 +1621,7 @@ async def aspirate96(
liquids = [(None, volume)]
all_liquids.append(liquids)
else:
# tracker is enabled: update tracker liquid history
liquids = well.tracker.remove_liquid(volume=volume) # type: ignore
all_liquids.append(liquids)

Expand Down Expand Up @@ -1760,15 +1761,16 @@ async def dispense96(
if not len(containers) == 96:
raise ValueError(f"dispense96 expects 96 wells, got {len(containers)}")

for channel, well in zip(self.head96.values(), containers):
for well, channel in zip(containers, self.head96.values()):
# even if the volume tracker is disabled, a liquid (None, volume) is added to the list
# during the aspiration command
liquids = channel.get_tip().tracker.remove_liquid(volume=volume)
reversed_liquids = list(reversed(liquids))
all_liquids.append(reversed_liquids)

for liquid, vol in reversed_liquids:
well.tracker.add_liquid(liquid=liquid, volume=vol)
if not well.tracker.is_disabled and does_volume_tracking():
for liquid, vol in reversed_liquids:
well.tracker.add_liquid(liquid=liquid, volume=vol)

dispense = MultiHeadDispensePlate(
wells=cast(List[Well], containers),
Expand Down
13 changes: 13 additions & 0 deletions pylabrobot/liquid_handling/liquid_handler_tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -1091,6 +1091,19 @@ async def error_func(*args, **kwargs):
# test volume doens't change on failed dispense
assert self.lh.head[0].get_tip().tracker.get_used_volume() == 200

async def test_96_head_volume_tracking(self):
for item in self.plate.get_all_items():
item.tracker.set_liquids([(Liquid.WATER, 10)])
await self.lh.pick_up_tips96(self.tip_rack)
await self.lh.aspirate96(self.plate, volume=10)
for i in range(96):
self.assertEqual(self.lh.head96[i].get_tip().tracker.get_used_volume(), 10)
self.plate.get_item(i).tracker.get_used_volume() == 0
await self.lh.dispense96(self.plate, volume=10)
for i in range(96):
self.assertEqual(self.lh.head96[i].get_tip().tracker.get_used_volume(), 0)
self.plate.get_item(i).tracker.get_used_volume() == 10


class TestLiquidHandlerCrossContaminationTracking(unittest.IsolatedAsyncioTestCase):
async def asyncSetUp(self):
Expand Down