opentrons 8.0.0a3__py2.py3-none-any.whl → 8.0.0a5__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.
@@ -204,6 +204,10 @@ class MotionController(Protocol[MountArgType]):
204
204
  """Disengage some axes."""
205
205
  ...
206
206
 
207
+ async def engage_axes(self, which: List[Axis]) -> None:
208
+ """Engage some axes."""
209
+ ...
210
+
207
211
  async def retract(self, mount: MountArgType, margin: float = 10) -> None:
208
212
  """Pull the specified mount up to its home position.
209
213
 
@@ -416,23 +416,48 @@ def _is_within_pipette_extents(
416
416
  pipette_bounding_box_at_loc: Tuple[Point, Point, Point, Point],
417
417
  ) -> bool:
418
418
  """Whether a given point is within the extents of a configured pipette on the specified robot."""
419
- mount = engine_state.pipettes.get_mount(pipette_id)
420
- robot_extent_per_mount = engine_state.geometry.absolute_deck_extents
421
- pip_back_left_bound, pip_front_right_bound, _, _ = pipette_bounding_box_at_loc
422
- pipette_bounds_offsets = engine_state.pipettes.get_pipette_bounding_box(pipette_id)
423
- from_back_right = (
424
- robot_extent_per_mount.back_right[mount]
425
- + pipette_bounds_offsets.back_right_corner
426
- )
427
- from_front_left = (
428
- robot_extent_per_mount.front_left[mount]
429
- + pipette_bounds_offsets.front_left_corner
430
- )
419
+ channels = engine_state.pipettes.get_channels(pipette_id)
420
+ robot_extents = engine_state.geometry.absolute_deck_extents
421
+ (
422
+ pip_back_left_bound,
423
+ pip_front_right_bound,
424
+ pip_back_right_bound,
425
+ pip_front_left_bound,
426
+ ) = pipette_bounding_box_at_loc
427
+
428
+ # Given the padding values accounted for against the deck extents,
429
+ # a pipette is within extents when all of the following are true:
430
+
431
+ # Each corner slot full pickup case:
432
+ # A1: Front right nozzle is within the rear and left-side padding limits
433
+ # D1: Back right nozzle is within the front and left-side padding limits
434
+ # A3 Front left nozzle is within the rear and right-side padding limits
435
+ # D3: Back left nozzle is within the front and right-side padding limits
436
+ # Thermocycler Column A2: Front right nozzle is within padding limits
437
+
438
+ if channels == 96:
439
+ return (
440
+ pip_front_right_bound.y
441
+ <= robot_extents.deck_extents.y + robot_extents.padding_rear
442
+ and pip_front_right_bound.x >= robot_extents.padding_left_side
443
+ and pip_back_right_bound.y >= robot_extents.padding_front
444
+ and pip_back_right_bound.x >= robot_extents.padding_left_side
445
+ and pip_front_left_bound.y
446
+ <= robot_extents.deck_extents.y + robot_extents.padding_rear
447
+ and pip_front_left_bound.x
448
+ <= robot_extents.deck_extents.x + robot_extents.padding_right_side
449
+ and pip_back_left_bound.y >= robot_extents.padding_front
450
+ and pip_back_left_bound.x
451
+ <= robot_extents.deck_extents.x + robot_extents.padding_right_side
452
+ )
453
+ # For 8ch pipettes we only check the rear and front extents
431
454
  return (
432
- from_back_right.x >= pip_back_left_bound.x >= from_front_left.x
433
- and from_back_right.y >= pip_back_left_bound.y >= from_front_left.y
434
- and from_back_right.x >= pip_front_right_bound.x >= from_front_left.x
435
- and from_back_right.y >= pip_front_right_bound.y >= from_front_left.y
455
+ pip_front_right_bound.y
456
+ <= robot_extents.deck_extents.y + robot_extents.padding_rear
457
+ and pip_back_right_bound.y >= robot_extents.padding_front
458
+ and pip_front_left_bound.y
459
+ <= robot_extents.deck_extents.y + robot_extents.padding_rear
460
+ and pip_back_left_bound.y >= robot_extents.padding_front
436
461
  )
437
462
 
438
463
 
@@ -268,7 +268,6 @@ class InstrumentContext(publisher.CommandPublisher):
268
268
  and self._96_tip_config_valid()
269
269
  ):
270
270
  self.require_liquid_presence(well=well)
271
- self.prepare_to_aspirate()
272
271
 
273
272
  with publisher.publish_context(
274
273
  broker=self.broker,
@@ -915,6 +915,7 @@ class ProtocolContext(CommandPublisher):
915
915
  from the Opentrons App or touchscreen.
916
916
  :param bool liquid_presence_detection: If ``True``, enable automatic
917
917
  :ref:`liquid presence detection <lpd>` for Flex 1-, 8-, or 96-channel pipettes.
918
+
918
919
  .. versionadded:: 2.20
919
920
  """
