Skip to content
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

Make Plate Site-adaptive (Fix PLR plate location 3) #205

Conversation

BioCam
Copy link
Contributor

@BioCam BioCam commented Jul 30, 2024

Hi everyone,

In this PR I am adding conditional logic to enable correct Plate placements on PlateCarrierSites with and without pedestals, a bug that has been dramatically reducing adaptability and utility of PLR deck configurations so far.

This is the 3rd (and hopefully last) PR in a series of careful changes to fix Plate.
Previous associated PRs:

Summary of the issue

The world of PlateCarrierSites, i.e. the "slots" / "positions" / "sites" on a machine that a Plate can be placed upon, can be classified into two simple categories:

  • site with a pedestal
  • site without a pedestal
PlateCarrierSite_types

Figure 1 - PlateCarrierSite classification based on existence of pedestal (i.e. central elevation)

Any automation control system that wants to enable users to conduct experiments (i.e. tasks in which deck configurations can rapidly changed - as opposed to "process churning", i.e. tasks in which the exact same actions are performed repeatedly) has to account for this difference in PlateCarrierSites.
If ignored Plates cannot freely move between different sites, will crash if they do or require careful manual readjustment of every plate location based on the site it is being moved to.

In PLR a series of bugs prevented the implementation of a self-adjusting Plate placement feature.
I summarised them in this infographic:

PLR_plate_FIX

Figure 2 - High-level summary of bugs, information previously missing, and actions needed to fix them

In short:

  1. Plate - was wrongly defined: did not account for the clearance space between the outside bottom of a well and the bottom of the plate skirt (i.e. the dz), incorrectly labelled the material thickness of the well in the z dimension as dz, did not have a clearly defined geometric classification scheme.
  2. Site - treated all sites the same (e.g. for tipracks and for plates), and required the creation of the PlateCarrierSite to enable the addition of information regarding the height/depth of a pedestal.
  3. Site - required more precise definition: the topmost surface of a PlateCarrierSite is always its location's z-coordinate: if there is a pedestal, then the top of the pedestal is the z-coordinate.

PR Content

After adding material_z_thickness as an attribute to Container (and hence to Well), correcting Well's indirect attribute dz (which is equivalent to the Well's anchor z-coordinate after creating a clear definition), and adding pedestal_z_height to PlateCarrierSite in the previous 2 PRs...

...in this PR I merged all this information in...

  • the assign_child_resource() method of PlateCarrierSite, and
  • the lh.move_plate() method...
    ... to deal with the 3 possible scenarios of Plate-to-PlateCarrierSite relationships:
  1. no pedestal
  2. pedestal taller than plate.well.dz
  3. pedestal shorter than plate.well.dz

I also updated the definitions of 5 plates to showcase examples of how plates of different types can be defined to enable accurate dynamical movement between different PlateCarrierSites.

FIX_PLATE_HELPER_MASTER

Figure 3 - Possible Plate-to-PlateCarrierSite relationships

NB.: The PlateCarrierSite z-coordinate is above the z-coordinate of the Plate in scenario 2 and 3 -> This reflects the physical reality of the Plate "sinking" into the PlateCarrierSite and dramatically simplifies the conditional logic needed to represent this phenomenon:

pylabrobot/resources/carrier.py

class PlateCarrierSite(CarrierSite):
...
  def assign_child_resource(self, resource: Resource, location: Coordinate = Coordinate.zero(),
                            reassign: bool = True):
    if isinstance(resource, Plate):
      # Sanity check for equal well clearances / dz
      well_dz_set = {round(well.location.z, 2) for well in resource.get_all_children()
               if all([well.category == "well", well.location is not None])}
      assert len(well_dz_set) == 1, "All wells must have the same dz"
      well_dz = well_dz_set.pop()
      # Plate "sinking" logic based on well dz to pedestal relationship
      pedestal_size_z = abs(self.pedestal_size_z)
      z_sinking_depth = min(pedestal_size_z, well_dz)
      location = Coordinate(location.x, location.y, location.z - z_sinking_depth)

    return super().assign_child_resource(resource, location, reassign)

Next Steps

Still in this PR to figure out:
As a result of these changes plates can be used on different PlateCarrierSites.

But the location of a Well in relationship to its parent Plate is now corrected while the aspirate, dispense, move_to_z commands have not been adjusted to compensate for the new Well changes.
I.e. if one would aspirate from the "bottom" of a well now the pipette tip will crash into the bottom of the well by a distance equivalent to material_z_thickness.
This must not be the case.

Question to the PLR community: Where should we add material_z_thickness to command stacks that go to the inside bottom of a Well?

At the moment, this dynamic plate placement only works when placing a Plate on a PlateCarrierSite.

