opentrons 8.7.0a4__py3-none-any.whl → 8.7.0a6__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/_version.py +2 -2
- opentrons/hardware_control/dev_types.py +3 -1
- opentrons/hardware_control/instruments/ot2/pipette_handler.py +1 -0
- opentrons/hardware_control/instruments/ot3/pipette_handler.py +1 -0
- opentrons/protocol_api/core/engine/instrument.py +143 -18
- opentrons/protocol_engine/resources/pipette_data_provider.py +3 -0
- opentrons/protocol_engine/state/pipettes.py +12 -3
- {opentrons-8.7.0a4.dist-info → opentrons-8.7.0a6.dist-info}/METADATA +4 -4
- {opentrons-8.7.0a4.dist-info → opentrons-8.7.0a6.dist-info}/RECORD +12 -12
- {opentrons-8.7.0a4.dist-info → opentrons-8.7.0a6.dist-info}/WHEEL +0 -0
- {opentrons-8.7.0a4.dist-info → opentrons-8.7.0a6.dist-info}/entry_points.txt +0 -0
- {opentrons-8.7.0a4.dist-info → opentrons-8.7.0a6.dist-info}/licenses/LICENSE +0 -0
opentrons/_version.py
CHANGED
|
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
|
|
|
28
28
|
commit_id: COMMIT_ID
|
|
29
29
|
__commit_id__: COMMIT_ID
|
|
30
30
|
|
|
31
|
-
__version__ = version = '8.7.
|
|
32
|
-
__version_tuple__ = version_tuple = (8, 7, 0, '
|
|
31
|
+
__version__ = version = '8.7.0a6'
|
|
32
|
+
__version_tuple__ = version_tuple = (8, 7, 0, 'a6')
|
|
33
33
|
|
|
34
34
|
__commit_id__ = commit_id = None
|
|
@@ -14,8 +14,9 @@ from opentrons_shared_data.pipette.types import (
|
|
|
14
14
|
PipetteModel,
|
|
15
15
|
PipetteName,
|
|
16
16
|
ChannelCount,
|
|
17
|
+
PipetteTipType,
|
|
18
|
+
LiquidClasses,
|
|
17
19
|
)
|
|
18
|
-
from opentrons_shared_data.pipette.types import PipetteTipType
|
|
19
20
|
from opentrons_shared_data.pipette.pipette_definition import (
|
|
20
21
|
PipetteConfigurations,
|
|
21
22
|
SupportedTipsDefinition,
|
|
@@ -104,6 +105,7 @@ class PipetteDict(InstrumentDict):
|
|
|
104
105
|
plunger_positions: Dict[str, float]
|
|
105
106
|
shaft_ul_per_mm: float
|
|
106
107
|
available_sensors: AvailableSensorDefinition
|
|
108
|
+
volume_mode: LiquidClasses # LiquidClasses refer to volume mode in this context
|
|
107
109
|
|
|
108
110
|
|
|
109
111
|
class PipetteStateDict(TypedDict):
|
|
@@ -267,6 +267,7 @@ class PipetteHandlerProvider(Generic[MountType]):
|
|
|
267
267
|
"drop_tip": instr.plunger_positions.drop_tip,
|
|
268
268
|
}
|
|
269
269
|
result["shaft_ul_per_mm"] = instr.config.shaft_ul_per_mm
|
|
270
|
+
result["volume_mode"] = instr.liquid_class_name
|
|
270
271
|
return cast(PipetteDict, result)
|
|
271
272
|
|
|
272
273
|
@property
|
|
@@ -294,6 +294,7 @@ class OT3PipetteHandler:
|
|
|
294
294
|
}
|
|
295
295
|
result["shaft_ul_per_mm"] = instr.config.shaft_ul_per_mm
|
|
296
296
|
result["available_sensors"] = instr.config.available_sensors
|
|
297
|
+
result["volume_mode"] = instr.liquid_class_name
|
|
297
298
|
return cast(PipetteDict, result)
|
|
298
299
|
|
|
299
300
|
@property
|
|
@@ -66,7 +66,6 @@ from opentrons.protocol_engine.types.automatic_tip_selection import (
|
|
|
66
66
|
)
|
|
67
67
|
from opentrons.protocol_engine.errors.exceptions import TipNotAttachedError
|
|
68
68
|
from opentrons.protocol_engine.clients import SyncClient as EngineClient
|
|
69
|
-
from opentrons.protocols.api_support.definitions import MAX_SUPPORTED_VERSION
|
|
70
69
|
from opentrons_shared_data.pipette.types import (
|
|
71
70
|
PIPETTE_API_NAMES_MAP,
|
|
72
71
|
LIQUID_PROBE_START_OFFSET_FROM_WELL_TOP,
|
|
@@ -101,6 +100,9 @@ _RESIN_TIP_DEFAULT_FLOW_RATE = 10.0
|
|
|
101
100
|
_FLEX_PIPETTE_NAMES_FIXED_IN = APIVersion(2, 23)
|
|
102
101
|
"""The version after which InstrumentContext.name returns the correct API-specific names of Flex pipettes."""
|
|
103
102
|
|
|
103
|
+
_DEFAULT_FLOW_RATE_BUG_FIXED_IN = APIVersion(2, 26)
|
|
104
|
+
"""The version after which default flow rates correctly update when pipette tip or volume changes."""
|
|
105
|
+
|
|
104
106
|
|
|
105
107
|
class InstrumentCore(AbstractInstrument[WellCore, LabwareCore]):
|
|
106
108
|
"""Instrument API core using a ProtocolEngine.
|
|
@@ -122,18 +124,27 @@ class InstrumentCore(AbstractInstrument[WellCore, LabwareCore]):
|
|
|
122
124
|
self._sync_hardware_api = sync_hardware_api
|
|
123
125
|
self._protocol_core = protocol_core
|
|
124
126
|
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
flow_rates = self._engine_client.state.pipettes.get_flow_rates(pipette_id)
|
|
128
|
-
self._aspirate_flow_rate = find_value_for_api_version(
|
|
129
|
-
MAX_SUPPORTED_VERSION, flow_rates.default_aspirate
|
|
130
|
-
)
|
|
131
|
-
self._dispense_flow_rate = find_value_for_api_version(
|
|
132
|
-
MAX_SUPPORTED_VERSION, flow_rates.default_dispense
|
|
133
|
-
)
|
|
134
|
-
self._blow_out_flow_rate = find_value_for_api_version(
|
|
135
|
-
MAX_SUPPORTED_VERSION, flow_rates.default_blow_out
|
|
127
|
+
self._initial_default_flow_rates = (
|
|
128
|
+
self._engine_client.state.pipettes.get_flow_rates(pipette_id)
|
|
136
129
|
)
|
|
130
|
+
self._user_aspirate_flow_rate: Optional[float] = None
|
|
131
|
+
self._user_dispense_flow_rate: Optional[float] = None
|
|
132
|
+
self._user_blow_out_flow_rate: Optional[float] = None
|
|
133
|
+
|
|
134
|
+
if self._protocol_core.api_version < _DEFAULT_FLOW_RATE_BUG_FIXED_IN:
|
|
135
|
+
# Set to the initial defaults to preserve buggy behavior where the default was not correctly updated
|
|
136
|
+
self._user_aspirate_flow_rate = find_value_for_api_version(
|
|
137
|
+
self._protocol_core.api_version,
|
|
138
|
+
self._initial_default_flow_rates.default_aspirate,
|
|
139
|
+
)
|
|
140
|
+
self._user_dispense_flow_rate = find_value_for_api_version(
|
|
141
|
+
self._protocol_core.api_version,
|
|
142
|
+
self._initial_default_flow_rates.default_dispense,
|
|
143
|
+
)
|
|
144
|
+
self._user_blow_out_flow_rate = find_value_for_api_version(
|
|
145
|
+
self._protocol_core.api_version,
|
|
146
|
+
self._initial_default_flow_rates.default_blow_out,
|
|
147
|
+
)
|
|
137
148
|
self._flow_rates = FlowRates(self)
|
|
138
149
|
|
|
139
150
|
self.set_default_speed(speed=default_movement_speed)
|
|
@@ -1031,13 +1042,64 @@ class InstrumentCore(AbstractInstrument[WellCore, LabwareCore]):
|
|
|
1031
1042
|
return self._flow_rates
|
|
1032
1043
|
|
|
1033
1044
|
def get_aspirate_flow_rate(self, rate: float = 1.0) -> float:
|
|
1034
|
-
|
|
1045
|
+
"""Returns the user-set aspirate flow rate if that's been modified, otherwise return the default.
|
|
1046
|
+
|
|
1047
|
+
Note that in API versions 2.25 and below `_user_aspirate_flow_rate` will automatically be set to the initial
|
|
1048
|
+
default flow rate when the pipette is loaded (which is the same as the max tip capacity). This is to preserve
|
|
1049
|
+
buggy behavior in which the default was never correctly updated when the pipette picked up or dropped a tip or
|
|
1050
|
+
had its volume configuration changed.
|
|
1051
|
+
"""
|
|
1052
|
+
aspirate_flow_rate = (
|
|
1053
|
+
self._user_aspirate_flow_rate
|
|
1054
|
+
or find_value_for_api_version(
|
|
1055
|
+
self._protocol_core.api_version,
|
|
1056
|
+
self._engine_client.state.pipettes.get_flow_rates(
|
|
1057
|
+
self._pipette_id
|
|
1058
|
+
).default_aspirate,
|
|
1059
|
+
)
|
|
1060
|
+
)
|
|
1061
|
+
|
|
1062
|
+
return aspirate_flow_rate * rate
|
|
1035
1063
|
|
|
1036
1064
|
def get_dispense_flow_rate(self, rate: float = 1.0) -> float:
|
|
1037
|
-
|
|
1065
|
+
"""Returns the user-set dispense flow rate if that's been modified, otherwise return the default.
|
|
1066
|
+
|
|
1067
|
+
Note that in API versions 2.25 and below `_user_dispense_flow_rate` will automatically be set to the initial
|
|
1068
|
+
default flow rate when the pipette is loaded (which is the same as the max tip capacity). This is to preserve
|
|
1069
|
+
buggy behavior in which the default was never correctly updated when the pipette picked up or dropped a tip or
|
|
1070
|
+
had its volume configuration changed.
|
|
1071
|
+
"""
|
|
1072
|
+
dispense_flow_rate = (
|
|
1073
|
+
self._user_dispense_flow_rate
|
|
1074
|
+
or find_value_for_api_version(
|
|
1075
|
+
self._protocol_core.api_version,
|
|
1076
|
+
self._engine_client.state.pipettes.get_flow_rates(
|
|
1077
|
+
self._pipette_id
|
|
1078
|
+
).default_dispense,
|
|
1079
|
+
)
|
|
1080
|
+
)
|
|
1081
|
+
|
|
1082
|
+
return dispense_flow_rate * rate
|
|
1038
1083
|
|
|
1039
1084
|
def get_blow_out_flow_rate(self, rate: float = 1.0) -> float:
|
|
1040
|
-
|
|
1085
|
+
"""Returns the user-set blow-out flow rate if that's been modified, otherwise return the default.
|
|
1086
|
+
|
|
1087
|
+
Note that in API versions 2.25 and below `_user_dispense_flow_rate` will automatically be set to the initial
|
|
1088
|
+
default flow rate when the pipette is loaded (which is the same as the max tip capacity). This is to preserve
|
|
1089
|
+
buggy behavior in which the default was never correctly updated when the pipette picked up or dropped a tip or
|
|
1090
|
+
had its volume configuration changed.
|
|
1091
|
+
"""
|
|
1092
|
+
blow_out_flow_rate = (
|
|
1093
|
+
self._user_blow_out_flow_rate
|
|
1094
|
+
or find_value_for_api_version(
|
|
1095
|
+
self._protocol_core.api_version,
|
|
1096
|
+
self._engine_client.state.pipettes.get_flow_rates(
|
|
1097
|
+
self._pipette_id
|
|
1098
|
+
).default_blow_out,
|
|
1099
|
+
)
|
|
1100
|
+
)
|
|
1101
|
+
|
|
1102
|
+
return blow_out_flow_rate * rate
|
|
1041
1103
|
|
|
1042
1104
|
def get_nozzle_configuration(self) -> NozzleConfigurationType:
|
|
1043
1105
|
return self._engine_client.state.pipettes.get_nozzle_layout_type(
|
|
@@ -1084,13 +1146,13 @@ class InstrumentCore(AbstractInstrument[WellCore, LabwareCore]):
|
|
|
1084
1146
|
) -> None:
|
|
1085
1147
|
if aspirate is not None:
|
|
1086
1148
|
assert aspirate > 0
|
|
1087
|
-
self.
|
|
1149
|
+
self._user_aspirate_flow_rate = aspirate
|
|
1088
1150
|
if dispense is not None:
|
|
1089
1151
|
assert dispense > 0
|
|
1090
|
-
self.
|
|
1152
|
+
self._user_dispense_flow_rate = dispense
|
|
1091
1153
|
if blow_out is not None:
|
|
1092
1154
|
assert blow_out > 0
|
|
1093
|
-
self.
|
|
1155
|
+
self._user_blow_out_flow_rate = blow_out
|
|
1094
1156
|
|
|
1095
1157
|
def set_liquid_presence_detection(self, enable: bool) -> None:
|
|
1096
1158
|
self._liquid_presence_detection = enable
|
|
@@ -1105,6 +1167,10 @@ class InstrumentCore(AbstractInstrument[WellCore, LabwareCore]):
|
|
|
1105
1167
|
),
|
|
1106
1168
|
)
|
|
1107
1169
|
)
|
|
1170
|
+
if self._protocol_core.api_version >= _DEFAULT_FLOW_RATE_BUG_FIXED_IN:
|
|
1171
|
+
self._user_aspirate_flow_rate = None
|
|
1172
|
+
self._user_dispense_flow_rate = None
|
|
1173
|
+
self._user_blow_out_flow_rate = None
|
|
1108
1174
|
|
|
1109
1175
|
def prepare_to_aspirate(self) -> None:
|
|
1110
1176
|
self._engine_client.execute_command(
|
|
@@ -1273,6 +1339,13 @@ class InstrumentCore(AbstractInstrument[WellCore, LabwareCore]):
|
|
|
1273
1339
|
tiprack_uri=tiprack_uri_for_transfer_props,
|
|
1274
1340
|
)
|
|
1275
1341
|
|
|
1342
|
+
original_aspirate_flow_rate = self._user_aspirate_flow_rate
|
|
1343
|
+
original_dispense_flow_rate = self._user_dispense_flow_rate
|
|
1344
|
+
original_blow_out_flow_rate = self._user_blow_out_flow_rate
|
|
1345
|
+
in_low_volume_mode = self._engine_client.state.pipettes.get_is_low_volume_mode(
|
|
1346
|
+
self._pipette_id
|
|
1347
|
+
)
|
|
1348
|
+
|
|
1276
1349
|
target_destinations: Sequence[
|
|
1277
1350
|
Union[Tuple[Location, WellCore], TrashBin, WasteChute]
|
|
1278
1351
|
]
|
|
@@ -1367,6 +1440,14 @@ class InstrumentCore(AbstractInstrument[WellCore, LabwareCore]):
|
|
|
1367
1440
|
if not keep_last_tip:
|
|
1368
1441
|
self._drop_tip_for_liquid_class(trash_location, return_tip)
|
|
1369
1442
|
|
|
1443
|
+
if self._protocol_core.api_version >= _DEFAULT_FLOW_RATE_BUG_FIXED_IN:
|
|
1444
|
+
self._restore_pipette_flow_rates_and_volume_mode(
|
|
1445
|
+
aspirate_flow_rate=original_aspirate_flow_rate,
|
|
1446
|
+
dispense_flow_rate=original_dispense_flow_rate,
|
|
1447
|
+
blow_out_flow_rate=original_blow_out_flow_rate,
|
|
1448
|
+
is_low_volume=in_low_volume_mode,
|
|
1449
|
+
)
|
|
1450
|
+
|
|
1370
1451
|
def distribute_with_liquid_class( # noqa: C901
|
|
1371
1452
|
self,
|
|
1372
1453
|
liquid_class: LiquidClass,
|
|
@@ -1474,6 +1555,13 @@ class InstrumentCore(AbstractInstrument[WellCore, LabwareCore]):
|
|
|
1474
1555
|
tiprack_uri=tiprack_uri_for_transfer_props,
|
|
1475
1556
|
)
|
|
1476
1557
|
|
|
1558
|
+
original_aspirate_flow_rate = self._user_aspirate_flow_rate
|
|
1559
|
+
original_dispense_flow_rate = self._user_dispense_flow_rate
|
|
1560
|
+
original_blow_out_flow_rate = self._user_blow_out_flow_rate
|
|
1561
|
+
in_low_volume_mode = self._engine_client.state.pipettes.get_is_low_volume_mode(
|
|
1562
|
+
self._pipette_id
|
|
1563
|
+
)
|
|
1564
|
+
|
|
1477
1565
|
# This will return a generator that provides pairs of destination well and
|
|
1478
1566
|
# the volume to dispense into it
|
|
1479
1567
|
dest_per_volume_step = (
|
|
@@ -1617,6 +1705,14 @@ class InstrumentCore(AbstractInstrument[WellCore, LabwareCore]):
|
|
|
1617
1705
|
if not keep_last_tip:
|
|
1618
1706
|
self._drop_tip_for_liquid_class(trash_location, return_tip)
|
|
1619
1707
|
|
|
1708
|
+
if self._protocol_core.api_version >= _DEFAULT_FLOW_RATE_BUG_FIXED_IN:
|
|
1709
|
+
self._restore_pipette_flow_rates_and_volume_mode(
|
|
1710
|
+
aspirate_flow_rate=original_aspirate_flow_rate,
|
|
1711
|
+
dispense_flow_rate=original_dispense_flow_rate,
|
|
1712
|
+
blow_out_flow_rate=original_blow_out_flow_rate,
|
|
1713
|
+
is_low_volume=in_low_volume_mode,
|
|
1714
|
+
)
|
|
1715
|
+
|
|
1620
1716
|
def _tip_can_hold_volume_for_multi_dispensing(
|
|
1621
1717
|
self,
|
|
1622
1718
|
transfer_volume: float,
|
|
@@ -1712,6 +1808,13 @@ class InstrumentCore(AbstractInstrument[WellCore, LabwareCore]):
|
|
|
1712
1808
|
tiprack_uri=tiprack_uri_for_transfer_props,
|
|
1713
1809
|
)
|
|
1714
1810
|
|
|
1811
|
+
original_aspirate_flow_rate = self._user_aspirate_flow_rate
|
|
1812
|
+
original_dispense_flow_rate = self._user_dispense_flow_rate
|
|
1813
|
+
original_blow_out_flow_rate = self._user_blow_out_flow_rate
|
|
1814
|
+
in_low_volume_mode = self._engine_client.state.pipettes.get_is_low_volume_mode(
|
|
1815
|
+
self._pipette_id
|
|
1816
|
+
)
|
|
1817
|
+
|
|
1715
1818
|
working_volume = self.get_working_volume_for_tip_rack(tip_racks[0][1])
|
|
1716
1819
|
|
|
1717
1820
|
source_per_volume_step = (
|
|
@@ -1796,6 +1899,14 @@ class InstrumentCore(AbstractInstrument[WellCore, LabwareCore]):
|
|
|
1796
1899
|
if not keep_last_tip:
|
|
1797
1900
|
self._drop_tip_for_liquid_class(trash_location, return_tip)
|
|
1798
1901
|
|
|
1902
|
+
if self._protocol_core.api_version >= _DEFAULT_FLOW_RATE_BUG_FIXED_IN:
|
|
1903
|
+
self._restore_pipette_flow_rates_and_volume_mode(
|
|
1904
|
+
aspirate_flow_rate=original_aspirate_flow_rate,
|
|
1905
|
+
dispense_flow_rate=original_dispense_flow_rate,
|
|
1906
|
+
blow_out_flow_rate=original_blow_out_flow_rate,
|
|
1907
|
+
is_low_volume=in_low_volume_mode,
|
|
1908
|
+
)
|
|
1909
|
+
|
|
1799
1910
|
def _get_location_and_well_core_from_next_tip_info(
|
|
1800
1911
|
self,
|
|
1801
1912
|
tip_info: NextTipInfo,
|
|
@@ -1904,6 +2015,20 @@ class InstrumentCore(AbstractInstrument[WellCore, LabwareCore]):
|
|
|
1904
2015
|
alternate_drop_location=True,
|
|
1905
2016
|
)
|
|
1906
2017
|
|
|
2018
|
+
def _restore_pipette_flow_rates_and_volume_mode(
|
|
2019
|
+
self,
|
|
2020
|
+
aspirate_flow_rate: Optional[float],
|
|
2021
|
+
dispense_flow_rate: Optional[float],
|
|
2022
|
+
blow_out_flow_rate: Optional[float],
|
|
2023
|
+
is_low_volume: bool,
|
|
2024
|
+
) -> None:
|
|
2025
|
+
# TODO(jbl 2025-09-17) this works for p50 low volume mode but is not guaranteed to work for future low volume
|
|
2026
|
+
# modes, this should be replaced with something less flaky
|
|
2027
|
+
self.configure_for_volume(self.get_max_volume() if not is_low_volume else 1)
|
|
2028
|
+
self._user_aspirate_flow_rate = aspirate_flow_rate
|
|
2029
|
+
self._user_dispense_flow_rate = dispense_flow_rate
|
|
2030
|
+
self._user_blow_out_flow_rate = blow_out_flow_rate
|
|
2031
|
+
|
|
1907
2032
|
def aspirate_liquid_class(
|
|
1908
2033
|
self,
|
|
1909
2034
|
volume: float,
|
|
@@ -70,6 +70,7 @@ class LoadedStaticPipetteData:
|
|
|
70
70
|
plunger_positions: Dict[str, float]
|
|
71
71
|
shaft_ul_per_mm: float
|
|
72
72
|
available_sensors: pipette_definition.AvailableSensorDefinition
|
|
73
|
+
volume_mode: pip_types.LiquidClasses # pip_types Liquid Classes refers to volume modes
|
|
73
74
|
|
|
74
75
|
|
|
75
76
|
class VirtualPipetteDataProvider:
|
|
@@ -298,6 +299,7 @@ class VirtualPipetteDataProvider:
|
|
|
298
299
|
shaft_ul_per_mm=config.shaft_ul_per_mm,
|
|
299
300
|
available_sensors=config.available_sensors
|
|
300
301
|
or pipette_definition.AvailableSensorDefinition(sensors=[]),
|
|
302
|
+
volume_mode=liquid_class,
|
|
301
303
|
)
|
|
302
304
|
|
|
303
305
|
def get_virtual_pipette_static_config(
|
|
@@ -353,6 +355,7 @@ def get_pipette_static_config(
|
|
|
353
355
|
plunger_positions=pipette_dict["plunger_positions"],
|
|
354
356
|
shaft_ul_per_mm=pipette_dict["shaft_ul_per_mm"],
|
|
355
357
|
available_sensors=available_sensors,
|
|
358
|
+
volume_mode=pipette_dict["volume_mode"],
|
|
356
359
|
)
|
|
357
360
|
|
|
358
361
|
|
|
@@ -17,7 +17,10 @@ from typing_extensions import assert_never
|
|
|
17
17
|
|
|
18
18
|
from opentrons_shared_data.pipette import pipette_definition
|
|
19
19
|
from opentrons_shared_data.pipette.ul_per_mm import calculate_ul_per_mm
|
|
20
|
-
from opentrons_shared_data.pipette.types import
|
|
20
|
+
from opentrons_shared_data.pipette.types import (
|
|
21
|
+
UlPerMmAction,
|
|
22
|
+
LiquidClasses as VolumeModes,
|
|
23
|
+
)
|
|
21
24
|
|
|
22
25
|
from opentrons.config.defaults_ot2 import Z_RETRACT_DISTANCE
|
|
23
26
|
from opentrons.hardware_control.dev_types import PipetteDict
|
|
@@ -107,6 +110,7 @@ class StaticPipetteConfig:
|
|
|
107
110
|
plunger_positions: Dict[str, float]
|
|
108
111
|
shaft_ul_per_mm: float
|
|
109
112
|
available_sensors: pipette_definition.AvailableSensorDefinition
|
|
113
|
+
volume_mode: VolumeModes
|
|
110
114
|
|
|
111
115
|
|
|
112
116
|
@dataclasses.dataclass
|
|
@@ -212,7 +216,7 @@ class PipetteStore(HasState[PipetteState], HandlesActions):
|
|
|
212
216
|
# we identify tip classes - looking things up by volume is not enough.
|
|
213
217
|
tip_configuration = list(
|
|
214
218
|
static_config.tip_configuration_lookup_table.values()
|
|
215
|
-
)[
|
|
219
|
+
)[-1]
|
|
216
220
|
self._state.flow_rates_by_id[pipette_id] = FlowRates(
|
|
217
221
|
default_blow_out=tip_configuration.default_blowout_flowrate.values_by_api_level,
|
|
218
222
|
default_aspirate=tip_configuration.default_aspirate_flowrate.values_by_api_level,
|
|
@@ -230,7 +234,7 @@ class PipetteStore(HasState[PipetteState], HandlesActions):
|
|
|
230
234
|
# TODO(seth,9/11/2023): bad way to do defaulting, see above.
|
|
231
235
|
tip_configuration = list(
|
|
232
236
|
static_config.tip_configuration_lookup_table.values()
|
|
233
|
-
)[
|
|
237
|
+
)[-1]
|
|
234
238
|
self._state.flow_rates_by_id[pipette_id] = FlowRates(
|
|
235
239
|
default_blow_out=tip_configuration.default_blowout_flowrate.values_by_api_level,
|
|
236
240
|
default_aspirate=tip_configuration.default_aspirate_flowrate.values_by_api_level,
|
|
@@ -313,6 +317,7 @@ class PipetteStore(HasState[PipetteState], HandlesActions):
|
|
|
313
317
|
plunger_positions=config.plunger_positions,
|
|
314
318
|
shaft_ul_per_mm=config.shaft_ul_per_mm,
|
|
315
319
|
available_sensors=config.available_sensors,
|
|
320
|
+
volume_mode=config.volume_mode,
|
|
316
321
|
)
|
|
317
322
|
self._state.flow_rates_by_id[
|
|
318
323
|
state_update.pipette_config.pipette_id
|
|
@@ -867,6 +872,10 @@ class PipetteView:
|
|
|
867
872
|
return False
|
|
868
873
|
return True
|
|
869
874
|
|
|
875
|
+
def get_is_low_volume_mode(self, pipette_id: str) -> bool:
|
|
876
|
+
"""Determine if the pipette is currently in low volume mode."""
|
|
877
|
+
return self.get_config(pipette_id).volume_mode == VolumeModes.lowVolumeDefault
|
|
878
|
+
|
|
870
879
|
def lookup_volume_to_mm_conversion(
|
|
871
880
|
self, pipette_id: str, volume: float, action: str
|
|
872
881
|
) -> float:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: opentrons
|
|
3
|
-
Version: 8.7.
|
|
3
|
+
Version: 8.7.0a6
|
|
4
4
|
Summary: The Opentrons API is a simple framework designed to make writing automated biology lab protocols easy.
|
|
5
5
|
Project-URL: opentrons.com, https://www.opentrons.com
|
|
6
6
|
Project-URL: Source Code On Github, https://github.com/Opentrons/opentrons/tree/edge/api
|
|
@@ -24,7 +24,7 @@ Requires-Dist: click<9,>=8.0.0
|
|
|
24
24
|
Requires-Dist: importlib-metadata>=1.0; python_version < '3.8'
|
|
25
25
|
Requires-Dist: jsonschema<4.18.0,>=3.0.1
|
|
26
26
|
Requires-Dist: numpy<2,>=1.20.0
|
|
27
|
-
Requires-Dist: opentrons-shared-data==8.7.
|
|
27
|
+
Requires-Dist: opentrons-shared-data==8.7.0a6
|
|
28
28
|
Requires-Dist: packaging>=21.0
|
|
29
29
|
Requires-Dist: pydantic-settings<3,>=2
|
|
30
30
|
Requires-Dist: pydantic<3,>=2.0.0
|
|
@@ -32,6 +32,6 @@ Requires-Dist: pyserial>=3.5
|
|
|
32
32
|
Requires-Dist: pyusb==1.2.1
|
|
33
33
|
Requires-Dist: typing-extensions<5,>=4.0.0
|
|
34
34
|
Provides-Extra: flex-hardware
|
|
35
|
-
Requires-Dist: opentrons-hardware[flex]==8.7.
|
|
35
|
+
Requires-Dist: opentrons-hardware[flex]==8.7.0a6; extra == 'flex-hardware'
|
|
36
36
|
Provides-Extra: ot2-hardware
|
|
37
|
-
Requires-Dist: opentrons-hardware==8.7.
|
|
37
|
+
Requires-Dist: opentrons-hardware==8.7.0a6; extra == 'ot2-hardware'
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
opentrons/__init__.py,sha256=TQ_Ca_zzAM3iLzAysWKkFkQHG8-imihxDPQbLCYrf-E,4533
|
|
2
|
-
opentrons/_version.py,sha256=
|
|
2
|
+
opentrons/_version.py,sha256=QWyf8tucSHUWM-f05vXVSeV8CkIBFLOTGDvxyi98YYM,712
|
|
3
3
|
opentrons/execute.py,sha256=Y88qICDiHWQjU0L4Ou7DI5OXXu7zZcdkUvNUYmZqIfc,29282
|
|
4
4
|
opentrons/legacy_broker.py,sha256=XnuEBBlrHCThc31RFW2UR0tGqctqWZ-CZ9vSC4L9whU,1553
|
|
5
5
|
opentrons/ordered_set.py,sha256=g-SB3qA14yxHu9zjGyc2wC7d2TUCBE6fKZlHAtbPzI8,4082
|
|
@@ -98,7 +98,7 @@ opentrons/hardware_control/__main__.py,sha256=DnlYdphZKLHiLCeXmnMDer6CclhberfTk_
|
|
|
98
98
|
opentrons/hardware_control/adapters.py,sha256=mm-gumoaF7CFrP0ad6W4xafbJRq6RaOD0GffSibWR-Q,3888
|
|
99
99
|
opentrons/hardware_control/api.py,sha256=TbEKD7MtDKkvdeJ0yqsFlsM8q_0D36iwolQSclivJpw,51234
|
|
100
100
|
opentrons/hardware_control/constants.py,sha256=Ku-XABo7AN9JQ0tef8oPk-JlUuhQQLeP9S0h7kx5GEA,227
|
|
101
|
-
opentrons/hardware_control/dev_types.py,sha256=
|
|
101
|
+
opentrons/hardware_control/dev_types.py,sha256=q2GU8JMkHAhNrW5A4bcyq9y5q4-X-HXxa7yxCR-olxw,3507
|
|
102
102
|
opentrons/hardware_control/errors.py,sha256=NMF5_AvX22ENTHPpUlElgF-0aeaxEhYXnOq2lfIzuiM,1433
|
|
103
103
|
opentrons/hardware_control/execution_manager.py,sha256=WG3NF1OJgorAmRpkx8BRnqFeQsPUQ5w7H1kVK7pC-7A,5984
|
|
104
104
|
opentrons/hardware_control/module_control.py,sha256=0mmVH9fiZWNyc33ilCpJHajX1Dfhf0YsbI28mSIS2K8,12726
|
|
@@ -157,13 +157,13 @@ opentrons/hardware_control/instruments/instrument_abc.py,sha256=UqKb7_8E4ivlTV2t
|
|
|
157
157
|
opentrons/hardware_control/instruments/ot2/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
158
158
|
opentrons/hardware_control/instruments/ot2/instrument_calibration.py,sha256=qyj0RWLYayq9q_9bOocgNK7xu4fCDyigSk-kN7d5YhA,4873
|
|
159
159
|
opentrons/hardware_control/instruments/ot2/pipette.py,sha256=aQ3gSnjtN3OwS2-9WiRTKjrHy6Bz9gUkZwT94y2Tcdg,28200
|
|
160
|
-
opentrons/hardware_control/instruments/ot2/pipette_handler.py,sha256=
|
|
160
|
+
opentrons/hardware_control/instruments/ot2/pipette_handler.py,sha256=qluMYYwui76366xsjOBKp3kpJVuKrxJEHPO45wR9jj4,38105
|
|
161
161
|
opentrons/hardware_control/instruments/ot3/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
162
162
|
opentrons/hardware_control/instruments/ot3/gripper.py,sha256=xGL3dfRo1fuzMwF984h002Hi5DRbxcEiDjdkdS9C2PI,15406
|
|
163
163
|
opentrons/hardware_control/instruments/ot3/gripper_handler.py,sha256=sa5GWZAzxQZk1A6RFKEg99L9Nb1UTeKeGWqnY_NA_cg,6071
|
|
164
164
|
opentrons/hardware_control/instruments/ot3/instrument_calibration.py,sha256=x5hloPvJD19OUbI5IkoKYda-G7xHdzfckRaDl_GK4i4,7011
|
|
165
165
|
opentrons/hardware_control/instruments/ot3/pipette.py,sha256=t3K28QLEmj3DS_KXoXbeBjEE5PfQJlSePzvSNt4GXsI,32376
|
|
166
|
-
opentrons/hardware_control/instruments/ot3/pipette_handler.py,sha256=
|
|
166
|
+
opentrons/hardware_control/instruments/ot3/pipette_handler.py,sha256=C8Ai5uSSuQEbcul-pkzHuywoIX-1Tppl4Xh51ADR3j0,39443
|
|
167
167
|
opentrons/hardware_control/modules/__init__.py,sha256=9tLhyYJ4AQ2Kch8oD4-NEZ_dGC7IqY5hOdGLyKqJjLs,1549
|
|
168
168
|
opentrons/hardware_control/modules/absorbance_reader.py,sha256=_6fcHEmsaeV3p8rFpPHB6Tdh7hvWE8buJDtUL2u0nlw,13495
|
|
169
169
|
opentrons/hardware_control/modules/errors.py,sha256=cREqoMc6nwGxQbLvZYDfIlq1mCv0alN42J7qxNBNiOY,165
|
|
@@ -255,7 +255,7 @@ opentrons/protocol_api/core/engine/_default_labware_versions.py,sha256=hLKAp33c_
|
|
|
255
255
|
opentrons/protocol_api/core/engine/_default_liquid_class_versions.py,sha256=be-eczhfOsWm4Q3fSVcjWqxteg_IGnwC-pozJUZ5u4U,1564
|
|
256
256
|
opentrons/protocol_api/core/engine/deck_conflict.py,sha256=j3AJ-sYr5e-06UgeGueUldx9B3fn7AhN738kJxZO_vw,14693
|
|
257
257
|
opentrons/protocol_api/core/engine/exceptions.py,sha256=aZgNrmYEeuPZm21nX_KZYtvyjv5h_zPjxxgPkEV7_bw,725
|
|
258
|
-
opentrons/protocol_api/core/engine/instrument.py,sha256=
|
|
258
|
+
opentrons/protocol_api/core/engine/instrument.py,sha256=iiiUdjdpLGxjr3iQwI6AOtfIFTFx1vwZLa6ALrpqgRM,105054
|
|
259
259
|
opentrons/protocol_api/core/engine/labware.py,sha256=-2oygShyRZo1-R0UOoBtXniFOXfc3cSdGM-qa_l9wh8,8610
|
|
260
260
|
opentrons/protocol_api/core/engine/load_labware_params.py,sha256=CxSbCBXVXHtBszP-3Ko8hsQTjvvogKRo0CCzCmMfIic,3003
|
|
261
261
|
opentrons/protocol_api/core/engine/module_core.py,sha256=qxxcqpH-A4Zil9hHDxnvh4H8JuPvK6-sgkODU5YdjZQ,39537
|
|
@@ -449,7 +449,7 @@ opentrons/protocol_engine/resources/labware_validation.py,sha256=6UkWktVvGNpOrRo
|
|
|
449
449
|
opentrons/protocol_engine/resources/model_utils.py,sha256=C3OHUi-OtuFUm3dS5rApSU3EJ0clnaCZEyBku5sTjzA,941
|
|
450
450
|
opentrons/protocol_engine/resources/module_data_provider.py,sha256=DaTv3QqrlpKEXlIfBCSgXwlyOrV2YqWcxlHD0MGKWWw,1558
|
|
451
451
|
opentrons/protocol_engine/resources/ot3_validation.py,sha256=0x81JoZBXcj2xUVcOF7v5ETc8y5T_sbs-jTPxuSnooE,744
|
|
452
|
-
opentrons/protocol_engine/resources/pipette_data_provider.py,sha256=
|
|
452
|
+
opentrons/protocol_engine/resources/pipette_data_provider.py,sha256=bsrknDnHWpp52MsQrIchPpAKktVmvCWJ5W2Myhv4OmY,16171
|
|
453
453
|
opentrons/protocol_engine/state/__init__.py,sha256=hDdA4GjXbi9h7K_FMbQGT9tOw3YtRNn5LIryMdkotS8,36
|
|
454
454
|
opentrons/protocol_engine/state/_abstract_store.py,sha256=b5cqKZhI6ERZj6gyL0kDutD6ogdQngR3T-JmPATvhi8,631
|
|
455
455
|
opentrons/protocol_engine/state/_axis_aligned_bounding_box.py,sha256=W_fkz7vUrtWlrJIp7GoSgceCj3YRcLSUafktQdRI3xg,1373
|
|
@@ -469,7 +469,7 @@ opentrons/protocol_engine/state/liquid_classes.py,sha256=u_z75UYdiFAKG0yB3mr1il4
|
|
|
469
469
|
opentrons/protocol_engine/state/liquids.py,sha256=NoesktcQdJUjIVmet1uqqJPf-rzbo4SGemXwQC295W0,2338
|
|
470
470
|
opentrons/protocol_engine/state/modules.py,sha256=UbvbJcx45n5hZRbxQMTmxrA1rFichsWNUj6SpPAsBIU,61816
|
|
471
471
|
opentrons/protocol_engine/state/motion.py,sha256=pWt28-vBaO6dz_rtvoliUsGDvls_ML6sRfDOwmD0F7g,15086
|
|
472
|
-
opentrons/protocol_engine/state/pipettes.py,sha256=
|
|
472
|
+
opentrons/protocol_engine/state/pipettes.py,sha256=Q-aDiVvOVvUXq930vvMvAWhK7aZ06-8FLZB6jO95dwQ,38531
|
|
473
473
|
opentrons/protocol_engine/state/state.py,sha256=X8Sb2HN01nmNBY1Rw6qeLOjSuIWTbiq4g5otsd4u6A0,15600
|
|
474
474
|
opentrons/protocol_engine/state/state_summary.py,sha256=tu-xJYKbKzeLk9Z0RwSaz0tUs6blYuxSA5V2n7_zSGk,1180
|
|
475
475
|
opentrons/protocol_engine/state/tips.py,sha256=kvYG3VO98VGloJiGiWNoNJ1JOfqPGWx6Yz--LXHcfK4,18307
|
|
@@ -595,8 +595,8 @@ opentrons/util/linal.py,sha256=IlKAP9HkNBBgULeSf4YVwSKHdx9jnCjSr7nvDvlRALg,5753
|
|
|
595
595
|
opentrons/util/logging_config.py,sha256=7et4YYuQdWdq_e50U-8vFS_QyNBRgdnqPGAQJm8qrIo,9954
|
|
596
596
|
opentrons/util/logging_queue_handler.py,sha256=ZsSJwy-oV8DXwpYiZisQ1PbYwmK2cOslD46AcyJ1E4I,2484
|
|
597
597
|
opentrons/util/performance_helpers.py,sha256=ew7H8XD20iS6-2TJAzbQeyzStZkkE6PzHt_Adx3wbZQ,5172
|
|
598
|
-
opentrons-8.7.
|
|
599
|
-
opentrons-8.7.
|
|
600
|
-
opentrons-8.7.
|
|
601
|
-
opentrons-8.7.
|
|
602
|
-
opentrons-8.7.
|
|
598
|
+
opentrons-8.7.0a6.dist-info/METADATA,sha256=RU-1uPU6tiSwIoBZzbwMcTfEa8XHYGoDrwFYgFq5RbU,1607
|
|
599
|
+
opentrons-8.7.0a6.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
600
|
+
opentrons-8.7.0a6.dist-info/entry_points.txt,sha256=fTa6eGCYkvOtv0ov-KVE8LLGetgb35LQLF9x85OWPVw,106
|
|
601
|
+
opentrons-8.7.0a6.dist-info/licenses/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
|
|
602
|
+
opentrons-8.7.0a6.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|