920
921
  instrument_name = validation.ensure_lowercase_name(instrument_name)
@@ -108,10 +108,15 @@ class MoveToMaintenancePositionImplementation(
108
108
  await ot3_api.move_axes(
109
109
  {
110
110
  Axis.Z_L: max_motion_range + _LEFT_MOUNT_Z_MARGIN,
111
+ }
112
+ )
113
+ await ot3_api.disengage_axes([Axis.Z_L])
114
+ await ot3_api.move_axes(
115
+ {
111
116
  Axis.Z_R: max_motion_range + _RIGHT_MOUNT_Z_MARGIN,
112
117
  }
113
118
  )
114
- await ot3_api.disengage_axes([Axis.Z_L, Axis.Z_R])
119
+ await ot3_api.disengage_axes([Axis.Z_R])
115
120
 
116
121
  return SuccessData(public=MoveToMaintenancePositionResult(), private=None)
117
122
 
@@ -391,6 +391,7 @@ Command = Annotated[
391
391
  unsafe.UnsafeBlowOutInPlace,
392
392
  unsafe.UnsafeDropTipInPlace,
393
393
  unsafe.UpdatePositionEstimators,
394
+ unsafe.UnsafeEngageAxes,
394
395
  ],
395
396
  Field(discriminator="commandType"),
396
397
  ]
@@ -463,6 +464,7 @@ CommandParams = Union[
463
464
  unsafe.UnsafeBlowOutInPlaceParams,
464
465
  unsafe.UnsafeDropTipInPlaceParams,
465
466
  unsafe.UpdatePositionEstimatorsParams,
467
+ unsafe.UnsafeEngageAxesParams,
466
468
  ]
467
469
 
