diff --git a/pylabrobot/liquid_handling/liquid_handler.py b/pylabrobot/liquid_handling/liquid_handler.py index 20ae453de4e..9a942a10ba2 100644 --- a/pylabrobot/liquid_handling/liquid_handler.py +++ b/pylabrobot/liquid_handling/liquid_handler.py @@ -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) @@ -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), diff --git a/pylabrobot/liquid_handling/liquid_handler_tests.py b/pylabrobot/liquid_handling/liquid_handler_tests.py index ed62c846308..2bccd622b17 100644 --- a/pylabrobot/liquid_handling/liquid_handler_tests.py +++ b/pylabrobot/liquid_handling/liquid_handler_tests.py @@ -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):