opentrons 8.0.0a6__py2.py3-none-any.whl → 8.0.0a8__py2.py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of opentrons might be problematic. Click here for more details.
- opentrons/hardware_control/ot3api.py +10 -1
- opentrons/protocol_api/core/engine/deck_conflict.py +21 -1
- opentrons/protocol_api/instrument_context.py +1 -0
- opentrons/protocol_engine/commands/liquid_probe.py +27 -7
- opentrons/protocol_engine/execution/pipetting.py +0 -11
- opentrons/protocol_engine/execution/tip_handler.py +26 -0
- opentrons/protocol_engine/state/pipettes.py +46 -21
- {opentrons-8.0.0a6.dist-info → opentrons-8.0.0a8.dist-info}/METADATA +4 -4
- {opentrons-8.0.0a6.dist-info → opentrons-8.0.0a8.dist-info}/RECORD +13 -13
- {opentrons-8.0.0a6.dist-info → opentrons-8.0.0a8.dist-info}/LICENSE +0 -0
- {opentrons-8.0.0a6.dist-info → opentrons-8.0.0a8.dist-info}/WHEEL +0 -0
- {opentrons-8.0.0a6.dist-info → opentrons-8.0.0a8.dist-info}/entry_points.txt +0 -0
- {opentrons-8.0.0a6.dist-info → opentrons-8.0.0a8.dist-info}/top_level.txt +0 -0
|
@@ -2683,6 +2683,15 @@ class OT3API(
|
|
|
2683
2683
|
self._pipette_handler.ready_for_tip_action(
|
|
2684
2684
|
instrument, HardwareAction.LIQUID_PROBE, checked_mount
|
|
2685
2685
|
)
|
|
2686
|
+
# default to using all available sensors
|
|
2687
|
+
if probe:
|
|
2688
|
+
checked_probe = probe
|
|
2689
|
+
else:
|
|
2690
|
+
checked_probe = (
|
|
2691
|
+
InstrumentProbeType.BOTH
|
|
2692
|
+
if instrument.channels > 1
|
|
2693
|
+
else InstrumentProbeType.PRIMARY
|
|
2694
|
+
)
|
|
2686
2695
|
|
|
2687
2696
|
if not probe_settings:
|
|
2688
2697
|
probe_settings = deepcopy(self.config.liquid_sense)
|
|
@@ -2756,7 +2765,7 @@ class OT3API(
|
|
|
2756
2765
|
height = await self._liquid_probe_pass(
|
|
2757
2766
|
checked_mount,
|
|
2758
2767
|
probe_settings,
|
|
2759
|
-
|
|
2768
|
+
checked_probe,
|
|
2760
2769
|
p_pass_travel + p_impulse_mm,
|
|
2761
2770
|
)
|
|
2762
2771
|
# if we made it here without an error we found the liquid
|
|
@@ -16,6 +16,7 @@ from typing import (
|
|
|
16
16
|
from opentrons_shared_data.errors.exceptions import MotionPlanningFailureError
|
|
17
17
|
from opentrons_shared_data.module import FLEX_TC_LID_COLLISION_ZONE
|
|
18
18
|
|
|
19
|
+
from opentrons.hardware_control import CriticalPoint
|
|
19
20
|
from opentrons.hardware_control.modules.types import ModuleType
|
|
20
21
|
from opentrons.motion_planning import deck_conflict as wrapped_deck_conflict
|
|
21
22
|
from opentrons.motion_planning import adjacent_slots_getters
|
|
@@ -228,9 +229,13 @@ def check_safe_for_pipette_movement(
|
|
|
228
229
|
)
|
|
229
230
|
primary_nozzle = engine_state.pipettes.get_primary_nozzle(pipette_id)
|
|
230
231
|
|
|
232
|
+
destination_cp = _get_critical_point_to_use(engine_state, labware_id)
|
|
233
|
+
|
|
231
234
|
pipette_bounds_at_well_location = (
|
|
232
235
|
engine_state.pipettes.get_pipette_bounds_at_specified_move_to_position(
|
|
233
|
-
pipette_id=pipette_id,
|
|
236
|
+
pipette_id=pipette_id,
|
|
237
|
+
destination_position=well_location_point,
|
|
238
|
+
critical_point=destination_cp,
|
|
234
239
|
)
|
|
235
240
|
)
|
|
236
241
|
if not _is_within_pipette_extents(
|
|
@@ -284,6 +289,21 @@ def check_safe_for_pipette_movement(
|
|
|
284
289
|
)
|
|
285
290
|
|
|
286
291
|
|
|
292
|
+
def _get_critical_point_to_use(
|
|
293
|
+
engine_state: StateView, labware_id: str
|
|
294
|
+
) -> Optional[CriticalPoint]:
|
|
295
|
+
"""Return the critical point to use when accessing the given labware."""
|
|
296
|
+
# TODO (spp, 2024-09-17): looks like Y_CENTER of column is the same as its XY_CENTER.
|
|
297
|
+
# I'm using this if-else ladder to be consistent with what we do in
|
|
298
|
+
# `MotionPlanning.get_movement_waypoints_to_well()`.
|
|
299
|
+
# We should probably use only XY_CENTER in both places.
|
|
300
|
+
if engine_state.labware.get_should_center_column_on_target_well(labware_id):
|
|
301
|
+
return CriticalPoint.Y_CENTER
|
|
302
|
+
elif engine_state.labware.get_should_center_pipette_on_target_well(labware_id):
|
|
303
|
+
return CriticalPoint.XY_CENTER
|
|
304
|
+
return None
|
|
305
|
+
|
|
306
|
+
|
|
287
307
|
def _slot_has_potential_colliding_object(
|
|
288
308
|
engine_state: StateView,
|
|
289
309
|
pipette_bounds: Tuple[Point, Point, Point, Point],
|
|
@@ -2,7 +2,11 @@
|
|
|
2
2
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
from typing import TYPE_CHECKING, Optional, Type, Union
|
|
5
|
-
from opentrons.protocol_engine.errors.exceptions import
|
|
5
|
+
from opentrons.protocol_engine.errors.exceptions import (
|
|
6
|
+
MustHomeError,
|
|
7
|
+
PipetteNotReadyToAspirateError,
|
|
8
|
+
TipNotEmptyError,
|
|
9
|
+
)
|
|
6
10
|
from opentrons.types import MountType
|
|
7
11
|
from opentrons_shared_data.errors.exceptions import (
|
|
8
12
|
PipetteLiquidNotFoundError,
|
|
@@ -32,6 +36,7 @@ from ..errors.error_occurrence import ErrorOccurrence
|
|
|
32
36
|
if TYPE_CHECKING:
|
|
33
37
|
from ..execution import MovementHandler, PipettingHandler
|
|
34
38
|
from ..resources import ModelUtils
|
|
39
|
+
from ..state import StateView
|
|
35
40
|
|
|
36
41
|
|
|
37
42
|
LiquidProbeCommandType = Literal["liquidProbe"]
|
|
@@ -92,11 +97,13 @@ class LiquidProbeImplementation(
|
|
|
92
97
|
|
|
93
98
|
def __init__(
|
|
94
99
|
self,
|
|
100
|
+
state_view: StateView,
|
|
95
101
|
movement: MovementHandler,
|
|
96
102
|
pipetting: PipettingHandler,
|
|
97
103
|
model_utils: ModelUtils,
|
|
98
104
|
**kwargs: object,
|
|
99
105
|
) -> None:
|
|
106
|
+
self._state_view = state_view
|
|
100
107
|
self._movement = movement
|
|
101
108
|
self._pipetting = pipetting
|
|
102
109
|
self._model_utils = model_utils
|
|
@@ -112,6 +119,8 @@ class LiquidProbeImplementation(
|
|
|
112
119
|
the pipette.
|
|
113
120
|
TipNotEmptyError: as an undefined error, if the tip starts with liquid
|
|
114
121
|
in it.
|
|
122
|
+
PipetteNotReadyToAspirateError: as an undefined error, if the plunger is not
|
|
123
|
+
in a safe position to do the liquid probe.
|
|
115
124
|
MustHomeError: as an undefined error, if the plunger is not in a valid
|
|
116
125
|
position.
|
|
117
126
|
"""
|
|
@@ -119,13 +128,21 @@ class LiquidProbeImplementation(
|
|
|
119
128
|
labware_id = params.labwareId
|
|
120
129
|
well_name = params.wellName
|
|
121
130
|
|
|
122
|
-
#
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
131
|
+
# May raise TipNotAttachedError.
|
|
132
|
+
aspirated_volume = self._state_view.pipettes.get_aspirated_volume(pipette_id)
|
|
133
|
+
|
|
134
|
+
if aspirated_volume is None:
|
|
135
|
+
# Theoretically, we could avoid raising an error by automatically preparing
|
|
136
|
+
# to aspirate above the well like AspirateImplementation does. However, the
|
|
137
|
+
# only way for this to happen is if someone tries to do a liquid probe with
|
|
138
|
+
# a tip that's previously held liquid, which they should avoid anyway.
|
|
139
|
+
raise PipetteNotReadyToAspirateError(
|
|
140
|
+
"The pipette cannot probe liquid because of a previous blow out."
|
|
141
|
+
" The plunger must be reset while the tip is somewhere away from liquid."
|
|
142
|
+
)
|
|
143
|
+
elif aspirated_volume != 0:
|
|
127
144
|
raise TipNotEmptyError(
|
|
128
|
-
message="
|
|
145
|
+
message="The pipette cannot probe for liquid when the tip has liquid in it."
|
|
129
146
|
)
|
|
130
147
|
|
|
131
148
|
if await self._movement.check_for_valid_position(mount=MountType.LEFT) is False:
|
|
@@ -182,11 +199,13 @@ class TryLiquidProbeImplementation(
|
|
|
182
199
|
|
|
183
200
|
def __init__(
|
|
184
201
|
self,
|
|
202
|
+
state_view: StateView,
|
|
185
203
|
movement: MovementHandler,
|
|
186
204
|
pipetting: PipettingHandler,
|
|
187
205
|
model_utils: ModelUtils,
|
|
188
206
|
**kwargs: object,
|
|
189
207
|
) -> None:
|
|
208
|
+
self._state_view = state_view
|
|
190
209
|
self._movement = movement
|
|
191
210
|
self._pipetting = pipetting
|
|
192
211
|
self._model_utils = model_utils
|
|
@@ -203,6 +222,7 @@ class TryLiquidProbeImplementation(
|
|
|
203
222
|
# Otherwise, we return the result or propagate the exception unchanged.
|
|
204
223
|
|
|
205
224
|
original_impl = LiquidProbeImplementation(
|
|
225
|
+
state_view=self._state_view,
|
|
206
226
|
movement=self._movement,
|
|
207
227
|
pipetting=self._pipetting,
|
|
208
228
|
model_utils=self._model_utils,
|
|
@@ -29,9 +29,6 @@ _VOLUME_ROUNDING_ERROR_TOLERANCE = 1e-9
|
|
|
29
29
|
class PipettingHandler(TypingProtocol):
|
|
30
30
|
"""Liquid handling commands."""
|
|
31
31
|
|
|
32
|
-
def get_is_empty(self, pipette_id: str) -> bool:
|
|
33
|
-
"""Get whether a pipette has an aspirated volume equal to 0."""
|
|
34
|
-
|
|
35
32
|
def get_is_ready_to_aspirate(self, pipette_id: str) -> bool:
|
|
36
33
|
"""Get whether a pipette is ready to aspirate."""
|
|
37
34
|
|
|
@@ -81,10 +78,6 @@ class HardwarePipettingHandler(PipettingHandler):
|
|
|
81
78
|
self._state_view = state_view
|
|
82
79
|
self._hardware_api = hardware_api
|
|
83
80
|
|
|
84
|
-
def get_is_empty(self, pipette_id: str) -> bool:
|
|
85
|
-
"""Get whether a pipette has an aspirated volume equal to 0."""
|
|
86
|
-
return self._state_view.pipettes.get_aspirated_volume(pipette_id) == 0
|
|
87
|
-
|
|
88
81
|
def get_is_ready_to_aspirate(self, pipette_id: str) -> bool:
|
|
89
82
|
"""Get whether a pipette is ready to aspirate."""
|
|
90
83
|
hw_pipette = self._state_view.pipettes.get_hardware_pipette(
|
|
@@ -236,10 +229,6 @@ class VirtualPipettingHandler(PipettingHandler):
|
|
|
236
229
|
"""Initialize a PipettingHandler instance."""
|
|
237
230
|
self._state_view = state_view
|
|
238
231
|
|
|
239
|
-
def get_is_empty(self, pipette_id: str) -> bool:
|
|
240
|
-
"""Get whether a pipette has an aspirated volume equal to 0."""
|
|
241
|
-
return self._state_view.pipettes.get_aspirated_volume(pipette_id) == 0
|
|
242
|
-
|
|
243
232
|
def get_is_ready_to_aspirate(self, pipette_id: str) -> bool:
|
|
244
233
|
"""Get whether a pipette is ready to aspirate."""
|
|
245
234
|
return self._state_view.pipettes.get_aspirated_volume(pipette_id) is not None
|
|
@@ -20,6 +20,8 @@ from ..errors import (
|
|
|
20
20
|
ProtocolEngineError,
|
|
21
21
|
)
|
|
22
22
|
|
|
23
|
+
from opentrons.hardware_control.nozzle_manager import NozzleConfigurationType
|
|
24
|
+
|
|
23
25
|
|
|
24
26
|
PRIMARY_NOZZLE_TO_ENDING_NOZZLE_MAP = {
|
|
25
27
|
"A1": {"COLUMN": "H1", "ROW": "A12"},
|
|
@@ -300,6 +302,30 @@ class HardwareTipHandler(TipHandler):
|
|
|
300
302
|
This function will raise an exception if the specified tip presence status
|
|
301
303
|
isn't matched.
|
|
302
304
|
"""
|
|
305
|
+
nozzle_configuration = (
|
|
306
|
+
self._state_view.pipettes.state.nozzle_configuration_by_id[pipette_id]
|
|
307
|
+
)
|
|
308
|
+
|
|
309
|
+
# Configuration metrics by which tip presence checking is ignored
|
|
310
|
+
unsupported_pipette_types = [8, 96]
|
|
311
|
+
unsupported_layout_types = [
|
|
312
|
+
NozzleConfigurationType.SINGLE,
|
|
313
|
+
NozzleConfigurationType.COLUMN,
|
|
314
|
+
]
|
|
315
|
+
# NOTE: (09-20-2024) Current on multi-channel pipettes, utilizing less than 4 nozzles risks false positives on the tip presence sensor
|
|
316
|
+
supported_partial_nozzle_minimum = 4
|
|
317
|
+
|
|
318
|
+
if (
|
|
319
|
+
nozzle_configuration is not None
|
|
320
|
+
and self._state_view.pipettes.get_channels(pipette_id)
|
|
321
|
+
in unsupported_pipette_types
|
|
322
|
+
and nozzle_configuration.configuration in unsupported_layout_types
|
|
323
|
+
and len(nozzle_configuration.map_store) < supported_partial_nozzle_minimum
|
|
324
|
+
):
|
|
325
|
+
# Tip presence sensing is not supported for single tip pick up on the 96ch Flex Pipette, nor with single and some partial layous of the 8ch Flex Pipette.
|
|
326
|
+
# This is due in part to a press distance tolerance which creates a risk case for false positives. In the case of single tip, the mechanical tolerance
|
|
327
|
+
# for presses with 100% success is below the minimum average achieved press distance for a given multi channel pipette in that configuration.
|
|
328
|
+
return
|
|
303
329
|
try:
|
|
304
330
|
ot3api = ensure_ot3_hardware(hardware_api=self._hardware_api)
|
|
305
331
|
hw_mount = self._state_view.pipettes.get_mount(pipette_id).to_hw_mount()
|
|
@@ -7,6 +7,7 @@ from typing_extensions import assert_type
|
|
|
7
7
|
from opentrons_shared_data.pipette import pipette_definition
|
|
8
8
|
from opentrons.config.defaults_ot2 import Z_RETRACT_DISTANCE
|
|
9
9
|
from opentrons.hardware_control.dev_types import PipetteDict
|
|
10
|
+
from opentrons.hardware_control import CriticalPoint
|
|
10
11
|
from opentrons.hardware_control.nozzle_manager import (
|
|
11
12
|
NozzleConfigurationType,
|
|
12
13
|
NozzleMap,
|
|
@@ -610,7 +611,7 @@ class PipetteView(HasState[PipetteState]):
|
|
|
610
611
|
|
|
611
612
|
Returns:
|
|
612
613
|
The volume the pipette has aspirated.
|
|
613
|
-
None, after blow-out and the plunger is in an unsafe position
|
|
614
|
+
None, after blow-out and the plunger is in an unsafe position.
|
|
614
615
|
|
|
615
616
|
Raises:
|
|
616
617
|
PipetteNotLoadedError: pipette ID does not exist.
|
|
@@ -795,17 +796,27 @@ class PipetteView(HasState[PipetteState]):
|
|
|
795
796
|
nozzle_map = self._state.nozzle_configuration_by_id.get(pipette_id)
|
|
796
797
|
return nozzle_map.starting_nozzle if nozzle_map else None
|
|
797
798
|
|
|
798
|
-
def
|
|
799
|
-
|
|
799
|
+
def _get_critical_point_offset_without_tip(
|
|
800
|
+
self, pipette_id: str, critical_point: Optional[CriticalPoint]
|
|
801
|
+
) -> Point:
|
|
802
|
+
"""Get the offset of the specified critical point from pipette's mount position."""
|
|
800
803
|
nozzle_map = self._state.nozzle_configuration_by_id.get(pipette_id)
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
804
|
+
# Nozzle map is unavailable only when there's no pipette loaded
|
|
805
|
+
# so this is merely for satisfying the type checker
|
|
806
|
+
assert (
|
|
807
|
+
nozzle_map is not None
|
|
808
|
+
), "Error getting critical point offset. Nozzle map not found."
|
|
809
|
+
match critical_point:
|
|
810
|
+
case CriticalPoint.INSTRUMENT_XY_CENTER:
|
|
811
|
+
return nozzle_map.instrument_xy_center_offset
|
|
812
|
+
case CriticalPoint.XY_CENTER:
|
|
813
|
+
return nozzle_map.xy_center_offset
|
|
814
|
+
case CriticalPoint.Y_CENTER:
|
|
815
|
+
return nozzle_map.y_center_offset
|
|
816
|
+
case CriticalPoint.FRONT_NOZZLE:
|
|
817
|
+
return nozzle_map.front_nozzle_offset
|
|
818
|
+
case _:
|
|
819
|
+
return nozzle_map.starting_nozzle_offset
|
|
809
820
|
|
|
810
821
|
def get_pipette_bounding_nozzle_offsets(
|
|
811
822
|
self, pipette_id: str
|
|
@@ -817,32 +828,46 @@ class PipetteView(HasState[PipetteState]):
|
|
|
817
828
|
"""Get the bounding box of the pipette."""
|
|
818
829
|
return self.get_config(pipette_id).pipette_bounding_box_offsets
|
|
819
830
|
|
|
831
|
+
# TODO (spp, 2024-09-17): in order to find the position of pipette at destination,
|
|
832
|
+
# this method repeats the same steps that waypoints builder does while finding
|
|
833
|
+
# waypoints to move to. We should consolidate these steps into a shared entity
|
|
834
|
+
# so that the deck conflict checker and movement plan builder always remain in sync.
|
|
820
835
|
def get_pipette_bounds_at_specified_move_to_position(
|
|
821
836
|
self,
|
|
822
837
|
pipette_id: str,
|
|
823
838
|
destination_position: Point,
|
|
839
|
+
critical_point: Optional[CriticalPoint],
|
|
824
840
|
) -> Tuple[Point, Point, Point, Point]:
|
|
825
|
-
"""Get the pipette's bounding
|
|
826
|
-
|
|
841
|
+
"""Get the pipette's bounding box position when critical point is at the destination position.
|
|
842
|
+
|
|
843
|
+
Returns a tuple of the pipette's bounding box position in deck coordinates as-
|
|
844
|
+
(back_left_bound, front_right_bound, back_right_bound, front_left_bound)
|
|
845
|
+
Bounding box of the pipette includes the pipette's outer casing as well as nozzles.
|
|
846
|
+
"""
|
|
827
847
|
tip = self.get_attached_tip(pipette_id)
|
|
828
|
-
|
|
829
|
-
#
|
|
830
|
-
|
|
848
|
+
|
|
849
|
+
# *Offset* of pipette's critical point w.r.t pipette mount
|
|
850
|
+
critical_point_offset = self._get_critical_point_offset_without_tip(
|
|
851
|
+
pipette_id, critical_point
|
|
852
|
+
)
|
|
853
|
+
|
|
854
|
+
# Position of the above critical point at destination, in deck coordinates
|
|
855
|
+
critical_point_position = destination_position + Point(
|
|
831
856
|
x=0, y=0, z=tip.length if tip else 0
|
|
832
857
|
)
|
|
833
858
|
|
|
834
|
-
# Get the pipette bounding box
|
|
859
|
+
# Get the pipette bounding box coordinates
|
|
835
860
|
pipette_bounds_offsets = self.get_config(
|
|
836
861
|
pipette_id
|
|
837
862
|
).pipette_bounding_box_offsets
|
|
838
863
|
pip_back_left_bound = (
|
|
839
|
-
|
|
840
|
-
-
|
|
864
|
+
critical_point_position
|
|
865
|
+
- critical_point_offset
|
|
841
866
|
+ pipette_bounds_offsets.back_left_corner
|
|
842
867
|
)
|
|
843
868
|
pip_front_right_bound = (
|
|
844
|
-
|
|
845
|
-
-
|
|
869
|
+
critical_point_position
|
|
870
|
+
- critical_point_offset
|
|
846
871
|
+ pipette_bounds_offsets.front_right_corner
|
|
847
872
|
)
|
|
848
873
|
pip_back_right_bound = Point(
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: opentrons
|
|
3
|
-
Version: 8.0.
|
|
3
|
+
Version: 8.0.0a8
|
|
4
4
|
Summary: The Opentrons API is a simple framework designed to make writing automated biology lab protocols easy.
|
|
5
5
|
Author: Opentrons
|
|
6
6
|
Author-email: engineering@opentrons.com
|
|
@@ -21,7 +21,7 @@ Classifier: Programming Language :: Python :: 3.10
|
|
|
21
21
|
Classifier: Topic :: Scientific/Engineering
|
|
22
22
|
Requires-Python: >=3.10
|
|
23
23
|
License-File: ../LICENSE
|
|
24
|
-
Requires-Dist: opentrons-shared-data ==8.0.
|
|
24
|
+
Requires-Dist: opentrons-shared-data ==8.0.0a8
|
|
25
25
|
Requires-Dist: aionotify ==0.3.1
|
|
26
26
|
Requires-Dist: anyio <4.0.0,>=3.6.1
|
|
27
27
|
Requires-Dist: jsonschema <4.18.0,>=3.0.1
|
|
@@ -33,9 +33,9 @@ Requires-Dist: click <9,>=8.0.0
|
|
|
33
33
|
Requires-Dist: packaging >=21.0
|
|
34
34
|
Requires-Dist: importlib-metadata >=1.0 ; python_version < "3.8"
|
|
35
35
|
Provides-Extra: flex-hardware
|
|
36
|
-
Requires-Dist: opentrons-hardware[flex] ==8.0.
|
|
36
|
+
Requires-Dist: opentrons-hardware[flex] ==8.0.0a8 ; extra == 'flex-hardware'
|
|
37
37
|
Provides-Extra: ot2-hardware
|
|
38
|
-
Requires-Dist: opentrons-hardware ==8.0.
|
|
38
|
+
Requires-Dist: opentrons-hardware ==8.0.0a8 ; extra == 'ot2-hardware'
|
|
39
39
|
|
|
40
40
|
.. _Full API Documentation: http://docs.opentrons.com
|
|
41
41
|
|
|
@@ -100,7 +100,7 @@ opentrons/hardware_control/module_control.py,sha256=JTS0ys8nyQfCoE099trGAIVTJQEU
|
|
|
100
100
|
opentrons/hardware_control/motion_utilities.py,sha256=LuOZBcnNJmTPra6-mYX5wN3jh8PA2l81dy5amCyYpcQ,7164
|
|
101
101
|
opentrons/hardware_control/nozzle_manager.py,sha256=XNEyNdh00QdZ7VECb--JUO_BI-96EwoAPuQ7bdGXSGs,16788
|
|
102
102
|
opentrons/hardware_control/ot3_calibration.py,sha256=OHkQi7cwgncCZjTfYmaKLR-sb3uHe6CrC5_1HVY0UJo,44753
|
|
103
|
-
opentrons/hardware_control/ot3api.py,sha256=
|
|
103
|
+
opentrons/hardware_control/ot3api.py,sha256=Jcxx47nr6C9-WD3OU7zOoZ0i2xxuZZIV8XXPyeM3VEM,116677
|
|
104
104
|
opentrons/hardware_control/pause_manager.py,sha256=wmNmraimE2yZQVqCxX_rtQHUWRzpzyQEaym9fLMgyww,888
|
|
105
105
|
opentrons/hardware_control/poller.py,sha256=iMwlIyXgL1UVaAZYAoDKTdzrQPoxDhhaGzT411aBiFw,3590
|
|
106
106
|
opentrons/hardware_control/robot_calibration.py,sha256=HiCQNmdp59SbkzXpDGtPsN8rSfUj-ZU4v63vcSw4AbI,7149
|
|
@@ -219,7 +219,7 @@ opentrons/protocol_api/config.py,sha256=r9lyvXjagTX_g3q5FGURPpcz2IA9sSF7Oa_1mKx-
|
|
|
219
219
|
opentrons/protocol_api/create_protocol_context.py,sha256=wwsZje0L__oDnu1Yrihau320_f-ASloR9eL1QCtkOh8,7612
|
|
220
220
|
opentrons/protocol_api/deck.py,sha256=94vFceg1SC1bAGd7TvC1ZpYwnJR-VlzurEZ6jkacYeg,8910
|
|
221
221
|
opentrons/protocol_api/disposal_locations.py,sha256=NRiSGmDR0LnbyEkWSOM-o64uR2fUoB1NWJG7Y7SsJSs,7920
|
|
222
|
-
opentrons/protocol_api/instrument_context.py,sha256=
|
|
222
|
+
opentrons/protocol_api/instrument_context.py,sha256=HOxDcWLDN8CqQZ38OCrolO8D54m21LLMZ_vdd9oDZfI,95863
|
|
223
223
|
opentrons/protocol_api/labware.py,sha256=cxJp5wWMv-OKLmryEXwPgFL6T6pu8T7SXYlGWaVmB-g,47723
|
|
224
224
|
opentrons/protocol_api/module_contexts.py,sha256=4uXWnO-w4Znbz27Y8m0uMJ_CR0U3Qy1r1ODntFbYMd0,37325
|
|
225
225
|
opentrons/protocol_api/module_validation_and_errors.py,sha256=XL_m72P8rcvGO2fynY7UzXLcpGuI6X4s0V6Xf735Iyc,1464
|
|
@@ -236,7 +236,7 @@ opentrons/protocol_api/core/protocol.py,sha256=C70tQe6ZTjYX56rvlSl8MW2CJl0Mb-yZt
|
|
|
236
236
|
opentrons/protocol_api/core/well.py,sha256=quBAF0UjcsRcqZy_Cb13NIkfnx4y1VbEHZgGcDIl-wI,2393
|
|
237
237
|
opentrons/protocol_api/core/well_grid.py,sha256=BU28DKaBgEU_JdZ6pEzrwNxmuh6TkO4zlg7Pq1Rf5Xk,1516
|
|
238
238
|
opentrons/protocol_api/core/engine/__init__.py,sha256=B_5T7zgkWDb1mXPg4NbT-wBkQaK-WVokMMnJRNu7xiM,582
|
|
239
|
-
opentrons/protocol_api/core/engine/deck_conflict.py,sha256=
|
|
239
|
+
opentrons/protocol_api/core/engine/deck_conflict.py,sha256=BDSSbAbJu6HZanPehNh8m4chdT573Q9AL98pC2LULfw,25473
|
|
240
240
|
opentrons/protocol_api/core/engine/exceptions.py,sha256=aZgNrmYEeuPZm21nX_KZYtvyjv5h_zPjxxgPkEV7_bw,725
|
|
241
241
|
opentrons/protocol_api/core/engine/instrument.py,sha256=r_2ZF3i_5FZqMdFipu0hXpgx9Pl5mM5_AfX7La8H_TU,35686
|
|
242
242
|
opentrons/protocol_api/core/engine/labware.py,sha256=xb1osbmcHL80S9RLeqA9qKiA_CdyMNMW0In7Pukegf4,7008
|
|
@@ -296,7 +296,7 @@ opentrons/protocol_engine/commands/generate_command_schema.py,sha256=w5RsTJV4HtF
|
|
|
296
296
|
opentrons/protocol_engine/commands/get_tip_presence.py,sha256=Jh1tDMGe8HWL0a1uq1E-RuSuAFZuME0F6RFrB2yRuUo,2539
|
|
297
297
|
opentrons/protocol_engine/commands/hash_command_params.py,sha256=obWy4TbVH97SyhNqrSD6iP1wgZ20JoaH1rilZCjXxIs,1530
|
|
298
298
|
opentrons/protocol_engine/commands/home.py,sha256=3FtygvsJUUQryFQpAXTOfrjJ_rNkOJJa25VzpRSrPfA,2766
|
|
299
|
-
opentrons/protocol_engine/commands/liquid_probe.py,sha256=
|
|
299
|
+
opentrons/protocol_engine/commands/liquid_probe.py,sha256=mVrRFvNI28wXauiRMVXAW493wvb5rq66gdfYMwdEpms,10197
|
|
300
300
|
opentrons/protocol_engine/commands/load_labware.py,sha256=yHCdamAKoIMOAZKH1ROx2W8-xwlhvjOWusVo9tarj9E,6623
|
|
301
301
|
opentrons/protocol_engine/commands/load_liquid.py,sha256=fPaETCUB1LRL6wga-uKJARzN3uDB7JjX9k8hV5a5wpY,2371
|
|
302
302
|
opentrons/protocol_engine/commands/load_module.py,sha256=tfNgKRUHyawoxfyM6amQScqN2JAerXCtf46M_lml1rY,7544
|
|
@@ -371,14 +371,14 @@ opentrons/protocol_engine/execution/hardware_stopper.py,sha256=kjvinwg6uPc3lDNlL
|
|
|
371
371
|
opentrons/protocol_engine/execution/heater_shaker_movement_flagger.py,sha256=FMqiJjE2L6Ru3x3zTCntT9ts7o_Q4wExrcQb03xZd9I,9287
|
|
372
372
|
opentrons/protocol_engine/execution/labware_movement.py,sha256=x-oZWh4p9QO6AhFxYo-68Ubv7wqnfIFteWsjkdutLg4,9832
|
|
373
373
|
opentrons/protocol_engine/execution/movement.py,sha256=MaLBVcca3C90kRvedRToNZvOe92tYQ-x5oFynN1K0Po,10902
|
|
374
|
-
opentrons/protocol_engine/execution/pipetting.py,sha256=
|
|
374
|
+
opentrons/protocol_engine/execution/pipetting.py,sha256=gtWiIUlxlRfEkiT6ztAwiu3_hUzudY-ZQWu3iOZUzos,14233
|
|
375
375
|
opentrons/protocol_engine/execution/queue_worker.py,sha256=3bVTnwOur8mgwLKVATAzKCYWxwrYajHRmykr9PbhTZc,2706
|
|
376
376
|
opentrons/protocol_engine/execution/rail_lights.py,sha256=eiJT6oI_kFk7rFuFkZzISZiLNnpf7Kkh86Kyk9wQ_Jo,590
|
|
377
377
|
opentrons/protocol_engine/execution/run_control.py,sha256=vWLSRdkds2CrtsJ0IU9hX-oTsNPrXJ5RZ9cq7ekO80c,1138
|
|
378
378
|
opentrons/protocol_engine/execution/status_bar.py,sha256=tR7CHS_y1ARQxcSKDO4YFU2cqVQhePzalmzsyH8b23A,970
|
|
379
379
|
opentrons/protocol_engine/execution/thermocycler_movement_flagger.py,sha256=if_jbmszy2MFMJCEMwt_fP_h0T1OBnHrQyI4jtUygvY,6784
|
|
380
380
|
opentrons/protocol_engine/execution/thermocycler_plate_lifter.py,sha256=SPzuiyNNB05YPb_czPr8KmnvBwmXTszvngW1CX3HVd4,3309
|
|
381
|
-
opentrons/protocol_engine/execution/tip_handler.py,sha256=
|
|
381
|
+
opentrons/protocol_engine/execution/tip_handler.py,sha256=SoZ4bEMWWDwFcwkL3tbZYxVTntVaTISJjrfu3DzNHdE,16484
|
|
382
382
|
opentrons/protocol_engine/notes/__init__.py,sha256=JRh7fKZ4XLUSQOZeI853MYkAZpKvp34RY8yDAHzcEbk,197
|
|
383
383
|
opentrons/protocol_engine/notes/notes.py,sha256=RlLpfElzIa_p51ECCug7Fueq2VHRUeBTtnk-2zQerp0,1419
|
|
384
384
|
opentrons/protocol_engine/resources/__init__.py,sha256=-tuKcd2Fn3YKWDX-tDqgZYv5MOSekGqHaHSoE1XDY3M,745
|
|
@@ -403,7 +403,7 @@ opentrons/protocol_engine/state/liquids.py,sha256=W7cf-mmVaZ3aNyiormFEy79aSvU__Q
|
|
|
403
403
|
opentrons/protocol_engine/state/modules.py,sha256=bylqsYZyVjrnx6BUhDjJb-TofnqPNk0EUYV8j12UINE,50673
|
|
404
404
|
opentrons/protocol_engine/state/motion.py,sha256=nh0UGOVvmpYynOchGJkVLTyIyiJ9CszRTUvp4Czr_GI,13955
|
|
405
405
|
opentrons/protocol_engine/state/move_types.py,sha256=zSQj_qYHBi7_-wrpaZBKmX_O-wNZCpLZkCzagOwI-zY,2132
|
|
406
|
-
opentrons/protocol_engine/state/pipettes.py,sha256=
|
|
406
|
+
opentrons/protocol_engine/state/pipettes.py,sha256=F026AaXUPe5VcNQ__C91y_qHhvbPWI7d17tKgYacaVc,37309
|
|
407
407
|
opentrons/protocol_engine/state/state.py,sha256=jx044yBfXFV1YO5aqXhJmy7iFx-tXEQ5rIl3lMcrY04,13562
|
|
408
408
|
opentrons/protocol_engine/state/state_summary.py,sha256=8VCxEOBeUflx8IBYUYtgNdwcwgdVZv3R8rSfzsbai7U,923
|
|
409
409
|
opentrons/protocol_engine/state/tips.py,sha256=gU2GsmaWPDyIIjWHj3KXv6NqxphfOd4eeNxF40hm5ok,22621
|
|
@@ -500,9 +500,9 @@ opentrons/util/helpers.py,sha256=3hr801bWGbxEcOFAS7f-iOhmnUhoK5qahbB8SIvaCfY,165
|
|
|
500
500
|
opentrons/util/linal.py,sha256=IlKAP9HkNBBgULeSf4YVwSKHdx9jnCjSr7nvDvlRALg,5753
|
|
501
501
|
opentrons/util/logging_config.py,sha256=g3TdzDKa1pL_N3eKhRYCdqPaZYe_hpLV-e8llObTcT4,5657
|
|
502
502
|
opentrons/util/performance_helpers.py,sha256=ew7H8XD20iS6-2TJAzbQeyzStZkkE6PzHt_Adx3wbZQ,5172
|
|
503
|
-
opentrons-8.0.
|
|
504
|
-
opentrons-8.0.
|
|
505
|
-
opentrons-8.0.
|
|
506
|
-
opentrons-8.0.
|
|
507
|
-
opentrons-8.0.
|
|
508
|
-
opentrons-8.0.
|
|
503
|
+
opentrons-8.0.0a8.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
|
|
504
|
+
opentrons-8.0.0a8.dist-info/METADATA,sha256=isHdbHQ4Ga3c32OVlfQVt0UJqazj2M-AWtEKBd_79I8,4990
|
|
505
|
+
opentrons-8.0.0a8.dist-info/WHEEL,sha256=_4XEmVmaBFWtekSGrbfOGNjC2I5lUr0lZSRblBllIFA,109
|
|
506
|
+
opentrons-8.0.0a8.dist-info/entry_points.txt,sha256=fTa6eGCYkvOtv0ov-KVE8LLGetgb35LQLF9x85OWPVw,106
|
|
507
|
+
opentrons-8.0.0a8.dist-info/top_level.txt,sha256=wk6whpbMZdBQpcK0Fg0YVfUGrAgVOFON7oQAhOMGMW8,10
|
|
508
|
+
opentrons-8.0.0a8.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|