468
470
  CommandType = Union[
@@ -533,6 +535,7 @@ CommandType = Union[
533
535
  unsafe.UnsafeBlowOutInPlaceCommandType,
534
536
  unsafe.UnsafeDropTipInPlaceCommandType,
535
537
  unsafe.UpdatePositionEstimatorsCommandType,
538
+ unsafe.UnsafeEngageAxesCommandType,
536
539
  ]
537
540
 
538
541
  CommandCreate = Annotated[
@@ -604,6 +607,7 @@ CommandCreate = Annotated[
604
607
  unsafe.UnsafeBlowOutInPlaceCreate,
605
608
  unsafe.UnsafeDropTipInPlaceCreate,
606
609
  unsafe.UpdatePositionEstimatorsCreate,
610
+ unsafe.UnsafeEngageAxesCreate,
607
611
  ],
608
612
  Field(discriminator="commandType"),
609
613
  ]
@@ -676,6 +680,7 @@ CommandResult = Union[
676
680
  unsafe.UnsafeBlowOutInPlaceResult,
677
681
  unsafe.UnsafeDropTipInPlaceResult,
678
682
  unsafe.UpdatePositionEstimatorsResult,
683
+ unsafe.UnsafeEngageAxesResult,
679
684
  ]
680
685
 
681
686
  # todo(mm, 2024-06-12): Ideally, command return types would have specific
@@ -23,6 +23,14 @@ from .update_position_estimators import (
23
23
  UpdatePositionEstimatorsCreate,
24
24
  )
25
25
 
26
+ from .unsafe_engage_axes import (
27
+ UnsafeEngageAxesCommandType,
28
+ UnsafeEngageAxesParams,
29
+ UnsafeEngageAxesResult,
30
+ UnsafeEngageAxes,
31
+ UnsafeEngageAxesCreate,
32
+ )
33
+
26
34
  __all__ = [
27
35
  # Unsafe blow-out-in-place command models
28
36
  "UnsafeBlowOutInPlaceCommandType",
@@ -42,4 +50,10 @@ __all__ = [
42
50
  "UpdatePositionEstimatorsResult",
43
51
  "UpdatePositionEstimators",
44
52
  "UpdatePositionEstimatorsCreate",
53
+ # Unsafe engage axes
54
+ "UnsafeEngageAxesCommandType",
55
+ "UnsafeEngageAxesParams",
56
+ "UnsafeEngageAxesResult",
57
+ "UnsafeEngageAxes",
58
+ "UnsafeEngageAxesCreate",
45
59
  ]
@@ -0,0 +1,83 @@
1
+ """Update position estimators payload, result, and implementaiton."""
2
+
3
+ from __future__ import annotations
4
+ from pydantic import BaseModel, Field
5
+ from typing import TYPE_CHECKING, Optional, List, Type
6
+ from typing_extensions import Literal
7
+
8
+ from ...types import MotorAxis
9
+ from ..command import AbstractCommandImpl, BaseCommand, BaseCommandCreate, SuccessData
10
+ from ...errors.error_occurrence import ErrorOccurrence
11
+ from ...resources import ensure_ot3_hardware
12
+
13
+ from opentrons.hardware_control import HardwareControlAPI
14
+
15
+ if TYPE_CHECKING:
16
+ from ...execution import GantryMover
17
+
18
+
19
+ UnsafeEngageAxesCommandType = Literal["unsafe/engageAxes"]
20
+
21
+
22
+ class UnsafeEngageAxesParams(BaseModel):
23
+ """Payload required for an UnsafeEngageAxes command."""
24
+
25
+ axes: List[MotorAxis] = Field(..., description="The axes for which to enable.")
26
+
27
+
28
+ class UnsafeEngageAxesResult(BaseModel):
29
+ """Result data from the execution of an UnsafeEngageAxes command."""
30
+
31
+
32
+ class UnsafeEngageAxesImplementation(
33
+ AbstractCommandImpl[
34
+ UnsafeEngageAxesParams,
35
+ SuccessData[UnsafeEngageAxesResult, None],
36
+ ]
37
+ ):
38
+ """Enable axes command implementation."""
39
+
40
+ def __init__(
41
+ self,
42
+ hardware_api: HardwareControlAPI,
43
+ gantry_mover: GantryMover,
44
+ **kwargs: object,
45
+ ) -> None:
46
+ self._hardware_api = hardware_api
47
+ self._gantry_mover = gantry_mover
48
+
49
+ async def execute(
50
+ self, params: UnsafeEngageAxesParams
51
+ ) -> SuccessData[UnsafeEngageAxesResult, None]:
52
+ """Enable exes."""
53
+ ot3_hardware_api = ensure_ot3_hardware(self._hardware_api)
54
+ await ot3_hardware_api.engage_axes(
55
+ [
56
+ self._gantry_mover.motor_axis_to_hardware_axis(axis)
57
+ for axis in params.axes
58
+ ]
59
+ )
60
+ return SuccessData(public=UnsafeEngageAxesResult(), private=None)
61
+
62
+
63
+ class UnsafeEngageAxes(
64
+ BaseCommand[UnsafeEngageAxesParams, UnsafeEngageAxesResult, ErrorOccurrence]
65
+ ):
66
+ """UnsafeEngageAxes command model."""
67
+
68
+ commandType: UnsafeEngageAxesCommandType = "unsafe/engageAxes"
69
+ params: UnsafeEngageAxesParams
70
+ result: Optional[UnsafeEngageAxesResult]
71
+
72
+ _ImplementationCls: Type[
73
+ UnsafeEngageAxesImplementation
74
+ ] = UnsafeEngageAxesImplementation
75
+
76
+
77
+ class UnsafeEngageAxesCreate(BaseCommandCreate[UnsafeEngageAxesParams]):
78
+ """UnsafeEngageAxes command request model."""
79
+
80
+ commandType: UnsafeEngageAxesCommandType = "unsafe/engageAxes"
81
+ params: UnsafeEngageAxesParams
82
+
83
+ _CommandCls: Type[UnsafeEngageAxes] = UnsafeEngageAxes
@@ -352,6 +352,20 @@ class AddressableAreaView(HasState[AddressableAreaState]):
352
352
  "right": Point(x=right_offset[0], y=right_offset[1], z=right_offset[2]),
353
353
  }
354
354
 
355
+ @cached_property
356
+ def padding_offsets(self) -> Dict[str, float]:
357
+ """The padding offsets to be applied to the deck extents of the robot."""
358
+ rear_offset = self.state.robot_definition["paddingOffsets"]["rear"]
359
+ front_offset = self.state.robot_definition["paddingOffsets"]["front"]
360
+ left_side_offset = self.state.robot_definition["paddingOffsets"]["leftSide"]
361
+ right_side_offset = self.state.robot_definition["paddingOffsets"]["rightSide"]
362
+ return {
363
+ "rear": rear_offset,
364
+ "front": front_offset,
365
+ "left_side": left_side_offset,
366
+ "right_side": right_side_offset,
367
+ }
368
+
355
369
  def get_addressable_area(self, addressable_area_name: str) -> AddressableArea:
356
370
  """Get addressable area."""
357
371
  if not self._state.use_simulated_deck_config:
@@ -77,6 +77,11 @@ class _GripperMoveType(enum.Enum):
77
77
  class _AbsoluteRobotExtents:
78
78
  front_left: Dict[MountType, Point]
79
79
  back_right: Dict[MountType, Point]
80
+ deck_extents: Point
81
+ padding_rear: float
82
+ padding_front: float
83
+ padding_left_side: float
84
+ padding_right_side: float
80
85
 
81
86
 
82
87
  _LabwareLocation = TypeVar("_LabwareLocation", bound=LabwareLocation)
@@ -118,7 +123,13 @@ class GeometryView:
118
123
  MountType.RIGHT: self._addressable_areas.deck_extents + right_offset,
119
124
  }
