Skip to content

Commit 315b297

Browse files
authored
Merge branch 'PyLabRobot:main' into nimbus8
2 parents 88804aa + 3000b70 commit 315b297

File tree

10 files changed

+93
-18
lines changed

10 files changed

+93
-18
lines changed

docs/resources/library/celltreat.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
| Same as 229590 (229590 is sold with lids) 'CellTreat_96_wellplate_350ul_Ub'<br>Part no.: 229591<br>[manufacturer website](https://www.celltreat.com/product/229591/) | ![](img/celltreat/CellTreat_96_wellplate_350ul_Ub.jpg) | `CellTreat_96_wellplate_350ul_Ub` |
99
| 229195 and 229196 'CellTreat_96_wellplate_350ul_Fb'<br>Part no.: 229195<br>[manufacturer website](https://www.celltreat.com/product/229195/) <br> are treated | ![](img/celltreat/CellTreat_96_wellplate_350ul_Fb.jpg) | `CellTreat_96_wellplate_350ul_Fb` |
1010
| 229562 (not sterile), 229566 (sterile) 'CellTreat_12_troughplate_15000ul_Vb'<br>[manufacturer website](https://www.celltreat.com/product/229562) <br> are treated | ![](img/celltreat/CellTreat_12_troughplate_15000ul_Vb.jpg) | `CellTreat_12_troughplate_15000ul_Vb` |
11+
| 229123, 229124<br>[manufacturer website](https://www.celltreat.com/product/229123) | ![](img/celltreat/CellTreat_24_wellplate_3300ul_Fb.jpg) | `CellTreat_24_wellplate_3300ul_Fb` |
1112

1213

1314
## Tubes

docs/resources/library/hamilton.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ Sometimes called "sample carriers" in Hamilton jargon.
5050
| Description | Image | PLR definition |
5151
| - | - | - |
5252
| 'Tube_CAR_24_A00'<br>Part no.: 173400<br>[manufacturer website](https://www.hamiltoncompany.com/automated-liquid-handling/other-robotics/173400) <br>Carries 24 "sample" tubes with 14.5–18 mm outer diameter, 60–120 mm high. Occupies one track. | ![](img/hamilton/Tube_CAR_24_A00.png) | `Tube_CAR_24_A00` |
53-
| 'Tube_CAR_32_A00'<br>Part no.: 173410<br>[manufacturer website](https://www.hamiltoncompany.com/other-robotics/173410) <br>Carries 32 "sample" tubes with 11–14 mm outer diameter, 60–120 mm high. Occupies one track. | ![](img/hamilton/Tube_CAR_32_A00.png.avif) | `Tube_CAR_32_A00` |
53+
| 'hamilton_tube_carrier_32_a00_insert_eppendorf_1_5mL'<br>Part no.: 173410<br>[manufacturer website](https://www.hamiltoncompany.com/other-robotics/173410) <br>Carries 32 `Eppendorf_DNA_LoBind_1_5ml_Vb` or `Eppendorf_Protein_LoBind_1_5ml_Vb` tubes. Occupies one track. | ![](img/hamilton/Tube_CAR_32_A00.png.avif) | `hamilton_tube_carrier_32_a00_insert_eppendorf_1_5mL` |
5454
| 'hamilton_tube_carrier_12_b00'<br>Part no.: 182045<br>[manufacturer website](https://www.hamiltoncompany.com/other-robotics/50-ml-falcon-tube-carrier) <br>Carries 12 "sample" tubes with 30 mm outer diameter, 115 mm high. Occupies two tracks. | ![](img/hamilton/hamilton_tube_carrier_12_b00.jpg) | `hamilton_tube_carrier_12_b00` |
5555

5656
### Trough carriers
44.9 KB
Loading

pylabrobot/liquid_handling/backends/hamilton/STAR_backend.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3415,6 +3415,9 @@ async def pick_up_resource(
34153415
if use_unsafe_hotel:
34163416
raise ValueError("Cannot use iswap hotel mode with core grippers")
34173417

3418+
if pickup.direction != GripDirection.FRONT:
3419+
raise NotImplementedError("Core grippers only support FRONT (default)")
3420+
34183421
if channel_1 is not None or channel_2 is not None:
34193422
warnings.warn(
34203423
"The channel_1 and channel_2 parameters are deprecated and will be removed in future versions. "
@@ -3545,7 +3548,7 @@ async def drop_resource(
35453548
hotel_center_z_direction=0 if z >= 0 else 1,
35463549
clearance_height=round(hotel_clearance_height * 10),
35473550
hotel_depth=round(hotel_depth * 10),
3548-
grip_direction=drop.drop_direction,
3551+
grip_direction=drop.direction,
35493552
open_gripper_position=round(open_gripper_position * 10),
35503553
traverse_height_at_beginning=round(traversal_height_start * 10),
35513554
z_position_at_end=round(z_position_at_the_command_end * 10),
@@ -3565,7 +3568,7 @@ async def drop_resource(
35653568
GripDirection.RIGHT: 2,
35663569
GripDirection.BACK: 3,
35673570
GripDirection.LEFT: 4,
3568-
}[drop.drop_direction],
3571+
}[drop.direction],
35693572
minimum_traverse_height_at_beginning_of_a_command=round(traversal_height_start * 10),
35703573
z_position_at_the_command_end=round(z_position_at_the_command_end * 10),
35713574
open_gripper_position=round(open_gripper_position * 10),
@@ -3576,6 +3579,9 @@ async def drop_resource(
35763579
if use_unsafe_hotel:
35773580
raise ValueError("Cannot use iswap hotel mode with core grippers")
35783581

3582+
if drop.direction != GripDirection.FRONT:
3583+
raise NotImplementedError("Core grippers only support FRONT direction (default)")
3584+
35793585
await self.core_release_picked_up_resource(
35803586
location=Coordinate(x, y, z),
35813587
resource=drop.resource,

pylabrobot/liquid_handling/backends/serializing_backend.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -213,7 +213,7 @@ async def drop_resource(self, drop: ResourceDrop, **backend_kwargs):
213213
"offset": serialize(drop.offset),
214214
"pickup_distance_from_top": drop.pickup_distance_from_top,
215215
"pickup_direction": serialize(drop.pickup_direction),
216-
"drop_direction": serialize(drop.drop_direction),
216+
"drop_direction": serialize(drop.direction),
217217
"rotation": drop.rotation,
218218
},
219219
**backend_kwargs,

pylabrobot/liquid_handling/backends/tecan/EVO_tests.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -387,7 +387,7 @@ async def test_move_resource(self):
387387
offset=Coordinate.zero(),
388388
pickup_distance_from_top=13.2,
389389
pickup_direction=GripDirection.FRONT,
390-
drop_direction=GripDirection.FRONT,
390+
direction=GripDirection.FRONT,
391391
rotation=0,
392392
)
393393

pylabrobot/liquid_handling/liquid_handler.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2221,7 +2221,7 @@ async def drop_resource(
22212221
offset=offset,
22222222
pickup_distance_from_top=self._resource_pickup.pickup_distance_from_top,
22232223
pickup_direction=self._resource_pickup.direction,
2224-
drop_direction=direction,
2224+
direction=direction,
22252225
rotation=rotation_applied_by_move,
22262226
)
22272227
result = await self.backend.drop_resource(drop=drop, **backend_kwargs)

pylabrobot/liquid_handling/standard.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ class ResourceDrop:
169169
offset: Coordinate
170170
pickup_distance_from_top: float
171171
pickup_direction: GripDirection
172-
drop_direction: GripDirection
172+
direction: GripDirection
173173
rotation: float
174174

175175

pylabrobot/resources/celltreat/plates.py

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,8 @@ def CellTreat_6_wellplate_16300ul_Fb(name: str, lid: Optional[Lid] = None) -> Pl
9494
CellTreat cat. no.: 229105
9595
- Material: Polystyrene
9696
- Tissue culture treated: No
97+
98+
https://www.celltreat.com/wp-content/uploads/6-Well-Plate.pdf
9799
"""
98100
UPPER_WELL_RADIUS = 17.75 # from plate specs/drawing
99101
LOWER_WELL_RADIUS = 17.35 # from plate specs/drawing
@@ -222,3 +224,49 @@ def CellTreat_12_troughplate_15000ul_Vb(name: str) -> Plate:
222224
**well_kwargs,
223225
),
224226
)
227+
228+
229+
def CellTreat_24_wellplate_3300ul_Fb_Lid(name: str) -> Lid:
230+
return Lid(
231+
name=name,
232+
size_x=127.61, # from spec
233+
size_y=85.24, # from spec
234+
size_z=9.94, # measured
235+
nesting_z_height=8.94, # measured as height of plate "plateau"
236+
model=CellTreat_24_wellplate_3300ul_Fb_Lid.__name__,
237+
)
238+
239+
240+
def CellTreat_24_wellplate_3300ul_Fb(name: str, with_lid: bool = False) -> Plate:
241+
"""
242+
CellTreat cat. no.: 229123, 229124
243+
https://www.celltreat.com/wp-content/uploads/24-Well-Plate.pdf
244+
"""
245+
well_kwargs = {
246+
"size_x": 16.6, # from spec
247+
"size_y": 16.6, # from spec
248+
"size_z": 17.2, # from spec
249+
"bottom_type": WellBottomType.FLAT,
250+
"material_z_thickness": 2.3,
251+
"cross_section_type": CrossSectionType.CIRCLE,
252+
"max_volume": 3300,
253+
}
254+
return Plate(
255+
name=name,
256+
size_x=128.02, # from spec
257+
size_y=85.74, # from spec
258+
size_z=20.2, # from spec, without lid
259+
lid=CellTreat_24_wellplate_3300ul_Fb_Lid(name + "_lid") if with_lid else None,
260+
model=CellTreat_24_wellplate_3300ul_Fb.__name__,
261+
ordered_items=create_ordered_items_2d(
262+
Well,
263+
num_items_x=6,
264+
num_items_y=4,
265+
dx=16.01 - 15.7 / 2, # from spec
266+
dy=14.06 - 15.7 / 2, # from spec
267+
dz=20.2 - 17.2 - 2.3, # from spec
268+
item_dx=19.2, # from spec
269+
item_dy=19.2, # from spec
270+
**well_kwargs,
271+
),
272+
)

pylabrobot/resources/hamilton/tube_carriers.py

Lines changed: 31 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import warnings
2+
13
from pylabrobot.resources.carrier import (
24
Coordinate,
35
ResourceHolder,
@@ -31,25 +33,42 @@ def Tube_CAR_24_A00(name: str) -> TubeCarrier:
3133

3234

3335
def Tube_CAR_32_A00(name: str) -> TubeCarrier:
34-
"""Hamilton cat. no.: 173410
36+
warnings.warn(
37+
"The true dimensions of a Tube_CAR_32_A00 (SMP_CAR_32_A00) are not known. "
38+
"The hamilton definitions are with inserts. "
39+
"Do you want to use `hamilton_tube_carrier_32_a00_insert_eppendorf_1_5mL` instead?",
40+
DeprecationWarning,
41+
)
42+
return hamilton_tube_carrier_32_a00_insert_eppendorf_1_5mL(name)
43+
44+
45+
def hamilton_tube_carrier_32_a00_insert_eppendorf_1_5mL(name: str) -> TubeCarrier:
46+
"""Hamilton cat. no.: 173410 with inserts cat no. 187350.
3547
Hamilton name: 'SMP_CAR_32_A00'.
3648
'Sample' carrier for 32 tubes
3749
1 track(T) wide.
50+
For use with `Eppendorf_DNA_LoBind_1_5ml_Vb` and `Eppendorf_Protein_LoBind_1_5ml_Vb`.
3851
"""
52+
hole_diameter = 10.8
3953
return TubeCarrier(
4054
name=name,
41-
size_x=22.5,
42-
size_y=497.0,
43-
size_z=71.5,
55+
size_x=22.5, # 1 track
56+
size_y=497.0, # standard
57+
size_z=60.2, # caliper
4458
sites=create_homogeneous_resources(
4559
klass=ResourceHolder,
46-
locations=[Coordinate(5, 6.5 + x * 15, 24.0) for x in range(32)],
60+
locations=[
61+
Coordinate(14.5 - hole_diameter / 2, 14.5 - hole_diameter / 2 + x * 15, 25.88)
62+
for x in range(
63+
32
64+
) # SMP_CAR_32_A00 in venus, verified with caliper, custom z from z probing
65+
],
4766
# should fix container
48-
resource_size_x=13.0,
49-
resource_size_y=13.0,
67+
resource_size_x=hole_diameter, # venus
68+
resource_size_y=hole_diameter, # venus
5069
name_prefix=name,
5170
),
52-
model="Tube_CAR_32_A00",
71+
model=hamilton_tube_carrier_32_a00_insert_eppendorf_1_5mL.__name__,
5372
)
5473

5574

@@ -59,6 +78,7 @@ def hamilton_tube_carrier_12_b00(name: str) -> TubeCarrier:
5978
'Sample' carrier for 12 50mL falcon tubes (Cor_Falcon_tube_50mL_Vb).
6079
2 track(T) wide.
6180
"""
81+
hole_diameter = 29.0
6282
return TubeCarrier(
6383
name=name,
6484
size_x=45, # 2 tracks
@@ -67,11 +87,11 @@ def hamilton_tube_carrier_12_b00(name: str) -> TubeCarrier:
6787
sites=create_homogeneous_resources(
6888
klass=ResourceHolder,
6989
locations=[
70-
Coordinate(26.05 - 29 / 2, 41.74 - 29 / 2 + i * 36.5, 18.9)
90+
Coordinate(26.05 - hole_diameter / 2, 41.74 - hole_diameter / 2 + i * 36.5, 18.9)
7191
for i in range(12) # SMP_CAR_12_A00 in venus, verified with caliper, custom z
7292
],
73-
resource_size_x=29.0,
74-
resource_size_y=29.0,
93+
resource_size_x=hole_diameter,
94+
resource_size_y=hole_diameter,
7595
name_prefix=name,
7696
),
7797
model=hamilton_tube_carrier_12_b00.__name__,

0 commit comments

Comments
 (0)