Skip to content

Commit d791a79

Browse files
committed
Merge branch 'chore_mergeback-8.5.0-to-pd-branch' into chore_release-pd-8.5.0
2 parents af50cda + 39b5d85 commit d791a79

File tree

20 files changed

+1229
-128
lines changed

20 files changed

+1229
-128
lines changed

analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[2b866b03f3][Flex_S_v2_21_P1000_96_GRIP_HS_MB_TC_TM_Smoke].json

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1262,6 +1262,14 @@
12621262
"brand": "Opentrons",
12631263
"brandId": []
12641264
},
1265+
"compatibleParentLabware": [
1266+
"armadillo_96_wellplate_200ul_pcr_full_skirt",
1267+
"biorad_96_wellplate_200ul_pcr",
1268+
"opentrons_96_wellplate_200ul_pcr_full_skirt",
1269+
"opentrons_flex_deck_riser",
1270+
"opentrons_tough_pcr_auto_sealing_lid",
1271+
"protocol_engine_lid_stack_object"
1272+
],
12651273
"cornerOffsetFromSlot": {
12661274
"x": 0,
12671275
"y": 0,
@@ -1430,6 +1438,14 @@
14301438
"brand": "Opentrons",
14311439
"brandId": []
14321440
},
1441+
"compatibleParentLabware": [
1442+
"armadillo_96_wellplate_200ul_pcr_full_skirt",
1443+
"biorad_96_wellplate_200ul_pcr",
1444+
"opentrons_96_wellplate_200ul_pcr_full_skirt",
1445+
"opentrons_flex_deck_riser",
1446+
"opentrons_tough_pcr_auto_sealing_lid",
1447+
"protocol_engine_lid_stack_object"
1448+
],
14331449
"cornerOffsetFromSlot": {
14341450
"x": 0,
14351451
"y": 0,
@@ -1602,6 +1618,14 @@
16021618
"brand": "Opentrons",
16031619
"brandId": []
16041620
},
1621+
"compatibleParentLabware": [
1622+
"armadillo_96_wellplate_200ul_pcr_full_skirt",
1623+
"biorad_96_wellplate_200ul_pcr",
1624+
"opentrons_96_wellplate_200ul_pcr_full_skirt",
1625+
"opentrons_flex_deck_riser",
1626+
"opentrons_tough_pcr_auto_sealing_lid",
1627+
"protocol_engine_lid_stack_object"
1628+
],
16051629
"cornerOffsetFromSlot": {
16061630
"x": 0,
16071631
"y": 0,
@@ -1778,6 +1802,14 @@
17781802
"brand": "Opentrons",
17791803
"brandId": []
17801804
},
1805+
"compatibleParentLabware": [
1806+
"armadillo_96_wellplate_200ul_pcr_full_skirt",
1807+
"biorad_96_wellplate_200ul_pcr",
1808+
"opentrons_96_wellplate_200ul_pcr_full_skirt",
1809+
"opentrons_flex_deck_riser",
1810+
"opentrons_tough_pcr_auto_sealing_lid",
1811+
"protocol_engine_lid_stack_object"
1812+
],
17811813
"cornerOffsetFromSlot": {
17821814
"x": 0,
17831815
"y": 0,
@@ -1958,6 +1990,14 @@
19581990
"brand": "Opentrons",
19591991
"brandId": []
19601992
},
1993+
"compatibleParentLabware": [
1994+
"armadillo_96_wellplate_200ul_pcr_full_skirt",
1995+
"biorad_96_wellplate_200ul_pcr",
1996+
"opentrons_96_wellplate_200ul_pcr_full_skirt",
1997+
"opentrons_flex_deck_riser",
1998+
"opentrons_tough_pcr_auto_sealing_lid",
1999+
"protocol_engine_lid_stack_object"
2000+
],
19612001
"cornerOffsetFromSlot": {
19622002
"x": 0,
19632003
"y": 0,

analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[7d16d5dbf0][Flex_X_v2_21_tc_lids_wrong_target].json

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2032,6 +2032,14 @@
20322032
"brand": "Opentrons",
20332033
"brandId": []
20342034
},
2035+
"compatibleParentLabware": [
2036+
"armadillo_96_wellplate_200ul_pcr_full_skirt",
2037+
"biorad_96_wellplate_200ul_pcr",
2038+
"opentrons_96_wellplate_200ul_pcr_full_skirt",
2039+
"opentrons_flex_deck_riser",
2040+
"opentrons_tough_pcr_auto_sealing_lid",
2041+
"protocol_engine_lid_stack_object"
2042+
],
20352043
"cornerOffsetFromSlot": {
20362044
"x": 0,
20372045
"y": 0,
@@ -2199,6 +2207,14 @@
21992207
"brand": "Opentrons",
22002208
"brandId": []
22012209
},
2210+
"compatibleParentLabware": [
2211+
"armadillo_96_wellplate_200ul_pcr_full_skirt",
2212+
"biorad_96_wellplate_200ul_pcr",
2213+
"opentrons_96_wellplate_200ul_pcr_full_skirt",
2214+
"opentrons_flex_deck_riser",
2215+
"opentrons_tough_pcr_auto_sealing_lid",
2216+
"protocol_engine_lid_stack_object"
2217+
],
22022218
"cornerOffsetFromSlot": {
22032219
"x": 0,
22042220
"y": 0,
@@ -2370,6 +2386,14 @@
23702386
"brand": "Opentrons",
23712387
"brandId": []
23722388
},
2389+
"compatibleParentLabware": [
2390+
"armadillo_96_wellplate_200ul_pcr_full_skirt",
2391+
"biorad_96_wellplate_200ul_pcr",
2392+
"opentrons_96_wellplate_200ul_pcr_full_skirt",
2393+
"opentrons_flex_deck_riser",
2394+
"opentrons_tough_pcr_auto_sealing_lid",
2395+
"protocol_engine_lid_stack_object"
2396+
],
23732397
"cornerOffsetFromSlot": {
23742398
"x": 0,
23752399
"y": 0,
@@ -2545,6 +2569,14 @@
25452569
"brand": "Opentrons",
25462570
"brandId": []
25472571
},
2572+
"compatibleParentLabware": [
2573+
"armadillo_96_wellplate_200ul_pcr_full_skirt",
2574+
"biorad_96_wellplate_200ul_pcr",
2575+
"opentrons_96_wellplate_200ul_pcr_full_skirt",
2576+
"opentrons_flex_deck_riser",
2577+
"opentrons_tough_pcr_auto_sealing_lid",
2578+
"protocol_engine_lid_stack_object"
2579+
],
25482580
"cornerOffsetFromSlot": {
25492581
"x": 0,
25502582
"y": 0,
@@ -2724,6 +2756,14 @@
27242756
"brand": "Opentrons",
27252757
"brandId": []
27262758
},
2759+
"compatibleParentLabware": [
2760+
"armadillo_96_wellplate_200ul_pcr_full_skirt",
2761+
"biorad_96_wellplate_200ul_pcr",
2762+
"opentrons_96_wellplate_200ul_pcr_full_skirt",
2763+
"opentrons_flex_deck_riser",
2764+
"opentrons_tough_pcr_auto_sealing_lid",
2765+
"protocol_engine_lid_stack_object"
2766+
],
27272767
"cornerOffsetFromSlot": {
27282768
"x": 0,
27292769
"y": 0,

analyses-snapshot-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[99c15c6c62][Flex_S_v2_21_tc_lids_happy_path].json

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,14 @@
118118
"brand": "Opentrons",
119119
"brandId": []
120120
},
121+
"compatibleParentLabware": [
122+
"armadillo_96_wellplate_200ul_pcr_full_skirt",
123+
"biorad_96_wellplate_200ul_pcr",
124+
"opentrons_96_wellplate_200ul_pcr_full_skirt",
125+
"opentrons_flex_deck_riser",
126+
"opentrons_tough_pcr_auto_sealing_lid",
127+
"protocol_engine_lid_stack_object"
128+
],
121129
"cornerOffsetFromSlot": {
122130
"x": 0,
123131
"y": 0,
@@ -285,6 +293,14 @@
285293
"brand": "Opentrons",
286294
"brandId": []
287295
},
296+
"compatibleParentLabware": [
297+
"armadillo_96_wellplate_200ul_pcr_full_skirt",
298+
"biorad_96_wellplate_200ul_pcr",
299+
"opentrons_96_wellplate_200ul_pcr_full_skirt",
300+
"opentrons_flex_deck_riser",
301+
"opentrons_tough_pcr_auto_sealing_lid",
302+
"protocol_engine_lid_stack_object"
303+
],
288304
"cornerOffsetFromSlot": {
289305
"x": 0,
290306
"y": 0,
@@ -456,6 +472,14 @@
456472
"brand": "Opentrons",
457473
"brandId": []
458474
},
475+
"compatibleParentLabware": [
476+
"armadillo_96_wellplate_200ul_pcr_full_skirt",
477+
"biorad_96_wellplate_200ul_pcr",
478+
"opentrons_96_wellplate_200ul_pcr_full_skirt",
479+
"opentrons_flex_deck_riser",
480+
"opentrons_tough_pcr_auto_sealing_lid",
481+
"protocol_engine_lid_stack_object"
482+
],
459483
"cornerOffsetFromSlot": {
460484
"x": 0,
461485
"y": 0,

api/src/opentrons/hardware_control/instruments/ot3/pipette_handler.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -665,6 +665,7 @@ def plan_check_dispense(
665665
return None
666666

667667
if is_full_dispense:
668+
disp_vol = instrument.current_volume
668669
if push_out is None:
669670
push_out_ul = instrument.push_out_volume
670671
else:

api/src/opentrons/protocol_api/_transfer_liquid_validation.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ def verify_and_normalize_transfer_args(
3333
last_tip_picked_up_from: Optional[Well],
3434
tip_racks: List[Labware],
3535
nozzle_map: NozzleMapInterface,
36-
target_all_wells: bool,
36+
group_wells_for_multi_channel: bool,
3737
current_volume: float,
3838
trash_location: Union[Location, Well, Labware, TrashBin, WasteChute],
3939
) -> TransferInfo:
@@ -43,7 +43,7 @@ def verify_and_normalize_transfer_args(
4343
else:
4444
# If trash bin or waste chute, set this to empty to have less isinstance checks after this
4545
flat_dests_list = []
46-
if not target_all_wells and nozzle_map.tip_count > 1:
46+
if group_wells_for_multi_channel and nozzle_map.tip_count > 1:
4747
flat_sources_list = tx_liquid_utils.group_wells_for_multi_channel_transfer(
4848
flat_sources_list, nozzle_map
4949
)

api/src/opentrons/protocol_api/instrument_context.py

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1794,7 +1794,7 @@ def transfer_with_liquid_class(
17941794
Union[types.Location, labware.Well, TrashBin, WasteChute]
17951795
] = None,
17961796
return_tip: bool = False,
1797-
visit_every_well: bool = False,
1797+
group_wells: bool = True,
17981798
) -> InstrumentContext:
17991799
"""Move a particular type of liquid from one well or group of wells to another.
18001800
@@ -1827,6 +1827,9 @@ def transfer_with_liquid_class(
18271827
tips. Depending on the liquid class, the pipette may also blow out liquid here.
18281828
:param return_tip: Whether to drop used tips in their original locations
18291829
in the tip rack, instead of the trash.
1830+
:param group_wells: For multi-channel transfers only. If set to ``True``, group together contiguous wells
1831+
given into a single transfer step, taking into account the tip configuration. If ``False``, target
1832+
each well given with the primary nozzle. Defaults to ``True``.
18301833
18311834
:meta private:
18321835
"""
@@ -1844,7 +1847,7 @@ def transfer_with_liquid_class(
18441847
last_tip_picked_up_from=self._last_tip_picked_up_from,
18451848
tip_racks=self._tip_racks,
18461849
nozzle_map=self._core.get_nozzle_map(),
1847-
target_all_wells=visit_every_well,
1850+
group_wells_for_multi_channel=group_wells,
18481851
current_volume=self.current_volume,
18491852
trash_location=(
18501853
trash_location if trash_location is not None else self.trash_container
@@ -1913,7 +1916,7 @@ def distribute_with_liquid_class(
19131916
Union[types.Location, labware.Well, TrashBin, WasteChute]
19141917
] = None,
19151918
return_tip: bool = False,
1916-
visit_every_well: bool = False,
1919+
group_wells: bool = True,
19171920
) -> InstrumentContext:
19181921
"""
19191922
Distribute a particular type of liquid from one well to a group of wells.
@@ -1943,6 +1946,9 @@ def distribute_with_liquid_class(
19431946
tips. Depending on the liquid class, the pipette may also blow out liquid here.
19441947
:param return_tip: Whether to drop used tips in their original locations
19451948
in the tip rack, instead of the trash.
1949+
:param group_wells: For multi-channel transfers only. If set to ``True``, group together contiguous wells
1950+
given into a single transfer step, taking into account the tip configuration. If ``False``, target
1951+
each well given with the primary nozzle. Defaults to ``True``.
19461952
19471953
:meta private:
19481954
"""
@@ -1960,7 +1966,7 @@ def distribute_with_liquid_class(
19601966
last_tip_picked_up_from=self._last_tip_picked_up_from,
19611967
tip_racks=self._tip_racks,
19621968
nozzle_map=self._core.get_nozzle_map(),
1963-
target_all_wells=visit_every_well,
1969+
group_wells_for_multi_channel=group_wells,
19641970
current_volume=self.current_volume,
19651971
trash_location=(
19661972
trash_location if trash_location is not None else self.trash_container
@@ -2035,7 +2041,7 @@ def consolidate_with_liquid_class(
20352041
Union[types.Location, labware.Well, TrashBin, WasteChute]
20362042
] = None,
20372043
return_tip: bool = False,
2038-
visit_every_well: bool = False,
2044+
group_wells: bool = True,
20392045
) -> InstrumentContext:
20402046
"""
20412047
Consolidate a particular type of liquid from a group of wells to one well.
@@ -2066,6 +2072,9 @@ def consolidate_with_liquid_class(
20662072
tips. Depending on the liquid class, the pipette may also blow out liquid here.
20672073
:param return_tip: Whether to drop used tips in their original locations
20682074
in the tip rack, instead of the trash.
2075+
:param group_wells: For multi-channel transfers only. If set to ``True``, group together contiguous wells
2076+
given into a single transfer step, taking into account the tip configuration. If ``False``, target
2077+
each well given with the primary nozzle. Defaults to ``True``.
20692078
20702079
:meta private:
20712080
"""
@@ -2083,7 +2092,7 @@ def consolidate_with_liquid_class(
20832092
last_tip_picked_up_from=self._last_tip_picked_up_from,
20842093
tip_racks=self._tip_racks,
20852094
nozzle_map=self._core.get_nozzle_map(),
2086-
target_all_wells=visit_every_well,
2095+
group_wells_for_multi_channel=group_wells,
20872096
current_volume=self.current_volume,
20882097
trash_location=(
20892098
trash_location if trash_location is not None else self.trash_container

api/src/opentrons/protocol_engine/commands/load_labware.py

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -165,25 +165,6 @@ async def execute(
165165
top_labware_definition=loaded_labware.definition,
166166
bottom_labware_id=verified_location.labwareId,
167167
)
168-
# Validate load location is valid for lids
169-
if labware_validation.validate_definition_is_lid(
170-
definition=loaded_labware.definition
171-
):
172-
# This parent is assumed to be compatible, unless the lid enumerates
173-
# all its compatible parents and this parent is missing from the list.
174-
parent_is_incompatible = (
175-
loaded_labware.definition.compatibleParentLabware is not None
176-
and self._state_view.labware.get_load_name(
177-
verified_location.labwareId
178-
)
179-
not in loaded_labware.definition.compatibleParentLabware
180-
)
181-
182-
if parent_is_incompatible:
183-
raise ValueError(
184-
f"Labware Lid {params.loadName} may not be loaded on parent labware"
185-
f" {self._state_view.labware.get_display_name(verified_location.labwareId)}."
186-
)
187168

188169
# Validate labware for the absorbance reader
189170
if self._is_loading_to_module(

api/src/opentrons/protocol_engine/resources/labware_validation.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,13 @@ def validate_labware_can_be_stacked(
4848
top_labware_definition: LabwareDefinition, below_labware_load_name: str
4949
) -> bool:
5050
"""Validate that the labware being loaded onto is in the above labware's stackingOffsetWithLabware definition."""
51-
return below_labware_load_name in top_labware_definition.stackingOffsetWithLabware
51+
return (
52+
below_labware_load_name in top_labware_definition.stackingOffsetWithLabware
53+
or (
54+
"default" in top_labware_definition.stackingOffsetWithLabware
55+
and top_labware_definition.compatibleParentLabware is None
56+
)
57+
)
5258

5359

5460
def validate_labware_can_be_ondeck(definition: LabwareDefinition) -> bool:

api/src/opentrons/protocol_engine/state/labware.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1179,6 +1179,18 @@ def raise_if_labware_cannot_be_stacked( # noqa: C901
11791179
raise errors.LabwareCannotBeStackedError(
11801180
f"Labware {top_labware_definition.parameters.loadName} cannot be loaded onto labware {below_labware.loadName}"
11811181
)
1182+
elif (
1183+
labware_validation.validate_definition_is_lid(top_labware_definition)
1184+
and top_labware_definition.compatibleParentLabware is not None
1185+
and self.get_load_name(bottom_labware_id)
1186+
not in top_labware_definition.compatibleParentLabware
1187+
):
1188+
# This parent is assumed to be compatible, unless the lid enumerates
1189+
# all its compatible parents and this parent is missing from the list.
1190+
raise ValueError(
1191+
f"Labware Lid {top_labware_definition.parameters.loadName} may not be loaded on parent labware"
1192+
f" {self.get_display_name(bottom_labware_id)}."
1193+
)
11821194
elif isinstance(below_labware.location, ModuleLocation):
11831195
below_definition = self.get_definition(labware_id=below_labware.id)
11841196
if not labware_validation.validate_definition_is_adapter(

0 commit comments

Comments
 (0)