120
125
  return _AbsoluteRobotExtents(
121
- front_left=front_left_abs, back_right=back_right_abs
126
+ front_left=front_left_abs,
127
+ back_right=back_right_abs,
128
+ deck_extents=self._addressable_areas.deck_extents,
129
+ padding_rear=self._addressable_areas.padding_offsets["rear"],
130
+ padding_front=self._addressable_areas.padding_offsets["front"],
131
+ padding_left_side=self._addressable_areas.padding_offsets["left_side"],
132
+ padding_right_side=self._addressable_areas.padding_offsets["right_side"],
122
133
  )
123
134
 
124
135
  def get_labware_highest_z(self, labware_id: str) -> float:
@@ -845,8 +845,6 @@ class PipetteView(HasState[PipetteState]):
845
845
  - primary_nozzle_offset
846
846
  + pipette_bounds_offsets.front_right_corner
847
847
  )
848
- # TODO (spp, 2024-02-27): remove back right & front left;
849
- # return only back left and front right points.
850
848
  pip_back_right_bound = Point(
851
849
  pip_front_right_bound.x, pip_back_left_bound.y, pip_front_right_bound.z
852
850
  )
@@ -84,4 +84,11 @@ class CSVParameter:
84
84
  rows.append(row)
85
85
  except (UnicodeDecodeError, csv.Error):
86
86
  raise ParameterValueError("Cannot parse provided CSV contents.")
87
+ return self._remove_trailing_empty_rows(rows)
88
+
89
+ @staticmethod
90
+ def _remove_trailing_empty_rows(rows: List[List[str]]) -> List[List[str]]:
91
+ """Removes any trailing empty rows."""
92
+ while rows and rows[-1] == []:
93
+ rows.pop()
87
94
  return rows
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: opentrons
3
- Version: 8.0.0a3
3
+ Version: 8.0.0a5
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.0a3
24
+ Requires-Dist: opentrons-shared-data ==8.0.0a5
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.0a3 ; extra == 'flex-hardware'
36
+ Requires-Dist: opentrons-hardware[flex] ==8.0.0a5 ; extra == 'flex-hardware'
37
37
  Provides-Extra: ot2-hardware
38
- Requires-Dist: opentrons-hardware ==8.0.0a3 ; extra == 'ot2-hardware'
38
+ Requires-Dist: opentrons-hardware ==8.0.0a5 ; extra == 'ot2-hardware'
39
39
 
40
40
  .. _Full API Documentation: http://docs.opentrons.com
41
41
 
