Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -325,7 +325,7 @@
"\n",
"await prep.pipettes.pick_up_tips(tip_spots, use_channels=channels)\n",
"status(\"after pickup\")\n",
"await prep.pipettes.aspirate(source, vols=volumes, use_channels=channels, liquid_height=[3.0, 3.0])\n",
"await prep.pipettes.aspirate(source, piston_volumes=volumes, use_channels=channels, liquid_heights=[3.0, 3.0])\n",
"status(\"after aspirate\")\n",
"await prep.pipettes.dispense(destination, vols=volumes, use_channels=channels, liquid_height=[3.0, 3.0])\n",
"status(\"after dispense\")\n",
Expand Down
2 changes: 1 addition & 1 deletion pylabrobot/hamilton/prep/driver/features/head8.py
Original file line number Diff line number Diff line change
Expand Up @@ -544,7 +544,7 @@ async def drop_tips(
for ch in use_channels:
used = mounted[ch].tracker.get_used_volume()
if not mounted[ch].tracker.is_disabled and used > 1e-6:
raise RuntimeError(f"Cannot drop tip on channel {ch} with volume {used} uL")
logger.warning("dropping the tip on channel %d with %s uL in it", ch, used)
spots = [d for d in destinations if isinstance(d, TipSpot)]
if len({id(spot) for spot in spots}) != len(spots):
raise ValueError("each tip must go into a spot of its own")
Expand Down
22 changes: 22 additions & 0 deletions pylabrobot/hamilton/prep/driver/features/head8_tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -471,6 +471,28 @@ async def _run() -> None:
asyncio.run(_run())


def test_head8_aspirate_pressure_without_p_lld_raises():
"""lld_mode=PRESSURE with no p_lld is refused and no aspirate is sent."""

async def _run() -> None:
deck, tip_rack, src_plate, _ = _make_deck()
p = PrepSimulationDriver(deck=deck, declared_configuration_json=RECORDING_PREP_HEAD8)
await p.setup()
assert p.head8 is not None

await p.head8.pick_up_tips(tip_rack.column(0))
captured, _ = _record_send(p)
with pytest.raises(ValueError, match="needs p_lld"):
await p.head8.aspirate(
wells=src_plate.column(0), volume=10, lld_mode=Pipettes.LLDMode.PRESSURE
)
assert captured == []

await p.stop()

asyncio.run(_run())


def test_head8_aspirate_lld_and_tadm_sends_mphaspirate_with_lld_tadm2():
"""lld_mode=CAPACITIVE + tadm= → MphAspirateWithLldTadm2."""

Expand Down
Loading
Loading