i agree. we can get a good abstraction and not force/hurt all LH to work the same.
visiting this thread back after a week because i deeply think agnosticism (or basically a good wrapper/frontend of what could be standardised) is important. we have quite helpful ones already in PLR and I think having this better at the right layer will bring us a long way. for now, i believe this is what should live in PLR and genuinely helpful:
- the resource and labware model;
- standard plate, well, tip-rack, carrier, and container definitions;
- liquid-volume, tip, resource-location, and machine-state tracking;
- shared communication and I/O infrastructure;
- standard result formats for analytical instruments, such as plate readers;
- common APIs for machines whose underlying operations are genuinely similar.
on 6, using LH example, what we can do is:
Protocol written using the PLR pipetting API
await lh.aspirate(β¦)
await lh.dispense(β¦)
β
Pipette-based liquid-handler frontend
PipetteLiquidHandler
β
Standard pipetting operation objects
PickupTip
SingleChannelAspiration
SingleChannelDispense
Mix
β
Machine-specific backend
STARBackend / EVOBackend / OpentronsBackend
β
Shared or device-specific I/O
USB / serial / HTTP / firmware commands
β
Physical pipetting robot
vs acoustic liquid handlers
Protocol written using the PLR acoustic-transfer API
await acoustic_lh.transfer(β¦)
β
Acoustic liquid-handler frontend
AcousticLiquidHandler
β
Standard acoustic operation objects
AcousticTransfer
SourceWellSurvey
DropletEjection
β
Machine-specific backend
EchoBackend / other acoustic backend
β
Shared or device-specific I/O
HTTP / file exchange / vendor API
β
Physical acoustic liquid handler
or if needed, make pipette-based LH explicitly different in API, too.
we may also have this hierarchy:
LiquidTransferDevice
βββ PipetteLiquidHandler
βββ AcousticLiquidHandler
βββ NonContactDispenser
where different families can still share the same PLR resource model, plate definitions, well objects, volume tracking, operation logging, serialization, and I/O utilities.
additionally, what i think PLR genuinely need to keep upgrading is state tracking across machines (eg readiness, activity, lid/tray status), not just device actions in the frontend (more here: Suggesting a thicker frontend for getting status of machines Β· Issue #1183 Β· PyLabRobot/pylabrobot Β· GitHub )
therefore, βsolvingβ higher-level scientific protocol intent with planner selecting a suitable device and execution strategy, or handling complex protocols like whole PCR prep, could live outside and build on top of PLR, imho.
I imagine we would share the logic of those things across all pipettes of course, but more so coming from the perspective of code sharing (DRY) than making a universal driver API for everything
is this feasible? on what level can you translate? I think that βaspirateβ is too low level
yes these are all still the same, with the exception of point 6 and to an extent 5
this is learning towards the capability architecture, which imo is the βcorrectβ but not the βdumbβ solution. it gets too complex for people to actually use. writing mostly independent drivers is very fast, and itβs agnostic enough for what I actually see people do