@@ -187,7 +187,7 @@ opentrons/hardware_control/protocols/identifiable.py,sha256=YmhScb4Tr4mxVObL1i7p
187
187
  opentrons/hardware_control/protocols/instrument_configurer.py,sha256=ap60TN0lhR5Sr3vcqMamU6NfJClDTUr3K4APeSg0snw,7271
188
188
  opentrons/hardware_control/protocols/liquid_handler.py,sha256=qKyFnHnoDQDXGehPrbt8r-4J5CMxMG3LcGvtYRGYmNk,7614
189
189
  opentrons/hardware_control/protocols/module_provider.py,sha256=QDKCWqrW-6IeI91IICBTJClK0C__mgq3A0-M3Wa9ee8,487
190
- opentrons/hardware_control/protocols/motion_controller.py,sha256=CyBMn7iUbvJG2e8I1F4pBhcG9SmnE2p6aJoURYeu4oM,9415
190
+ opentrons/hardware_control/protocols/motion_controller.py,sha256=2sv-fc0uvmuFj-wA1h4VrEjLLTMTvswLCkisjEXwxXQ,9520
191
191
  opentrons/hardware_control/protocols/position_estimator.py,sha256=bEYQiNZYsh5k9r_J2XCDQg6FixrQmxr-7KTD9gfVmYc,1797
192
192
  opentrons/hardware_control/protocols/simulatable.py,sha256=ED3VHoO8q1h9FhBDv31g5N7YdTKB5hj7lp7BZcCaL7o,247
193
193
  opentrons/hardware_control/protocols/stoppable.py,sha256=ukI1WrJzXwsJm5ty2trhMqGJr0sT13ttlv914YMAUt8,226
@@ -219,11 +219,11 @@ 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=Viq1EpJ67IiOXXNKigx4iTW1xtDfx3yQ5PHdy3StzcQ,95849
222
+ opentrons/protocol_api/instrument_context.py,sha256=TqzML0qqGKBKaU4FUEJKZJ23c5kLzZXQR1sfamZaNJw,95810
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
226
- opentrons/protocol_api/protocol_context.py,sha256=SxqZ_vRTPxmceJdYXpI_e2VfWJm_atoCjM1I1UPBMB0,53602
226
+ opentrons/protocol_api/protocol_context.py,sha256=qaCMeIJIGSrGv_iORtkC8ANj5_36el1enBeB5BmJ9FM,53603
227
227
  opentrons/protocol_api/robot_context.py,sha256=vph_ZqfdmREOwLwpjSkXiSZSpI1HO0HuilhqjhgT7Rw,2660
228
228
  opentrons/protocol_api/validation.py,sha256=p9kwYn340lIGHJ88q7L3RsfEgr25Nv1uTMuw4yly7T0,18373
229
229
  opentrons/protocol_api/core/__init__.py,sha256=-g74o8OtBB0LmmOvwkRvPgrHt7fF7T8FRHDj-x_-Onk,736
@@ -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=yKN7LbDuZ1ObUOHIQyV8L2lvNuEJKxjV0hx-vVnARb8,23376
239
+ opentrons/protocol_api/core/engine/deck_conflict.py,sha256=EBC15ROS9cEUSnKHzeaL9xOhN_WS3tSNic8S-kkFz-Q,24560
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
@@ -282,7 +282,7 @@ opentrons/protocol_engine/commands/aspirate_in_place.py,sha256=DpDDkyJ7m2vyeFRXd
282
282
  opentrons/protocol_engine/commands/blow_out.py,sha256=pQnQ_MjpWWBBHWjwTWR3BrduA90QwbYBqhbbw6wuJak,2629
283
283
  opentrons/protocol_engine/commands/blow_out_in_place.py,sha256=QFtJoUII8E_INbAnh2I2_xoJNWWdv-YrO_mdYsEdwOY,2402
284
284
  opentrons/protocol_engine/commands/command.py,sha256=QQqZN8VHKJXMPV9XycyeGeIvPnWY43HXZe606IyynVA,9290
285
- opentrons/protocol_engine/commands/command_unions.py,sha256=XLs68vF_rqDx9IffkWm-2Y8--tyf6oPRIMZohdVxr6I,19833
285
+ opentrons/protocol_engine/commands/command_unions.py,sha256=BAmTHBqrx2Pl84GomRprwlD7C7aRyiTTd4648KcbxAs,20015
286
286
  opentrons/protocol_engine/commands/comment.py,sha256=V9ryXPE8JzR4NYTZPsFfgYBLh4mfMNSorkfynPYL5bs,1634
