I have seen that the class Lid(Resource) is defined in pylabrobot/resources/plate.py but I am asking specifically what is the real-world reference to this definition of a plate lid in relationship to its parent plate?
This complexity arises from the fact that most lids do not protrude over the x-y borders of their plate but instead sit straight on top of the plate.
To hold the lid in that position the lid’s skirt/frame has to “nest” into the plate below it.
only the z-height above the plate (this would be C-lid_skirt_height, this information is currently not covered by PLR), or
the total height of the physical lid (shown as C in the drawing), i.e. even the part of the lid that “nests” into the plate?
My guess of the current state is that Lid.get_size_z() = C, i.e. option 2.
If that is the is the case I suggest we add an attribute that could be called nesting_z_height to Lid which records how much of the lid’s z-dimension overlaps with the plate parent.
I believe that this is the minimal, currently not available information that is needed to write lid-to-plate assignments that self correct the lids true origin position.
Foreshadowing: Once we solve this, we can add some really neat features to PLR… or at least I think they are really neat
worse: lid_height is actually fixed to 10mm, the x and y dimensions simply match a Plate’s definition (at least for Hamilton).
C looks like a good option. I think it would also be good to know the thickness of the plastic cover on the top, the big horizontal plane that rests on the wells, say lid.top_plane_thickness. This, to be clear, does not exist right now.
Then we can compute nesting_z_height as plate.get_size_z() + lid.top_plane_thickness - lid.get_size_z().
Plates could define the “base height”, or similar. If lid.get_size_z() - lid.top_plane_thickness > plate.get_size_z() - plate.base_height, the lid z coordinate will simply be plate.base_height. (the lid rests on the base)
I suspect several of these measurements may not be available in databases, but I’m happy to crowd source again.
This is proposing that we manually measure the top_plane_thickness and then calculate the nesting_z_height “from the bottom up”.
I see a couple of problems with this approach:
Physically measuring the top_plane_thickness with a caliper is actually very hard (/ I don’t know how) because the top_plane is surrounded by structures on all sides.
The only way I would accurately measure top_plane_thickness is using the STAR as a CMM: place a block of conductive metal on the deck, probe its top_z_height_start, place the lid below the metal block, measure its top_z_height_end, and then calculate top_z_height_end-top_z_height_start to find the true top_plane_thickness… that’s quite a lot of work, and I left out some important considerations.
I don’t think this would cover all possibilities:
A number of lids have inset elevations, similar to pedestal, or have raised edges around the entire lid:
we require an easy-to-measure parameter (lid.nesting_z_height), and
we adjust the lid origin to where it is in real life, i.e. nesting onto its parent plate.
I believe this will also facilitate accurate plate movement.
I think we can adjust the elevation in the definition if the real increase in z-height of any additional plate on top of the lid is not actually the full size of the elevation.
Precise, reliable plate stacks → therefore enabling 5-9x throughput (depending on plates chosen) without modification to the overall deck during run time and minimal setup time (including future LLM-proofing)
PS.: This does not include “nested” plates which compared to “stacked” plates could achieve even higher throughput due to nested plates exhibiting higher plates/z-height counts than plates being placed on top of each others’ lids. But a “plate nest” implementation is the next challenge after this “plate stack” implementation.
I added the suggested changes to PR#161. (I’ll try and figure out how to update all the unit tests in a bit)
We can modify and test different versions in this PR.
Sorry, let me clarify. In the Hamilton robots there are teaching needles installed (basically stainless steel tips) with which you can teach position with absolute coordinates. With those you can easily measure the thickness even if it is elevated. I assume, that there is something similar on the Tecan machines to assist with labware definitions? I mean this problem is not only true for lid definition but for all labware without a technical drawing, right?
Ahh, thank you for clarifying.
Since one cannot use the steel tips for cLLD identification to measure the lid (because it is a highly non-conductive plastic) I assume you are referring to moving the tip via commands and recording the height when a human sees it approach the plate top.
That is not the question but instead it is whether we can measure the thickness without the elevation?
For stacking we must know and therefore precisely measure the thickness without the elevation.
To be clear we are talking about an elevation range of approximately 0.5-3 mm, and could empirically deduce the correct value when stacking actually occurs.
But for the purpose of identifying what information to make required for PLR it is important to discuss these details because they can break an automation run.
I’m not entirely sure I get what you mean by elevation. Would it be helpful to show you a real work example? Can you provide a cross-section view of what we are talking about?
In the above, you’re almost measuring the same twice (though the first way is more accurate). If you want the z of the upper protrusion (the “plateau” of the lid), then the simplest way to measure it is to measure total z of the plate + plateau, and subtract what you measure in your first picture (the “edge” minus the plateau).
This measures nesting_z_height + thickness_of_top + elevation.
For the purpose of correct lid placement the elevation value has to be removed because a plate or lid placed on top of a lid does not sit on that elevation. The elevation is inset on the top surface and acts to hold the item placed on top of it into place.
To be clear, the elevation is very small, I’ve seen it from 0.5-3mm. So I don’t see this as a huge problem.
But for completeness sake we should establish a standard operating procedure for how to measure lids in detail.
I recommend doing what @jkhales suggested above / I suggested in the GitHub infographic (no matter whether one uses a “depth measurement” or a “jaw measurement”).
But in the end add a depth measurement of the lid elevation and subtract it for the final Lid.size_z:
Sorry, I still don’t fully understand. I think we can measure all components individually.
In my initial picture (which JJ posted), I measure nesting_z_height + thickness_of_top, elevation is not included.
thickness_of_top can be measured with a thickness gauge: just add a gauge block in between the thickness gauge and the plate, and measure the difference between thickness of gauge block and the measurement of gauge block + plate thickness. You can add two gauge blocks if you want to miss elevation. elevation can be measured using calipers with the stepped edge:
nesting_z_height can thus be calculated from these two numbers and total_size_z.
You can also place two plates on top of each other and use the “stepped edge” method and directly measure the z difference. For example: place plate on table and use “stepped edge” method to measure total_size_z. Then place plate. Measure total_size_z again. Now you have the difference in height generated by 1 stacking step.
Yes, I agree that that would work very well. I just don’t think most labs have the gauge and/or gauge block.
Do you mean elevation can be calculated and nesting_z_height easily be measured using the stepped edge or depth measurement?
I think this is the smartest way of measuring the elevation, and thereby gaining the knowledge to remove it from the final Lid.size_z!
That’s a very neat measurement technique @fderop