From 56ac8b4422d2c75dfb9820a5f89ede78896f163e Mon Sep 17 00:00:00 2001 From: David Nedrud Date: Wed, 3 Dec 2025 10:22:21 -0600 Subject: [PATCH 1/8] Update module.py add aluminum block holder --- pylabrobot/resources/opentrons/module.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/pylabrobot/resources/opentrons/module.py b/pylabrobot/resources/opentrons/module.py index 53c1ed2e8fd..8ccfe9e7ce7 100644 --- a/pylabrobot/resources/opentrons/module.py +++ b/pylabrobot/resources/opentrons/module.py @@ -1,2 +1,22 @@ +from pylabrobot.resources.carrier import Coordinate, PlateHolder + + class OTModule: """Any ot module like temperature controller, thermocycler, etc.""" + + +def Opentrons_deep_well_aluminum_block(name: str) -> PlateHolder: + """Aluminum Block – 96 Deep Well Plate (cat. 991-00211) + https://opentrons.com/products/aluminum-block-96-deep-well-plate + The Opentrons Deep Well Aluminum Block can be placed directly on + the OT-2/Opentrons Flex deck or on the Opentrons Temperature Module""" + + return PlateHolder( + name=name, + size_x=127.7, # measured + size_y=85.5, # measured + size_z=21.5, # measured + child_location=Coordinate(0, 0, 5.1), # measured + #pedestal_size_z=, + model=Opentrons_deep_well_aluminum_block.__name__, + ) From 0a56d8212abcdac2887e1bc606cf6d08c726d47a Mon Sep 17 00:00:00 2001 From: David Nedrud Date: Wed, 3 Dec 2025 10:33:38 -0600 Subject: [PATCH 2/8] Update module.py updated dimensions from opentrons data --- pylabrobot/resources/opentrons/module.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pylabrobot/resources/opentrons/module.py b/pylabrobot/resources/opentrons/module.py index 8ccfe9e7ce7..a39ae2b5524 100644 --- a/pylabrobot/resources/opentrons/module.py +++ b/pylabrobot/resources/opentrons/module.py @@ -13,8 +13,8 @@ def Opentrons_deep_well_aluminum_block(name: str) -> PlateHolder: return PlateHolder( name=name, - size_x=127.7, # measured - size_y=85.5, # measured + size_x=127.76, # opentrons data + size_y=85.48, # opentrons data size_z=21.5, # measured child_location=Coordinate(0, 0, 5.1), # measured #pedestal_size_z=, From 7e43a851c598ae63665257438546fe7a4375d061 Mon Sep 17 00:00:00 2001 From: nedru004 Date: Wed, 3 Dec 2025 12:46:24 -0600 Subject: [PATCH 3/8] Revert module.py and add adapter to new file Load module from opentrons repository --- pylabrobot/resources/opentrons/adapters.py | 9 ++++++++ pylabrobot/resources/opentrons/load.py | 24 ++++++++++++++++++++++ pylabrobot/resources/opentrons/module.py | 20 ------------------ 3 files changed, 33 insertions(+), 20 deletions(-) create mode 100644 pylabrobot/resources/opentrons/adapters.py diff --git a/pylabrobot/resources/opentrons/adapters.py b/pylabrobot/resources/opentrons/adapters.py new file mode 100644 index 00000000000..100f05446b7 --- /dev/null +++ b/pylabrobot/resources/opentrons/adapters.py @@ -0,0 +1,9 @@ +from pylabrobot.resources.opentrons.load import load_ot_plate_holder +from pylabrobot.resources.carrier import PlateHolder + + +def opentrons_96_deep_well_temp_mod_adapter(name: str) -> PlateHolder: + z_offset = 5.1 + return load_ot_adapter( + "opentrons_96_well_aluminum_block", z_offset=z_offset, plr_resource_name=name + ) diff --git a/pylabrobot/resources/opentrons/load.py b/pylabrobot/resources/opentrons/load.py index 7adad6025c9..2c95884ecd5 100644 --- a/pylabrobot/resources/opentrons/load.py +++ b/pylabrobot/resources/opentrons/load.py @@ -7,6 +7,7 @@ from pylabrobot.resources import Coordinate, Tip, TipRack, TipSpot from pylabrobot.resources.resource_holder import ResourceHolder from pylabrobot.resources.tube_rack import TubeRack +from pylabrobot.resources.carrier import Coordinate, PlateHolder def _download_file(url: str, local_path: str) -> bytes: @@ -147,3 +148,26 @@ def load_ot_tube_rack( ordered_items=cast(Dict[str, ResourceHolder], ordered_items), model=data["metadata"]["displayName"], ) + + +def load_ot_adapter( + ot_name: str, plr_resource_name: str, z_offset: float, force_download: bool = False +) -> PlateHolder: + """Convert an Opentrons adapter definition file to a PyLabRobot PlateHolder resource.""" + + data = _download_ot_resource_file(ot_name=ot_name, force_download=force_download) + + display_category = data["metadata"]["displayCategory"] + if display_category not in {"adapter", "aluminumBlock"}: + raise ValueError("Not a plate adapter definition file.") + + location = data["cornerOffsetFromSlot"] + + return PlateHolder( + name=plr_resource_name, + size_x=data["dimensions"]["xDimension"], + size_y=data["dimensions"]["yDimension"], + size_z=data["dimensions"]["zDimension"], + child_location=Coordinate(location["x"], location["y"], z_offset), + model=data["metadata"]["displayName"], + ) diff --git a/pylabrobot/resources/opentrons/module.py b/pylabrobot/resources/opentrons/module.py index a39ae2b5524..53c1ed2e8fd 100644 --- a/pylabrobot/resources/opentrons/module.py +++ b/pylabrobot/resources/opentrons/module.py @@ -1,22 +1,2 @@ -from pylabrobot.resources.carrier import Coordinate, PlateHolder - - class OTModule: """Any ot module like temperature controller, thermocycler, etc.""" - - -def Opentrons_deep_well_aluminum_block(name: str) -> PlateHolder: - """Aluminum Block – 96 Deep Well Plate (cat. 991-00211) - https://opentrons.com/products/aluminum-block-96-deep-well-plate - The Opentrons Deep Well Aluminum Block can be placed directly on - the OT-2/Opentrons Flex deck or on the Opentrons Temperature Module""" - - return PlateHolder( - name=name, - size_x=127.76, # opentrons data - size_y=85.48, # opentrons data - size_z=21.5, # measured - child_location=Coordinate(0, 0, 5.1), # measured - #pedestal_size_z=, - model=Opentrons_deep_well_aluminum_block.__name__, - ) From fd2d3dad31984d347deac8e06d3b615d9896dbba Mon Sep 17 00:00:00 2001 From: Rick Wierenga Date: Wed, 3 Dec 2025 17:07:08 -0800 Subject: [PATCH 4/8] tl --- pylabrobot/resources/opentrons/adapters.py | 4 ++-- pylabrobot/resources/opentrons/load.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pylabrobot/resources/opentrons/adapters.py b/pylabrobot/resources/opentrons/adapters.py index 100f05446b7..53c46c3cdf6 100644 --- a/pylabrobot/resources/opentrons/adapters.py +++ b/pylabrobot/resources/opentrons/adapters.py @@ -1,9 +1,9 @@ -from pylabrobot.resources.opentrons.load import load_ot_plate_holder from pylabrobot.resources.carrier import PlateHolder +from pylabrobot.resources.opentrons.load import load_ot_plate_holder def opentrons_96_deep_well_temp_mod_adapter(name: str) -> PlateHolder: z_offset = 5.1 - return load_ot_adapter( + return load_ot_plate_holder( "opentrons_96_well_aluminum_block", z_offset=z_offset, plr_resource_name=name ) diff --git a/pylabrobot/resources/opentrons/load.py b/pylabrobot/resources/opentrons/load.py index 2c95884ecd5..86070777e9b 100644 --- a/pylabrobot/resources/opentrons/load.py +++ b/pylabrobot/resources/opentrons/load.py @@ -5,9 +5,9 @@ from typing import Dict, List, cast from pylabrobot.resources import Coordinate, Tip, TipRack, TipSpot +from pylabrobot.resources.carrier import Coordinate, PlateHolder from pylabrobot.resources.resource_holder import ResourceHolder from pylabrobot.resources.tube_rack import TubeRack -from pylabrobot.resources.carrier import Coordinate, PlateHolder def _download_file(url: str, local_path: str) -> bytes: @@ -150,7 +150,7 @@ def load_ot_tube_rack( ) -def load_ot_adapter( +def load_ot_plate_holder( ot_name: str, plr_resource_name: str, z_offset: float, force_download: bool = False ) -> PlateHolder: """Convert an Opentrons adapter definition file to a PyLabRobot PlateHolder resource.""" From 42254540f1a952727c00cb1c982ab2e6e8617072 Mon Sep 17 00:00:00 2001 From: Rick Wierenga Date: Wed, 3 Dec 2025 17:08:45 -0800 Subject: [PATCH 5/8] l --- pylabrobot/resources/opentrons/load.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pylabrobot/resources/opentrons/load.py b/pylabrobot/resources/opentrons/load.py index 86070777e9b..fc4bf645669 100644 --- a/pylabrobot/resources/opentrons/load.py +++ b/pylabrobot/resources/opentrons/load.py @@ -5,7 +5,7 @@ from typing import Dict, List, cast from pylabrobot.resources import Coordinate, Tip, TipRack, TipSpot -from pylabrobot.resources.carrier import Coordinate, PlateHolder +from pylabrobot.resources.carrier import PlateHolder from pylabrobot.resources.resource_holder import ResourceHolder from pylabrobot.resources.tube_rack import TubeRack From eddcedd112159068b08cdf9f737743cf6d82d7a6 Mon Sep 17 00:00:00 2001 From: David Nedrud Date: Thu, 4 Dec 2025 11:42:32 -0600 Subject: [PATCH 6/8] Update path for tmp file /tmp doesnt exist on windows computers. Add C:/Windows/Temp --- pylabrobot/resources/opentrons/adapters.py | 2 +- pylabrobot/resources/opentrons/load.py | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/pylabrobot/resources/opentrons/adapters.py b/pylabrobot/resources/opentrons/adapters.py index 53c46c3cdf6..decd6756fe7 100644 --- a/pylabrobot/resources/opentrons/adapters.py +++ b/pylabrobot/resources/opentrons/adapters.py @@ -5,5 +5,5 @@ def opentrons_96_deep_well_temp_mod_adapter(name: str) -> PlateHolder: z_offset = 5.1 return load_ot_plate_holder( - "opentrons_96_well_aluminum_block", z_offset=z_offset, plr_resource_name=name + "opentrons_96_deep_well_temp_mod_adapter", z_offset=z_offset, plr_resource_name=name ) diff --git a/pylabrobot/resources/opentrons/load.py b/pylabrobot/resources/opentrons/load.py index fc4bf645669..e12c9e64b4b 100644 --- a/pylabrobot/resources/opentrons/load.py +++ b/pylabrobot/resources/opentrons/load.py @@ -27,7 +27,10 @@ def _download_ot_resource_file(ot_name: str, force_download: bool): The labware definition as a dictionary. """ url = f"https://raw.githubusercontent.com/Opentrons/opentrons/5b51a98ce736b2bb5aff780bf3fdf91941a038fa/shared-data/labware/definitions/2/{ot_name}/1.json" - path = f"/tmp/{ot_name}.json" + if os.path.exists("/tmp"): + path = f"/tmp/{ot_name}.json" # only works with linux/mac systems + else: + path = f"C:/Windows/Temp/{ot_name}.json" if force_download or not os.path.exists(path): data = _download_file(url=url, local_path=path) else: @@ -169,5 +172,6 @@ def load_ot_plate_holder( size_y=data["dimensions"]["yDimension"], size_z=data["dimensions"]["zDimension"], child_location=Coordinate(location["x"], location["y"], z_offset), + pedestal_size_z = 0, model=data["metadata"]["displayName"], ) From 88be0a59c77909e3046c3795755d458387819b89 Mon Sep 17 00:00:00 2001 From: nedru004 Date: Thu, 4 Dec 2025 13:25:42 -0600 Subject: [PATCH 7/8] Update load.py formatting --- pylabrobot/resources/opentrons/load.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pylabrobot/resources/opentrons/load.py b/pylabrobot/resources/opentrons/load.py index e12c9e64b4b..868363a0e7e 100644 --- a/pylabrobot/resources/opentrons/load.py +++ b/pylabrobot/resources/opentrons/load.py @@ -172,6 +172,6 @@ def load_ot_plate_holder( size_y=data["dimensions"]["yDimension"], size_z=data["dimensions"]["zDimension"], child_location=Coordinate(location["x"], location["y"], z_offset), - pedestal_size_z = 0, + pedestal_size_z=0, model=data["metadata"]["displayName"], ) From 672f836f6ef877de8e7b0fe99cc93a018d843b6f Mon Sep 17 00:00:00 2001 From: nedru004 Date: Fri, 5 Dec 2025 12:37:50 -0600 Subject: [PATCH 8/8] Update opentrons.md --- docs/resources/library/opentrons.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/resources/library/opentrons.md b/docs/resources/library/opentrons.md index 273a1a7fab5..c3ba94216d9 100644 --- a/docs/resources/library/opentrons.md +++ b/docs/resources/library/opentrons.md @@ -53,3 +53,8 @@ Unfortunately, most of the other labware (plates) is missing information that is - `opentrons_96_aluminumblock_generic_pcr_strip_200ul` - `opentrons_96_aluminumblock_nest_wellplate_100ul` - `opentrons_96_well_aluminum_block` + + +## Plate Adapters + +- `opentrons_96_deep_well_temp_mod_adapter`