287
287
  opentrons/protocol_engine/commands/configure_for_volume.py,sha256=YavcUpy0QSNR0uRiDIDYGRzysesUglz54Ki8Kev3iQg,3464
288
288
  opentrons/protocol_engine/commands/configure_nozzle_layout.py,sha256=a-Nq9n01SBXCH2yRkChd-XhcHqgWvDXEhLjgP4vfTzM,3979
@@ -326,7 +326,7 @@ opentrons/protocol_engine/commands/calibration/__init__.py,sha256=JjNnULLBM3j8Vt
326
326
  opentrons/protocol_engine/commands/calibration/calibrate_gripper.py,sha256=vgiQ7vkm16btXJfKdSn21oydo4Ut0ai2fDiobFPJuZE,5622
327
327
  opentrons/protocol_engine/commands/calibration/calibrate_module.py,sha256=rfzW6IUhQft1zuJhSX2qdhUHzWHV13OuiyKOZNmATmg,4204
328
328
  opentrons/protocol_engine/commands/calibration/calibrate_pipette.py,sha256=xtYulhb3BfKhL1GU3wqWhm2bi7hUBAIbCbBM9xOe-oQ,3311
329
- opentrons/protocol_engine/commands/calibration/move_to_maintenance_position.py,sha256=Zr4o-KBgftaOyEFoKZ9HH247B_s0HLBUGRYaLF5nGXs,5151
329
+ opentrons/protocol_engine/commands/calibration/move_to_maintenance_position.py,sha256=QYMe7vEzQ8fNDuUpuUzhN4sk1mpPVG9Hz1_znvldfek,5301
330
330
  opentrons/protocol_engine/commands/heater_shaker/__init__.py,sha256=ImAPrYSUvP8tI7obvoHmrJbjwLldgGNTnFYRgfXj8hI,2757
331
331
  opentrons/protocol_engine/commands/heater_shaker/close_labware_latch.py,sha256=tCQy35R8O-UgY3Z-JsTfQ1_CB8cpkLV9wcCid1Viros,2851
332
332
  opentrons/protocol_engine/commands/heater_shaker/deactivate_heater.py,sha256=rLduURAqRQzTFrJA4NRQRuGFeKkv0Pf-aZ4p1yFmLW4,2759
@@ -353,9 +353,10 @@ opentrons/protocol_engine/commands/thermocycler/set_target_block_temperature.py,
353
353
  opentrons/protocol_engine/commands/thermocycler/set_target_lid_temperature.py,sha256=25FJ41F4PJI9jvf5eW-w0Xvfd_CxNSndKuKi2k7aVkM,3409
354
354
  opentrons/protocol_engine/commands/thermocycler/wait_for_block_temperature.py,sha256=xzHO58ay9sT2O5-TXQEub4j9gr03UMY_p8PmdLHCX_U,3091
355
355
  opentrons/protocol_engine/commands/thermocycler/wait_for_lid_temperature.py,sha256=oi-OYs0wuOyeFeI6aGTmdo50hNXIfYqnovTqr4_Wmno,2961
356
- opentrons/protocol_engine/commands/unsafe/__init__.py,sha256=SIT8c86bw4qniMmD8Lc_TElM-n93d8eUg0pnf35Nhzo,1387
356
+ opentrons/protocol_engine/commands/unsafe/__init__.py,sha256=PDYTbdjpFjWFjHmmaua0Q0A81ozdcjQmDqMHsG37Rkk,1737
357
357
  opentrons/protocol_engine/commands/unsafe/unsafe_blow_out_in_place.py,sha256=khVS17_svWxlzzK12L1pdwAIUjF-hinh6qJLmNjPdwo,3062
358
358
  opentrons/protocol_engine/commands/unsafe/unsafe_drop_tip_in_place.py,sha256=kO2Eq5rY_PwGhtAhaKHis6dcS5MxQ0_K5jPqK7SDRbA,3383
