@opentrons/shared-data 0.0.1-alpha.20 → 0.1.0-alpha.0
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.
- package/Makefile +1 -1
- package/lib/opentrons-shared-data.js +1 -1
- package/lib/opentrons-shared-data.js.map +1 -1
- package/package.json +1 -1
- package/js/__tests__/__snapshots__/pipettes.test.ts.snap +0 -5969
- package/js/__tests__/deckSchemas.test.ts +0 -87
- package/js/__tests__/errors.test.js +0 -21
- package/js/__tests__/getAreSlotsAdjacent.test.ts +0 -128
- package/js/__tests__/getWellNamePerMultiTip.test.ts +0 -162
- package/js/__tests__/labwareDefQuirks.test.ts +0 -37
- package/js/__tests__/labwareDefSchemaV1.test.ts +0 -82
- package/js/__tests__/labwareDefSchemaV2.test.ts +0 -298
- package/js/__tests__/moduleAccessors.test.ts +0 -50
- package/js/__tests__/moduleSpecsSchema.test.ts +0 -77
- package/js/__tests__/pipetteSchemaV2.test.ts +0 -107
- package/js/__tests__/pipetteSpecSchemas.test.ts +0 -48
- package/js/__tests__/pipettes.test.ts +0 -58
- package/js/__tests__/protocolSchemaV4.test.ts +0 -137
- package/js/__tests__/protocolSchemaV5.test.ts +0 -137
- package/js/__tests__/protocolSchemaV6.test.ts +0 -132
- package/js/__tests__/protocolSchemaV7.test.ts +0 -64
- package/js/__tests__/protocolValidation.test.ts +0 -83
- package/js/__tests__/sortWells.test.ts +0 -40
- package/js/__tests__/splitWellsOnColumn.test.ts +0 -21
- package/js/__tests__/validateErrors.test.js +0 -34
- package/js/constants.ts +0 -338
- package/js/cypressUtils.ts +0 -35
- package/js/errors.ts +0 -33
- package/js/fixtures.ts +0 -161
- package/js/getLabware.ts +0 -154
- package/js/gripper.ts +0 -29
- package/js/helpers/__tests__/getAdapterName.test.ts +0 -31
- package/js/helpers/__tests__/getDeckDefFromLoadedLabware.test.ts +0 -12
- package/js/helpers/__tests__/getVectorDifference.test.ts +0 -25
- package/js/helpers/__tests__/getVectorSum.test.ts +0 -21
- package/js/helpers/__tests__/labwareInference.test.ts +0 -84
- package/js/helpers/__tests__/orderWells.test.ts +0 -87
- package/js/helpers/__tests__/parseProtocolData.test.ts +0 -165
- package/js/helpers/__tests__/volume.test.ts +0 -108
- package/js/helpers/__tests__/wellSets.test.ts +0 -352
- package/js/helpers/get96Channel384WellPlateWells.ts +0 -44
- package/js/helpers/getAddressableAreasInProtocol.ts +0 -59
- package/js/helpers/getLoadedLabwareDefinitionsByUri.ts +0 -30
- package/js/helpers/getModuleVizDims.ts +0 -118
- package/js/helpers/getOccludedSlotCountForModule.ts +0 -13
- package/js/helpers/getVectorDifference.ts +0 -12
- package/js/helpers/getVectorSum.ts +0 -12
- package/js/helpers/getWellNamePerMultiTip.ts +0 -86
- package/js/helpers/getWellTotalVolume.ts +0 -16
- package/js/helpers/index.ts +0 -347
- package/js/helpers/labwareInference.ts +0 -92
- package/js/helpers/orderWells.ts +0 -69
- package/js/helpers/parseProtocolData.ts +0 -141
- package/js/helpers/volume.ts +0 -35
- package/js/helpers/wellIsRect.ts +0 -6
- package/js/helpers/wellSets.ts +0 -155
- package/js/index.ts +0 -14
- package/js/labwareTools/__tests__/__snapshots__/createIrregularLabware.test.ts.snap +0 -3
- package/js/labwareTools/__tests__/__snapshots__/createLabware.test.ts.snap +0 -3
- package/js/labwareTools/__tests__/createDefaultDisplayName.test.ts +0 -111
- package/js/labwareTools/__tests__/createIrregularLabware.test.ts +0 -226
- package/js/labwareTools/__tests__/createLabware.test.ts +0 -147
- package/js/labwareTools/index.ts +0 -452
- package/js/modules.ts +0 -97
- package/js/pipettes.ts +0 -89
- package/js/protocols.ts +0 -290
- package/js/schema.ts +0 -80
- package/js/scripts/generateDeckLayersFromSVG.js +0 -46
- package/js/titleCase.ts +0 -30
- package/js/types.ts +0 -600
- package/python/.coveragerc +0 -4
- package/python/.flake8 +0 -32
- package/python/Config.in +0 -10
- package/python/Makefile +0 -134
- package/python/Pipfile +0 -28
- package/python/Pipfile.lock +0 -645
- package/python/buildroot.mk +0 -30
- package/python/mypy.ini +0 -41
- package/python/opentrons_shared_data/__init__.py +0 -17
- package/python/opentrons_shared_data/_version.py +0 -20
- package/python/opentrons_shared_data/command/__init__.py +0 -52
- package/python/opentrons_shared_data/deck/__init__.py +0 -96
- package/python/opentrons_shared_data/deck/dev_types.py +0 -180
- package/python/opentrons_shared_data/errors/__init__.py +0 -30
- package/python/opentrons_shared_data/errors/categories.py +0 -60
- package/python/opentrons_shared_data/errors/codes.py +0 -108
- package/python/opentrons_shared_data/errors/exceptions.py +0 -915
- package/python/opentrons_shared_data/gripper/__init__.py +0 -63
- package/python/opentrons_shared_data/gripper/constants.py +0 -6
- package/python/opentrons_shared_data/gripper/gripper_definition.py +0 -101
- package/python/opentrons_shared_data/labware/__init__.py +0 -22
- package/python/opentrons_shared_data/labware/constants.py +0 -7
- package/python/opentrons_shared_data/labware/dev_types.py +0 -140
- package/python/opentrons_shared_data/labware/labware_definition.py +0 -328
- package/python/opentrons_shared_data/load.py +0 -57
- package/python/opentrons_shared_data/module/__init__.py +0 -74
- package/python/opentrons_shared_data/module/dev_types.py +0 -141
- package/python/opentrons_shared_data/pipette/__init__.py +0 -107
- package/python/opentrons_shared_data/pipette/dev_types.py +0 -177
- package/python/opentrons_shared_data/pipette/file_operation_helpers.py +0 -37
- package/python/opentrons_shared_data/pipette/load_data.py +0 -261
- package/python/opentrons_shared_data/pipette/model_constants.py +0 -123
- package/python/opentrons_shared_data/pipette/mutable_configurations.py +0 -431
- package/python/opentrons_shared_data/pipette/pipette_definition.py +0 -503
- package/python/opentrons_shared_data/pipette/pipette_load_name_conversions.py +0 -240
- package/python/opentrons_shared_data/pipette/scripts/__init__.py +0 -0
- package/python/opentrons_shared_data/pipette/scripts/build_json_script.py +0 -469
- package/python/opentrons_shared_data/pipette/scripts/update_configuration_files.py +0 -450
- package/python/opentrons_shared_data/pipette/types.py +0 -193
- package/python/opentrons_shared_data/protocol/__init__.py +0 -13
- package/python/opentrons_shared_data/protocol/constants.py +0 -98
- package/python/opentrons_shared_data/protocol/dev_types.py +0 -436
- package/python/opentrons_shared_data/protocol/models/__init__.py +0 -48
- package/python/opentrons_shared_data/protocol/models/protocol_schema_v6.py +0 -145
- package/python/opentrons_shared_data/protocol/models/protocol_schema_v7.py +0 -95
- package/python/opentrons_shared_data/protocol/models/protocol_schema_v8.py +0 -110
- package/python/opentrons_shared_data/protocol/models/shared_models.py +0 -111
- package/python/opentrons_shared_data/py.typed +0 -0
- package/python/opentrons_shared_data/robot/__init__.py +0 -33
- package/python/opentrons_shared_data/robot/dev_types.py +0 -37
- package/python/pytest.ini +0 -2
- package/python/setup.cfg +0 -5
- package/python/setup.py +0 -179
- package/python/tests/__init__.py +0 -1
- package/python/tests/conftest.py +0 -0
- package/python/tests/deck/__init__.py +0 -0
- package/python/tests/deck/test_list_names.py +0 -12
- package/python/tests/deck/test_position.py +0 -113
- package/python/tests/deck/test_typechecks.py +0 -28
- package/python/tests/errors/__init__.py +0 -1
- package/python/tests/errors/test_error_completeness.py +0 -19
- package/python/tests/errors/test_exceptions.py +0 -74
- package/python/tests/gripper/__init__.py +0 -0
- package/python/tests/gripper/test_definition.py +0 -30
- package/python/tests/gripper/test_load.py +0 -16
- package/python/tests/labware/__init__.py +0 -13
- package/python/tests/labware/test_typechecks.py +0 -21
- package/python/tests/module/__init__.py +0 -20
- package/python/tests/module/test_load.py +0 -49
- package/python/tests/module/test_typechecks.py +0 -34
- package/python/tests/pipette/__init__.py +0 -0
- package/python/tests/pipette/test_load_data.py +0 -103
- package/python/tests/pipette/test_mutable_configurations.py +0 -266
- package/python/tests/pipette/test_pipette_definition.py +0 -183
- package/python/tests/pipette/test_pipette_load_name_conversions.py +0 -222
- package/python/tests/pipette/test_typechecks.py +0 -50
- package/python/tests/pipette/test_validate_schema.py +0 -37
- package/python/tests/protocol/__init__.py +0 -15
- package/python/tests/protocol/test_protocol_schema_v6.py +0 -107
- package/python/tests/protocol/test_protocol_schema_v7.py +0 -34
- package/python/tests/protocol/test_protocol_schema_v8.py +0 -20
- package/python/tests/protocol/test_typechecks.py +0 -36
- package/python/tests/robot/__init__.py +0 -0
- package/python/tests/robot/test_typechecks.py +0 -20
|
@@ -1,261 +0,0 @@
|
|
|
1
|
-
import json
|
|
2
|
-
import os
|
|
3
|
-
|
|
4
|
-
from typing import Dict, Any, Union, Optional, List
|
|
5
|
-
from typing_extensions import Literal
|
|
6
|
-
from functools import lru_cache
|
|
7
|
-
|
|
8
|
-
from .. import load_shared_data, get_shared_data_root
|
|
9
|
-
|
|
10
|
-
from .pipette_definition import (
|
|
11
|
-
PipetteConfigurations,
|
|
12
|
-
PipetteLiquidPropertiesDefinition,
|
|
13
|
-
)
|
|
14
|
-
from .model_constants import MOUNT_CONFIG_LOOKUP_TABLE, _MAP_KEY_TO_V2
|
|
15
|
-
from .types import (
|
|
16
|
-
PipetteChannelType,
|
|
17
|
-
PipetteModelType,
|
|
18
|
-
PipetteGenerationType,
|
|
19
|
-
PipetteVersionType,
|
|
20
|
-
PipetteModelMajorVersion,
|
|
21
|
-
PipetteModelMinorVersion,
|
|
22
|
-
LiquidClasses,
|
|
23
|
-
)
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
LoadedConfiguration = Dict[str, Union[str, Dict[str, Any]]]
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
def _get_configuration_dictionary(
|
|
30
|
-
config_type: Literal["general", "geometry", "liquid"],
|
|
31
|
-
channels: PipetteChannelType,
|
|
32
|
-
model: PipetteModelType,
|
|
33
|
-
version: PipetteVersionType,
|
|
34
|
-
liquid_class: Optional[LiquidClasses] = None,
|
|
35
|
-
) -> LoadedConfiguration:
|
|
36
|
-
if liquid_class:
|
|
37
|
-
config_path = (
|
|
38
|
-
get_shared_data_root()
|
|
39
|
-
/ "pipette"
|
|
40
|
-
/ "definitions"
|
|
41
|
-
/ "2"
|
|
42
|
-
/ config_type
|
|
43
|
-
/ channels.name.lower()
|
|
44
|
-
/ model.value
|
|
45
|
-
/ liquid_class.name
|
|
46
|
-
/ f"{version.major}_{version.minor}.json"
|
|
47
|
-
)
|
|
48
|
-
else:
|
|
49
|
-
config_path = (
|
|
50
|
-
get_shared_data_root()
|
|
51
|
-
/ "pipette"
|
|
52
|
-
/ "definitions"
|
|
53
|
-
/ "2"
|
|
54
|
-
/ config_type
|
|
55
|
-
/ channels.name.lower()
|
|
56
|
-
/ model.value
|
|
57
|
-
/ f"{version.major}_{version.minor}.json"
|
|
58
|
-
)
|
|
59
|
-
return json.loads(load_shared_data(config_path))
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
@lru_cache(maxsize=None)
|
|
63
|
-
def _geometry(
|
|
64
|
-
channels: PipetteChannelType,
|
|
65
|
-
model: PipetteModelType,
|
|
66
|
-
version: PipetteVersionType,
|
|
67
|
-
) -> LoadedConfiguration:
|
|
68
|
-
return _get_configuration_dictionary("geometry", channels, model, version)
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
@lru_cache(maxsize=None)
|
|
72
|
-
def _liquid(
|
|
73
|
-
channels: PipetteChannelType,
|
|
74
|
-
model: PipetteModelType,
|
|
75
|
-
version: PipetteVersionType,
|
|
76
|
-
) -> Dict[str, LoadedConfiguration]:
|
|
77
|
-
liquid_dict = {}
|
|
78
|
-
for liquid_class in LiquidClasses:
|
|
79
|
-
try:
|
|
80
|
-
liquid_dict[liquid_class.name] = _get_configuration_dictionary(
|
|
81
|
-
"liquid", channels, model, version, liquid_class
|
|
82
|
-
)
|
|
83
|
-
except FileNotFoundError:
|
|
84
|
-
continue
|
|
85
|
-
|
|
86
|
-
return liquid_dict
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
@lru_cache(maxsize=None)
|
|
90
|
-
def _physical(
|
|
91
|
-
channels: PipetteChannelType,
|
|
92
|
-
model: PipetteModelType,
|
|
93
|
-
version: PipetteVersionType,
|
|
94
|
-
) -> LoadedConfiguration:
|
|
95
|
-
return _get_configuration_dictionary("general", channels, model, version)
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
@lru_cache(maxsize=None)
|
|
99
|
-
def load_serial_lookup_table() -> Dict[str, str]:
|
|
100
|
-
"""Load a serial abbreviation lookup table mapped to model name."""
|
|
101
|
-
config_path = get_shared_data_root() / "pipette" / "definitions" / "2" / "general"
|
|
102
|
-
_lookup_table = {}
|
|
103
|
-
_channel_shorthand = {
|
|
104
|
-
"eight_channel": "M",
|
|
105
|
-
"single_channel": "S",
|
|
106
|
-
"ninety_six_channel": "H",
|
|
107
|
-
}
|
|
108
|
-
_channel_model_str = {
|
|
109
|
-
"single_channel": "single",
|
|
110
|
-
"ninety_six_channel": "96",
|
|
111
|
-
"eight_channel": "multi",
|
|
112
|
-
}
|
|
113
|
-
_model_shorthand = {"p1000": "p1k", "p300": "p3h"}
|
|
114
|
-
for channel_dir in os.listdir(config_path):
|
|
115
|
-
for model_dir in os.listdir(config_path / channel_dir):
|
|
116
|
-
for version_file in os.listdir(config_path / channel_dir / model_dir):
|
|
117
|
-
version_list = version_file.split(".json")[0].split("_")
|
|
118
|
-
built_model = f"{model_dir}_{_channel_model_str[channel_dir]}_v{version_list[0]}.{version_list[1]}"
|
|
119
|
-
|
|
120
|
-
model_shorthand = _model_shorthand.get(model_dir, model_dir)
|
|
121
|
-
|
|
122
|
-
if (
|
|
123
|
-
model_dir == "p300"
|
|
124
|
-
and int(version_list[0]) == 1
|
|
125
|
-
and int(version_list[1]) == 0
|
|
126
|
-
):
|
|
127
|
-
# Well apparently, we decided to switch the shorthand of the p300 depending
|
|
128
|
-
# on whether it's a "V1" model or not...so...here is the lovely workaround.
|
|
129
|
-
model_shorthand = model_dir
|
|
130
|
-
serial_shorthand = f"{model_shorthand.upper()}{_channel_shorthand[channel_dir]}V{version_list[0]}{version_list[1]}"
|
|
131
|
-
_lookup_table[serial_shorthand] = built_model
|
|
132
|
-
return _lookup_table
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
def load_liquid_model(
|
|
136
|
-
model: PipetteModelType,
|
|
137
|
-
channels: PipetteChannelType,
|
|
138
|
-
version: PipetteVersionType,
|
|
139
|
-
) -> Dict[str, PipetteLiquidPropertiesDefinition]:
|
|
140
|
-
liquid_dict = _liquid(channels, model, version)
|
|
141
|
-
return {
|
|
142
|
-
k: PipetteLiquidPropertiesDefinition.parse_obj(v)
|
|
143
|
-
for k, v in liquid_dict.items()
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
def _change_to_camel_case(c: str) -> str:
|
|
148
|
-
# Tiny helper function to convert to camelCase.
|
|
149
|
-
config_name = c.split("_")
|
|
150
|
-
if len(config_name) == 1:
|
|
151
|
-
return config_name[0]
|
|
152
|
-
return f"{config_name[0]}" + "".join(s.capitalize() for s in config_name[1::])
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
def _edit_non_quirk_with_lc_override(
|
|
156
|
-
mutable_config_key: str,
|
|
157
|
-
new_mutable_value: Any,
|
|
158
|
-
base_dict: Dict[str, Any],
|
|
159
|
-
liquid_class: Optional[LiquidClasses],
|
|
160
|
-
) -> None:
|
|
161
|
-
def _do_edit_non_quirk(
|
|
162
|
-
new_value: Any, existing: Dict[Any, Any], keypath: List[Any]
|
|
163
|
-
) -> None:
|
|
164
|
-
thiskey: Any = keypath[0]
|
|
165
|
-
if thiskey in [lc.name for lc in LiquidClasses]:
|
|
166
|
-
if liquid_class:
|
|
167
|
-
thiskey = liquid_class
|
|
168
|
-
else:
|
|
169
|
-
thiskey = LiquidClasses[thiskey]
|
|
170
|
-
if len(keypath) > 1:
|
|
171
|
-
restkeys = keypath[1:]
|
|
172
|
-
if thiskey == "##EACHTIP##":
|
|
173
|
-
for key in existing.keys():
|
|
174
|
-
_do_edit_non_quirk(new_value, existing[key], restkeys)
|
|
175
|
-
else:
|
|
176
|
-
_do_edit_non_quirk(new_value, existing[thiskey], restkeys)
|
|
177
|
-
else:
|
|
178
|
-
# This was the last key
|
|
179
|
-
if thiskey == "##EACHTIP##":
|
|
180
|
-
for key in existing.keys():
|
|
181
|
-
existing[key] = new_value
|
|
182
|
-
else:
|
|
183
|
-
existing[thiskey] = new_value
|
|
184
|
-
|
|
185
|
-
new_names = _MAP_KEY_TO_V2[mutable_config_key]
|
|
186
|
-
_do_edit_non_quirk(new_mutable_value, base_dict, new_names)
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
def update_pipette_configuration(
|
|
190
|
-
base_configurations: PipetteConfigurations,
|
|
191
|
-
v1_configuration_changes: Dict[str, Any],
|
|
192
|
-
liquid_class: Optional[LiquidClasses] = None,
|
|
193
|
-
) -> PipetteConfigurations:
|
|
194
|
-
"""Helper function to update 'V1' format configurations (left over from PipetteDict).
|
|
195
|
-
|
|
196
|
-
#TODO (lc 7-14-2023) Remove once the pipette config dict is eliminated.
|
|
197
|
-
Given an input of v1 mutable configs, look up the equivalent keyed
|
|
198
|
-
value of that configuration."""
|
|
199
|
-
quirks_list = []
|
|
200
|
-
dict_of_base_model = base_configurations.dict(by_alias=True)
|
|
201
|
-
|
|
202
|
-
for c, v in v1_configuration_changes.items():
|
|
203
|
-
lookup_key = _change_to_camel_case(c)
|
|
204
|
-
if c == "quirks" and isinstance(v, dict):
|
|
205
|
-
quirks_list.extend([b.name for b in v.values() if b.value])
|
|
206
|
-
else:
|
|
207
|
-
_edit_non_quirk_with_lc_override(
|
|
208
|
-
lookup_key, v, dict_of_base_model, liquid_class
|
|
209
|
-
)
|
|
210
|
-
|
|
211
|
-
dict_of_base_model["quirks"] = list(
|
|
212
|
-
set(dict_of_base_model["quirks"]) - set(quirks_list)
|
|
213
|
-
)
|
|
214
|
-
|
|
215
|
-
# re-serialization is not great for this nested enum so we need
|
|
216
|
-
# to perform this workaround.
|
|
217
|
-
if not liquid_class:
|
|
218
|
-
liquid_class = LiquidClasses.default
|
|
219
|
-
dict_of_base_model["liquid_properties"][liquid_class]["supportedTips"] = {
|
|
220
|
-
k.name: v
|
|
221
|
-
for k, v in dict_of_base_model["liquid_properties"][liquid_class][
|
|
222
|
-
"supportedTips"
|
|
223
|
-
].items()
|
|
224
|
-
}
|
|
225
|
-
dict_of_base_model["liquid_properties"] = {
|
|
226
|
-
k.name: v for k, v in dict_of_base_model["liquid_properties"].items()
|
|
227
|
-
}
|
|
228
|
-
dict_of_base_model["plungerPositionsConfigurations"] = {
|
|
229
|
-
k.name: v
|
|
230
|
-
for k, v in dict_of_base_model["plungerPositionsConfigurations"].items()
|
|
231
|
-
}
|
|
232
|
-
return PipetteConfigurations.parse_obj(dict_of_base_model)
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
def load_definition(
|
|
236
|
-
model: PipetteModelType,
|
|
237
|
-
channels: PipetteChannelType,
|
|
238
|
-
version: PipetteVersionType,
|
|
239
|
-
) -> PipetteConfigurations:
|
|
240
|
-
if (
|
|
241
|
-
version.major not in PipetteModelMajorVersion
|
|
242
|
-
or version.minor not in PipetteModelMinorVersion
|
|
243
|
-
):
|
|
244
|
-
raise KeyError("Pipette version not found.")
|
|
245
|
-
|
|
246
|
-
geometry_dict = _geometry(channels, model, version)
|
|
247
|
-
physical_dict = _physical(channels, model, version)
|
|
248
|
-
liquid_dict = _liquid(channels, model, version)
|
|
249
|
-
|
|
250
|
-
generation = PipetteGenerationType(physical_dict["displayCategory"])
|
|
251
|
-
mount_configs = MOUNT_CONFIG_LOOKUP_TABLE[generation][channels]
|
|
252
|
-
|
|
253
|
-
return PipetteConfigurations.parse_obj(
|
|
254
|
-
{
|
|
255
|
-
**geometry_dict,
|
|
256
|
-
**physical_dict,
|
|
257
|
-
"liquid_properties": liquid_dict,
|
|
258
|
-
"version": version,
|
|
259
|
-
"mount_configurations": mount_configs,
|
|
260
|
-
}
|
|
261
|
-
)
|
|
@@ -1,123 +0,0 @@
|
|
|
1
|
-
from typing import Dict, Union, List
|
|
2
|
-
|
|
3
|
-
from .types import (
|
|
4
|
-
Quirks,
|
|
5
|
-
RobotMountConfigs,
|
|
6
|
-
AvailableUnits,
|
|
7
|
-
PipetteGenerationType,
|
|
8
|
-
PipetteChannelType,
|
|
9
|
-
)
|
|
10
|
-
|
|
11
|
-
MOUNT_CONFIG_LOOKUP_TABLE = {
|
|
12
|
-
PipetteGenerationType.GEN1: {
|
|
13
|
-
PipetteChannelType.SINGLE_CHANNEL: RobotMountConfigs(768, 220, 30),
|
|
14
|
-
PipetteChannelType.EIGHT_CHANNEL: RobotMountConfigs(768, 220, 30),
|
|
15
|
-
},
|
|
16
|
-
PipetteGenerationType.GEN2: {
|
|
17
|
-
PipetteChannelType.SINGLE_CHANNEL: RobotMountConfigs(3200, 172.15, 60),
|
|
18
|
-
PipetteChannelType.EIGHT_CHANNEL: RobotMountConfigs(3200, 155.75, 60),
|
|
19
|
-
},
|
|
20
|
-
PipetteGenerationType.FLEX: {
|
|
21
|
-
PipetteChannelType.SINGLE_CHANNEL: RobotMountConfigs(2133.33, 230.15, 80),
|
|
22
|
-
PipetteChannelType.EIGHT_CHANNEL: RobotMountConfigs(2133.33, 230.15, 80),
|
|
23
|
-
PipetteChannelType.NINETY_SIX_CHANNEL: RobotMountConfigs(2133.33, 230.15, 80),
|
|
24
|
-
},
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
VALID_QUIRKS = [q.value for q in Quirks]
|
|
29
|
-
MUTABLE_CONFIGS_V1 = [
|
|
30
|
-
"top",
|
|
31
|
-
"bottom",
|
|
32
|
-
"blowout",
|
|
33
|
-
"dropTip",
|
|
34
|
-
"pickUpCurrent",
|
|
35
|
-
"pickUpDistance",
|
|
36
|
-
"pickUpIncrement",
|
|
37
|
-
"pickUpPresses",
|
|
38
|
-
"pickUpSpeed",
|
|
39
|
-
"plungerCurrent",
|
|
40
|
-
"dropTipCurrent",
|
|
41
|
-
"dropTipSpeed",
|
|
42
|
-
"tipLength",
|
|
43
|
-
"quirks",
|
|
44
|
-
]
|
|
45
|
-
|
|
46
|
-
# Version 2 Configuration Keys.
|
|
47
|
-
MUTABLE_CONFIGS_V2 = [
|
|
48
|
-
"plungerPositionsConfigurations",
|
|
49
|
-
"pickUpTipConfigurations",
|
|
50
|
-
"dropTipConfigurations",
|
|
51
|
-
"plungerMotorConfigurations",
|
|
52
|
-
"tipLength",
|
|
53
|
-
]
|
|
54
|
-
|
|
55
|
-
RESTRICTED_MUTABLE_CONFIG_KEYS = [*VALID_QUIRKS, "model"]
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
_MAP_KEY_TO_V2: Dict[str, List[str]] = {
|
|
59
|
-
"top": ["plungerPositionsConfigurations", "default", "top"],
|
|
60
|
-
"bottom": ["plungerPositionsConfigurations", "default", "bottom"],
|
|
61
|
-
"blowout": ["plungerPositionsConfigurations", "default", "blowout"],
|
|
62
|
-
"dropTip": ["plungerPositionsConfigurations", "default", "drop"],
|
|
63
|
-
"pickUpCurrent": ["pickUpTipConfigurations", "pressFit", "currentByTipCount"],
|
|
64
|
-
"pickUpDistance": ["pickUpTipConfigurations", "pressFit", "distance"],
|
|
65
|
-
"pickUpIncrement": ["pickUpTipConfigurations", "pressFit", "increment"],
|
|
66
|
-
"pickUpPresses": ["pickUpTipConfigurations", "pressFit", "presses"],
|
|
67
|
-
"pickUpSpeed": ["pickUpTipConfigurations", "pressFit", "speed"],
|
|
68
|
-
"plungerCurrent": ["plungerMotorConfigurations", "run"],
|
|
69
|
-
"dropTipCurrent": ["dropTipConfigurations", "plungerEject", "current"],
|
|
70
|
-
"dropTipSpeed": ["dropTipConfigurations", "plungerEject", "speed"],
|
|
71
|
-
"maxVolume": ["liquid_properties", "default", "maxVolume"],
|
|
72
|
-
"minVolume": ["liquid_properties", "default", "minVolume"],
|
|
73
|
-
"tipLength": [
|
|
74
|
-
"liquid_properties",
|
|
75
|
-
"default",
|
|
76
|
-
"supportedTips",
|
|
77
|
-
"##EACHTIP##",
|
|
78
|
-
"defaultTipLength",
|
|
79
|
-
],
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
_MIN_MAX_LOOKUP: Dict[str, Dict[str, Union[int, float]]] = {
|
|
84
|
-
"current": {"min": 0.1, "max": 2.0},
|
|
85
|
-
"run": {"min": 0.1, "max": 2.0},
|
|
86
|
-
"speed": {"min": 0.01, "max": 30},
|
|
87
|
-
"top": {"min": -20, "max": 30},
|
|
88
|
-
"bottom": {"min": -20, "max": 30},
|
|
89
|
-
"blowout": {"min": -20, "max": 30},
|
|
90
|
-
"drop": {"min": -20, "max": 30},
|
|
91
|
-
"presses": {"min": 0, "max": 15},
|
|
92
|
-
"increment": {"min": 0, "max": 10},
|
|
93
|
-
"distance": {"min": 0, "max": 10},
|
|
94
|
-
"defaultTipLength": {"min": 0, "max": 100},
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
_TYPE_LOOKUP: Dict[str, str] = {
|
|
98
|
-
"current": "float",
|
|
99
|
-
"run": "float",
|
|
100
|
-
"speed": "float",
|
|
101
|
-
"top": "float",
|
|
102
|
-
"bottom": "float",
|
|
103
|
-
"blowout": "float",
|
|
104
|
-
"drop": "float",
|
|
105
|
-
"presses": "int",
|
|
106
|
-
"increment": "int",
|
|
107
|
-
"defaultTipLength": "float",
|
|
108
|
-
"distance": "float",
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
_UNITS_LOOKUP = {
|
|
112
|
-
"current": AvailableUnits.amps,
|
|
113
|
-
"run": AvailableUnits.amps,
|
|
114
|
-
"speed": AvailableUnits.speed,
|
|
115
|
-
"top": AvailableUnits.mm,
|
|
116
|
-
"bottom": AvailableUnits.mm,
|
|
117
|
-
"blowout": AvailableUnits.mm,
|
|
118
|
-
"drop": AvailableUnits.mm,
|
|
119
|
-
"presses": AvailableUnits.presses,
|
|
120
|
-
"increment": AvailableUnits.mm,
|
|
121
|
-
"defaultTipLength": AvailableUnits.mm,
|
|
122
|
-
"distance": AvailableUnits.mm,
|
|
123
|
-
}
|