Repository navigation
Conversation
The 96-head's tip commands could only put head channel A1 over tip spot A1, so the head took or left a whole rack or nothing. An `offset` of whole columns moved the head, but the model still paired spot A1 with channel A1. - `pick_up_tips` and `drop_tips` take `channel` and `tip_spot`, both A1 to H12: the head channel and the spot it goes over. The defaults are A1 and A1, the commands as they were. - Picking up, each channel over a spot holding a tip takes that tip; channels over an empty spot or past the rack's edge take none. - Dropping, each channel's tip goes into the spot under it. A channel carrying a tip beside the rack is refused before anything moves. - `return_tips` reads the two from where the tips came from, so tips are returned the way they were picked up. It refused anything but spot A1 on channel A1. - The alignment itself, which item is under which channel and how far channel A1 is shifted, is in `lib/liquid_handling/head_alignment.py`. It knows nothing of the STAR and works on any grid of the head's size, a plate included. Tests: a shifted pick-up from a rack with a gap pins the command and the tip on every channel; a return after it pins the command and every spot; one pins the refusal of a tip beside the rack; two pin the alignment on a plain rack. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
BioCam
force-pushed
the
head96-partial-tip-pickup
branch
from
October 7, 2026 16:00
4049c2f to
203bea7
Compare
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The Problem
So far PyLabRobot could only use head96s with a perfect placement of the head96's "A1" channel over the tiprack's "A1" TipSpot.
So the head took or left a whole rack or nothing. Taking a block of tips, such as three columns or one quadrant, means shifting the head by whole rows and columns so that only some channels meet tips. An
offsetcould move the head that way, but the model still paired spot A1 with channel A1, so every tip ended up on the wrong channel andreturn_tipscould not return them.PR Content/Solution
head96.pick_up_tipsandhead96.drop_tipstakechannelandtip_spot, both A1 to H12: the head channel and the spot it goes over. The defaults are A1 and A1, which is the commands as they were.head96.return_tipsreads the two from where the tips came from, so tips are returned the way they were picked up. It refused anything but spot A1 on channel A1.lib/liquid_handling/head_alignment.py. It knows nothing of theSTARand works on any grid of the head's size.Channels past the rack's edge come down beside it. What stands there is the caller's to keep clear.
This is the first step. The pair is the low-level form on purpose: whole columns, rows, a quadrant or a set of tip spots each come down to choosing one
channeland onetip_spot, so they can follow as thin arguments on top without new device logic, inheriting the model, the refusals and the reach checks from here.head96.aspirateandhead96.dispensestill place channel A1 over well A1.head_alignmenttakes a plate as well as a tip rack, so the same anchoring will follow for them in a future PR.Tests: a shifted pick-up from a rack with a gap pins the command and the tip on every channel; a return after it pins the command and every spot; one pins the refusal of a tip beside the rack; two pin the alignment on a plain rack.
🤖 Generated with Claude Code