359
+ opentrons/protocol_engine/commands/unsafe/unsafe_engage_axes.py,sha256=ekU036vznKljyH0Jx41xTp7r9S-iAACruuzj8tzvrXo,2555
359
360
  opentrons/protocol_engine/commands/unsafe/update_position_estimators.py,sha256=HfbTP4_T4WieVKxalf_C10PTJv2nr8md28NvITfo_F0,2941
360
361
  opentrons/protocol_engine/errors/__init__.py,sha256=LVf5EerQWvztgJSiCsUWsA0enK1Yn8yCy2QAiPPWBG0,4560
361
362
  opentrons/protocol_engine/errors/error_occurrence.py,sha256=PM_bxIxLYKtsRl_cGMiCtXVVMEb88hkLFEWcafwqLf8,7542
@@ -392,17 +393,17 @@ opentrons/protocol_engine/resources/ot3_validation.py,sha256=0x81JoZBXcj2xUVcOF7
392
393
  opentrons/protocol_engine/resources/pipette_data_provider.py,sha256=NYcQGJYQ-aeEME5nilUlkHF6oWfrNZt0op52bUH0czo,14623
393
394
  opentrons/protocol_engine/state/__init__.py,sha256=l-VhTfs16xika3ZWPqfxovB1Z1GHuPRm-IHWrEOuzAw,1826
394
395
  opentrons/protocol_engine/state/abstract_store.py,sha256=b5cqKZhI6ERZj6gyL0kDutD6ogdQngR3T-JmPATvhi8,631
395
- opentrons/protocol_engine/state/addressable_areas.py,sha256=X1DKa2Cb2Xu1asYgXB0By67iSeToF1ZezmO7EcR3nSM,27553
396
+ opentrons/protocol_engine/state/addressable_areas.py,sha256=Al86_Qv-ikveekNPV4XS50yzFzXMGklUgEotvbg3O8s,28217
396
397
  opentrons/protocol_engine/state/command_history.py,sha256=aNB1Oye3LxAVOvGppCEohv4KT84buJckgngDcDXDvj8,10252
397
398
  opentrons/protocol_engine/state/commands.py,sha256=wNqBp-tb7rgzqp94mYy6vVjxshv50AearJ1y9QWvKi4,41287
398
399
  opentrons/protocol_engine/state/config.py,sha256=7jSGxC6Vqj1eA8fqZ2I3zjlxVXg8pxvcBYMztRIx9Mg,1515
399
- opentrons/protocol_engine/state/geometry.py,sha256=g1YuN5Gsno-AOseitK_rjAjGn_jVZPknq8a9o6r6Uf8,50601
400
+ opentrons/protocol_engine/state/geometry.py,sha256=YT3ILruOwRvAUtDt_C8EV8k_puXAm5oxmhe1wBnWi1I,51129
400
401
  opentrons/protocol_engine/state/labware.py,sha256=sKbX7uN26m3C_84WnSxM-BJ38n1PlPDlxWf6mkYsY_4,37285
401
402
  opentrons/protocol_engine/state/liquids.py,sha256=W7cf-mmVaZ3aNyiormFEy79aSvU__QwDfPVgjFb3lF4,1885
402
403
  opentrons/protocol_engine/state/modules.py,sha256=bylqsYZyVjrnx6BUhDjJb-TofnqPNk0EUYV8j12UINE,50673
403
404
  opentrons/protocol_engine/state/motion.py,sha256=nh0UGOVvmpYynOchGJkVLTyIyiJ9CszRTUvp4Czr_GI,13955
404
405
  opentrons/protocol_engine/state/move_types.py,sha256=zSQj_qYHBi7_-wrpaZBKmX_O-wNZCpLZkCzagOwI-zY,2132
405
- opentrons/protocol_engine/state/pipettes.py,sha256=MDbzNEr2sI80QvTdCwNfB3GqOdiLFFXRG14zLYA5lqs,36176
406
+ opentrons/protocol_engine/state/pipettes.py,sha256=wS7q9Sau86zK5vCcHiSGRdMhWNm26GPKUDNJnSEjEHw,36053
406
407
  opentrons/protocol_engine/state/state.py,sha256=jx044yBfXFV1YO5aqXhJmy7iFx-tXEQ5rIl3lMcrY04,13562
407
408
  opentrons/protocol_engine/state/state_summary.py,sha256=8VCxEOBeUflx8IBYUYtgNdwcwgdVZv3R8rSfzsbai7U,923