I can see one other important instance in which we must enable the exact same dynamic plate placement: when placing a Plate on a MFXModule.
I initially built the MFXModule using a CarrierSite on it to place single plates onto it but we refactored this implementation into a specific-location based one instead (#77 ).
We could e.g.
(1) revert back to the old implementation but using PlateCarrierSite instead (that way we carry over the placement logic, or
(2) continue with MFXModule as a single-child location implementation and copy the plate placement from PlateCarrierSite onto it (but then have to also figure out how to navigate the difference between MFXModules that take Plate, TipRack, or Trough.

Please let me know what you think :)

Furthermore, once this PR is completed I will write a post-mortem of the entire Plate issue on the labautomation forum, and generate some docs information for a streamlined workflow to identify (1) a Well's material_z_thickness, and (2) a Plate.Well's correct dz value.

@BioCam
Copy link
Contributor Author

BioCam commented Jul 30, 2024

I'm tagging a couple of people who I believe will be affected by the changes and who I would like to ask for feedback on the questions raised:

@fderop
Copy link
Contributor

fderop commented Jul 30, 2024

Thanks for tagging us @BioCam

Inconsequential, but the "sinking" terminology in my mind conflicts with the "pedestal" terminology - a pedestal lifts something up above a surface, just like the pedestal lifts up the well bottoms if pedestal height > well dz + material thickness.

Where should we add material_z_thickness to command stacks that go to the inside bottom of a Well?

I think ideally nowhere, and we just make sure that the z origin coincides with the well bottom, which I think this PR is setting us up for.

At the moment, this dynamic plate placement only works when placing a Plate on a PlateCarrierSite.

I think ideally all resources with sites that potentially have a pedestal should inherit from a class where assign_child_resource applies the pedestal logic. Pedestal z could be 0 for sites without a pedestal. In this spirit, it seems like applying multiple inheritance to MFXModule could be a third option. If I'm not mistake, this would be the first multiple inheritance in PLR, so adding that will set us up for future multiple inheritance cases (I tried with the Tilt module, but it became too complicated due to diamond inheritance issues).

@ben-ray
Copy link
Contributor

ben-ray commented Jul 31, 2024

Once we have this PR merged, we could replace detailed manual plate definitions with an automatic calibration tool where:

  • developer specifies dx and dy between center of wells, well cross-section(circle/square), plus an approx height above the well
  • use collision detection to determine hard bottom of plate when mounted on carrier
  • pipette water into the well & use cLLD to determine well geometry at a few different well volumes

i think dx, dy, liquid height, and bottom height are the only 4 geometric details that matter for most liquid handling. (plus iSWAP stuff, let's ignore that for now) if this is true, could the plate definition process be fully automated after the user specifies a minimal set of values for the plate? will the generated definition be accurate enough for use our protocols? unsure

@BioCam
Copy link
Contributor Author

BioCam commented Jul 31, 2024

Inconsequential, but the "sinking" terminology in my mind conflicts with the "pedestal" terminology - a pedestal lifts something up above a surface, just like the pedestal lifts up the well bottoms if pedestal height > well dz + material thickness.

@fderop I see your point regarding the nomenclature. In that sense the word "pedestal" might be the misleading word:
The topmost surface of a PlateCarrierSite is its origin's z-coordinate (also according to VENUS).
If a "pedestal" (central elevation) exists, that means the plate does then "sink" into the PlateCarrierSite.
Not sure whether we should then try and find a better word for PlateCarrierSite.pedestal_z_height?

Where should we add material_z_thickness to command stacks that go to the inside bottom of a Well?

I think ideally nowhere, and we just make sure that the z origin coincides with the well bottom, which I think this PR is setting us up for.

Are you suggesting we change the PLR definition of what a Well is?
In the last PR #183 we discussed whether a Well is just the empty cavity or is the empty cavity + the material that creates the cavity and found that
(1) the Well.material_z_thickness is an integral part of the definition (-> had to be considered part of the Well), and
(2) that the Well.material_x_thickness & Well.material_y_thickness are too ambiguous to be measured accurate (-> had to not be considered part of the Well).

Your message indicates that you are suggesting that we change this current PLR Well definition to only count the empty cavity as Well, and make material_z_thickness an associated attribute to Well but not a direct part of it?

I think ideally all resources with sites that potentially have a pedestal should inherit from a class where assign_child_resource applies the pedestal logic.

I think this is a very good point: so you are suggesting we add the pedestal placement logic maybe to assign_child_resource at the super class level of Resource?

@BioCam
Copy link
Contributor Author

BioCam commented Jul 31, 2024

i think dx, dy, liquid height, and bottom height are the only 4 geometric details that matter for most liquid handling.

I don't think so. The issue with Plate was missing information. Specifically, not having information regarding the clearance below the outside of a well, i.e. dz, and the ambiguity of not having a dedicated material_z_thickness meant that until now it was not possible to use the same plate on PlateCarrierSites with and without pedestals.
It also meant that plate movements moved the plate into the wrong position on a PlateCarrierSite with a pedestal until this PR (i.e. it moved it at the z-coordinate of the PlateCarrierSite when it should, and now does, move the plate into the "sunk" position below the PlateCarrierSite z-coordinate - you guys might have noticed how the plates always require a push from the the top after being moved?).

Altogether this indicates that the growing set of attributes of plate definitions are needed.
I also think that plate definitions are maintainable while the alternative - writing automation protocols that are dependent on offsets - is not maintainable long term.

This does not mean that we shouldn't work on developing an automated plate definition tool like the one you are describing though.
I have actually already started 😅
But it is quite difficult and there are at least half a dozen implementation methods which might be able to do the job, from simple camera/computer vision-based systems to figuring out how to retrieve the z-touchoff crash-coordinate from the STAR to some fancy 3D-scanning approaches... the difficulty is to address time-constraint and what will actually work robustly.
But I would like this tool to give us the full set of plate definition attributes that we need to cover all possible use cases of the plate :)

@fderop
Copy link
Contributor

fderop commented Jul 31, 2024

Where should we add material_z_thickness to command stacks that go to the inside bottom of a Well?

I think ideally nowhere, and we just make sure that the z origin coincides with the well bottom, which I think this PR is setting us up for.

Are you suggesting we change the PLR definition of what a Well is? In the last PR #183 we discussed whether a Well is just the empty cavity or is the empty cavity + the material that creates the cavity and found that (1) the Well.material_z_thickness is an integral part of the definition (-> had to be considered part of the Well), and (2) that the Well.material_x_thickness & Well.material_y_thickness are too ambiguous to be measured accurate (-> had to not be considered part of the Well).

Oh no, I thought with "command stacks" you meant as a kwarg somewhere in the commands that call Well, I think what you propose is good.

I was looking at heater-shakers earlier, and in theory a case could exist where the depth of a well is too great to fit into the "wells" on the heat block. The "wells" of the heater-shaker would thus elevate the plate independently of the "pedestal" height of the heater-shaker block. How would you implement that?

@rickwierenga
Copy link
Member

Thank you, Camillo, for the continued work on this, and Ben and Florian for providing feedback.

Regarding pedestals rising or sinking: Camillo previously convinced me (on a call) it's easiest that carrier sites have z=0 at the top of the pedestal, if it exists, because it's not ambiguous what z=0 is in that case. Some carrier sites have complex geometries, for example in the image from the docs below you can see two lower levels and screws. We only care about the highest level below the pedestal surface because plates would rest on that. I am open to re-having this discussion if you have new arguments. I think renaming pedestal might be good, but I don't think pedestal is a bad name.

Regarding single-resource-taking-resource: I think this should be a shared base class for MFXModule and CarrierSite, and TiltModule, HeaterShaker, etc. I propose we define the pedestal height and potetially child_resource_location in that class. As we found with the Tilter, diamond inheritance is not good.

Where should we add material_z_thickness to command stacks that go to the inside bottom of a Well?

For lh.aspirate and lh.dispense, this can be handled on the backend, where backends automatically add the material thickness to the well_bottom they computed from get_absolute_location.

For manual pipette movements with move_channel, I think well.get_absolute_position(..., z="b") + Coordinate(z=well.material_thickness) is most explicit, but it's not concise. How about well.get_cavity_bottom() or similar, which will add the material thickness. You could imagine get_absolute_cavity(z={"b","c","t"})

The "wells" of the heater-shaker would thus elevate the plate independently of the "pedestal" height of the heater-shaker block. How would you implement that?

I think the following "highest level below the pedestal surface", the pedestal should in that case be the bottom of heater-shaker cavities.

IMG_6051

@fderop
Copy link
Contributor

fderop commented Aug 1, 2024

Regarding pedestals rising or sinking: Camillo previously convinced me (on a call) it's easiest that carrier sites have z=0 at the top of the pedestal, if it exists, because it's not ambiguous what z=0 is in that case. Some carrier sites have complex geometries, for example in the image from the docs below you can see two lower levels and screws. We only care about the highest level below the pedestal surface because plates would rest on that. I am open to re-having this discussion if you have new arguments.

I think this is convincing!

The "wells" of the heater-shaker would thus elevate the plate independently of the "pedestal" height of the heater-shaker block. How would you implement that?

I think the following "highest level below the pedestal surface", the pedestal should in that case be the bottom of heater-shaker cavities.

Ok, what happens when the well is shorter in depth than the "heat block well", and thus the origin of the well is lifted above the pedestal?

@BioCam
Copy link
Contributor Author

BioCam commented Aug 2, 2024

I was looking at heater-shakers earlier, and in theory a case could exist where the depth of a well is too great to fit into the "wells" on the heat block. The "wells" of the heater-shaker would thus elevate the plate independently of the "pedestal" height of the heater-shaker block. How would you implement that?

Ok, what happens when the well is shorter in depth than the "heat block well", and thus the origin of the well is lifted above the pedestal?

@fderop, are you talking about this when talking about the "'wells' on a heat block"?

image

Are you familiar with the Resource subclass PlateAdapter I created in #152?

All these adapters are instances of PlateAdapter, i.e. the PlateAdapter's "hole-grid" is used to self-adjust the placement of plates onto the PlateAdapter.
There is a current caveat though: I've mentioned in the PR, PlateAdapter is missing the correction in the z-dimension due to the ongoing Plate issue (which this current PR is [hopefully] fixing).
I believe that now we have all the information to build a z-dimension correction into PlateAdapter (in addition to the existing x-y correction).

Therefore to answer your question...

Ok, what happens when the well is shorter in depth than the "heat block well", and thus the origin of the well is lifted above the pedestal?

...we can write a condition statement that checks this and correctly represents the plate sitting with its top plate on the holes?

@BioCam
Copy link
Contributor Author

BioCam commented Aug 2, 2024

Regarding pedestals rising or sinking: Camillo previously convinced me (on a call) it's easiest that carrier sites have z=0 at the top of the pedestal, if it exists, because it's not ambiguous what z=0 is in that case. Some carrier sites have complex geometries, for example in the image from the docs below you can see two lower levels and screws. We only care about the highest level below the pedestal surface because plates would rest on that. I am open to re-having this discussion if you have new arguments. I think renaming pedestal might be good, but I don't think pedestal is a bad name.

I agree - then we leave PlateCarrierSite.pedestal_z_height and "sinking" terminology (at least for the moment).

Regarding single-resource-taking-resource: I think this should be a shared base class for MFXModule and CarrierSite, ...

Interesting... at the moment, these are direct subclasses of Resource - are you saying we should create a new Resource-subclass to place in between Resource & MFXModule/CarrierSite in this PR, something like SingleChildTakingResource?
This would give all of these a pedestal_z_height attribute.

...and TiltModule, HeaterShaker, etc. I propose we define the pedestal height and potetially child_resource_location in that class. As we found with the Tilter, diamond inheritance is not good.

I am a bit confused by the inheritance pattern:
So far I was under the impression that the mfx_plate_modules, mfx_tip_modules, heaters, shakers, tilters, ... are - physically speaking - instances of MFXModules because they share the single-child resource taking and are flexibly fixed onto a carrier and easily modifiable.
This list makes it seem to me as if they are seen as being at the same level as MFXModules in the inheritance tree?

Where should we add material_z_thickness to command stacks that go to the inside bottom of a Well?

For lh.aspirate and lh.dispense, this can be handled on the backend, where backends automatically add the material thickness to the well_bottom they computed from get_absolute_location.

For manual pipette movements with move_channel, I think well.get_absolute_position(..., z="b") + Coordinate(z=well.material_thickness) is most explicit, but it's not concise. How about well.get_cavity_bottom() or similar, which will add the material thickness. You could imagine get_absolute_cavity(z={"b","c","t"})

Excellent! 👍🏻

lh.backend (in this case STAR) is where I will then add the material_z_thickness for the aspirate and dispense functions.

  • Important question though: Who would be willing to add the equivalent changes to PLR's other backends?
    This change is affecting Plate and will therefore propagate to all machines. As a result, all backends will have to update to include the material_z_thickness in their aspirate and dispense functions(?)

I also agree that manual pipette movement should be separate and be accessible using get_absolute_cavity(z={"b","c","t"}) but would add to that the ability to say get_absolute_cavity(x={"l","c","r"},y={"f","c","b"}, z={"b","c","t"}), i.e. make it the equivalent to get_absolute_location for the cavity.

The "wells" of the heater-shaker would thus elevate the plate independently of the "pedestal" height of the heater-shaker block. How would you implement that?

I think the following "highest level below the pedestal surface", the pedestal should in that case be the bottom of heater-shaker cavities.

I disagree:
As I mentioned above, this physical adapter is easily exchangeable and I would recommend digitally representing it as a PlateAdapter and beefing out PlateAdapter's handling of special child resources like the case described by @fderop here.

Furthermore, PlateCarrierSite does not have the necessary attributes to deal with this situation; e.g. it is missing the hole-grid's dx and dy. That's why I invented PlateAdapter :)

@rickwierenga
Copy link
Member

are you saying we should create a new Resource-subclass to place in between Resource & MFXModule/CarrierSite in this PR, something like SingleChildTakingResource?

yes, in another PR, i think that would be good.

This list makes it seem to me as if they are seen as being at the same level as MFXModules in the inheritance tree?

HamiltonTiltModule was still be inheriting from MFXModule, but additionally from Tilter. Both MFXModule and Tilter inherited from Resource. If you draw this out, there is a diamond, which is difficult to initialize, so we decided Tilter takes precedence over MFXModule as a superclass for HamiltonTiltModule. This is because Tilter is a machine front end, and not all tilt modules are Hamilton/MFX. In the diamond, Tilter and MFXModule were at the same level, below Resource and above HamiltonTiltModule. But again, the MFXModule path was scrapped for convenience.

In the future, we can fix this with the intermediary class like SingleChildTakingResource that is the parent of Tilter and could replace MFXModule (MFXModule has the same code that would be in SingleChildTakingResource and at that point it would only exist for semantic reasons.) That's for a different PR :)

lh.backend (in this case STAR) is where I will then add the material_z_thickness for the aspirate and dispense functions.

Thanks! Do you want to do that in this PR?

Important question though: Who would be willing to add the equivalent changes to PLR's other backends?

For Vantage, I will do it.

For Tecan, these carriers do not have the pedestal_size_z attribute, which means the carriers cannot even be initialized. So it's really up to the next person who uses the next person who uses the EVO backend to fix it, along with adding the pedestal_size_z. If I get my hands on a Tecan again, I suppose I can be that person.

For Opentrons, it should not change anything because there is no pedestal on the Deck.

As I mentioned above, this physical adapter is easily exchangeable and I would recommend digitally representing it as a PlateAdapter and beefing out PlateAdapter's handling of special child resources like the case described by @fderop here.

For these specialized PlateAdapters, yes, strongly agree. But for PlateCarriers, the "highest level below the pedestal surface" should be the definition we use.

@BioCam
Copy link
Contributor Author

BioCam commented Aug 12, 2024

Thanks! Do you want to do that in this PR?

Yes, I will add this today.

For Vantage, I will do it.

Awesome, thank you @rickwierenga.

For Tecan, these carriers do not have the pedestal_size_z attribute, which means the carriers cannot even be initialized.

That makes sense for the Plate-to-PlateCarrierSite relationship modelling.

But I am a bit concerned about the fact that this change will also affect all other Plate operations on all PLR-integrated machines:
We are here implementing the updated Plate definition of well_cavity_bottom_z_coordinate = plate_z_origin + well.dz + well.material_z_thickness (same goes for all other Containers, i.e. Tube, Trough and PetriDish).
This will affect everything in PLR.

Which means I don't think this is correct:

For Opentrons, it should not change anything because there is no pedestal on the Deck.

@BioCam
Copy link
Contributor Author

BioCam commented Aug 12, 2024

@rickwierenga, I am not entirely sure where the z-coordinates are actually defined for different lld_modes:

For lld_mode=0 "aspirate from bottom of the well" it appears that firmware parameter C0AS zl is responsible for sending aspirate_pip to the correct z-coordinate?

zl is in turn defined in aspirate via STAR.py:1578:

liquid_surfaces_no_lld = [wb + (op.liquid_height or 1)
                          for wb, op in zip(well_bottoms, ops)]

But I'm not sure why 1 mm is added here?

I'm starting to think that changing the well_cavity_bottom_z_coordinate at this stage could be very cumbersome for every lld_mode.

Update:

I guess its actually pretty simple to change STAR.py:1577

  def aspirate():
    ...
    well_bottoms = [op.resource.get_absolute_location().z + op.offset.z + op.resource.material_z_thickness for op in ops]
   ...

We just have to do this for every operation (i.e. aspirate, aspirate96, dispense, dispense96)?

rickwierenga added a commit that referenced this pull request Aug 12, 2024
@rickwierenga
Copy link
Member

But I'm not sure why 1 mm is added here?

I added that because I was just going from rck files -> observed firmware commands, and this constant was needed. I was just thinking in terms of variables at that time, not really the physical they represent. This may actually have been the material z thickness. It looks like in this PR we can finally make this sensible.

We just have to do this for every operation (i.e. aspirate, aspirate96, dispense, dispense96)?

That looks right!

I am working on fixing the tests (the plate definition I used for writing the STAR tests is now no longer usable because it is missing the material z thickness, but I think i can figure it out).

rickwierenga added a commit that referenced this pull request Aug 12, 2024
@rickwierenga
Copy link
Member

Can you confirm that this code is working physically on your machine for aspirating?

@rickwierenga
Copy link
Member

is movement with iswap currently broken for you @BioCam? My guess is that the hard-coded pickup_distance_from_top: float = 13.2, in LH is wrong, and again simply a constant that I needed when writing this code, that implicitly factored in the material z thickness.

@BioCam
Copy link
Contributor Author

BioCam commented Aug 15, 2024

is movement with iswap currently broken for you @BioCam?

@rickwierenga, I don't have an iSWAP 😅

But with CO-RE grippers I am always adjusting the pickup_distance_from_top to the specific resource anyway, so I might not have noticed anything.

My guess is that the hard-coded pickup_distance_from_top: float = 13.2, in LH is wrong, and again simply a constant that I needed when writing this code, that implicitly factored in the material z thickness

There are two things that don't sound right about this:

  1. This is in liquid_handler.py which means it affects all PLR liquid handlers, including Tecans and the OT-2, is that correct?
    If yes, I don't think these offsets based on one machine should automatically be applied to all machines?

  2. Do you remember whether you got these 13.2 (mm or dmm?) from a parsed definition of a specific plate?
    We can then check the plate.

Either way, anything between 1.32 - 13.2 mm pick pickup_distance_from_top is a reasonable default value for most plates.
The default value should just be small enough to ensure the grippers aren't sent crashing into the PlateCarrierSite (e.g. if the Plate.get_size_z()==10 (mm) and the pickup_distance_from_top==13.2 mm).

Most "microtiter plates" are between 13-20 mm tall, and any "deepwell plate" would be okay.
I wonder whether the 13.2 mm is actually the maximal distance that a CO-RE gripper can tolerate: if CO-RE grippers are asked to grip too low, the channels instead of the grippers will squeeze the plate because the grippers have a smaller cross-section than the channels lol

jkhales pushed a commit to retrobiosciences/pylabrobot that referenced this pull request Aug 15, 2024
jkhales pushed a commit to retrobiosciences/pylabrobot that referenced this pull request Aug 15, 2024
@rickwierenga
Copy link
Member

The heights of plates have not changed as a result of these changes. But, now that plates sink into the plate carrier sites (with skirted plates), the top z location is (correctly) lower than what we previously thought. Previously, the height of the plate was (wrongly) the z-bottom of wells + total height of plate.

In STAR_tests.py, we use a Cor_96_wellplate_360ul_Fb plate with a PLT_CAR_L5AC_A00 carrier. The sinking depth is 3.03. I also started using Cor_96_wellplate_360ul_Fb instead of Cos_96_EZWash for STAR_tests.py. Cos_96_EZWash was the VENUS-imported plate definition we used in the Esvelt lab, and what I used for developing most of PLR tests. The reason for this change is Cos_96_EZWash does not have material_z_thickness. Cor_96_wellplate_360ul_Fb's height is 14.2mm, 0.3mm lower than Cos_96_EZWash (14.5). Together, these changes mean the height of the plate is 3.03+0.3 = 3.33 lower than before.

This has important implications for resource movements, where the pick up z location is partially defined by the distance from the top of the resource (pickup_distance_from_top). Previously, the top here was actually too high, as explained above. So in order to fix this, we need to decrease pickup_distance_from_top by 3.33 in these tests. I did this in 9ac2e62.

user action required: In the general case, the pickup_distance_from_top for a plate movement to/from a carrier needs to be decreased by the z_sinking_depth as computed in PlateCarrierSite.assign_child_resource.

I already made this change in LiquidHandler.py for the default parameter value. It obviously still depends on a person's setup, and people will likely want to use a custom value, but from what I have seen the carrier and plate used in the tests is pretty typical, so hopefully we approximate the same default behavior as before.

@rickwierenga
Copy link
Member

Another problem was with modifying the location in PlateCarrierSite.assign_child_resource. When deserializing, the location passed to this method is already correct ("sinked") and sinking again is not necessary. It is impossible to generally determine whether sinking has been applied.

As with other resources, I made it so that location is an optional, and that the to-be-parent-resource can choose the best child location if None is passed. When a specific location is passed, that location is used (eg when deserializing). I made this change for CarrierSite and PlateCarrierSite. To allow PlateCarrierSite to use the super class location modification (for rotation), I introduced a new private function for those classes named _get_child_location.

(I also fixed two other tests)

@rickwierenga
Copy link
Member

to answer your questions:

This is in liquid_handler.py which means it affects all PLR liquid handlers, including Tecans and the OT-2, is that correct?

Yes, it would be, but:

  • OT2 doens't have grippers
  • pickup_distance_from_top is not implemented for EVO yet

Do you remember whether you got these 13.2 (mm or dmm?) from a parsed definition of a specific plate?

From the odd Cos_96_EZWash. By the same principle: trying to find a function rck file info -> number observed in trace file.

@rickwierenga
Copy link
Member

awaiting your grace before merging @BioCam

@BioCam
Copy link
Contributor Author

BioCam commented Aug 18, 2024

Thank you for reviewing the changes and fixing the tests, @rickwierenga!

All good to merge from my end.

@rickwierenga
Copy link
Member

As evidenced by the CHANGELOG, a massive & phenomenal PR. Thanks a lot!!

I initially made the decision when looking at VENUS and firmware commands without really considering physical reality, which led to inaccurate and non-understandable code because I imported the VENUS mindset. This is now fixed, thanks to your huge effort. PLR is probably the world's first interface to lab automation that correctly places skirted plates on pedestals automatically. 🎉

@rickwierenga rickwierenga merged commit ed10ddb into PyLabRobot:main Aug 19, 2024
7 checks passed
@BioCam
Copy link
Contributor Author

BioCam commented Aug 20, 2024

Thank you @rickwierenga!

The issue fixed here and the previous 2 associated PRs (of Plate definitions and correct Plate placements) has in the end taken about 6 months to fix, including periods of placing it behind main/other work priorities.
This has been an incredible team effort, and I am very excited about the new potential of PLR.
(I definitely think this is one of those classic issues that everyone ignores because the functionality of placing a Plate correctly is just so simple it's assumed to be self-explanatory - which we show here, it isn't -, but when fixed it actually makes processes work 😅 )

Tagging some specific people to make them aware that these changes have now been deployed: @fderop, @ben-ray, @jkhales.

@fderop: The issue we previously discussed of not being able to use the same Plate in two different locations should now be fixed. Please let us know if you still encounter issues with it.

jkhales pushed a commit to retrobiosciences/pylabrobot that referenced this pull request Sep 20, 2024
jkhales pushed a commit to retrobiosciences/pylabrobot that referenced this pull request Sep 20, 2024
jkhales pushed a commit to retrobiosciences/pylabrobot that referenced this pull request Sep 20, 2024
VilhelmKMoller added a commit to VilhelmKMoller/pylabrobot_DALSA that referenced this pull request Oct 8, 2024
commit 59f8de7318ad100667fb84804119c7c2ac0145ee
Author: Rick Wierenga <[email protected]>
Date:   Mon Oct 7 17:50:07 2024 -0700

    fix channel 1-n volume tracking (#273)

commit cef404b3dbd951f312b9a20191456b7f272ffb5f
Author: Rick Wierenga <[email protected]>
Date:   Tue Oct 1 16:30:19 2024 -0700

    [STAR] really skip these on setup if True

commit 9edf04a8e01c381ee5c3b020542bbea7e7709806
Author: Phi Nguyen <[email protected]>
Date:   Mon Sep 30 21:48:45 2024 -0400

    Add VSpin (spin spin) Wrapper (#243)

    Co-authored-by: jkh <[email protected]>
    Co-authored-by: Rick Wierenga <[email protected]>

commit a14c253155aa8bde2926e7cf43cc07ab258d87d5
Author: Rick Wierenga <[email protected]>
Date:   Sun Sep 29 15:19:15 2024 -0700

    tests for lid rotation with iswap

commit 90775c9d9399543b5165a99c03736dd3a03f344d
Author: Rick Wierenga <[email protected]>
Date:   Sun Sep 29 14:48:16 2024 -0700

    add Rotation.__repr__

commit b67193aee145eb068c5ddd44f339b39578ddffe5
Author: Rick Wierenga <[email protected]>
Date:   Sun Sep 29 14:48:10 2024 -0700

    add a setter to Plate.lid

commit f265f9fc8e02c48c438770d99cb6e61c1bdf8369
Author: Rick Wierenga <[email protected]>
Date:   Sun Sep 29 14:16:19 2024 -0700

    forgot these links

commit ec2eedc602348557ac148282114045406a5b9192
Author: Rick Wierenga <[email protected]>
Date:   Sat Sep 28 18:07:22 2024 -0700

    no special treatment for lid on ResourceStack (#267)

commit a6d870b8b5dae5c020b1e83b121c11f75b2bfd22
Author: Rick Wierenga <[email protected]>
Date:   Sat Sep 28 16:49:36 2024 -0700

    Fix iswap rotation issue (#269)

commit 0f00e4527642977d0bfc856bdb99c79c5c0ebe01
Author: Rick Wierenga <[email protected]>
Date:   Fri Sep 27 19:31:50 2024 -0700

    also fix iswap pickup for rotated resources for vantage (#268)

commit 1711edc006e9e34efc1429d1df34b821252b4203
Author: Rick Wierenga <[email protected]>
Date:   Fri Sep 27 17:29:09 2024 -0700

    new logo & new forum

commit 39ebdf5fdb183b19ea8bad06675e7a58f4768d6f
Author: Rick Wierenga <[email protected]>
Date:   Fri Sep 27 17:08:47 2024 -0700

    rename file bc it was too long on Windows

commit 92be7424db5de5db0cc4467a1aec8f2d11f0ebc1
Author: Rick Wierenga <[email protected]>
Date:   Fri Sep 27 16:50:11 2024 -0700

    link to discuss.pylabrobot.org (#266)

commit 0353a674b49dc2f4110e095303b402a55aa67cff
Author: Rick Wierenga <[email protected]>
Date:   Fri Sep 27 16:28:44 2024 -0700

    Revert "hamilton liquid classes make kwargs (#248)" (#264)

    This reverts commit fbb08be3a93719f842cdd480f6499c5a2d716860.

commit 6542154ce489d787d6683779fcbe16e525d827fa
Author: Rick Wierenga <[email protected]>
Date:   Fri Sep 27 16:01:57 2024 -0700

    [star] [vantage] flags for skipping setting up modules (#263)

commit fbb08be3a93719f842cdd480f6499c5a2d716860
Author: Rick Wierenga <[email protected]>
Date:   Fri Sep 27 11:12:27 2024 -0700

    hamilton liquid classes make kwargs (#248)

commit 6d05d453bdef1a826b14ac27bb5843e17ce6a9d5
Author: Rick Wierenga <[email protected]>
Date:   Thu Sep 26 13:29:54 2024 -0700

    [liquidhandler] no blow out error without volume tracking or when blow out volume is 0 (#262)

commit 905753c729e805d592430713447981b4ba68516d
Author: Rick Wierenga <[email protected]>
Date:   Thu Sep 26 13:09:19 2024 -0700

    [STAR] homogenization -> mix (#261)

commit 8f15ee0973f6d544b710ca741931ca4fa4e5e258
Author: Rick Wierenga <[email protected]>
Date:   Wed Sep 25 09:15:16 2024 -0700

    Less verbose

commit 01a10f852d573456d4505effe87e134205f6f508
Author: Rick Wierenga <[email protected]>
Date:   Tue Sep 24 08:21:31 2024 -0700

    add T-Therapeutics to “used by”

commit 244f36e6211b5c4e5a95dd1e08dad31198eec55b
Author: Rick Wierenga <[email protected]>
Date:   Mon Sep 23 19:28:51 2024 -0700

    cytation5 in new docs

commit a2ca897f03039596482c0942bd41a52824079657
Author: Rick Wierenga <[email protected]>
Date:   Mon Sep 23 19:25:53 2024 -0700

    new docs theme (#249)

commit 6d48b34de78f0b727a200030427d9c3e176a2834
Author: Rick Wierenga <[email protected]>
Date:   Mon Sep 23 19:08:43 2024 -0700

    top->bottom in docs

commit 9d48831c6bc4324ca35a3baf9259c4bfbf11581d
Author: Florian De Rop <[email protected]>
Date:   Sun Sep 22 20:10:19 2024 -0700

    [Labware] Add several plates (#254)

commit f6f4693e65ccaacf1f861777ee89e6f67fef4540
Author: Rick Wierenga <[email protected]>
Date:   Sun Sep 22 11:15:57 2024 -0700

    pylibftdi optional for cytation

commit d748daaef74f0c2d52a2f495723383b33ad3488e
Author: Rick Wierenga <[email protected]>
Date:   Fri Sep 20 20:43:18 2024 -0700

    add tip spot generators (#256)

commit d9d687bf9bcca63022b6b1228128106d99d736a9
Author: Rick Wierenga <[email protected]>
Date:   Fri Sep 20 14:39:10 2024 -0700

    use correct bit for autoload_installed

commit 085855465e46879ecde0fb41c73a0367e8a0347c
Author: Rick Wierenga <[email protected]>
Date:   Fri Sep 20 11:32:05 2024 -0700

    add material_z_thickness to falcon_tube_50mL

commit b7e28685d03220f67cbac5a95e41b4a38d6441b3
Author: Rick Wierenga <[email protected]>
Date:   Fri Sep 20 10:00:31 2024 -0700

    support pylint 3.3.0

commit 9513089ca7b1784c9fc0f44f6526e39f109f18a4
Author: Camillo Moschner <[email protected]>
Date:   Fri Sep 20 17:39:36 2024 +0100

    Resource Update: PLT_CAR_L5AC_A00 pedestal_size_z (#255)

commit 68d102761a5362f2e9cc8312b3283940042694aa
Author: jkh <[email protected]>
Date:   Wed Sep 18 15:06:10 2024 -0700

    [rotations] add ResourceHolderMixin to fix placement in a number of resources (#239)

    Co-authored-by: Rick Wierenga <[email protected]>

commit dc97d25939813aabea4f7890ae663aaa3b081ba0
Author: Rick Wierenga <[email protected]>
Date:   Wed Sep 18 13:01:39 2024 -0700

    freeze the ops classes and remove doc strings

commit 515c8a0f3eb657ec7f6376d3e023095214da327a
Author: Rick Wierenga <[email protected]>
Date:   Wed Sep 18 10:57:26 2024 -0700

    Coordinate.zero static instead of class method

commit e5bb2492c4f3488fdedcf93492e9d404b24170f5
Author: Rick Wierenga <[email protected]>
Date:   Wed Sep 18 10:56:04 2024 -0700

    [star] don't log empty responses

commit 6cf28431f379134d4a4e8c8d22a23fbfde19219c
Author: Rick Wierenga <[email protected]>
Date:   Mon Sep 16 18:43:18 2024 -0700

    [STAR] replace None values in list with default

commit 0a821d5b1f9253b09550e8c30dc50c66f39db928
Author: Rick Wierenga <[email protected]>
Date:   Sat Sep 14 13:16:57 2024 -0700

    add fluorescence to cytation5 (#244)

commit 5826c7328f64bad7ad9da995f6f6f0a46612efb0
Author: Rick Wierenga <[email protected]>
Date:   Wed Sep 11 16:19:48 2024 -0700

    more chatterboxes (#242)

commit 0f6146a2bc550a4826cbae373bc3758fcdee453b
Author: Rick Wierenga <[email protected]>
Date:   Wed Sep 11 15:09:47 2024 -0700

    add Cytation5 (#238)

    Co-authored-by: jkh <[email protected]>

commit 2145f38f77e0629e338befea355f40bbb22b1ad0
Author: Rick Wierenga <[email protected]>
Date:   Tue Sep 10 17:44:35 2024 -0700

    deprecation warning for 3.8

commit 8c2d1e5c4123dae7dbee35be9cac7b9d46eafb45
Author: Rick Wierenga <[email protected]>
Date:   Tue Sep 10 17:28:09 2024 -0700

    remove single arg check (#240)

commit 277de6915a1abd8414ffb6b6108e8c6f6e191009
Author: Rick Wierenga <[email protected]>
Date:   Tue Sep 10 15:10:27 2024 -0700

    remove old code

commit 858b1e0baae9e8aeaaa418f40ce490e200ef6808
Author: Florian De Rop <[email protected]>
Date:   Mon Sep 9 15:47:59 2024 -0700

    [Labware] Add pedestal_size_z to PLT_CAR_L5FLEX_MD_A00 (#237)

commit 087701a3c28b149ad57f001d2e8919a5833c8c7e
Author: 1dkone1 <[email protected]>
Date:   Sat Sep 7 19:39:39 2024 -0400

    fixed read_timeout for vantage (#236)

commit a2c827fb990e9e543dc714f7b0a48c2d7a329a79
Author: Rick Wierenga <[email protected]>
Date:   Thu Sep 5 15:01:20 2024 -0700

    clearly differentiate between local and absolute size (#235)

commit 6eccd81f627d6d3074a7c9e469f66251d35100f1
Author: Rick Wierenga <[email protected]>
Date:   Thu Sep 5 13:48:41 2024 -0700

    update changelog for #233

commit 52577a2613d897ac106f2105e0629dfa1216cb8c
Author: jkh <[email protected]>
Date:   Thu Sep 5 13:43:40 2024 -0700

    [liquid_handling] use correct rotation matrix for anchor (#233)

commit 175bdab7a2dc0d0083b36bcd9216c2d126e5708c
Author: jkh <[email protected]>
Date:   Thu Sep 5 10:13:40 2024 -0700

    [rotations] fix angles computed by grip directions (#234)

commit c6fc6917ad29433bf41204598d973c1ec169037a
Author: Rick Wierenga <[email protected]>
Date:   Thu Sep 5 09:16:28 2024 -0700

    remove `items` from ItemizedResource (#231)

    * remove `items` from ItemizedResource

    * changelog

    * linting

commit d1b8cd7e9c648ecfcaeb7afc7b8753e969c4eda6
Author: jkh <[email protected]>
Date:   Wed Sep 4 11:35:15 2024 -0700

    [liquid_handling] add in more valid grip combinations (#232)

commit 58481cad9060b28ddaa37fd1a8a79e4c6b38b675
Author: Florian De Rop <[email protected]>
Date:   Tue Sep 3 08:53:11 2024 -0700

    [Fix] Fix carrier PLT_CAR_L5AC_A00 pedestal_size_z (#230)

    Co-authored-by: Rick Wierenga <[email protected]>
    Co-authored-by: jkh <[email protected]>

commit 56958fe516563d35e274aee07a9769863728d3db
Author: Rick Wierenga <[email protected]>
Date:   Fri Aug 30 23:57:25 2024 +0200

    fix {aspirate,dispense}96 type check

commit 19d1a95b879f739aaaef4589d946fbb340673e93
Author: Rick Wierenga <[email protected]>
Date:   Fri Aug 30 01:35:29 2024 +0200

    cl for #229

commit 68e884805b390d824ae6ce03e6873c756e0caa7f
Author: Florian De Rop <[email protected]>
Date:   Thu Aug 29 16:31:24 2024 -0700

    [Labware] Add support for 3.20 mm ultra wide bore tips (#229)

    Co-authored-by: Rick Wierenga <[email protected]>
    Co-authored-by: jkh <[email protected]>

commit 8460459f58445b79dd7349976c004a0889c57697
Author: Camillo Moschner <[email protected]>
Date:   Thu Aug 29 22:23:26 2024 +0100

    Create NestedTipRack Class (#228)

    Co-authored-by: Rick Wierenga <[email protected]>

commit 079b7b8a60c506abf6d22bf9cb87645fc1b58d67
Author: Marielle Russo <[email protected]>
Date:   Sun Aug 25 15:24:42 2024 -0400

    Added z and z nesting heights to Costar flat bottom 360 µL plates (#226)

    Co-authored-by: Rick Wierenga <[email protected]>

commit a4896c9f13c17fbb148b3346d5f0defce0fb9237
Author: jkh <[email protected]>
Date:   Sat Aug 24 08:51:11 2024 -0700

    [STAR] add liquid_surfaces_no_lld parameter to aspiration (#227)

    Co-authored-by: fderop <[email protected]>
    Co-authored-by: Rick Wierenga <[email protected]>

commit fd675edefdaf72f245e70deb9170c54fe4383be3
Author: Rick Wierenga <[email protected]>
Date:   Thu Aug 22 14:20:15 2024 +0200

    allow STAR firmware planning (#224)

    * allow_firmware_planning

    * update CHANGELOG

commit 08371abd28be0e38458aa1c2ff27a43a27978e9c
Author: Rick Wierenga <[email protected]>
Date:   Wed Aug 21 10:09:01 2024 +0200

    update changelog & rm print

commit 4a07f6a32a9a33d0370eb9c29015567c98aea002
Author: Rick Wierenga <[email protected]>
Date:   Wed Aug 21 10:03:08 2024 +0200

    basic query

commit 9bd67a9febbb7ba88c748f705e9d51f4c2adb07c
Author: Camillo Moschner <[email protected]>
Date:   Tue Aug 20 23:01:03 2024 +0100

    Integrate Hamilton NTR (50 ul) (#223)

commit ed10ddbce0840d84ec2ca05260d39e978c1376f7
Author: Camillo Moschner <[email protected]>
Date:   Mon Aug 19 16:35:23 2024 +0100

    Make Plate Site-adaptive (Fix PLR plate location 3) (#205)

    Co-authored-by: Rick Wierenga <[email protected]>

commit 7de7d400d2f0981df08158fd584c44258e67871d
Author: Rick Wierenga <[email protected]>
Date:   Sat Aug 17 16:57:54 2024 +0200

    update CHANGELOG

commit c24361b454f2b0456d74628352d95389232b4aa5
Author: Florian De Rop <[email protected]>
Date:   Sat Aug 17 07:55:30 2024 -0700

    [Tilter] Add support for multiple tips per well (#218)

    * Fix server tests (#209)

    * fix lh server?

    * fix

    * test

    * fix list

    * fix lint

    * typing

    ---------

    Co-authored-by: Rick Wierenga <[email protected]>
    Co-authored-by: jkh <[email protected]>

commit 16a30beac466bea3ac5ec678207912d259223a3f
Author: jkh <[email protected]>
Date:   Sat Aug 17 07:50:58 2024 -0700

    [serializer] handle closure (#220)

    Co-authored-by: Rick Wierenga <[email protected]>

commit 4b9500f99d853426857e708e1e384dfb1122ca59
Author: Florian De Rop <[email protected]>
Date:   Sat Aug 17 07:47:43 2024 -0700

    [Labware] Add support for 1.20 mm wide bore tips (#222)

    Co-authored-by: Rick Wierenga <[email protected]>
    Co-authored-by: jkh <[email protected]>

commit a0c0959d687215784c57084c7837684a8dd73fa5
Author: Rick Wierenga <[email protected]>
Date:   Sat Aug 17 15:19:42 2024 +0200

    ignore *.swo

commit 9b31b238fef187511c66fc9ffc3a338d3857d6a2
Author: Rick Wierenga <[email protected]>
Date:   Fri Aug 16 10:06:43 2024 +0200

    fix lint

commit 6ea363dd9b7123a1b63b02e1e7ee26f005cb4f37
Author: Robert-Keyser-Calico <[email protected]>
Date:   Fri Aug 16 01:01:11 2024 -0700

    - added setup method that calls LiquidHandlerBackend and USBBackend setups (#219)

commit 48cb06a376035f43aa99a4b3140e76ef7efb95db
Author: jkh <[email protected]>
Date:   Wed Aug 14 15:17:03 2024 -0700

    [HamiltonHeatShaker] add temperature controls (#217)

commit e5036d5f7fe8d889a967fe35ad8d874af0a4fe6b
Author: Florian De Rop <[email protected]>
Date:   Tue Aug 13 02:30:15 2024 -0700

    [Resource] Add slim 300 uL tips (#216)

    * add slim 300

    * add docstring

    * Update tip_creators.py

    ---------

    Co-authored-by: Rick Wierenga <[email protected]>

commit 92496419e60af3ce3f168ad24eb2934791999fbc
Author: Rick Wierenga <[email protected]>
Date:   Mon Aug 12 17:41:41 2024 +0200

    it was actually #215

commit badede5db93ae300ff3c41ff92402b6eaf8804e5
Author: Rick Wierenga <[email protected]>
Date:   Mon Aug 12 17:40:43 2024 +0200

    Revert "update changelog for #205"

    This reverts commit 0ad15420f49d16492813b40f182d700916256449.

commit bbef443067209f1d4df020c46446b9efc210fb64
Merge: 0ad15420 67a1d3f7
Author: Rick Wierenga <[email protected]>
Date:   Mon Aug 12 17:16:36 2024 +0200

    Merge branch 'main' of https://github.com/pylabrobot/pylabrobot

commit 0ad15420f49d16492813b40f182d700916256449
Author: Rick Wierenga <[email protected]>
Date:   Mon Aug 12 17:16:24 2024 +0200

    update changelog for #205

commit 67a1d3f74d7d636034bb57582442ea1f5e5aed4b
Author: Camillo Moschner <[email protected]>
Date:   Mon Aug 12 16:12:02 2024 +0100

    Make PlateAdapter z-offset Manually Adjustable + 1st Semi- & Non-skirted Plates (#212)

    * update Thermo Fisher Scientific Inc README

    * test README formatting

    * remove overflow information from README

    * add Thermo_AB_96_wellplate_300ul_Vb_EnduraPlate base definition for testing

    * adjust material_z_thickness to empirical testing

    * adding plate_hole_size_z & plate_z_offset

    * testing proper hole_size_z and plate_z_offset

    * add Eppendorf non-skirted plate

    * testing Eppendorf 96-well plate & rough volume/height functions

    * fix naming of Thermo_TS_96_wellplate_1200ul_Rb

    * fix linting & add guesstimates for alpaqua magnet & Hamilton PlateAdapter

    * fix Thermo Fisher Scientific Inc explainer in plates.py

    * update naming convention in README

    * updating height<>volume functions to polynomial fits

    * fix linting

    * Update plates.py

    * Update plates.py

    ---------

    Co-authored-by: Rick Wierenga <[email protected]>

commit 9f1fcf5e6fe67cb383a1084ccbd76ff13a30f959
Merge: b37b7729 27a06b58
Author: Rick Wierenga <[email protected]>
Date:   Fri Aug 9 22:53:37 2024 +0200

    Merge branch 'main' of https://github.com/pylabrobot/pylabrobot

commit b37b77298c8bbd82810307cdbbb1ca7d2b747cb6
Author: Rick Wierenga <[email protected]>
Date:   Fri Aug 9 22:53:30 2024 +0200

    update visualizer tutorial

commit 27a06b58ecf1704e8b97540ef92c395298eed2d9
Author: Joe Laforet Jr. <[email protected]>
Date:   Fri Aug 9 16:53:16 2024 -0400

    Protocol Visualizer Overhaul: Making GIFs (#162)

    * Implemented TubeRack and Tube methods and added to visualizer

    * added reservoirs to opentrons

    * Added new reservoir class for OpenTrons Reservoirs

    * bugs with reservoirs and visualizer. Maybe also in how children are assigned too

    * added code for OpenTrons reservoirs and got them on visualizer

    * made lint/test/typecheck happy

    * Normalize all the line endings

    * no need for new reservoir class

    * made test/lint/typecheck happy

    * screwing around with writing movies from visualizer. Broken atm

    * Added gif renderer to visualizer

    * added white background to gifs

    * made frames save every 0.5s, rather than on update calls

    * added slider for save rate, download as zip, display gif in browser

    * removed temp folder, garbage cleanup

    * first version of gif visualizer done

    * removed unecessary file

    * fixed lint, typecheck, and tests

    * re-structured the layout of the visualizer

    * working visualizer with tweaks

    * some format

    * background big enough, don’t move on drag

    * minor UI changes

    * made reservoir super plate on visualizer

    * refactor UI handling a bit

    ---------

    Co-authored-by: Joe Laforet <joelaforet@JLaforetLaptop>
    Co-authored-by: Rick Wierenga <[email protected]>

commit bdc445048c501c08cb63877882e616cbb3d5871b
Author: ray <[email protected]>
Date:   Fri Aug 9 12:44:15 2024 -0700

    add 32 tube carrier for 1.5ml eppendorf tubes (#204)

    * add 32 tube carrier for 1.5ml eppendorf tubes

    * add eppendorf tube def

    * clean

    * lint

    * fine-tune tuberack def

    * lint

    ---------

    Co-authored-by: Rick Wierenga <[email protected]>

commit 60db08f9b7218b2e227249406386e4bf916441b9
Author: Rick Wierenga <[email protected]>
Date:   Fri Aug 9 21:34:54 2024 +0200

    Serialize functions (#215)

    * marshal functions

    * serialize functions

    * typecheck

    * remove old code

commit cc180b107b4b3d43a1cc71f006a79b8fa0207597
Author: ray <[email protected]>
Date:   Fri Aug 9 11:20:48 2024 -0700

    ray/make_chatterbox_pretty (#208)

    * ray/make_chatterbox_pretty

    * remove extra print

    * remove hamilton in favor of lh

    * unbreak

    * just don’t have extras with kwargs

    * formatting

    * add tip pick/drop

    * format pick_up & drop

    * update changelog

    ---------

    Co-authored-by: Rick Wierenga <[email protected]>

commit 08a36664fdbac871336d5b2ada2952678af0ce2b
Author: Rick Wierenga <[email protected]>
Date:   Fri Aug 9 19:24:05 2024 +0200

    fix import serial in ham tilt module

commit 4c385cd834e43c6bf65492d450a68ecc3a583e15
Author: Camillo Moschner <[email protected]>
Date:   Mon Aug 5 12:41:29 2024 +0100

    Integrate Opentrons 96-well Aluminium Adapter (#211)

    * add Opentrons 96-well aluminium plate adapter

    * Adjust surrogate dz value for Opentrons 96-well aluminium adapter

    * clarify symmetry & resulting orientation-agnosticity

    * add Opentrons README

    * update CHANGELOG

commit 9952fa1b6fde6d506560e83c3ec79f467467fe11
Author: Rick Wierenga <[email protected]>
Date:   Thu Aug 1 18:49:15 2024 +0200

    Fix server tests (#209)

    * fix lh server?

    * fix

commit 59fdcb78656db320f9ba48fbc37259b80193a4bb
Author: Rick Wierenga <[email protected]>
Date:   Thu Aug 1 18:12:13 2024 +0200

    remove PLT_CAR_L4_SHAKER

commit 20c61c29c6b164212c3cc0bc0a60eb8d166f854f
Author: Rick Wierenga <[email protected]>
Date:   Thu Aug 1 18:09:47 2024 +0200

    delete hamilton_parse

commit 1a99c490dff66d744226b72a1d661dfe2291ab3e
Author: Rick Wierenga <[email protected]>
Date:   Thu Aug 1 18:06:19 2024 +0200

    remove load_from_lay_file

commit 793d20d675c71d40e89e8d0c15d20b59fa5aa748
Author: Rick Wierenga <[email protected]>
Date:   Thu Aug 1 13:36:44 2024 +0200

    ugh

commit 90d89357ed78df23e0f32de6f5fcd78499c04179
Author: Florian De Rop <[email protected]>
Date:   Thu Aug 1 03:56:28 2024 -0700

    [Feature] Rewrite tilt module (#187)

    * add self.ser

    * add initial pos to initialisation

    * rewrite_tilt_module

    * rewrote tilter

    * add pedestal

    * edit init

    * remove underscore

    * HamiltonTiltModule is a Tilter again

    * solve issues

    * remove comment

    * fix float

    * add f

    * add additional_z

    * remove additional_z

    * fix type

    * docs and mark `experimental`

    * fix type once more

    ---------

    Co-authored-by: Rick Wierenga <[email protected]>

commit 638bb88661f073d67b05c9ecefd8cf9d0aed943d
Author: Rick Wierenga <[email protected]>
Date:   Wed Jul 31 12:44:26 2024 +0200

    only if bav is not none

commit 1f7274def3723e677d32a9b9bcfe054d82664f9c
Author: ray <[email protected]>
Date:   Wed Jul 31 03:42:41 2024 -0700

    enable dispense blowout on STAR backend (#207)

    * enable dispense blowout on STAR backend

    * add back at end

    ---------

    Co-authored-by: Rick Wierenga <[email protected]>

commit 51e0015c137929afd2723a3ca7a2ef85add61ae8
Author: Rick Wierenga <[email protected]>
Date:   Sat Jul 27 18:04:47 2024 +0200

    type check in LH

commit 92983dec8be0a7c86a2bc24386d2c606435fedd9
Author: Florian De Rop <[email protected]>
Date:   Thu Jul 25 06:54:08 2024 -0700

    [lawbare] add basic height functions and example (#200)

    * [feature] add basic height functions and example

    * 2 spaces, not private, no redundant doc

    * move some to volume_functions

    * consolidate

    * deprecation warnings

    * fix

    * fix celltreat

    * lint

    * tiny format

    * plr plate naming standard & changelog & ct readme

    ---------

    Co-authored-by: Rick Wierenga <[email protected]>

commit d239b54cd9a6a4d9cdbcffb09b1681fe1042ba51
Author: Rick Wierenga <[email protected]>
Date:   Sat Jul 20 00:51:48 2024 +0200

    ordered_items in ItemizedResource (#201)

    * use ordered_items instead of items in ItemizedResource

    * fix TipRack.set_tip_state and ordering

    * support reverse ranges, grid instead of diagonal (as before)

    * ordered_items in TubeRack

    * smh

    * bring back num_items_{x,y} when allowed

    * ot loading

    * tecan loading

    * flatten when ot loading

    * smh

    * type checking & linting

    * doc

    * update changelog

commit d6feeb1998851f9e7f5f9d89b8893643d387994c
Author: Rick Wierenga <[email protected]>
Date:   Sat Jul 20 00:42:26 2024 +0200

    update mypy

commit bcbe101b1e7939b08a2a38cd9441f2ae9351aa7a
Author: Rick Wierenga <[email protected]>
Date:   Thu Jul 18 20:09:55 2024 +0200

    handle int/float in STAR params

commit 60ff5caf7f9b30e0c0321618dc349afbf6367af0
Author: Camillo Moschner <[email protected]>
Date:   Thu Jul 18 16:29:38 2024 +0100

    Fix Aspirate & Dispense Arguments (#199)

    * making minimum_traverse_height_at_beginning_of_a_command & min_z_endpos take mm

    * make style consistent with rest

    ---------

    Co-authored-by: Rick Wierenga <[email protected]>

commit 7e2ff4b1cc285c4ab715db864e564001469dac5e
Author: Florian De Rop <[email protected]>
Date:   Thu Jul 18 02:36:52 2024 -0700

    Add pedestal_size_z to PLT_CAR_L5MD{_A00} (#198)

    * add pedestal

    * Update CHANGELOG.md

    * Update CHANGELOG.md

    ---------

    Co-authored-by: Rick Wierenga <[email protected]>

commit 282ebfa7bd0ab86ee58950dc53fad286948e034a
Author: Rick Wierenga <[email protected]>
Date:   Wed Jul 17 13:52:34 2024 +0200

    fix `Cos_96_DWP_2mL_Vb` in table

commit 1fa8773a09265e690b5dd17599d1c31e18206984
Author: Rick Wierenga <[email protected]>
Date:   Wed Jul 17 13:50:55 2024 +0200

    use Cor_96_wellplate_360ul_Fb in tutorials

commit 5ad5f897800d47ebfddaf7394c8699cfa27af032
Author: Rick Wierenga <[email protected]>
Date:   Tue Jul 16 23:22:05 2024 +0200

    make units in STAR method parameters consistent (#191)

    * initial commit

    * STAR

    * move mid-level core methods

    * forgot some & typing

    * move core_check_resource_exists_at_location_center

    * fix

    * core_check_resource_exists_at_location_center

    * update changelog

    * vantage

    * forgot these

commit b07dd061d9959fd880bd9267898b32d5e3e36cf8
Author: Rick Wierenga <[email protected]>
Date:   Tue Jul 16 19:33:08 2024 +0200

    make libusb_package an optional dep

commit 8a497892e3bb23311a6c36ba3b79e956677735c5
Author: Rick Wierenga <[email protected]>
Date:   Tue Jul 16 10:08:15 2024 +0200

    support exotic number types

commit 912975518e0bed0115c05b327ce017b05b6f7f86
Author: Camillo Moschner <[email protected]>
Date:   Mon Jul 15 11:32:20 2024 +0100

    Integrate material_z_thickness (Container) & skirt_base_to_well_base (Plate) (fix PLR Plate location 2) (#183)

    * material_z_thickness (Container) & skirt_base_to_well_base (Plate) integrations

    * update CHANGELOG

    * make material_z_thickness optional, delete skirt_base_to_well_base

    * add material_z_thickness to Cor_96_wellplate_360ul_Fb

    * update changelog

    * change this back

    ---------

    Co-authored-by: Rick Wierenga <[email protected]>

commit 0b939e6768cfed263f8cae6a91fe93a1494fb884
Author: Rick Wierenga <[email protected]>
Date:   Mon Jul 15 12:26:57 2024 +0200

    update sphinx

commit 0a945ab50b069fc6c90679ae6f0c0c9f4e0c369d
Author: Rick Wierenga <[email protected]>
Date:   Mon Jul 15 11:55:34 2024 +0200

    type checking

commit e9e30cedaedf20cc5d5215b738c104b3294354ef
Author: Camillo Moschner <[email protected]>
Date:   Mon Jul 15 10:39:17 2024 +0100

    Fix Plate Stacking in ResourceStack (#192)

    * troubleshooting lid assignment in ResourceStack

    * testing ResourceStack part 2

    * fixing ResourceStack.get_size_z()

    * testing (a) empty stack on stack site, (b) empty stack on MFX DWP module, (c) & (d) same but with plates

    * fix linting

    * tiny rewrite

    * support get_size_z when direction != “z”

    * fix typing & tests

    * refactor & add tests

    ---------

    Co-authored-by: Rick Wierenga <[email protected]>

commit 70e0f03f3045a3837b6ce61e64d10c644a7fd89c
Author: Rick Wierenga <[email protected]>
Date:   Sun Jul 14 20:48:49 2024 +0200

    full xyz rotations (#195)

    * full xyz rotations

    * fix

    * update changelog

    * conventional axis names, not planes

    * style

commit 21ffbb06f90a2451a15b194ae8e097d0a44fd375
Author: Rick Wierenga <[email protected]>
Date:   Sat Jul 13 22:08:59 2024 +0200

    ugh

commit 6e2616bc0c10c8aa63384f0be0f6e609a9cb8e2d
Author: Rick Wierenga <[email protected]>
Date:   Sat Jul 13 22:04:14 2024 +0200

    warning for big resources (#194)

commit a1b63e97cad92456e1409ef62c6293eb67701a71
Author: Rick Wierenga <[email protected]>
Date:   Fri Jul 12 18:31:30 2024 +0200

    don’t run ci twice on PRs from plr repo

commit c4cd1c3ca050a5e98c98e10ace019d29a0fd3c63
Author: Rick Wierenga <[email protected]>
Date:   Mon Jul 8 17:05:06 2024 +0200

    add PLT_CAR_L4_SHAKER -> MFX_CAR_L5_base to changelog

commit bf61aa1365957df0c02566918bc748da84568b2d
Author: Camillo Moschner <[email protected]>
Date:   Mon Jul 8 15:34:24 2024 +0100

    Add Shaker Carrier (a MFX Carrier) Information (#188)

commit 1aadf1f635b69c40fee4898abff38f20b1b64060
Author: Rick Wierenga <[email protected]>
Date:   Tue Jul 2 13:47:20 2024 +0200

    use list with multi channel single-resource op

commit bc52106f88df933af0f8774b43e0a64ac8581e90
Author: Rick Wierenga <[email protected]>
Date:   Tue Jul 2 00:25:39 2024 +0200

    deprecate hamilton_parse

commit 9f142940071f048acae0234c3ad47325385a9bb3
Author: Rick Wierenga <[email protected]>
Date:   Tue Jul 2 00:16:22 2024 +0200

    offset no longer optional

commit 262479f19d14daeb7044c9c130078cc908344c5e
Author: Rick Wierenga <[email protected]>
Date:   Mon Jul 1 23:40:01 2024 +0200

    deprecate single values in LH (#185)

    * deprecate single values in LH

    * forgot the headers

    * remove unused improt

    * fix tests

    * remove dumb function

commit 8e9d8d846358d15902b0e441ea6c201c18e52f7b
Author: Rick Wierenga <[email protected]>
Date:   Fri Jun 28 17:48:16 2024 +0200

    Raise error undefined resources (#172)

    * raise exception for undefined resources

    * add this image

    * accidentally added this

    * Cos_96_EZWash-> Cos_96_wellplate_360ul_Fb

    * don’t use Cos_96_EZWash in tests

    * (Cos->Cor)_96_wellplate_360ul_Fb

    * smh

commit f19506d470fc070b121307827eb5d7e5f76b6aab
Author: Rick Wierenga <[email protected]>
Date:   Fri Jun 28 15:57:16 2024 +0200

    fix OT resource loading and defining

commit de037346f98ad3a834a175e40db72d01c24bc926
Author: Rick Wierenga <[email protected]>
Date:   Fri Jun 28 11:28:36 2024 +0200

    fix rectangle drawing in visualizer

commit e01702efedbe7586ee7fc1c2a144ac7b5f56297e
Author: Rick Wierenga <[email protected]>
Date:   Fri Jun 28 00:22:13 2024 +0200

    Create CHANGELOG.md

commit 31614ed748edfec05daef7b1b88d8cc5d536161e
Author: Rick Wierenga <[email protected]>
Date:   Fri Jun 28 00:06:59 2024 +0200

    update doc

commit 6beeacb246351ee3e8a0ad2bfec96f8dd432bb3f
Author: Rick Wierenga <[email protected]>
Date:   Thu Jun 27 21:08:12 2024 +0200

    smh

commit 0b30920be4234f09b3b1855b5e398794562e91d6
Author: jkh <[email protected]>
Date:   Thu Jun 27 12:05:01 2024 -0700

    [resources] add hamilton tilt module resource (#181)

    * [resources] add hamilton tilt module resource

    * move to plr.tilting module, add name param, Tilter

    ---------

    Co-authored-by: JJ <[email protected]>
    Co-authored-by: Rick Wierenga <[email protected]>

commit 1ada672cbbccfc6cc2decdb0786b601d4bd58ff9
Author: Rick Wierenga <[email protected]>
Date:   Thu Jun 27 20:50:31 2024 +0200

    fix

commit 61dade196d3d93415aef364cdad5df2b8faa5ee3
Author: Rick Wierenga <[email protected]>
Date:   Thu Jun 27 20:48:37 2024 +0200

    add tilt module (#165)

    * add tilt module

    * add async (#175)

    Co-authored-by: jj <[email protected]>

    * add pylabrobot.tilting module / modernize

    * add tiny doc

    ---------

    Co-authored-by: jkh <[email protected]>
    Co-authored-by: jj <[email protected]>

commit 1d851c494919cc4564a1a592aa88bd0ba0b15d4e
Author: Rick Wierenga <[email protected]>
Date:   Thu Jun 27 12:45:00 2024 +0200

    Correct plate dimensions (#180)

    * Correct plate dimensions

    * more

    * fix

commit cf972b40e0cada95e811e78e5bb57da51d83e49d
Author: Rick Wierenga <[email protected]>
Date:   Thu Jun 27 11:12:42 2024 +0200

    minor formatting

commit f54a81d29c5180530565a1637a5e1554b4875277
Author: Rick Wierenga <[email protected]>
Date:   Thu Jun 27 11:11:33 2024 +0200

    Add meaesure nesting_z_height to docs

commit 2fd8e52101495a90794dab308d54f3bb722bb0cd
Author: Rick Wierenga <[email protected]>
Date:   Thu Jun 27 10:54:50 2024 +0200

    update measure picture

commit 60cc8eddc359f7cb7457e40e520561dc8cac2a86
Author: Rick Wierenga <[email protected]>
Date:   Thu Jun 27 00:30:45 2024 +0200

    move volume <->height functions to Container

commit bcc381b535d0efd598a375f221dea86d5cb2e0c1
Author: Rick Wierenga <[email protected]>
Date:   Wed Jun 26 19:55:38 2024 +0200

    expose STAR.dispense liquid_surface_no_lld param

commit 0c3587498821e517b52777073eb744262d0f4221
Author: Camillo Moschner <[email protected]>
Date:   Tue Jun 25 13:10:05 2024 +0100

    TubeCarrier Integration (#174)

    * Create Tube_CAR_24_A00

    * correcting README PNGs

    * Define 14ml Falcon tube and add tested TubeCarrier dimensions

commit 30377677903bc6a60313651cabe5d182091428c7
Author: Rick Wierenga <[email protected]>
Date:   Mon Jun 24 21:23:25 2024 +0200

    fix lh.summary longest name bug

commit b7b39361666baf56165f8b1632810c0fe2aa4b96
Author: Rick Wierenga <[email protected]>
Date:   Mon Jun 24 16:16:38 2024 +0200

    remove “currently defined” (#169)

commit 6ad9e53e22d5f405fdf6f608aa38646eda5aa1e9
Author: Rick Wierenga <[email protected]>
Date:   Mon Jun 24 13:08:44 2024 +0200

    fix docs building

commit 25a7ff37a64bec7c5663243f7ca0b87421edf893
Author: Rick Wierenga <[email protected]>
Date:   Mon Jun 24 12:04:47 2024 +0200

    update

commit 3dd3965987da277f27790ee4c68e3abebe091ef4
Author: Camillo Moschner <[email protected]>
Date:   Mon Jun 24 10:58:19 2024 +0100

    TroughCarrier Integration (#168)

    * polynomial volume compute fit

    * update trough docstring

    * fix linting

    * well -> trough

    * include 0 in polyfit

    * Update ml_star README

    * Update trough_carriers.py

    * rename true_dz to through_base_to_container_base

    ---------

    Co-authored-by: Rick Wierenga <[email protected]>

commit dd832cc31122acf5063075e13919f25daa42b0d2
Author: Camillo Moschner <[email protected]>
Date:   Fri Jun 21 20:38:17 2024 +0100

    Fix Lid Placement (#161)

    * update Cos_6_wellplate_16800ul_Fb, add nesting_z_heigth

    * integrate lid_nesting_z_height updates to liquid_handler.py

    * updating unit tests

    * fix linting

    * update STAR_tests.py

    * declare lid_nesting_z_height to Cos_96_EZWash for unit testing

    * use Lid in Plate instead of duplicating attributes

    * make hamilton resources with Lid

    * use lid param in tests

    * update tecan resources

    * format

    * tiny fix

    * update other plates

    * ugh

    ---------

    Co-authored-by: Rick Wierenga <[email protected]>

commit e899965b61d20a5343d44c162eb4095623f5f0ce
Author: jkh <[email protected]>
Date:   Wed Jun 19 12:19:24 2024 -0700

    [STAR] fix get_core typo (#167)

commit 1c13e361fb004527a492536338e96c64932194ad
Author: jkh <[email protected]>
Date:   Wed Jun 19 11:06:26 2024 -0700

    [resources] add accidentally deleted ShakerCarrier back in (#166)

    Co-authored-by: jj <[email protected]>

commit e77efc490644f8d1221bdfb3f823d8e7dcd63700
Author: jkh <[email protected]>
Date:   Wed Jun 19 10:44:26 2024 -0700

    [STAR] allow core hotel to be configured (#163)

    * [STAR] allow core hotel to be configured

    * change to coordinate

    * fix formatting

    * fix typo

    ---------

    Co-authored-by: jj <[email protected]>

commit e63b80f61ad7e19ab43e329529a02631a8357c9d
Author: Camillo Moschner <[email protected]>
Date:   Mon Jun 17 11:46:26 2024 +0100

    Make PlateAdapter accessible on PlateCarrierSite (#160)

    * updating carrier.py

    * fix plate_adapter.py Coordinate import

commit cfc0a3df8570765771dd3ea3dd96fb92fa3f72aa
Author: Rick Wierenga <[email protected]>
Date:   Sat Jun 15 16:56:34 2024 +0200

    move to plate carriers page

commit 0a5857b9561f9773e0fa96145f156ad3362972b6
Author: Rick Wierenga <[email protected]>
Date:   Fri Jun 14 12:09:25 2024 +0200

    links

commit a59d204793d0ddb549fd31c871f0190dc33efbe3
Author: Rick Wierenga <[email protected]>
Date:   Fri Jun 14 12:02:13 2024 +0200

    test mixing with volume tracker

commit 1f9860e7b94da00c11a5f0cccf0538498c336264
Author: Florian De Rop <[email protected]>
Date:   Fri Jun 14 02:12:07 2024 -0700

    [feature] remove lld_search_height override and replace by argument values (#159)

    * [feature] remove lld_search_height override and replace by argument values

    * [fix] removed testing print statement

    * Update STAR.py

    * also dispense

    ---------

    Co-authored-by: Rick Wierenga <[email protected]>

commit e6450ca976c4880497cf9a372e17ef342603473d
Author: joelaforet <[email protected]>
Date:   Fri Jun 14 04:51:24 2024 -0400

    Cross Contamination Tracker (#138)

    * Implemented TubeRack and Tube methods and added to visualizer

    * starting to implement cross contamination tracking

    * fiddled with first iteration of CC tracking

    * tested out turning on/off CC tracking

    * fixed bug where liquids were being added as characters instead of strings to the liquid history on add calls

    * fixed bug with updating using a list of (liquid,vols)

    * fixed line endings

    * reset back to PLR main branch

    * FINALLY made lint and tests happy, except for 1 test :(

    * fixed everything and verified functionality

    * Moved aspirate cross contamination check to volume_tracker

    * Made lint/tests/typecheck happy

    * rolled back to cross contamination check being in liquid_handler instead of volume_tracker, PRE-LINT CHECK

    * made typecheck/lint/tests happy

    * tiny format

    * clarified logic issues

    * tiny format

    * fix

    * made lint/tests/typecheck happy

    * forgot await keyword, fixed broken test

    * changed dispense code to correctly update the liquid history, was previously making reference error

    * v tiny format

    * bring back changes from plr:main

    ---------

    Co-authored-by: Joe Laforet <joelaforet@JLaforetLaptop>
    Co-authored-by: Rick Wierenga <[email protected]>

commit 1d9f10ad0d2c0b4fa17bf9df63edeaf82d5f9525
Author: Camillo Moschner <[email protected]>
Date:   Thu Jun 13 22:37:40 2024 +0100

    Implement pedestal for CarrierSite & MFXModule (fix PLR Plate location 1) (#143)

    * expose CarrierSite.pedestal_size_z

    * update carrier naming guide

    * Update README.md

    * Update README.md

    * expose pedestal_size_z to MFXModule class

    * fix linting

    * fixing type checking

    * fixing None type handling

    * adding little TODO for plate quadrants

    * PlateCarrierSite

    * resolve update conflicts

    * add guide for missing pedestal_size_z

    * exclude plate_carrier_site from HamiltonDeck.summary

    ---------

    Co-authored-by: Rick Wierenga <[email protected]>

commit 691143fc014ca1d2d2058741000705369d5b6a16
Author: Rick Wierenga <[email protected]>
Date:   Thu Jun 13 19:31:41 2024 +0200

    remove superfluous doc string things

commit e4baf715e701e2125764aaf4167faa568327b7e4
Author: Camillo Moschner <[email protected]>
Date:   Thu Jun 13 14:16:55 2024 +0100

    Adaptive lh.summary() (#158)

    * modifying lh.summary to be name len-adaptive

    * fixing linting

    * complete_resource_column as generator

    * fixing unit test

    * enable parsing of deck children that are not Carrier

    * fix unit tests

    * use  tree instead of string for longest name

    * refactor HamiltonDeck.summary

    * fix lint and type

    * fix long name issue

    * handle MFXModule, and be recursive again

    * remove unused improt

    * enable recursive search through entire deck tree

    * update unit test

    * Revert "enable recursive search through entire deck tree"

    This reverts commit e81c93123af493938be48e8bc9ec394bc9887ab5.

    * Revert "update unit test"

    This reverts commit 6bb323233a68f12799a9b78076c823a57939edb2.

    * fix excluded_categories child bug

    * style

    ---------

    Co-authored-by: Rick Wierenga <[email protected]>

commit 98042cc0b67094c115be986f367db27830a4bf17
Author: Rick Wierenga <[email protected]>
Date:   Mon Jun 10 23:54:43 2024 +0200

    doc config

commit ad2bb4d0a3fc69ecb90aae369518209aa9c60106
Author: Rick Wierenga <[email protected]>
Date:   Mon Jun 10 23:50:39 2024 +0200

    rename ini_file.py to ini_config.py

commit 3b3615b4c30548612c7e8723d95cc849bb54aeb1
Author: jt05610 <[email protected]>
Date:   Mon Jun 10 13:48:25 2024 -0600

    Add config file (#155)

    * create .editorconfig file to synchronize formatting for development

    * add pytest-asyncio to development dependencies

    * feature: create module-level config file.

    Adds the config module which facilitates managing configuration for pylabrobot. Default config for development is in pylabrobot.ini which mimics the config that was already found in the module.

    Configs are searched for in the current directory and all parent directory. If none are found, a new one is created in the current working directory.

    Currently, it supports .ini files, but wrote to easily support json, yaml, etc.

    I set the default log level to INFO for end users.

    * feature: put pylabrobot.ini in the project directory when pylabrobot is installed. The default is located at defaults/pylabrobot.ini

    Note: I set the default log level to INFO for end users.

    * Revert "feature: put pylabrobot.ini in the project directory when pylabrobot is installed. The default is located at defaults/pylabrobot.ini"

    This reverts commit 3a0f17811fc6b5c5783dab8e7363dec602ddc79b.

    * feature: create pylabrobot.ini at the module level by finding the .git directory. If this cannot be found, pylabrobot.ini gets created in the current directory.

    * fix: no more pytest-asyncio and support python 3.8 & 3.9 typing

    * fix: support python 3.8 & 3.9 typing

    * fix: support python 3.8 & 3.9 typing

    * fix: support python 3.8 & 3.9 typing

    * fix: support python 3.8 & 3.9 typing

    * fix: support python 3.8 & 3.9 typing

    * Revert "fix: support python 3.8 & 3.9 typing"

    This reverts commit 22bab216164f7dbe94ee18ed904ad5ed9f3b5b9a.

    * fix: linting and typing errors

    * fix: linting and typing errors

    * make LOG_TO_STRING initialize from LOG_FROM_STRING

    use Path as type for log_dir in Config.Logging instead of Union[str, Path]

    * Rename MultiFileReader
    Create JsonReader and JsonWriter for config
    Add json filetype to default reader

    * remove unnecessary cfg_dict = cfg.as_dict from IniWriter

    * add config with json request to server

    * lint

    * remove unnecessary raise NotImplementedError

    * Turn FileReader/FileWriter into FileLoader/FileSaver for clarity. Consolidate Config ABCs into service.__init__. Create HTTPLoader.

    * remove unneeded http file and fix typing of service.__init__

    * fix config tests

    * clean & fix typing

    * all test logs into <project root>/test_logs

    * switch Reader/Writer and Loader/Saver

    * add function for getting project root

    ---------

    Co-authored-by: jtaylor <[email protected]>
    Co-authored-by: Rick Wierenga <[email protected]>

commit 5fac5f5573a912c161f21dd85c053a0d4cfa97eb
Author: Rick Wierenga <[email protected]>
Date:   Sun Jun 9 02:10:08 2024 +0200

    fix clario star checksum

commit 775a99b6e8e1c9fec525937b24dba121744b8354
Author: Rick Wierenga <[email protected]>
Date:   Fri Jun 7 00:22:00 2024 +0200

    fix doc making

commit a60a7afb71e1e527c62618068d2cf49166477a54
Author: Camillo Moschner <[email protected]>
Date:   Thu Jun 6 19:51:39 2024 +0100

    Cos_96_DWP_2mL_Vb Integration + Naming Standard Suggestion (#156)

    * test new Porvair_6_reservoir_47ml_Vb definition

    * update Porvair README

    * renaming Cos_96_DWP_2mL_Vb & Cos_6_MWP_16800ul_Fb

    * update Corning-Costar README

    * Update README.md

    * rename ThermoScientific_96_DWP_1200ul_Rd

    * update Thermo README

    * updating new nomenclature

    * Add PLR resources README and plate naming standard recommendation

    * add examples to resources README

    * fix resources README headers

    * fix type in resources README

    * add little resource subclass explainer to README

    * fine adjustment of volume and height calculations for new Cos_96_DWP_2mL_Vb

    * minor edits

    ---------

    Co-authored-by: Rick Wierenga <[email protected]>

commit e74e169093d882933ff9cae4ccb517bb1db4a8f1
Author: Camillo Moschner <[email protected]>
Date:   Wed Jun 5 20:17:10 2024 +0100

    Creating PlateAdapter (#152)

    * Initiating plate_adapter module

    * new Alpaqua magnum FLX definition as PlateAdapter

    * Second PlateAdapter example, Hamilton_96_adapter_188182

    * Unravelling correct resource to resource assignment with logic

    * fixing linting

    * make site_pedestal_z non-optional

    * investigtae assign_child_resource Signature

    * fixing linting

    * implement Well-grid to hole-grid compatibility check

    * implement Rick's _compute_child_location idea

    * working on linting fix

    * minor format

    * add WIP comment

    * move TypeError to assign_child_resource

    * lift protection from compute_plate_location to enable access in LiquidHandler

    * remove grids' spacing limitations

    * tiny format

    * remove _child_resource_location

    * fix type and lint

    * remove adapter hole spacing constraint

    * tiny format

    ---------

    Co-authored-by: Rick Wierenga <[email protected]>

commit bbc68aa9b8e30044841a06ef65b5bc394b66913c
Author: Rick Wierenga <[email protected]>
Date:   Wed Jun 5 07:06:26 2024 +0200

    remove LiquidHandler.unassign_resource

commit 083841c6287288edf2573d0e534376edc9c2e090
Merge: d9baaf1c 70344495
Author: Rick Wierenga <[email protected]>
Date:   Wed Jun 5 06:48:19 2024 +0200

    Merge pull request #154 from jt05610/fix-asyncio-threading

    fix: close event loop that starts in thread

commit 703444959b975b093b2bf9e141421d2cca379ef4
Author: jtaylor <[email protected]>
Date:   Tue Jun 4 16:53:46 2024 -0600

    fix: close event loop that starts in thread

commit d9baaf1c6abfdbe434f7ae5e4ae6477ad1de7634
Author: Rick Wierenga <[email protected]>
Date:   Mon Jun 3 12:21:58 2024 +0200

    add fans doc, rename module for compatibility

commit 12c4a525ef3ac439fb010ba71b1e31ce47410fe2
Author: Rick Wierenga <[email protected]>
Date:   Sat Jun 1 06:13:30 2024 -0400

    simplify {aspirate,dispense}96 container

commit 71bdcff94afc13f40ca7647cf83e021798bd5672
Author: Rick Wierenga <[email protected]>
Date:   Sat Jun 1 05:40:42 2024 -0400

    raise BlowOutVolumeError (#153)

    * raise BlowOutVolumeError

    * set back to None

    * fix

commit 4756af76b1533da9b944cf079b80a14cd78f0762
Author: Rick Wierenga <[email protected]>
Date:   Fri May 31 23:40:31 2024 -0400

    create carrier sites with klass

commit d16d995b01ab6b6eda51b323271bdea5a11b953a
Author: Rick Wierenga <[email protected]>
Date:   Fri May 31 23:20:33 2024 -0400

    create_equally_spaced_{x,y,2d}

commit ef0546b45524153a39a145a105d62da256bef271
Author: Rick Wierenga <[email protected]>
Date:   Fri May 31 19:33:25 2024 -0400

    fix hlc blow out air in STAR.dispense

commit ce99845a9bc4c6301bdda8fa654cfc6f3d16b1d5
Author: Rick Wierenga <[email protected]>
Date:   Thu May 30 16:12:11 2024 -0400

    (that only works on 3.12)

commit 938fe3ec5be52ed2cf3a854673fcf3cce8c0208c
Author: Marielle Russo <[email protected]>
Date:   Thu May 30 16:06:28 2024 -0400

    Allow 96 head to perform liquid handling operations (Aspirate and Dispense) on arbitrary containers. (#150)

    * Added support for using 96 head to aspirate and dispense on with Trough

    * tiny format

    * Update liquid handling backend methods to use `AspirationContainer` and `DispenseContainer`

    The code changes modify the `aspirate96` and `dispense96` methods in the `EVO`, `LiquidHandlerBackend`, `OpentronsBackend`, and `ChatterBoxBackend` classes to use the `AspirationContainer` and `DispenseContainer` classes instead of `AspirationTrough` and `DispenseTrough`. This change aligns the method signatures with the updated class names in the `standard.py` module.

    * linting

    * fix

    * fix tests

    * Trigger Build

    ---------

    Co-authored-by: Rick Wierenga <[email protected]>

commit e8fe49ccef33015894bb6a2bc7c6bad267466c89
Author: joelaforet <[email protected]>
Date:   Thu May 30 15:06:06 2024 -0400

    OT2 'reservoirs' (#149)

    * Implemented TubeRack and Tube methods and added to visualizer

    * added reservoirs to opentrons

    * Added new reservoir class for OpenTrons Reservoirs

    * bugs with reservoirs and visualizer. Maybe also in how children are assigned too

    * added code for OpenTrons reservoirs and got them on visualizer

    * made lint/test/typecheck happy

    * Normalize all the line endings

    * no need for new reservoir class

    * made test/lint/typecheck happy

    * minor formatting

    ---------

    Co-authored-by: Joe Laforet <joelaforet@JLaforetLaptop>
    Co-authored-by: Rick Wierenga <[email protected]>

commit 567110d8304c6558a6deb0daedb76c3aab080383
Author: Florian De Rop <[email protected]>
Date:   Tue May 28 18:06:50 2024 -0700

    [STAR] Remove unused argument from docstring (#148)

commit d3568d3a935b340b584d95f967e8a5aa1d69b19e
Author: Rick Wierenga <[email protected]>
Date:   Tue May 28 08:45:30 2024 -0400

    get_anchor (#147)

    * get_anchor

    * type

commit 288e1d72848dbb7a1625d7c5979f07b7de61dcc9
Author: Phi Nguyen <[email protected]>
Date:   Mon May 27 14:28:06 2024 -0400

    added size to plate reader in README (#146)

commit c1ca2b55ebd1f3c37cb09c91154529d0d54dba49
Author: ramirjos <[email protected]>
Date:   Sun May 26 21:28:42 2024 -0400

    add the only fan (#144)

commit 3640150319d5667dcc558bfd0961ade6c0e0a2c9
Author: Rick Wierenga <[email protected]>
Date:   Sat May 25 23:02:43 2024 -0400

    fix

commit 61e1275b71eee9b0e0df5a2717bca1a4d55df112
Merge: 996a32c9 f84b5611
Author: Rick Wierenga <[email protected]>
Date:   Sat May 25 23:00:25 2024 -0400

    Merge branch 'main' of https://github.com/pylabrobot/pylabrobot

commit 996a32c9a94fd24f393453ca818994010d5563b8
Author: Rick Wierenga <[email protected]>
Date:   Sat May 25 23:00:16 2024 -0400

    update tecan well height definition

commit f84b561165cacb0c9b827a23de126c460f7a4453
Author: Camillo Moschner <[email protected]>
Date:   Sat May 25 18:34:09 2024 +0100

    Well compute_height_from_volume method integration (LLF part 2) (#139)

    * Well compute_height_from_volume integration

    * add tolerance explanation

    * fix linting

commit 14f1ce5240b1bd3d3df95112942236fcb6bf7670
Author: Marielle Russo <[email protected]>
Date:   Sat May 25 13:29:54 2024 -0400

    Add serialization and deserialization methods to Pump, PumpArray, and PumpCalibration (#140)

    * feat: Add serialization and deserialization methods to Pump, PumpArray, and PumpCalibration to allow for calibrations to be serialized and deserialized separately and within instances of pumps.

    The commit adds serialization and deserialization methods to the `Pump`, `PumpArray`, and 'PumpCalibration' classes. These methods allow instances of the classes to be converted to and from a dictionary representation, making it easier to store and retrieve their state. This feature improves the flexibility and usability of the classes.

    * minor formatting

    ---------

    Co-authored-by: Rick Wierenga <[email protected]>

commit 8eca518580dc9b5f12a272411190097201129ab1
Author: Camillo Moschner <[email protected]>
Date:   Thu May 23 18:23:56 2024 +0100

    Calculate height from volume in container (LLF part 1) (#136)

    * implementing height functions (3 / 5)

    * fixing type checking

    * fixing int 0

    * fixing linting

    * two more height functions

    * enhancing_height_of_volume_in_spherical_cap

    added docstring and ValueError in case liquid_volume given exceeds volume of spherical cap (useful when used as a standalone function, redundancy in height_functions)

    ---------

    Co-authored-by: Rick Wierenga <[email protected]>

commit adeeff75941e14cede7db46d15bffd4f19155d89
Author: Rick Wierenga <[email protected]>
Date:   Wed May 22 03:27:10 2024 -0400

    fix type

commit ac3e45ff495aaa2f1b02cd56bc5628f784c88378
Author: ramirjos <[email protected]>
Date:   Wed May 22 02:53:01 2024 -0400

    fix z offset for 96 tip pickup (#137)

commit 5bad3ae812f21d9b33893dcb34f05c1b6ee88c95
Author: Camillo Moschner <[email protected]>
Date:   Tue May 21 19:09:43 2024 +0100

    Thermo scientific 96 1200ul rd integration (#135)

    * ThermoScientific_96_1200ul_Rd integration

    * adding docstring with useful information in the field

    * fixing linting

commit 8fe9b0b770333b4fa0e1600b73df75e73ec2cd9b
Author: joelaforet <[email protected]>
Date:   Fri May 17 15:22:15 2024 -0400

    Visualizer showing volume updates for add_liquid() and remove_liquid() calls. (#134)

    * Added functions to TubeRack and Tube and added them to the visualizer

    * fixed bug in remove_liquid() and add_liquid() not updating on the visualizer

    * linting

    ---------

    Co-authored-by: Joe Laforet <joelaforet@JLaforetLaptop>
    Co-authored-by: Rick Wierenga <[email protected]>

commit dc9a40fae19bdb17c78a0b73d474cd16c7e78e67
Author: jkh <[email protected]>
Date:   Thu May 16 15:35:59 2024 -0700

    [STAR] fix core gripper location (#133)

    Co-authored-by: jj <[email protected]>

commit f382dd2a909fd650598f4a0f36a4b61f67e1e150
Author: joelaforet <[email protected]>
Date:   Thu May 16 16:52:55 2024 -0400

    Added functions to TubeRack and Tube and added them to the visualizer (#132)

    * Added functions to TubeRack and Tube and added them to the visualizer

    * minor formatting

    ---------

    Co-authored-by: Joe Laforet <joelaforet@JLaforetLaptop>
    Co-authored-by: Rick Wierenga <[email protected]>

commit 1919727e2d142ec81d2a1a8adc02acf9a7b1f96b
Author: Camillo Moschner <[email protected]>
Date:   Wed May 15 18:12:51 2024 +0100

    ShakerCarrier integration (#130)

    * PLT_CAR_L4_SHAKER definition

    * Make PLT_CAR_L4_SHAKER a MFXCarrier

    * Polish PLT_CAR_L4_SHAKER

commit f8b539eb4eee7a9e44683a913755ba695e65d26e
Author: Camillo Moschner <[email protected]>
Date:   Wed May 15 00:04:09 2024 +0100

    Alpaqua MAGNUM FLX integration (#129)

    * Alpaqua MAGNUM FLX definition verification

    * correcting unnecessary wildcard import

    * correcting missing Coordinate import

    * only allow V and U bottom plates

    * fix type / only take plates …

    ---------

    Co-authored-by: Rick Wierenga <[email protected]>

commit b144f11c90a18c5493db1755f6bc8e9edb100229
Author: Rick Wierenga <[email protected]>
Date:   Tue May 14 16:29:37 2024 -0400

    fix linting errors

commit 7d316afd4cce7c4cbc1f59f1333b7c280eb9f6de
Author: Charlotte Christensen <[email protected]>
Date:   Sun May 12 18:36:52 2024 -0400

    fix greiner 384 plate (#128)

commit 9e664e1fb4c28e370214225dc7e10eb6436fc564
Author: Rick Wierenga <[email protected]>
Date:   Sun May 12 13:28:13 2024 -0400

    fix some STAR error messages

commit 2c7d05d335d81d1aeb71f0ba8f7f9409794cec97
Author: Nicolás A. Méndez <[email protected]>
Date:   Sat May 11 23:12:46 2024 -0300

    Add "__repr__" and "print_grid" to itemized_resource to display item occupacy (#127)

    * Add "__repr__" to itemized_resource, displaying a grid of occupied/free spots

    Example output:

    ```
    12x8 TipRack
        1  2  3  4  5  6  7  8  9  10 11 12
    A:  -  -  -  -  -  -  -  -  -  -  -  -
    B:  -  -  -  -  -  -  -  -  -  -  -  -
    C:  -  -  -  -  -  -  -  -  -  -  -  -
    D:  -  -  -  -  -  -  -  -  -  -  -  -
    E:  -  -  -  -  -  -  -  -  -  -  -  -
    F:  -  -  -  -  -  -  -  -  -  -  -  -
    G:  -  -  -  -  -  -  -  -  -  -  -  -
    H:  -  -  -  -  -  -  -  -  -  -  -  -
    ```

    * Add LETTERS

    * linter errors

    * fix type checking

    * fix type checking again

    pylabrobot/resources/itemized_resource.py:390: error: Incompatible types in assignment (expression has type "str", variable has type "list[list[str]]")  [assignment]
    pylabrobot/resources/itemized_resource.py:393: error: Unsupported operand types for + ("str" and "list[list[str]]")  [operator]

    * replace __repr__ with print_grid

    makes more sense, and is required because there is no way for itemizedresource way to know how to check for or represent the items from classes inheriting from it (see comments in code)

    * add footer

    * _occupied_func: replace Resource hint with T

    "T is a placeholder for the resource that is "itemized" by ItemizedResource. It is TipSpot for TipRack, Well for Plate, and Tube (soon TubeSpot) for TubeRacks"

    * Add _occupied_func method to TipRack

    This overrides _occupied_func in ItemizedResource, making print_grid informative about tips in tipspots

    * linter fixes

    * fix typo

commit 0b08a1a8719b729c160b25eb3db6ee69396b22fb
Author: Rick Wierenga <[email protected]>
Date:   Sat May 11 09:15:25 2024 -0700

    fix STAR.request_{y,z}_pos_channel_n

commit 52d8b5b5c61a524075b94464f2aa187e5deb8acd
Author: Rick Wierenga <[email protected]>
Date:   Sat May 11 09:04:15 2024 -0700

    fix LTF pickup on STAR

commit 8f5f77f790a4819c0b8e539dbd932992284527ec
Author: Ben <[email protected]>
Date:   Wed May 8 18:55:54 2024 -0700

    update docstrings for swap_speed in STAR.py (#126)

commit 254d424e90ccf4fbcf6ba2209ce87d3b23f5bb8d
Author: Rick Wierenga <[email protected]>
Date:   Wed May 8 12:45:46 2024 -0400

    fix tiny dispense on Vantage with 10uL tips

commit c655ceb5b6d5a4fbece10b54420ec0562728a82c
Author: Rick Wierenga <[email protected]>
Date:   Tue May 7 18:09:22 2024 -0400

    fix LH.dispense volume tracker issue

commit a292d3022ec3528fdd2b9453ee30e95f861b6fad
Author: jkh <[email protected]>
Date:   Mon May 6 10:07:49 2024 -0700

    [STAR] allow variable number of pipettes to be initialized (#124)

    Co-authored-by: jj <[email protected]>

commit ddeff94bfe2dc6249d27642c243237ec472c3ff8
Author: Camillo Moschner <[email protected]>
Date:   Sat May 4 05:55:12 2024 +0100

    Corning-Costar 6-well flat-bottom plate integration (#122)

    * Cos_6_Fb base definition

    * Cos_6_Fb PLR integration

    * polishing definition

    * generate README for Corning-Costar labware

    * minor formatting

    ---------

    Co-authored-by: Rick Wierenga <[email protected]>

commit 42326e7b351c3ce3203552f93a335ce5d8601de1
Author: Rick Wierenga <[email protected]>
Date:   Wed May 1 13:13:51 2024 -0400

    fix type

commit 6405ee12052db38c53e3bb69b2ecdd6029c2f189
Author: Marielle Russo <[email protected]>
Date:   Wed May 1 13:04:19 2024 -0400

    allowing serialization and deserialization of Machines and their backends (#120)

    * implemented calibrations, PumpArrays, and the backend for Agrow Dose Pumps

    * implemented calibrations, PumpArrays, and the backend for Agrow Dose Pumps

    * implemented unit tests for calibrations, pumps, and pump arrays, debugged and cleaned code

    * debugged agrowtek pump functionality and validated expected operation

    * remove unnecessary print statement

    * Make formatting consistent

    * make formatting consistent

    * check single value when using calibration with single pump

    * more formatting

    * resolved pull request issues and cleaned up code

    * added agrowpumps requirements to setup

    * formatting & fix tests

    * modified Calibration so class methods take calibration_mode as well, raise an error if it is not 'revolutions' or 'duration' and added tests to validate it's implementation. Also changed the csv processing to allow for single and two-column csv inputs, and added test csvs to validate it's performance

    * changed agrowdosepump to use AsyncModbusClient appropriately, ensured that pumps ran as expected, and also brought agrowdosepump_tests into agreement

    * Fix logger error in keep alive thread and disable pylint warning

    * fix some typing errors & formatting

    * remove single column csv support

    * Refactor PumpArray class initialization and add new parameters in pumparray.py to bring it in line with the Pump class

    * Refactor PumpArray class initialization and
    associated tests and add new parameters in
    pumparray.py to bring it in line with the Pump
    class

    * Refactor PumpArray class initialization and add new parameters in pumparray.py to bring it in line with the Pump class

    * Fix calibration_mode attribute access in PumpArray class

    * Add serialize method to AgrowPumpArray and Masterflex classes

    * Fix calibration_mode attribute access in PumpArray class

    * Add serialize and deserialize method to Machine and MachineBackend, with processing to handle backend instantiating, and edited all associated MachineBackend subclasses

    * Update inheco.py

    * Add get_resource_class_from_string function to Machine and MachineBackend. Also added rotation variable to machine_tests

    * Update Machine and MachineBackend to use find_subclass function for backend subclass lookup, as get_class_from_string imported from resources produces typing related issues

    * Update serialization and deserialization methods in LiquidHandlerBackend and STAR classes to reflect that custom methods are no longer needed

    * Update serialization and deserialization methods in LiquidHandlerBackend and STAR classes to reflect changes in find_subclass function introduced in utils and removal of custom methods. Also added handling for USBBackend.

    * Update typing imports in backend.py, STAR_tests.py, machine.py, and resource.py

    * Refactor typing imports in liquid_handler.py and update serialization and deserialization methods in LiquidHandlerBackend and STAR classes

    * Update machine.py

    * Machine.__init__ not abstract

    * Update agrowdosepump.py

    ---------

    Co-authored-by: Rick Wierenga <[email protected]>

commit 69dd270d68f06aa4c7947e0efacba7f2573ab5ba
Author: Rick Wierenga <[email protected]>
Date:   Wed May 1 12:49:50 2024 -0400

    fix type

commit 8362937bad16ec9b1685b91a3426c3efa207eaaf
Author: Lenni Justen <[email protected]>
Date:   Wed May 1 11:12:11 2024 -0400

    fix typo (#121)

commit 9ac280a44392cb4727778ed20289f429ea2f92d9
Author: Rick Wierenga <[email protected]>
Date:   Wed May 1 00:18:30 2024 -0400

    fix vantage.{pick_up,drop}96 offset.z

commit d31f66ed80788376f677809ea8c87be249f696db
Author: Lenni Justen <[email protected]>
Date:   Tue Apr 30 16:42:18 2024 -0400

    Change tc to t for temperature controller in temperature.ipynb (#119)

commit 19afa9a3669dd0dac8df4622122b7896f3970659
Author: Lenni Justen <[email protected]>
Date:   Tue Apr 30 13:33:37 2024 -0400

    fix ot module loading (#118)

commit 9f2011035bbf5813ec38b77a3839f541b130e8c5
Author: Phi Nguyen <[email protected]>
Date:   Tue Apr 30 13:26:17 2024 -0400

    fixed pick_up_tips tracker error for liquid handling (#117)

    * fixed core 96 setup bumping problem

    * kgug

    * remove comment

    * Revert "kgug"

    This reverts commit 930407d201ac880d11b53a70f5ee28ec14d1ad67.

    * adding first centrifuge files

    * fix iswap move resources on rotation

    * added more confiration settings

    * test push with "notes"

    * fixed pick_up_tips tracker error

    * Delete pylabrobot/centrifuge directory

    * deleted drop_tips mistake

 …
rickwierenga added a commit that referenced this pull request Nov 13, 2024
rickwierenga added a commit that referenced this pull request Nov 13, 2024
rickwierenga added a commit that referenced this pull request Nov 13, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants