-
Notifications
You must be signed in to change notification settings - Fork 94
Expose Well.bottom() & Well.top() #142
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
…/BioCam/pylabrobot into Implement-Well.bottom-&-Well.top
I think it would be better if |
I love the extensive documentation and motivation (as always) and it's definitely a useful add, whatever the implementation is! |
Let's discuss :) I think the question to answer is "what is well.bottom() and well.top() likely going to be used for?" I have found these two methods very useful for labware definition investigation, which is why I showed them as examples in this PR. I could imagine though that an "anchor" rather than absolute location approach might be useful for other applications? Like you said maybe for await lh.aspirate(
plate['H1'],
vols=[0],
lld_mode=[lh.backend.LLDMode(0),
offsets=Coordinate(0,0,well.top().z),
use_channels=[0],
liquid_class_dict=liquid_class_x) But in that situation I would say it is just as easy to call the well_depth, which already exists, instead: await lh.aspirate(
plate['H1'],
vols=[0],
lld_mode=[lh.backend.LLDMode(0),
offsets=Coordinate(0,0,well.get_size_z()),
use_channels=[0],
liquid_class_dict=liquid_class_x) Meaning, in this specific situation I don't think the "anchor" implementation yields a benefit to current solutions. |
Agree that this is not optimal, and duplicated from well.get_size_z(). A second thought: the I am also thinking about something like this: |
I see what you mean: switching back and forth between anchors and absolute coordinates is indeed confusing.
I love that idea! Should we then just make the pure .bottom() and .top() into anchors, |
That sounds good to me! |
what do you think about this: #147 |
done! thanks for the work here & "asking" for this feature! :) |
Haha no worries, I always think it's more productive to ask with a suggestion of the solution (if possible), makes things move faster 😄 Thank you for the fast replies and finding an even better solution! |
Hi everyone,
Let's expose some of that Opentrons wisdom to PLR:
In this PR I added two small methods to the
Well
class inresources/well.py
:Well.bottom(z_offset=0.0)
... convenient method to compute the absolute Coordinate of the 2D central bottom of a well, with the added functionality that a z_offset can directly be declared.Well.top(z_offset=0.0)
... similar as above just for the 2D central top of a well.Why
With
Well.get_absolute_location()
already in place there is a valid question as to why generate these two methods.The main reason is convenience and clarity to facilitate plate definition creation.
Currently, when defining labware there is no PLR
probe_z_height_using_channel
function (which I created in #69) that works with standard plates and tubes becauseprobe_z_height_using_channel
detects items using capacitative liquid level detection but cannot detect plates due to their material being highly electrically resistant.As a consequence, the dimensions of a plate have to be manually evaluated. In particular the depth of a well represents a small but important challenge: it is arguably one of the most important definitions to get right to avoid crashes and minimise dead volume.
It is therefore important that the machine used enables moving a tip quickly to the bottom of a well and to the top of a well, back and forth, with the ability to efficiently add a z_offset to each Coordinate.
(A laminated piece of paper is very effective at testing whether
Well.top()
is indeed the top of the well, and when moving the tip toWell.bottom()
, the tip can be slightly moved by hand, sensing slight resistance to the move, i.e. the tip hasn't crashed.)Example Use Case
A step-by-step guide to conveniently and transparently use these little methods:
I hope this helps PLR users to create more robust labware definitions.