408
409
  opentrons/protocol_engine/state/tips.py,sha256=gU2GsmaWPDyIIjWHj3KXv6NqxphfOd4eeNxF40hm5ok,22621
@@ -472,7 +473,7 @@ opentrons/protocols/models/__init__.py,sha256=KePRAkkKzFoc0lAz8y89cWnxru8ofe3mow
472
473
  opentrons/protocols/models/json_protocol.py,sha256=lteWlIBXgRM86k-wO1dKsx02G2_4kustSDeSoyc5N5U,20128
473
474
  opentrons/protocols/parameters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
474
475
  opentrons/protocols/parameters/csv_parameter_definition.py,sha256=xZhGtdfH2vXSWFK-aGET07_L0LODvHWkfNxf7pQoOmo,2762
475
- opentrons/protocols/parameters/csv_parameter_interface.py,sha256=XxQCcNgrtpvZR451nbnlCaQnlgZj_uNkwGIxnK9rk9Q,3684
476
+ opentrons/protocols/parameters/csv_parameter_interface.py,sha256=S7fdY39TxXqXO-jnaTZFLFI62n0HGc_XjYScWGB44VY,3945
476
477
  opentrons/protocols/parameters/exceptions.py,sha256=vQUeyy8Yk_fzP4bvT0r_zu3s7Aty3LM7PzTV6k2iXu0,1092
477
478
  opentrons/protocols/parameters/parameter_definition.py,sha256=OMtUCPKyFx5ZH3Jfcw05aF8pptWQ7XYzYttGMuSPu9k,9529
478
479
  opentrons/protocols/parameters/types.py,sha256=h7vaNmKbDHc1q_FzbZoIgoSVo0mvS64FeiLZDnv7xnQ,489
@@ -499,9 +500,9 @@ opentrons/util/helpers.py,sha256=3hr801bWGbxEcOFAS7f-iOhmnUhoK5qahbB8SIvaCfY,165
499
500
  opentrons/util/linal.py,sha256=IlKAP9HkNBBgULeSf4YVwSKHdx9jnCjSr7nvDvlRALg,5753
500
501
  opentrons/util/logging_config.py,sha256=g3TdzDKa1pL_N3eKhRYCdqPaZYe_hpLV-e8llObTcT4,5657
501
502
  opentrons/util/performance_helpers.py,sha256=ew7H8XD20iS6-2TJAzbQeyzStZkkE6PzHt_Adx3wbZQ,5172
502
- opentrons-8.0.0a3.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
503
- opentrons-8.0.0a3.dist-info/METADATA,sha256=VCwClY3mFwancF9yu2AwyRWSS9pET6Wk42H8mMVPPZA,4990
504
- opentrons-8.0.0a3.dist-info/WHEEL,sha256=_4XEmVmaBFWtekSGrbfOGNjC2I5lUr0lZSRblBllIFA,109
505
- opentrons-8.0.0a3.dist-info/entry_points.txt,sha256=fTa6eGCYkvOtv0ov-KVE8LLGetgb35LQLF9x85OWPVw,106
506
- opentrons-8.0.0a3.dist-info/top_level.txt,sha256=wk6whpbMZdBQpcK0Fg0YVfUGrAgVOFON7oQAhOMGMW8,10
507
- opentrons-8.0.0a3.dist-info/RECORD,,
503
+ opentrons-8.0.0a5.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
504
+ opentrons-8.0.0a5.dist-info/METADATA,sha256=8bfifhIOeDmfyGhYLVdDykKvLIB4R6h6t-3WaKHeNRk,4990
505
+ opentrons-8.0.0a5.dist-info/WHEEL,sha256=_4XEmVmaBFWtekSGrbfOGNjC2I5lUr0lZSRblBllIFA,109
506
+ opentrons-8.0.0a5.dist-info/entry_points.txt,sha256=fTa6eGCYkvOtv0ov-KVE8LLGetgb35LQLF9x85OWPVw,106
507
+ opentrons-8.0.0a5.dist-info/top_level.txt,sha256=wk6whpbMZdBQpcK0Fg0YVfUGrAgVOFON7oQAhOMGMW8,10
508
+ opentrons-8.0.0a5.dist-info/RECORD,,