From c039b9d529c135e6f338eb71f04173fad8bdd174 Mon Sep 17 00:00:00 2001 From: Eric <113262615+ericguan04@users.noreply.github.com> Date: Thu, 12 Jun 2025 15:26:31 -0400 Subject: [PATCH 01/11] Add new resources to pylabrobot --- pylabrobot/resources/sergi/plate_adapters.py | 46 ++++++++++++++++++++ pylabrobot/resources/vwr/plates.py | 40 +++++++++++++++++ pylabrobot/resources/vwr/troughs.py | 40 +++++++++++++++++ 3 files changed, 126 insertions(+) create mode 100644 pylabrobot/resources/sergi/plate_adapters.py create mode 100644 pylabrobot/resources/vwr/plates.py diff --git a/pylabrobot/resources/sergi/plate_adapters.py b/pylabrobot/resources/sergi/plate_adapters.py new file mode 100644 index 00000000000..06cb4e96781 --- /dev/null +++ b/pylabrobot/resources/sergi/plate_adapters.py @@ -0,0 +1,46 @@ +"""Sergi Lab Supplies plate adapters""" + +from pylabrobot.resources.plate import Plate +from pylabrobot.resources.plate_adapter import PlateAdapter +from pylabrobot.resources.utils import create_ordered_items_2d +from pylabrobot.resources.well import ( + CrossSectionType, + Well, + WellBottomType, +) + + +def SergiLabSupplies_96_MagneticRack_250ul_Vb(name: str) -> PlateAdapter: + """ + Sergi Lab Supplies Magnetic Rack [cat. no. 1047] + - Holds a 96-well PCR plate for DNA/RNA purification + - SBS footprint: 127.76 x 85.48 mm + - Rack height: 22.0 mm + - Pulls magnetic beads ~1-2 mm above bottom + """ + + return PlateAdapter( + name=name, + size_x=127.76, + size_y=85.48, + size_z=22.0, + model="SergiLabSupplies_96_MagneticRack_250ul_Vb", + lid=None, + ordered_items=create_ordered_items_2d( + Well, + num_items_x=12, + num_items_y=8, + dx=10.87, # 14.3-6.86/2 + dy=7.77, # 11.2-6.86/2 + dz=3.03, + item_dx=9.0, + item_dy=9.0, + size_x=8.0, + size_y=8.0, + size_z=16.0, + material_z_thickness=0.5, + bottom_type=WellBottomType.V, + cross_section_type=CrossSectionType.CIRCLE, + max_volume=250, + ), + ) diff --git a/pylabrobot/resources/vwr/plates.py b/pylabrobot/resources/vwr/plates.py new file mode 100644 index 00000000000..eb90f1e2a75 --- /dev/null +++ b/pylabrobot/resources/vwr/plates.py @@ -0,0 +1,40 @@ +from pylabrobot.resources.plate import Plate +from pylabrobot.resources.utils import create_ordered_items_2d +from pylabrobot.resources.well import ( + CrossSectionType, + Well, + WellBottomType, +) + + +def VWR_96_ReagentReservoir_195mL_Ub(name: str) -> Plate: + """ + VWR NA Cat. No. 77575-302 + + For plate carriers and plate stacks + """ + return Plate( + name=name, + size_x=127.76, + size_y=85.48, + size_z=31.4, + lid=None, + model="VWR_96_ReagentReservoir_195mL_Ub", + ordered_items=create_ordered_items_2d( + Well, + size_x=8.9, + size_y=8.9, + size_z=26.85, + dx=9.93, # 14.38 - (8.9/2) + dy=6.79, # 11.24 - (8.9/2) + dz=3.55, + material_z_thickness=1, # 31.4 - (26.85 + 3.55) + item_dx=9.0, + item_dy=9.0, + num_items_x=12, + num_items_y=8, + cross_section_type=CrossSectionType.RECTANGLE, + bottom_type=WellBottomType.U, + max_volume=195000, + ), + ) diff --git a/pylabrobot/resources/vwr/troughs.py b/pylabrobot/resources/vwr/troughs.py index 252c9cc4348..83741fa7222 100644 --- a/pylabrobot/resources/vwr/troughs.py +++ b/pylabrobot/resources/vwr/troughs.py @@ -1,4 +1,11 @@ +from pylabrobot.resources.plate import Plate from pylabrobot.resources.trough import Trough +from pylabrobot.resources.utils import create_ordered_items_2d +from pylabrobot.resources.well import ( + CrossSectionType, + Well, + WellBottomType, +) def VWRReagentReservoirs25mL(name: str) -> Trough: @@ -11,3 +18,36 @@ def VWRReagentReservoirs25mL(name: str) -> Trough: max_volume=25000, model="VWR Reagent Reservoirs 25mL", ) + + +def VWR_96_ReagentReservoir_195mL_Ub(name: str) -> Trough: + """ + VWR NA Cat. No. 77575-302 + + For trough carriers and trough stacks + """ + return Trough( + name=name, + size_x=127.76, + size_y=85.48, + size_z=31.4, + lid=None, + model="VWR_96_ReagentReservoir_195mL_Ub", + ordered_items=create_ordered_items_2d( + Well, + size_x=8.9, + size_y=8.9, + size_z=26.85, + dx=9.93, # 14.38 - (8.9/2) + dy=6.79, # 11.24 - (8.9/2) + dz=3.55, + material_z_thickness=1, # 31.4 - (26.85 + 3.55) + item_dx=9.0, + item_dy=9.0, + num_items_x=12, + num_items_y=8, + cross_section_type=CrossSectionType.RECTANGLE, + bottom_type=WellBottomType.U, + max_volume=195000, + ), + ) From 7bb5ef2236a112daf00267e1f50ce79473fa94c3 Mon Sep 17 00:00:00 2001 From: Eric <113262615+ericguan04@users.noreply.github.com> Date: Fri, 13 Jun 2025 00:13:21 -0400 Subject: [PATCH 02/11] Add resource fixes --- ...giLabSupplies_96_MagneticRack_250ul_Vb.jpg | Bin 0 -> 50933 bytes .../vwr/VWR_96_ReagentReservoir_195mL_Ub.jpg | Bin 0 -> 12506 bytes docs/resources/library/sergi.md | 9 ++++ docs/resources/library/vwr.md | 2 + pylabrobot/resources/sergi/__init__.py | 1 + pylabrobot/resources/sergi/plate_adapters.py | 32 +++++++------- pylabrobot/resources/vwr/__init__.py | 2 +- pylabrobot/resources/vwr/plates.py | 32 +++++++------- pylabrobot/resources/vwr/troughs.py | 40 ------------------ 9 files changed, 47 insertions(+), 71 deletions(-) create mode 100644 docs/resources/library/img/sergi/SergiLabSupplies_96_MagneticRack_250ul_Vb.jpg create mode 100644 docs/resources/library/img/vwr/VWR_96_ReagentReservoir_195mL_Ub.jpg create mode 100644 docs/resources/library/sergi.md create mode 100644 pylabrobot/resources/sergi/__init__.py diff --git a/docs/resources/library/img/sergi/SergiLabSupplies_96_MagneticRack_250ul_Vb.jpg b/docs/resources/library/img/sergi/SergiLabSupplies_96_MagneticRack_250ul_Vb.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8007a3ef4c36fe3980ffe7e90a820a8068c84e88 GIT binary patch literal 50933 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 MhyNe{1AqPcA5s(S&j0`b literal 0 HcmV?d00001 diff --git a/docs/resources/library/img/vwr/VWR_96_ReagentReservoir_195mL_Ub.jpg b/docs/resources/library/img/vwr/VWR_96_ReagentReservoir_195mL_Ub.jpg new file mode 100644 index 0000000000000000000000000000000000000000..eb6e9d51c6e57a69fc3b1b9f7ffed42df0386056 GIT binary patch literal 12506 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 Gef}Q?JpgY2 literal 0 HcmV?d00001 diff --git a/docs/resources/library/sergi.md b/docs/resources/library/sergi.md new file mode 100644 index 00000000000..c1d8fa5d5d6 --- /dev/null +++ b/docs/resources/library/sergi.md @@ -0,0 +1,9 @@ +# Sergi Lab Supplies + +Company page: [Sergi Lab Supplies](https://sergilabsupplies.com/?srsltid=AfmBOoqk2e3QkpWxvWEtSXS4ySJVoly7hvdiji_ehH5-s6tM3gi67SMu) + +## Plate Adaptors + +| Description | Image | PLR definition | +|--------------------|--------------------|--------------------| +| 'SergiLabSupplies_96_MagneticRack_250ul_Vb'
Part no.: 1047
[manufacturer website](https://sergilabsupplies.com/collections/magnetic-racks/products/96-wells-magnetic-rack-for-dna-rna-and-other-molecules-purification)
A separator for purifying DNA, RNA or other biomolecules with magnetic beads | ![](img/sergi/SergiLabSupplies_96_MagneticRack_250ul_Vb.jpg) | `SergiLabSupplies_96_MagneticRack_250ul_Vb` | \ No newline at end of file diff --git a/docs/resources/library/vwr.md b/docs/resources/library/vwr.md index 2976683a8ff..67c656318a7 100644 --- a/docs/resources/library/vwr.md +++ b/docs/resources/library/vwr.md @@ -7,3 +7,5 @@ Company page: [Wikipedia](https://en.wikipedia.org/wiki/VWR_International) | Description | Image | PLR definition | |--------------------|--------------------|--------------------| | 'VWRReagentReservoirs25mL'
Part no.: 89094
[manufacturer website](https://us.vwr.com/store/product/4694822/vwr-disposable-pipetting-reservoirs)
Polystyrene Reservoirs | ![](img/vwr/VWRReagentReservoirs25mL.jpg) | `VWRReagentReservoirs25mL` | + +| 'VWR_96_ReagentReservoir_195mL_Ub'
Part no.: 77575-302
[manufacturer website](https://www.avantorsciences.com/us/en/product/47763965/vwr-multi-channel-polypropylene-reagent-reservoirs?isCatNumSearch=true&searchedCatalogNumber=77575-302)
Polypropylene multi-channel reagent reservoirs | ![](img/vwr/VWR_96_ReagentReservoir_195mL_Ub.jpg) | `VWR_96_ReagentReservoir_195mL_Ub` | \ No newline at end of file diff --git a/pylabrobot/resources/sergi/__init__.py b/pylabrobot/resources/sergi/__init__.py new file mode 100644 index 00000000000..3a2db2824f7 --- /dev/null +++ b/pylabrobot/resources/sergi/__init__.py @@ -0,0 +1 @@ +from .plate_adapters import SergiLabSupplies_96_MagneticRack_250ul_Vb diff --git a/pylabrobot/resources/sergi/plate_adapters.py b/pylabrobot/resources/sergi/plate_adapters.py index 06cb4e96781..7af39708ba5 100644 --- a/pylabrobot/resources/sergi/plate_adapters.py +++ b/pylabrobot/resources/sergi/plate_adapters.py @@ -19,28 +19,30 @@ def SergiLabSupplies_96_MagneticRack_250ul_Vb(name: str) -> PlateAdapter: - Pulls magnetic beads ~1-2 mm above bottom """ + # measurements from technical drawing: + # https://sergilabsupplies.com/collections/magnetic-racks/products/96-wells-magnetic-rack-for-dna-rna-and-other-molecules-purification return PlateAdapter( name=name, - size_x=127.76, - size_y=85.48, - size_z=22.0, + size_x=127.76, # from spec + size_y=85.48, # from spec + size_z=22.0, # from spec model="SergiLabSupplies_96_MagneticRack_250ul_Vb", lid=None, ordered_items=create_ordered_items_2d( Well, - num_items_x=12, - num_items_y=8, - dx=10.87, # 14.3-6.86/2 - dy=7.77, # 11.2-6.86/2 - dz=3.03, - item_dx=9.0, - item_dy=9.0, - size_x=8.0, - size_y=8.0, - size_z=16.0, - material_z_thickness=0.5, + num_items_x=12, # from spec + num_items_y=8, # from spec + dx=10.87, # 14.3-6.86/2 measured + dy=7.77, # 11.2-6.86/2 measured + dz=3.03, # measured + item_dx=9.0, # measured + item_dy=9.0, # measured + size_x=8.0, # measured + size_y=8.0, # measured + size_z=16.0, # measured + material_z_thickness=0.5, # estimated bottom_type=WellBottomType.V, cross_section_type=CrossSectionType.CIRCLE, - max_volume=250, + max_volume=250, # from spec ), ) diff --git a/pylabrobot/resources/vwr/__init__.py b/pylabrobot/resources/vwr/__init__.py index 1d84afb05a5..f0e6ab85630 100644 --- a/pylabrobot/resources/vwr/__init__.py +++ b/pylabrobot/resources/vwr/__init__.py @@ -1 +1 @@ -from .troughs import VWRReagentReservoirs25mL +from .troughs import VWR_96_ReagentReservoir_195mL_Ub, VWRReagentReservoirs25mL diff --git a/pylabrobot/resources/vwr/plates.py b/pylabrobot/resources/vwr/plates.py index eb90f1e2a75..6fb7e7db254 100644 --- a/pylabrobot/resources/vwr/plates.py +++ b/pylabrobot/resources/vwr/plates.py @@ -13,28 +13,30 @@ def VWR_96_ReagentReservoir_195mL_Ub(name: str) -> Plate: For plate carriers and plate stacks """ + # technical drawing: + # https://github.com/PyLabRobot/pylabrobot/pull/574#issuecomment-2967988150 return Plate( name=name, - size_x=127.76, - size_y=85.48, - size_z=31.4, + size_x=127.76, # from spec + size_y=85.48, # from spec + size_z=31.4, # from spec lid=None, model="VWR_96_ReagentReservoir_195mL_Ub", ordered_items=create_ordered_items_2d( Well, - size_x=8.9, - size_y=8.9, - size_z=26.85, - dx=9.93, # 14.38 - (8.9/2) - dy=6.79, # 11.24 - (8.9/2) - dz=3.55, - material_z_thickness=1, # 31.4 - (26.85 + 3.55) - item_dx=9.0, - item_dy=9.0, - num_items_x=12, - num_items_y=8, + size_x=8.9, # from spec + size_y=8.9, # from spec + size_z=26.85, # from spec + dx=9.93, # 14.38 - (8.9/2) from spec + dy=6.79, # 11.24 - (8.9/2) from spec + dz=3.55, # from spec + material_z_thickness=1, # 31.4 - (26.85 + 3.55) from spec + item_dx=9.0, # from spec + item_dy=9.0, # from spec + num_items_x=12, # from spec + num_items_y=8, # from spec cross_section_type=CrossSectionType.RECTANGLE, bottom_type=WellBottomType.U, - max_volume=195000, + max_volume=195000, # from spec ), ) diff --git a/pylabrobot/resources/vwr/troughs.py b/pylabrobot/resources/vwr/troughs.py index 83741fa7222..252c9cc4348 100644 --- a/pylabrobot/resources/vwr/troughs.py +++ b/pylabrobot/resources/vwr/troughs.py @@ -1,11 +1,4 @@ -from pylabrobot.resources.plate import Plate from pylabrobot.resources.trough import Trough -from pylabrobot.resources.utils import create_ordered_items_2d -from pylabrobot.resources.well import ( - CrossSectionType, - Well, - WellBottomType, -) def VWRReagentReservoirs25mL(name: str) -> Trough: @@ -18,36 +11,3 @@ def VWRReagentReservoirs25mL(name: str) -> Trough: max_volume=25000, model="VWR Reagent Reservoirs 25mL", ) - - -def VWR_96_ReagentReservoir_195mL_Ub(name: str) -> Trough: - """ - VWR NA Cat. No. 77575-302 - - For trough carriers and trough stacks - """ - return Trough( - name=name, - size_x=127.76, - size_y=85.48, - size_z=31.4, - lid=None, - model="VWR_96_ReagentReservoir_195mL_Ub", - ordered_items=create_ordered_items_2d( - Well, - size_x=8.9, - size_y=8.9, - size_z=26.85, - dx=9.93, # 14.38 - (8.9/2) - dy=6.79, # 11.24 - (8.9/2) - dz=3.55, - material_z_thickness=1, # 31.4 - (26.85 + 3.55) - item_dx=9.0, - item_dy=9.0, - num_items_x=12, - num_items_y=8, - cross_section_type=CrossSectionType.RECTANGLE, - bottom_type=WellBottomType.U, - max_volume=195000, - ), - ) From fe1bc7dfbe3535c5799d75dc6a18cfabbfee6329 Mon Sep 17 00:00:00 2001 From: Eric <113262615+ericguan04@users.noreply.github.com> Date: Fri, 13 Jun 2025 14:13:58 -0400 Subject: [PATCH 03/11] Fix num_items args --- pylabrobot/resources/vwr/plates.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pylabrobot/resources/vwr/plates.py b/pylabrobot/resources/vwr/plates.py index 6fb7e7db254..a4baf58840a 100644 --- a/pylabrobot/resources/vwr/plates.py +++ b/pylabrobot/resources/vwr/plates.py @@ -33,8 +33,8 @@ def VWR_96_ReagentReservoir_195mL_Ub(name: str) -> Plate: material_z_thickness=1, # 31.4 - (26.85 + 3.55) from spec item_dx=9.0, # from spec item_dy=9.0, # from spec - num_items_x=12, # from spec - num_items_y=8, # from spec + num_items_x=1, # from spec + num_items_y=1, # from spec cross_section_type=CrossSectionType.RECTANGLE, bottom_type=WellBottomType.U, max_volume=195000, # from spec From 050b58c1562f399759aee06f883fec0e76066c6a Mon Sep 17 00:00:00 2001 From: Rick Wierenga Date: Fri, 13 Jun 2025 11:17:44 -0700 Subject: [PATCH 04/11] add sergi to resource library docs index --- docs/resources/index.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/resources/index.md b/docs/resources/index.md index d7b70a75f46..6f65550202f 100644 --- a/docs/resources/index.md +++ b/docs/resources/index.md @@ -182,6 +182,7 @@ library/nest library/opentrons library/porvair library/revvity +library/sergi library/thermo_fisher library/vwr ``` From c2bb9afc92c0a5c20c2ef0449920837f9d210d91 Mon Sep 17 00:00:00 2001 From: Rick Wierenga Date: Fri, 13 Jun 2025 11:22:56 -0700 Subject: [PATCH 05/11] format, type, plr plate naming convention --- docs/resources/library/vwr.md | 6 +++++- pylabrobot/resources/sergi/plate_adapters.py | 2 -- pylabrobot/resources/vwr/__init__.py | 3 ++- pylabrobot/resources/vwr/plates.py | 8 ++------ 4 files changed, 9 insertions(+), 10 deletions(-) diff --git a/docs/resources/library/vwr.md b/docs/resources/library/vwr.md index 67c656318a7..71bc1e1d24d 100644 --- a/docs/resources/library/vwr.md +++ b/docs/resources/library/vwr.md @@ -8,4 +8,8 @@ Company page: [Wikipedia](https://en.wikipedia.org/wiki/VWR_International) |--------------------|--------------------|--------------------| | 'VWRReagentReservoirs25mL'
Part no.: 89094
[manufacturer website](https://us.vwr.com/store/product/4694822/vwr-disposable-pipetting-reservoirs)
Polystyrene Reservoirs | ![](img/vwr/VWRReagentReservoirs25mL.jpg) | `VWRReagentReservoirs25mL` | -| 'VWR_96_ReagentReservoir_195mL_Ub'
Part no.: 77575-302
[manufacturer website](https://www.avantorsciences.com/us/en/product/47763965/vwr-multi-channel-polypropylene-reagent-reservoirs?isCatNumSearch=true&searchedCatalogNumber=77575-302)
Polypropylene multi-channel reagent reservoirs | ![](img/vwr/VWR_96_ReagentReservoir_195mL_Ub.jpg) | `VWR_96_ReagentReservoir_195mL_Ub` | \ No newline at end of file +## Plates + +| Description | Image | PLR definition | +|--------------------|--------------------|--------------------| +| VWR_96_troughplate_195000uL_Ub''
Part no.: 77575-302
[manufacturer website](https://www.avantorsciences.com/us/en/product/47763965/vwr-multi-channel-polypropylene-reagent-reservoirs?isCatNumSearch=true&searchedCatalogNumber=77575-302)
Polypropylene multi-channel reagent reservoirs | ![](img/vwr/VWR_96_troughplate_195000uL_Ub.jpg) | `VWR_96_troughplate_195000uL_Ub` | diff --git a/pylabrobot/resources/sergi/plate_adapters.py b/pylabrobot/resources/sergi/plate_adapters.py index 7af39708ba5..cc5633f2441 100644 --- a/pylabrobot/resources/sergi/plate_adapters.py +++ b/pylabrobot/resources/sergi/plate_adapters.py @@ -1,6 +1,5 @@ """Sergi Lab Supplies plate adapters""" -from pylabrobot.resources.plate import Plate from pylabrobot.resources.plate_adapter import PlateAdapter from pylabrobot.resources.utils import create_ordered_items_2d from pylabrobot.resources.well import ( @@ -27,7 +26,6 @@ def SergiLabSupplies_96_MagneticRack_250ul_Vb(name: str) -> PlateAdapter: size_y=85.48, # from spec size_z=22.0, # from spec model="SergiLabSupplies_96_MagneticRack_250ul_Vb", - lid=None, ordered_items=create_ordered_items_2d( Well, num_items_x=12, # from spec diff --git a/pylabrobot/resources/vwr/__init__.py b/pylabrobot/resources/vwr/__init__.py index f0e6ab85630..486400b50d7 100644 --- a/pylabrobot/resources/vwr/__init__.py +++ b/pylabrobot/resources/vwr/__init__.py @@ -1 +1,2 @@ -from .troughs import VWR_96_ReagentReservoir_195mL_Ub, VWRReagentReservoirs25mL +from .plates import VWR_96_troughplate_195000uL_Ub +from .troughs import VWRReagentReservoirs25mL diff --git a/pylabrobot/resources/vwr/plates.py b/pylabrobot/resources/vwr/plates.py index a4baf58840a..c5fd99e31cf 100644 --- a/pylabrobot/resources/vwr/plates.py +++ b/pylabrobot/resources/vwr/plates.py @@ -7,12 +7,8 @@ ) -def VWR_96_ReagentReservoir_195mL_Ub(name: str) -> Plate: - """ - VWR NA Cat. No. 77575-302 - - For plate carriers and plate stacks - """ +def VWR_96_troughplate_195000uL_Ub(name: str) -> Plate: + """VWR NA Cat. No. 77575-302""" # technical drawing: # https://github.com/PyLabRobot/pylabrobot/pull/574#issuecomment-2967988150 return Plate( From 335104bd955cd2aabd174a6b258e342bbdefbe61 Mon Sep 17 00:00:00 2001 From: Eric <113262615+ericguan04@users.noreply.github.com> Date: Wed, 18 Jun 2025 18:08:58 -0400 Subject: [PATCH 06/11] Add vwr deep well, fix plate adapter --- pylabrobot/resources/__init__.py | 1 + pylabrobot/resources/sergi/plate_adapters.py | 29 +++----------- pylabrobot/resources/vwr/__init__.py | 2 +- pylabrobot/resources/vwr/plates.py | 42 +++++++++++++++++++- 4 files changed, 48 insertions(+), 26 deletions(-) diff --git a/pylabrobot/resources/__init__.py b/pylabrobot/resources/__init__.py index e542af7db81..a31d59ce87a 100644 --- a/pylabrobot/resources/__init__.py +++ b/pylabrobot/resources/__init__.py @@ -35,6 +35,7 @@ from .resource_stack import ResourceStack from .revvity import * from .rotation import Rotation +from .sergi import * from .tecan import * from .thermo_fisher import * from .tip_rack import TipRack, TipSpot diff --git a/pylabrobot/resources/sergi/plate_adapters.py b/pylabrobot/resources/sergi/plate_adapters.py index cc5633f2441..55df7be7743 100644 --- a/pylabrobot/resources/sergi/plate_adapters.py +++ b/pylabrobot/resources/sergi/plate_adapters.py @@ -1,12 +1,6 @@ """Sergi Lab Supplies plate adapters""" from pylabrobot.resources.plate_adapter import PlateAdapter -from pylabrobot.resources.utils import create_ordered_items_2d -from pylabrobot.resources.well import ( - CrossSectionType, - Well, - WellBottomType, -) def SergiLabSupplies_96_MagneticRack_250ul_Vb(name: str) -> PlateAdapter: @@ -25,22 +19,11 @@ def SergiLabSupplies_96_MagneticRack_250ul_Vb(name: str) -> PlateAdapter: size_x=127.76, # from spec size_y=85.48, # from spec size_z=22.0, # from spec + dx=9.88, # measured (127.76 - 108) / 2 = 9.88 + dy=4.74, # measured (85.48 - 76) / 2 = 4.74 + dz=7.0, # measured + adapter_hole_size_x=7.0, # measured + adapter_hole_size_y=7.0, # measured + adapter_hole_size_z=16.0, # measured (22.0 - 6) = 16.0 model="SergiLabSupplies_96_MagneticRack_250ul_Vb", - ordered_items=create_ordered_items_2d( - Well, - num_items_x=12, # from spec - num_items_y=8, # from spec - dx=10.87, # 14.3-6.86/2 measured - dy=7.77, # 11.2-6.86/2 measured - dz=3.03, # measured - item_dx=9.0, # measured - item_dy=9.0, # measured - size_x=8.0, # measured - size_y=8.0, # measured - size_z=16.0, # measured - material_z_thickness=0.5, # estimated - bottom_type=WellBottomType.V, - cross_section_type=CrossSectionType.CIRCLE, - max_volume=250, # from spec - ), ) diff --git a/pylabrobot/resources/vwr/__init__.py b/pylabrobot/resources/vwr/__init__.py index 486400b50d7..b3abefadca3 100644 --- a/pylabrobot/resources/vwr/__init__.py +++ b/pylabrobot/resources/vwr/__init__.py @@ -1,2 +1,2 @@ -from .plates import VWR_96_troughplate_195000uL_Ub +from .plates import VWR_96_DWP_2mL_Vb, VWR_96_troughplate_195000uL_Ub from .troughs import VWRReagentReservoirs25mL diff --git a/pylabrobot/resources/vwr/plates.py b/pylabrobot/resources/vwr/plates.py index c5fd99e31cf..fdf7917a4ae 100644 --- a/pylabrobot/resources/vwr/plates.py +++ b/pylabrobot/resources/vwr/plates.py @@ -11,13 +11,17 @@ def VWR_96_troughplate_195000uL_Ub(name: str) -> Plate: """VWR NA Cat. No. 77575-302""" # technical drawing: # https://github.com/PyLabRobot/pylabrobot/pull/574#issuecomment-2967988150 + + # product info + # https://us-prod2.vwr.com/store/product/47763965/vwr-multi-channel-polypropylene-reagent-reservoirs + return Plate( name=name, size_x=127.76, # from spec size_y=85.48, # from spec size_z=31.4, # from spec lid=None, - model="VWR_96_ReagentReservoir_195mL_Ub", + model="VWR_96_troughplate_195000uL_Ub", ordered_items=create_ordered_items_2d( Well, size_x=8.9, # from spec @@ -33,6 +37,40 @@ def VWR_96_troughplate_195000uL_Ub(name: str) -> Plate: num_items_y=1, # from spec cross_section_type=CrossSectionType.RECTANGLE, bottom_type=WellBottomType.U, - max_volume=195000, # from spec + max_volume=195000, # from spec 195 mL + ), + ) + + +def VWR_96_DWP_2mL_Vb(name: str) -> Plate: + """VWR NA Cat. No. 76329-998""" + # product info + # https://us-prod2.vwr.com/store/product/26915641/vwr-96-well-deep-well-plates-with-automation-notches + + # no technical drawing available + + return Plate( + name=name, + size_x=127.76, # standard + size_y=85.48, # standard + size_z=44.0, # measured + lid=None, + model="VWR_96_DWP_2mL_Vb", + ordered_items=create_ordered_items_2d( + Well, + size_x=10.0, # measured + size_y=10.0, # measured + size_z=43.5, # measured + dx=9.0, # measured + dy=5.5, # measured + dz=0.5, # 44.0 - 43.5 = 0.5 + material_z_thickness=1, # estimate + item_dx=10.0, # measured + item_dy=10.0, # measured + num_items_x=12, # from spec + num_items_y=8, # from spec + cross_section_type=CrossSectionType.RECTANGLE, + bottom_type=WellBottomType.V, + max_volume=2200, # from spec 2.2 ml ), ) From e963f9a3de1f70fe508a17d13c7ec508531f60ed Mon Sep 17 00:00:00 2001 From: Rick Wierenga Date: Thu, 19 Jun 2025 10:06:49 -0700 Subject: [PATCH 07/11] correct name VWR_1_troughplate_195000uL_Ub --- ...5mL_Ub.jpg => VWR_1_troughplate_195000uL_Ub.jpg} | Bin docs/resources/library/vwr.md | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename docs/resources/library/img/vwr/{VWR_96_ReagentReservoir_195mL_Ub.jpg => VWR_1_troughplate_195000uL_Ub.jpg} (100%) diff --git a/docs/resources/library/img/vwr/VWR_96_ReagentReservoir_195mL_Ub.jpg b/docs/resources/library/img/vwr/VWR_1_troughplate_195000uL_Ub.jpg similarity index 100% rename from docs/resources/library/img/vwr/VWR_96_ReagentReservoir_195mL_Ub.jpg rename to docs/resources/library/img/vwr/VWR_1_troughplate_195000uL_Ub.jpg diff --git a/docs/resources/library/vwr.md b/docs/resources/library/vwr.md index 71bc1e1d24d..23fe9d7735c 100644 --- a/docs/resources/library/vwr.md +++ b/docs/resources/library/vwr.md @@ -12,4 +12,4 @@ Company page: [Wikipedia](https://en.wikipedia.org/wiki/VWR_International) | Description | Image | PLR definition | |--------------------|--------------------|--------------------| -| VWR_96_troughplate_195000uL_Ub''
Part no.: 77575-302
[manufacturer website](https://www.avantorsciences.com/us/en/product/47763965/vwr-multi-channel-polypropylene-reagent-reservoirs?isCatNumSearch=true&searchedCatalogNumber=77575-302)
Polypropylene multi-channel reagent reservoirs | ![](img/vwr/VWR_96_troughplate_195000uL_Ub.jpg) | `VWR_96_troughplate_195000uL_Ub` | +| VWR_1_troughplate_195000uL_Ub''
Part no.: 77575-302
[manufacturer website](https://www.avantorsciences.com/us/en/product/47763965/vwr-multi-channel-polypropylene-reagent-reservoirs?isCatNumSearch=true&searchedCatalogNumber=77575-302)
Polypropylene multi-channel reagent reservoirs | ![](img/vwr/VWR_1_troughplate_195000uL_Ub.jpg) | `VWR_1_troughplate_195000uL_Ub` | From 1756d817149c5921437fa1cdbc4956971fa6bb5a Mon Sep 17 00:00:00 2001 From: Rick Wierenga Date: Thu, 19 Jun 2025 10:10:44 -0700 Subject: [PATCH 08/11] correct size for well of VWR_1_troughplate_195000uL_Ub --- pylabrobot/resources/vwr/plates.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pylabrobot/resources/vwr/plates.py b/pylabrobot/resources/vwr/plates.py index fdf7917a4ae..aea77623ca3 100644 --- a/pylabrobot/resources/vwr/plates.py +++ b/pylabrobot/resources/vwr/plates.py @@ -7,7 +7,7 @@ ) -def VWR_96_troughplate_195000uL_Ub(name: str) -> Plate: +def VWR_1_troughplate_195000uL_Ub(name: str) -> Plate: """VWR NA Cat. No. 77575-302""" # technical drawing: # https://github.com/PyLabRobot/pylabrobot/pull/574#issuecomment-2967988150 @@ -21,11 +21,11 @@ def VWR_96_troughplate_195000uL_Ub(name: str) -> Plate: size_y=85.48, # from spec size_z=31.4, # from spec lid=None, - model="VWR_96_troughplate_195000uL_Ub", + model=VWR_1_troughplate_195000uL_Ub.__name__, ordered_items=create_ordered_items_2d( Well, - size_x=8.9, # from spec - size_y=8.9, # from spec + size_x=127.76 - (14.38 - 8.9 / 2) * 2, # from spec + size_y=85.48 - (11.24 - 8.9 / 2) * 2, # from spec size_z=26.85, # from spec dx=9.93, # 14.38 - (8.9/2) from spec dy=6.79, # 11.24 - (8.9/2) from spec From e4da5b17d12f5ec08243714f1e118757fbfa7264 Mon Sep 17 00:00:00 2001 From: Rick Wierenga Date: Thu, 19 Jun 2025 10:25:53 -0700 Subject: [PATCH 09/11] correct name VWR_96_wellplate_2mL_Vb --- pylabrobot/resources/vwr/plates.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pylabrobot/resources/vwr/plates.py b/pylabrobot/resources/vwr/plates.py index aea77623ca3..0977439d67a 100644 --- a/pylabrobot/resources/vwr/plates.py +++ b/pylabrobot/resources/vwr/plates.py @@ -42,7 +42,7 @@ def VWR_1_troughplate_195000uL_Ub(name: str) -> Plate: ) -def VWR_96_DWP_2mL_Vb(name: str) -> Plate: +def VWR_96_wellplate_2mL_Vb(name: str) -> Plate: """VWR NA Cat. No. 76329-998""" # product info # https://us-prod2.vwr.com/store/product/26915641/vwr-96-well-deep-well-plates-with-automation-notches @@ -55,7 +55,7 @@ def VWR_96_DWP_2mL_Vb(name: str) -> Plate: size_y=85.48, # standard size_z=44.0, # measured lid=None, - model="VWR_96_DWP_2mL_Vb", + model=VWR_96_wellplate_2mL_Vb.__name__, ordered_items=create_ordered_items_2d( Well, size_x=10.0, # measured From dc6026a2ac67554c2ce993eb05901b24e493522c Mon Sep 17 00:00:00 2001 From: Rick Wierenga Date: Thu, 19 Jun 2025 10:25:59 -0700 Subject: [PATCH 10/11] docs for VWR_96_wellplate_2mL_Vb --- .../library/img/vwr/VWR_96_wellplate_2mL_Vb.jpg | Bin 0 -> 27100 bytes docs/resources/library/vwr.md | 3 ++- 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 docs/resources/library/img/vwr/VWR_96_wellplate_2mL_Vb.jpg diff --git a/docs/resources/library/img/vwr/VWR_96_wellplate_2mL_Vb.jpg b/docs/resources/library/img/vwr/VWR_96_wellplate_2mL_Vb.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7946958163be5d408ee46f10e03a8161c7e58bd4 GIT binary patch literal 27100 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�-s0DFGSyqFLw@m@n`cT@HE-?|}TyX!2^! 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 DUQ3aa literal 0 HcmV?d00001 diff --git a/docs/resources/library/vwr.md b/docs/resources/library/vwr.md index 23fe9d7735c..62cae2f87ce 100644 --- a/docs/resources/library/vwr.md +++ b/docs/resources/library/vwr.md @@ -12,4 +12,5 @@ Company page: [Wikipedia](https://en.wikipedia.org/wiki/VWR_International) | Description | Image | PLR definition | |--------------------|--------------------|--------------------| -| VWR_1_troughplate_195000uL_Ub''
Part no.: 77575-302
[manufacturer website](https://www.avantorsciences.com/us/en/product/47763965/vwr-multi-channel-polypropylene-reagent-reservoirs?isCatNumSearch=true&searchedCatalogNumber=77575-302)
Polypropylene multi-channel reagent reservoirs | ![](img/vwr/VWR_1_troughplate_195000uL_Ub.jpg) | `VWR_1_troughplate_195000uL_Ub` | +| 'VWR_1_troughplate_195000uL_Ub'
Part no.: 77575-302
[manufacturer website](https://www.avantorsciences.com/us/en/product/47763965/vwr-multi-channel-polypropylene-reagent-reservoirs?isCatNumSearch=true&searchedCatalogNumber=77575-302)
Polypropylene multi-channel reagent reservoirs | ![](img/vwr/VWR_1_troughplate_195000uL_Ub.jpg) | `VWR_1_troughplate_195000uL_Ub` | +| 'VWR_96_wellplate_2mL_Vb'
Part no.: 76329-998
[manufacturer website](https://us-prod2.vwr.com/store/product/26915641/vwr-96-well-deep-well-plates-with-automation-notches)
Polypropylene multi-channel reagent reservoirs | ![](img/vwr/VWR_96_wellplate_2mL_Vb.jpg) | `VWR_96_wellplate_2mL_Vb` | From 3ce703af96d68d50cf5e3591d0807fbaeed2556c Mon Sep 17 00:00:00 2001 From: Rick Wierenga Date: Thu, 19 Jun 2025 10:26:37 -0700 Subject: [PATCH 11/11] fix import --- pylabrobot/resources/vwr/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pylabrobot/resources/vwr/__init__.py b/pylabrobot/resources/vwr/__init__.py index b3abefadca3..fa3552c9330 100644 --- a/pylabrobot/resources/vwr/__init__.py +++ b/pylabrobot/resources/vwr/__init__.py @@ -1,2 +1,2 @@ -from .plates import VWR_96_DWP_2mL_Vb, VWR_96_troughplate_195000uL_Ub +from .plates import VWR_1_troughplate_195000uL_Ub, VWR_96_wellplate_2mL_Vb from .troughs import VWRReagentReservoirs25mL