diff --git a/.github/workflows/start-internal-release-ot2-build.yaml b/.github/workflows/start-internal-release-ot2-build.yaml new file mode 100644 index 00000000000..a6f6ed0f3d3 --- /dev/null +++ b/.github/workflows/start-internal-release-ot2-build.yaml @@ -0,0 +1,59 @@ +name: 'Start Internal-Release OT-2 build' +on: + push: + branches: + - edge + - '*internal-release*' + tags: + - ot3@* + pull_request: + types: + - opened + - synchronize + - labeled + +jobs: + handle-push: + runs-on: 'ubuntu-latest' + if: github.event_name == 'push' + name: "Start an OT-2 build for a branch/tag push" + steps: + - name: 'start build' + uses: octokit/request-action@v2.x + env: + GITHUB_TOKEN: ${{ secrets.OT2_BUILD_CROSSREPO_ACCESS }} + with: + route: POST /repos/{owner}/{repo}/actions/workflows/{workflow-id}/dispatches + owner: opentrons + repo: buildroot + workflow-id: build.yml + ref: opentrons-develop + inputs: | + { + "buildroot-ref": "-", + "monorepo-ref": "${{ github.ref }}", + "infra-stage": "stage-prod" + } + + + handle-pr: + runs-on: 'ubuntu-latest' + if: github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name == 'Opentrons/opentrons' && contains(github.event.pull_request.labels.*.name, 'ot2-build') + name: "Start an OT-2 build for a requested PR" + steps: + - name: 'start build' + uses: octokit/request-action@v2.x + env: + GITHUB_TOKEN: ${{ secrets.OT2_BUILD_CROSSREPO_ACCESS }} + with: + route: POST /repos/{owner}/{repo}/actions/workflows/{workflow-id}/dispatches + owner: opentrons + repo: buildroot + workflow-id: build.yml + ref: opentrons-develop + inputs: | + { + "buildroot-ref": "-", + "monorepo-ref": "refs/heads/${{ github.head_ref }}", + "infra-stage": "stage-prod" + } diff --git a/.github/workflows/start-ot3-build.yaml b/.github/workflows/start-internal-release-ot3-build.yaml similarity index 94% rename from .github/workflows/start-ot3-build.yaml rename to .github/workflows/start-internal-release-ot3-build.yaml index 8f17c65d806..a568a3d0af9 100644 --- a/.github/workflows/start-ot3-build.yaml +++ b/.github/workflows/start-internal-release-ot3-build.yaml @@ -1,13 +1,10 @@ -name: 'Start OT-3 build' +name: 'Start Internal-Release OT-3 build' on: push: branches: - edge - - chore_bump-* - - chore_release-* - - release* + - '*internal-release*' tags: - - v* - ot3@* pull_request: types: diff --git a/api-client/src/instruments/__fixtures__/index.ts b/api-client/src/instruments/__fixtures__/index.ts index c4e514befd7..10e3753a885 100644 --- a/api-client/src/instruments/__fixtures__/index.ts +++ b/api-client/src/instruments/__fixtures__/index.ts @@ -22,6 +22,8 @@ export const instrumentsResponseFixture = { cursor: 0, totalLength: 1, }, + ok: true, + subsystem: 'gripper', }, ], } diff --git a/api-client/src/instruments/types.ts b/api-client/src/instruments/types.ts index c17500bd02f..0fb6d374ec9 100644 --- a/api-client/src/instruments/types.ts +++ b/api-client/src/instruments/types.ts @@ -8,6 +8,7 @@ export interface GripperData { last_modified?: string } } + firmwareVersion?: string instrumentModel: string instrumentType: 'gripper' mount: string @@ -26,6 +27,7 @@ export interface PipetteData { last_modified?: string } } + firmwareVersion?: string instrumentName: string instrumentModel: string instrumentType: 'pipette' diff --git a/api/docs/static/override_sphinx.css b/api/docs/static/override_sphinx.css index 9e670ae1c33..61f9514e6ea 100644 --- a/api/docs/static/override_sphinx.css +++ b/api/docs/static/override_sphinx.css @@ -168,7 +168,6 @@ ul { ul ul { list-style-type: circle; margin-left: 30px; - color: #999; font-family: "Open Sans", "sans-serif"; } @@ -197,3 +196,22 @@ table.docutils.field-list { margin-left: 0; padding-left: 30px; } + +/* Adjustments to Note and Warning admonitions */ +div.admonition { + padding-top: 20px; +} + +div.admonition p.admonition-title { + font-size: 18px; +} + +div.note { + background-color: #d9e9fe; + border: none; +} + +div.warning { + background-color: #f7e0e0; + border: none; +} diff --git a/api/docs/v2/new_modules.rst b/api/docs/v2/new_modules.rst index aa7ca259b1f..21bc67c4b95 100644 --- a/api/docs/v2/new_modules.rst +++ b/api/docs/v2/new_modules.rst @@ -37,7 +37,7 @@ When you load a module in a protocol, you inform the OT-2 that you want the spec .. versionadded:: 2.0 -.. _available_modules +.. _available_modules: Available Modules ----------------- diff --git a/api/docs/v2/new_protocol_api.rst b/api/docs/v2/new_protocol_api.rst index 01b91764073..0856cf6c5c7 100644 --- a/api/docs/v2/new_protocol_api.rst +++ b/api/docs/v2/new_protocol_api.rst @@ -42,9 +42,14 @@ Labware and Wells Modules ------- -.. autoclass:: opentrons.protocol_api.TemperatureModuleContext +.. autoclass:: opentrons.protocol_api.HeaterShakerContext :members: - :exclude-members: start_set_temperature, await_temperature, broker, geometry, load_labware_object + :exclude-members: broker, geometry, load_labware_object + :inherited-members: + +.. autoclass:: opentrons.protocol_api.MagneticBlockContext + :members: + :exclude-members: broker, geometry, load_labware_object :inherited-members: .. autoclass:: opentrons.protocol_api.MagneticModuleContext @@ -52,16 +57,16 @@ Modules :exclude-members: calibrate, broker, geometry, load_labware_object :inherited-members: +.. autoclass:: opentrons.protocol_api.TemperatureModuleContext + :members: + :exclude-members: start_set_temperature, await_temperature, broker, geometry, load_labware_object + :inherited-members: + .. autoclass:: opentrons.protocol_api.ThermocyclerContext :members: :exclude-members: total_step_count, current_cycle_index, total_cycle_count, hold_time, ramp_rate, current_step_index, broker, geometry, load_labware_object :inherited-members: -.. autoclass:: opentrons.protocol_api.HeaterShakerContext - :members: - :exclude-members: broker, geometry, load_labware_object - :inherited-members: - .. _protocol-api-types: diff --git a/api/release-notes-internal.md b/api/release-notes-internal.md index 6281a750f9c..3eca3018e4b 100644 --- a/api/release-notes-internal.md +++ b/api/release-notes-internal.md @@ -20,11 +20,13 @@ For more details about this release, please see the full [technical change log][ - The ODD should prompt you to update your pipettes when you attach one that needs it (!) - The 96 shouldn't fall down when you attach it now (!) - More little stall detection fixes +- The ODD will now display a spinner until the robot server has started +- Homing now goes to the limit switch then backs off until the limit switch is released +- Support for PVT (v3.5) pipettes ## Big Things That Don't Work Yet So Don't Report Bugs About Them ### ODD -- The ODD doesn't really tell you if the robot server hasn't started yet; if a robot looks on but has the name "opentrons", or says it's not network-connected when you know it is, probably the server isn't up yet, give it another little bit - It can take a while for the robot to start after installing an update (it's the firmware updates happening on boot). Allow 10 minutes after an update that has a firmware change. ### Robot Control @@ -33,7 +35,7 @@ For more details about this release, please see the full [technical change log][ ## Big Things That Do Work Please Do Report Bugs About Them ### Robot Control -- Liquid handling protocols with 1 and 8 channel pipettes +- Protocol behavior - Labware movement between slots/modules, both manual and with gripper, from python protocols - Labware drop/gripper crash errors, but they're very insensitive - Pipette and gripper automated offset calibration @@ -41,6 +43,7 @@ For more details about this release, please see the full [technical change log][ - Firmware update for all devices - Cancelling a protocol run. We're even more sure we fixed this so definitely tell us if it's not. - USB connectivity +- Stall detection firing basically ever unless you clearly ran into something ### ODD - Protocol execution including end-of-protocol screen diff --git a/api/src/opentrons/config/advanced_settings.py b/api/src/opentrons/config/advanced_settings.py index 42734d4e443..c6056c15c57 100644 --- a/api/src/opentrons/config/advanced_settings.py +++ b/api/src/opentrons/config/advanced_settings.py @@ -193,7 +193,10 @@ class Setting(NamedTuple): ), ] -if ARCHITECTURE == SystemArchitecture.BUILDROOT: +if ( + ARCHITECTURE == SystemArchitecture.BUILDROOT + or ARCHITECTURE == SystemArchitecture.YOCTO +): settings.append(DisableLogIntegrationSettingDefinition()) diff --git a/api/src/opentrons/config/defaults_ot3.py b/api/src/opentrons/config/defaults_ot3.py index 80b04538f67..ddf65b5331f 100644 --- a/api/src/opentrons/config/defaults_ot3.py +++ b/api/src/opentrons/config/defaults_ot3.py @@ -81,16 +81,16 @@ DEFAULT_MAX_SPEEDS: Final[ByGantryLoad[Dict[OT3AxisKind, float]]] = ByGantryLoad( high_throughput={ - OT3AxisKind.X: 400, - OT3AxisKind.Y: 325, + OT3AxisKind.X: 350, + OT3AxisKind.Y: 300, OT3AxisKind.Z: 35, OT3AxisKind.P: 15, OT3AxisKind.Z_G: 50, OT3AxisKind.Q: 5.5, }, low_throughput={ - OT3AxisKind.X: 400, - OT3AxisKind.Y: 325, + OT3AxisKind.X: 350, + OT3AxisKind.Y: 300, OT3AxisKind.Z: 100, OT3AxisKind.P: 70, OT3AxisKind.Z_G: 50, @@ -99,8 +99,8 @@ DEFAULT_ACCELERATIONS: Final[ByGantryLoad[Dict[OT3AxisKind, float]]] = ByGantryLoad( high_throughput={ - OT3AxisKind.X: 800, - OT3AxisKind.Y: 500, + OT3AxisKind.X: 700, + OT3AxisKind.Y: 600, OT3AxisKind.Z: 150, OT3AxisKind.P: 30, OT3AxisKind.Z_G: 150, @@ -184,7 +184,7 @@ }, low_throughput={ OT3AxisKind.X: 1.25, - OT3AxisKind.Y: 1.25, + OT3AxisKind.Y: 1.2, OT3AxisKind.Z: 1.0, # TODO: verify this value OT3AxisKind.P: 1.0, diff --git a/api/src/opentrons/config/pipette_config.py b/api/src/opentrons/config/pipette_config.py deleted file mode 100644 index d4bd4ce1750..00000000000 --- a/api/src/opentrons/config/pipette_config.py +++ /dev/null @@ -1,466 +0,0 @@ -from __future__ import annotations -from dataclasses import dataclass -import logging -import json -import numbers -from typing import Any, Dict, List, Mapping, Optional, Union, Tuple, Sequence, cast - -from opentrons import config -from opentrons.config import feature_flags as ff -from opentrons_shared_data.pipette import model_config, name_config, fuse_specs -from opentrons_shared_data.pipette.dev_types import ( - PipetteName, - PipetteModel, - PipetteModelSpec, - UlPerMm, - Quirk, - PipetteFusedSpec, - LabwareUri, -) - -log = logging.getLogger(__name__) - - -@dataclass(frozen=True) -class PipetteConfig: - top: float - bottom: float - blow_out: float - drop_tip: float - pick_up_current: float - pick_up_distance: float - pick_up_increment: float - pick_up_presses: int - pick_up_speed: float - aspirate_flow_rate: float - dispense_flow_rate: float - channels: int - nozzle_offset: Tuple[float, float, float] - plunger_current: float - drop_tip_current: float - drop_tip_speed: float - min_volume: float - max_volume: float - ul_per_mm: UlPerMm - quirks: List[Quirk] - tip_length: float # TODO(seth): remove - # TODO: Replace entirely with tip length calibration - tip_overlap: Dict[str, float] - display_name: str - name: PipetteName - back_compat_names: List[PipetteName] - return_tip_height: float - blow_out_flow_rate: float - max_travel: float - home_position: float - steps_per_mm: float - idle_current: float - default_blow_out_flow_rates: Dict[str, float] - default_aspirate_flow_rates: Dict[str, float] - default_dispense_flow_rates: Dict[str, float] - model: PipetteModel - default_tipracks: List[LabwareUri] - - -# Notes: -# - multi-channel pipettes share the same dimensional offsets -# - single-channel pipettes have different lengths -# - Default number of seconds to aspirate/dispense a pipette's full volume, -# and these times were chosen to mimic normal human-pipetting motions. -# However, accurate speeds are dependent on environment (ex: liquid -# viscosity), therefore a pipette's flow-rates (ul/sec) should be set by -# protocol writer - -# Multi-channel y offset caluclations: -DISTANCE_BETWEEN_NOZZLES = 9 -NUM_MULTI_CHANNEL_NOZZLES = 8 -MULTI_LENGTH = (NUM_MULTI_CHANNEL_NOZZLES - 1) * DISTANCE_BETWEEN_NOZZLES -Y_OFFSET_MULTI = MULTI_LENGTH / 2 -Z_OFFSET_MULTI = -25.8 - -Z_OFFSET_P10 = -13 # longest single-channel pipette -Z_OFFSET_P50 = 0 -Z_OFFSET_P300 = 0 -Z_OFFSET_P1000 = 20 # shortest single-channel pipette - -NOZZLE_OFFSET_DEFAULT = [0.0, 0.0, 0.0] - -LOW_CURRENT_DEFAULT = 0.05 - -config_models = list(model_config()["config"].keys()) -config_names = list(name_config().keys()) -configs = model_config()["config"] -#: A list of pipette model names for which we have config entries -MUTABLE_CONFIGS = model_config()["mutableConfigs"] -#: A list of mutable configs for pipettes -VALID_QUIRKS = model_config()["validQuirks"] -#: A list of valid quirks for pipettes - - -def load( - pipette_model: PipetteModel, pipette_id: Optional[str] = None -) -> PipetteConfig: - """ - Load pipette config data - - - This function loads from a combination of - - - the pipetteModelSpecs.json file in the wheel (should never be edited) - - the pipetteNameSpecs.json file in the wheel (should never be edited) - - any config overrides found in - ``opentrons.config.CONFIG['pipette_config_overrides_dir']`` - - This function reads from disk each time, so changes to the overrides - will be picked up in subsequent calls. - - :param str pipette_model: The pipette model name (i.e. "p10_single_v1.3") - for which to load configuration - :param pipette_id: An (optional) unique ID for the pipette to locate - config overrides. If the ID is not specified, the system - assumes this is a simulated pipette and does not - save settings. If the ID is specified but no overrides - corresponding to the ID are found, the system creates a - new overrides file for it. - :type pipette_id: str or None - :raises KeyError: if ``pipette_model`` is not in the top-level keys of - the pipetteModelSpecs.json file (and therefore not in - :py:attr:`configs`) - - :returns PipetteConfig: The configuration, loaded and checked - """ - - # Load the model config and update with the name config - cfg = fuse_specs(pipette_model) - - # Load overrides if we have a pipette id - if pipette_id: - try: - override = load_overrides(pipette_id) - if "quirks" in override.keys(): - override["quirks"] = [ - qname for qname, qval in override["quirks"].items() if qval - ] - for legacy_key in ( - "defaultAspirateFlowRate", - "defaultDispenseFlowRate", - "defaultBlowOutFlowRate", - ): - override.pop(legacy_key, None) - - except FileNotFoundError: - save_overrides(pipette_id, {}, pipette_model) - log.info( - "Save defaults for pipette model {} and id {}".format( - pipette_model, pipette_id - ) - ) - else: - cfg.update(override) # type: ignore - - # the ulPerMm functions are structured in pipetteModelSpecs.json as - # a list sorted from oldest to newest. That means the latest functions - # are always the last element and, as of right now, the older ones are - # the first element (for models that only have one function, the first - # and last elements are the same, which is fine). If we add more in the - # future, we’ll have to change this code to select items more - # intelligently - if ff.use_old_aspiration_functions(): - log.debug("Using old aspiration functions") - ul_per_mm = cfg["ulPerMm"][0] - else: - ul_per_mm = cfg["ulPerMm"][-1] - - smoothie_configs = cfg["smoothieConfigs"] - res = PipetteConfig( - top=ensure_value(cfg, "top", MUTABLE_CONFIGS), - bottom=ensure_value(cfg, "bottom", MUTABLE_CONFIGS), - blow_out=ensure_value(cfg, "blowout", MUTABLE_CONFIGS), - drop_tip=ensure_value(cfg, "dropTip", MUTABLE_CONFIGS), - pick_up_current=ensure_value(cfg, "pickUpCurrent", MUTABLE_CONFIGS), - pick_up_distance=ensure_value(cfg, "pickUpDistance", MUTABLE_CONFIGS), - pick_up_increment=ensure_value(cfg, "pickUpIncrement", MUTABLE_CONFIGS), - pick_up_presses=ensure_value(cfg, "pickUpPresses", MUTABLE_CONFIGS), - pick_up_speed=ensure_value(cfg, "pickUpSpeed", MUTABLE_CONFIGS), - aspirate_flow_rate=cfg["defaultAspirateFlowRate"]["value"], - dispense_flow_rate=cfg["defaultDispenseFlowRate"]["value"], - channels=ensure_value(cfg, "channels", MUTABLE_CONFIGS), - nozzle_offset=cfg.get("nozzleOffset", NOZZLE_OFFSET_DEFAULT), # type: ignore - plunger_current=ensure_value(cfg, "plungerCurrent", MUTABLE_CONFIGS), - drop_tip_current=ensure_value(cfg, "dropTipCurrent", MUTABLE_CONFIGS), - drop_tip_speed=ensure_value(cfg, "dropTipSpeed", MUTABLE_CONFIGS), - min_volume=ensure_value(cfg, "minVolume", MUTABLE_CONFIGS), - max_volume=ensure_value(cfg, "maxVolume", MUTABLE_CONFIGS), - ul_per_mm=ul_per_mm, - quirks=validate_quirks(ensure_value(cfg, "quirks", MUTABLE_CONFIGS)), - tip_overlap=cfg["tipOverlap"], - tip_length=ensure_value(cfg, "tipLength", MUTABLE_CONFIGS), - display_name=ensure_value(cfg, "displayName", MUTABLE_CONFIGS), - name=cfg["name"], - back_compat_names=cfg.get("backCompatNames", []), - return_tip_height=cfg.get("returnTipHeight", 0.5), - blow_out_flow_rate=cfg["defaultBlowOutFlowRate"]["value"], - max_travel=smoothie_configs["travelDistance"], - home_position=smoothie_configs["homePosition"], - steps_per_mm=smoothie_configs["stepsPerMM"], - idle_current=cfg.get("idleCurrent", LOW_CURRENT_DEFAULT), - default_blow_out_flow_rates=cfg["defaultBlowOutFlowRate"].get( - "valuesByApiLevel", {"2.0": cfg["defaultBlowOutFlowRate"]["value"]} - ), - default_dispense_flow_rates=cfg["defaultDispenseFlowRate"].get( - "valuesByApiLevel", {"2.0": cfg["defaultDispenseFlowRate"]["value"]} - ), - default_aspirate_flow_rates=cfg["defaultAspirateFlowRate"].get( - "valuesByApiLevel", {"2.0": cfg["defaultAspirateFlowRate"]["value"]} - ), - model=pipette_model, - default_tipracks=cfg["defaultTipracks"], - ) - - return res - - -def piecewise_volume_conversion(ul: float, sequence: List[List[float]]) -> float: - """ - Takes a volume in microliters and a sequence representing a piecewise - function for the slope and y-intercept of a ul/mm function, where each - sub-list in the sequence contains: - - - the max volume for the piece of the function (minimum implied from the - max of the previous item or 0 - - the slope of the segment - - the y-intercept of the segment - - :return: the ul/mm value for the specified volume - """ - # pick the first item from the seq for which the target is less than - # the bracketing element - for x in sequence: - if ul <= x[0]: - # use that element to calculate the movement distance in mm - return x[1] * ul + x[2] - - # Compatibility with previous implementation of search. - # list(filter(lambda x: ul <= x[0], sequence))[0] - raise IndexError() - - -TypeOverrides = Mapping[str, Union[float, bool, None]] - - -def validate_overrides(data: TypeOverrides, config_model: Dict[str, Any]) -> None: - """ - Check that override fields are valid. - - :param data: a dict of field name to value - :param config_model: the configuration for the chosen model - :raises ValueError: If a value is invalid - """ - for key, value in data.items(): - field_config = config_model.get(key) - is_quirk = key in config_model["quirks"] and key in VALID_QUIRKS - - if is_quirk: - # If it's a quirk it must be a bool or None - if value is not None and not isinstance(value, bool): - raise ValueError(f"{value} is invalid for {key}") - elif not field_config: - # If it's not a quirk we must have a field config - raise ValueError(f"Unknown field {key}") - elif value is not None: - # If value is not None it must be numeric and between min and max - if isinstance(value, bool) or not isinstance(value, numbers.Number): - raise ValueError(f"{value} is invalid for {key}") - elif value < field_config["min"] or value > field_config["max"]: - raise ValueError(f"{key} out of range with {value}") - - -def override(pipette_id: str, fields: TypeOverrides) -> None: - """ - Override configuration for pipette. Validate then save. - - :param pipette_id: The pipette id - :param fields: Dict of field name to override value - """ - config_match = list_mutable_configs(pipette_id) - whole_config, model = load_config_dict(pipette_id) - validate_overrides(data=fields, config_model=config_match) - save_overrides(pipette_id, fields, model) - - -def save_overrides( - pipette_id: str, overrides: TypeOverrides, model: PipetteModel -) -> None: - """ - Save overrides for the pipette. - - :param pipette_id: The pipette id - :param overrides: The incoming values - :param model: The model of pipette - :return: None - """ - override_dir = config.CONFIG["pipette_config_overrides_dir"] - model_configs = configs[model] - model_configs_quirks = {key: True for key in model_configs["quirks"]} - try: - existing = load_overrides(pipette_id) - # Add quirks setting for pipettes already with a pipette id file - if "quirks" not in existing.keys(): - existing["quirks"] = model_configs_quirks - except FileNotFoundError: - existing = model_configs_quirks # type: ignore - - for key, value in overrides.items(): - # If an existing override is saved as null from endpoint, remove from - # overrides file - if value is None: - if existing.get(key): - del existing[key] - elif isinstance(value, bool): - existing, model_configs = change_quirks( - {key: value}, - existing, - model_configs, - ) - else: - # type ignores are here because mypy needs typed dict accesses to - # be string literals sadly enough - model_config_value = model_configs[key] # type: ignore - if not model_config_value.get("default"): - model_config_value["default"] = model_config_value["value"] - model_config_value["value"] = value - existing[key] = model_config_value - assert model in config_models - existing["model"] = model - with (override_dir / f"{pipette_id}.json").open("w") as file: - json.dump(existing, file) - - -def change_quirks( - override_quirks: Dict[str, Any], - existing: Dict[str, Any], - model_configs: PipetteModelSpec, -) -> Tuple[Dict[str, Any], PipetteModelSpec]: - if not existing.get("quirks"): - # ensure quirk key exists - existing["quirks"] = override_quirks - for quirk, setting in override_quirks.items(): - # setting values again if above case true, but - # meant for use-cases where we may only be given an update - # for one setting - existing["quirks"][quirk] = setting - if setting not in model_configs["quirks"]: - model_configs["quirks"].append(quirk) # type: ignore[arg-type] - elif not setting: - model_configs["quirks"].remove(quirk) # type: ignore[arg-type] - return existing, model_configs - - -def load_overrides(pipette_id: str) -> Dict[str, Any]: - overrides = config.CONFIG["pipette_config_overrides_dir"] - try: - with (overrides / f"{pipette_id}.json").open() as fi: - return cast(Dict[str, Any], json.load(fi)) - except json.JSONDecodeError as e: - log.warning(f"pipette override for {pipette_id} is corrupt: {e}") - (overrides / f"{pipette_id}.json").unlink() - raise FileNotFoundError(str(overrides / f"{pipette_id}.json")) - - -def validate_quirks(quirks: List[str]) -> List[Quirk]: - valid_quirks: List[Quirk] = [] - for quirk in quirks: - if quirk in VALID_QUIRKS: - valid_quirks.append(Quirk(quirk)) - else: - log.warning(f"{quirk} is not a valid quirk") - return valid_quirks - - -def ensure_value( - config: PipetteFusedSpec, - name: Union[str, Tuple[str, ...]], - mutable_config_list: List[str], -) -> Any: - """ - Pull value of config data from file. Shape can either be a dictionary with - a value key -- indicating that it can be changed -- or another - data structure such as an array. - """ - if not isinstance(name, tuple): - path: Tuple[str, ...] = (name,) - else: - path = name - for element in path[:-1]: - config = config[element] # type: ignore - - value = config[path[-1]] # type: ignore - if path[-1] != "quirks" and path[-1] in mutable_config_list: - value = value["value"] - return value - - -def known_pipettes() -> Sequence[str]: - """List pipette IDs for which we have known overrides""" - return [ - fi.stem - for fi in config.CONFIG["pipette_config_overrides_dir"].iterdir() - if fi.is_file() and ".json" in fi.suffixes - ] - - -def add_default(cfg: Any) -> None: - if isinstance(cfg, dict): - if "value" in cfg.keys(): - cfg["default"] = cfg["value"] - else: - for top_level_key in cfg.keys(): - add_default(cfg[top_level_key]) - - -def load_config_dict(pipette_id: str) -> Tuple["PipetteFusedSpec", "PipetteModel"]: - """Give updated config with overrides for a pipette. This will add - the default value for a mutable config before returning the modified - config value. - """ - override = load_overrides(pipette_id) - model = override["model"] - config = fuse_specs(model) - - if "quirks" not in override.keys(): - override["quirks"] = {key: True for key in config["quirks"]} - else: - # 20210210 AL - There have been bugs that allow settings invalid - # quirks. Sanitize quirks by removing invalid ones that may have - # been saved erroneously. - override["quirks"] = { - key: value - for key, value in override["quirks"].items() - if key in VALID_QUIRKS - } - - for top_level_key in config.keys(): - if top_level_key != "quirks": - add_default(config[top_level_key]) # type: ignore - - config.update(override) # type: ignore - - return config, model - - -def list_mutable_configs(pipette_id: str) -> Dict[str, Any]: - """ - Returns dict of mutable configs only. - """ - cfg: Dict[str, Any] = {} - - try: - config, model = load_config_dict(pipette_id) - except FileNotFoundError: - log.info(f"Pipette id {pipette_id} not found") - return cfg - - for key in config: - if key in MUTABLE_CONFIGS: - cfg[key] = config[key] # type: ignore - return cfg diff --git a/api/src/opentrons/hardware_control/api.py b/api/src/opentrons/hardware_control/api.py index f119098a74e..9c5bd691ac3 100644 --- a/api/src/opentrons/hardware_control/api.py +++ b/api/src/opentrons/hardware_control/api.py @@ -20,7 +20,9 @@ cast, ) -from opentrons_shared_data.pipette import name_config +from opentrons_shared_data.pipette import ( + pipette_load_name_conversions as pipette_load_name, +) from opentrons_shared_data.pipette.dev_types import PipetteName from opentrons_shared_data.robot.dev_types import RobotType from opentrons import types as top_types @@ -409,11 +411,10 @@ async def cache_instruments( self._log.info("Updating instrument model cache") checked_require = require or {} for mount, name in checked_require.items(): - if name not in name_config(): + if not pipette_load_name.supported_pipette(name): raise RuntimeError(f"{name} is not a valid pipette name") async with self._motion_lock: found = await self._backend.get_attached_instruments(checked_require) - for mount, instrument_data in found.items(): config = instrument_data.get("config") req_instr = checked_require.get(mount, None) @@ -428,7 +429,10 @@ async def cache_instruments( ) self._attached_instruments[mount] = p if req_instr and p: - p.act_as(req_instr) + converted_name = pipette_load_name.convert_to_pipette_name_type( + req_instr + ) + p.act_as(converted_name) if may_skip: self._log.info(f"Skipping configuration on {mount.name}") @@ -557,14 +561,16 @@ async def _do_plunger_home( await stack.enter_async_context(self._motion_lock) with self._backend.save_current(): self._backend.set_active_current( - {checked_axis: instr.config.plunger_current} + {checked_axis: instr.plunger_motor_current.run} ) await self._backend.home([ot2_axis_to_string(checked_axis)]) # either we were passed False for our acquire_lock and we # should pass it on, or we acquired the lock above and # shouldn't do it again target_pos = target_position_from_plunger( - checked_mount, instr.config.bottom, self._current_position + checked_mount, + instr.plunger_positions.bottom, + self._current_position, ) await self._move( target_pos, @@ -929,7 +935,7 @@ async def prepare_for_aspirate( speed = self.plunger_speed( instrument, instrument.blow_out_flow_rate, "aspirate" ) - bottom = instrument.config.bottom + bottom = instrument.plunger_positions.bottom target = target_position_from_plunger(mount, bottom, self._current_position) await self._move( target, diff --git a/api/src/opentrons/hardware_control/backends/controller.py b/api/src/opentrons/hardware_control/backends/controller.py index 47c04cc0675..f3e73ecbea7 100644 --- a/api/src/opentrons/hardware_control/backends/controller.py +++ b/api/src/opentrons/hardware_control/backends/controller.py @@ -13,6 +13,7 @@ TYPE_CHECKING, Union, Sequence, + cast, ) from typing_extensions import Final @@ -21,10 +22,15 @@ except (OSError, ModuleNotFoundError): aionotify = None +from opentrons_shared_data.pipette import ( + pipette_load_name_conversions as pipette_load_name, + mutable_configurations, +) +from opentrons_shared_data.pipette.dev_types import PipetteName + from opentrons.drivers.smoothie_drivers import SmoothieDriver from opentrons.drivers.rpi_drivers import build_gpio_chardev import opentrons.config -from opentrons.config import pipette_config from opentrons.config.types import RobotConfig from opentrons.types import Mount @@ -33,7 +39,7 @@ from ..util import ot2_axis_to_string if TYPE_CHECKING: - from opentrons_shared_data.pipette.dev_types import PipetteModel, PipetteName + from opentrons_shared_data.pipette.dev_types import PipetteModel from ..dev_types import ( AttachedPipette, AttachedInstruments, @@ -180,7 +186,7 @@ async def _query_mount( ] = await self._smoothie_driver.read_pipette_model( # type: ignore mount.name.lower() ) - if found_model and found_model not in pipette_config.config_models: + if found_model and not pipette_load_name.supported_pipette(found_model): # TODO: Consider how to handle this error - it bubbles up now # and will cause problems at higher levels MODULE_LOG.error(f"Bad model on {mount.name}: {found_model}") @@ -188,14 +194,25 @@ async def _query_mount( found_id = await self._smoothie_driver.read_pipette_id(mount.name.lower()) if found_model: - config = pipette_config.load(found_model, found_id) + path_to_overrides = opentrons.config.get_opentrons_path( + "pipette_config_overrides_dir" + ) + converted_found_model = pipette_load_name.convert_pipette_model(found_model) + converted_found_name = pipette_load_name.convert_to_pipette_name_type( + found_model + ) + config = mutable_configurations.load_with_mutable_configurations( + converted_found_model, path_to_overrides, found_id + ) if expected: - acceptable = [config.name] + config.back_compat_names + acceptable = [ + cast(PipetteName, str(converted_found_name)) + ] + config.pipette_backcompat_names if expected not in acceptable: raise RuntimeError( f"mount {mount}: instrument" f" {expected} was requested" - f" but {config.model} is present" + f" but {converted_found_model} is present" ) return {"config": config, "id": found_id} else: diff --git a/api/src/opentrons/hardware_control/backends/ot3controller.py b/api/src/opentrons/hardware_control/backends/ot3controller.py index b1278b155e4..e1f0ebbe65e 100644 --- a/api/src/opentrons/hardware_control/backends/ot3controller.py +++ b/api/src/opentrons/hardware_control/backends/ot3controller.py @@ -31,7 +31,7 @@ create_move_group, axis_to_node, get_current_settings, - create_home_group, + create_home_groups, node_to_axis, sensor_node_for_mount, sensor_node_for_pipette, @@ -40,6 +40,7 @@ create_gripper_jaw_home_group, create_gripper_jaw_hold_group, create_tip_action_group, + create_tip_action_home_group, PipetteAction, motor_nodes, LIMIT_SWITCH_OVERTRAVEL_DISTANCE, @@ -67,6 +68,11 @@ Move, Coordinates, ) +from opentrons_hardware.hardware_control.estop.detector import ( + EstopDetector, +) + +from opentrons.hardware_control.estop_state import EstopStateMachine from opentrons_hardware.hardware_control.motor_enable_disable import ( set_enable_motor, @@ -110,6 +116,7 @@ AionotifyEvent, OT3Mount, OT3AxisMap, + OT3AxisKind, CurrentConfig, MotorStatus, InstrumentProbeType, @@ -157,7 +164,7 @@ if TYPE_CHECKING: from ..dev_types import ( - OT3AttachedPipette, + AttachedPipette, AttachedGripper, OT3AttachedInstruments, ) @@ -249,6 +256,8 @@ def __init__( network.NetworkInfo(self._messenger, self._usb_messenger), FirmwareUpdate(), ) + self._estop_detector: Optional[EstopDetector] = None + self._estop_state_machine = EstopStateMachine(detector=None) self._position = self._get_home_position() self._encoder_position = self._get_home_position() self._motor_status = {} @@ -488,85 +497,69 @@ def _get_axis_home_distance(self, axis: Axis) -> float: else: return -1 * self.axis_bounds[axis][1] - self.axis_bounds[axis][0] + def _build_axes_home_groups( + self, axes: Sequence[Axis], speed_settings: Dict[OT3AxisKind, float] + ) -> List[MoveGroup]: + present_axes = [ax for ax in axes if self.axis_is_present(ax)] + if not present_axes: + return [] + else: + distances = {ax: self._get_axis_home_distance(ax) for ax in present_axes} + velocities = { + ax: -1 * speed_settings[Axis.to_kind(ax)] for ax in present_axes + } + return create_home_groups(distances, velocities) + def _build_home_pipettes_runner( self, axes: Sequence[Axis], gantry_load: GantryLoad, ) -> Optional[MoveGroupRunner]: + pipette_axes = [ax for ax in axes if ax in Axis.pipette_axes()] + if not pipette_axes: + return None + speed_settings = self._configuration.motion_settings.max_speed_discontinuity[ gantry_load ] - - distances_pipette = { - ax: self._get_axis_home_distance(ax) - for ax in axes - if ax in Axis.pipette_axes() - } - velocities_pipette = { - ax: -1 * speed_settings[Axis.to_kind(ax)] - for ax in axes - if ax in Axis.pipette_axes() - } - - move_group_pipette = [] - if distances_pipette and velocities_pipette: - pipette_move = self._filter_move_group( - create_home_group(distances_pipette, velocities_pipette) - ) - move_group_pipette.append(pipette_move) - - if move_group_pipette: - return MoveGroupRunner(move_groups=move_group_pipette, start_at_index=2) - return None + move_groups: List[MoveGroup] = self._build_axes_home_groups( + pipette_axes, speed_settings + ) + return MoveGroupRunner(move_groups=move_groups) def _build_home_gantry_z_runner( self, axes: Sequence[Axis], gantry_load: GantryLoad, ) -> Optional[MoveGroupRunner]: + gantry_axes = [ax for ax in axes if ax in Axis.gantry_axes()] + if not gantry_axes: + return None + speed_settings = self._configuration.motion_settings.max_speed_discontinuity[ gantry_load ] - distances_gantry = { - ax: self._get_axis_home_distance(ax) - for ax in axes - if ax in Axis.gantry_axes() and ax not in Axis.ot3_mount_axes() - } - velocities_gantry = { - ax: -1 * speed_settings[Axis.to_kind(ax)] - for ax in axes - if ax in Axis.gantry_axes() and ax not in Axis.ot3_mount_axes() - } - distances_z = { - ax: self._get_axis_home_distance(ax) - for ax in axes - if ax in Axis.ot3_mount_axes() - } - velocities_z = { - ax: -1 * speed_settings[Axis.to_kind(ax)] - for ax in axes - if ax in Axis.ot3_mount_axes() - } - move_group_gantry_z = [] - if distances_z and velocities_z: - z_move = self._filter_move_group( - create_home_group(distances_z, velocities_z) - ) - move_group_gantry_z.append(z_move) - if distances_gantry and velocities_gantry: - # home X axis before Y axis, to avoid collision with thermo-cycler lid - # that could be in the back-left corner - for ax in [Axis.X, Axis.Y]: - if ax in axes: - gantry_move = self._filter_move_group( - create_home_group( - {ax: distances_gantry[ax]}, {ax: velocities_gantry[ax]} - ) - ) - move_group_gantry_z.append(gantry_move) - if move_group_gantry_z: - return MoveGroupRunner(move_groups=move_group_gantry_z) + # first home all the present mount axes + z_axes = list(filter(lambda ax: ax in Axis.ot3_mount_axes(), gantry_axes)) + z_groups = self._build_axes_home_groups(z_axes, speed_settings) + + # home X axis before Y axis, to avoid collision with thermo-cycler lid + # that could be in the back-left corner + x_groups = ( + self._build_axes_home_groups([Axis.X], speed_settings) + if Axis.X in gantry_axes + else [] + ) + y_groups = ( + self._build_axes_home_groups([Axis.Y], speed_settings) + if Axis.Y in gantry_axes + else [] + ) + + move_groups = [*z_groups, *x_groups, *y_groups] + if move_groups: + return MoveGroupRunner(move_groups=move_groups) return None @requires_update @@ -612,18 +605,6 @@ async def home( self._handle_motor_status_response(position) return axis_convert(self._position, 0.0) - def _filter_move_group(self, move_group: MoveGroup) -> MoveGroup: - new_group: MoveGroup = [] - for step in move_group: - new_group.append( - { - node: axis_step - for node, axis_step in step.items() - if node in self._motor_nodes() - } - ) - return new_group - async def tip_action( self, axes: Sequence[Axis], @@ -633,10 +614,17 @@ async def tip_action( ) -> None: if tip_action == "home": speed = speed * -1 - move_group = create_tip_action_group( - axes, distance, speed, cast(PipetteAction, tip_action) - ) - runner = MoveGroupRunner(move_groups=[move_group]) + runner = MoveGroupRunner( + move_groups=create_tip_action_home_group(axes, distance, speed) + ) + else: + runner = MoveGroupRunner( + move_groups=[ + create_tip_action_group( + axes, distance, speed, cast(PipetteAction, tip_action) + ) + ] + ) positions = await runner.run(can_messenger=self._messenger) for axis, point in positions.items(): self._position.update({axis: point[0]}) @@ -691,7 +679,7 @@ def _combine_serial_number(pipette_info: ohc_tool_types.PipetteInformation) -> s @staticmethod def _build_attached_pip( attached: ohc_tool_types.PipetteInformation, mount: OT3Mount - ) -> OT3AttachedPipette: + ) -> AttachedPipette: if attached.name == FirmwarePipetteName.unknown: raise InvalidPipetteName(name=attached.name_int, mount=mount) try: @@ -1158,3 +1146,18 @@ def _door_listener(msg: BinaryMessageDefinition) -> None: def status_bar_interface(self) -> status_bar.StatusBar: return self._status_bar + + async def build_estop_detector(self) -> bool: + """Must be called to set up the estop detector & state machine.""" + if self._drivers.usb_messenger is None: + return False + self._estop_detector = await EstopDetector.build( + usb_messenger=self._drivers.usb_messenger + ) + self._estop_state_machine.subscribe_to_detector(self._estop_detector) + return True + + @property + def estop_state_machine(self) -> EstopStateMachine: + """Accessor for the API to get the state machine, if it exists.""" + return self._estop_state_machine diff --git a/api/src/opentrons/hardware_control/backends/ot3simulator.py b/api/src/opentrons/hardware_control/backends/ot3simulator.py index bf9671c2b90..6316af70ce5 100644 --- a/api/src/opentrons/hardware_control/backends/ot3simulator.py +++ b/api/src/opentrons/hardware_control/backends/ot3simulator.py @@ -45,6 +45,7 @@ Move, Coordinates, ) +from opentrons.hardware_control.estop_state import EstopStateMachine from opentrons_hardware.drivers.eeprom import EEPROMData from opentrons.hardware_control.module_control import AttachedModulesControl from opentrons.hardware_control import modules @@ -75,7 +76,7 @@ InstrumentHardwareConfigs, PipetteSpec, GripperSpec, - OT3AttachedPipette, + AttachedPipette, AttachedGripper, OT3AttachedInstruments, ) @@ -137,6 +138,7 @@ def __init__( self._update_required = False self._initialized = False self._lights = {"button": False, "rails": False} + self._estop_state_machine = EstopStateMachine(detector=None) def _sanitize_attached_instrument( mount: OT3Mount, passed_ai: Optional[Dict[str, Optional[str]]] = None @@ -407,7 +409,7 @@ def _attached_pipette_to_mount( mount: OT3Mount, init_instr: PipetteSpec, expected_instr: Optional[PipetteName], - ) -> OT3AttachedPipette: + ) -> AttachedPipette: found_model = init_instr["model"] # TODO (lc 12-05-2022) When the time comes, we should think about supporting @@ -686,3 +688,8 @@ def subsystems(self) -> Dict[SubSystem, SubSystemState]: ) for target in self._present_nodes } + + @property + def estop_state_machine(self) -> EstopStateMachine: + """Return an estop state machine locked in the "disengaged" state.""" + return self._estop_state_machine diff --git a/api/src/opentrons/hardware_control/backends/ot3utils.py b/api/src/opentrons/hardware_control/backends/ot3utils.py index 17afc5304bf..dadf8953ba6 100644 --- a/api/src/opentrons/hardware_control/backends/ot3utils.py +++ b/api/src/opentrons/hardware_control/backends/ot3utils.py @@ -1,6 +1,7 @@ """Shared utilities for ot3 hardware control.""" from typing import Dict, Iterable, List, Set, Tuple, TypeVar, Sequence, cast from typing_extensions import Literal +from logging import getLogger from opentrons.config.defaults_ot3 import DEFAULT_CALIBRATION_AXIS_MAX_SPEED from opentrons.config.types import OT3MotionSettings, OT3CurrentSettings, GantryLoad from opentrons.hardware_control.types import ( @@ -46,12 +47,14 @@ NodeIdMotionValues, create_home_step, create_backoff_step, + create_tip_action_backoff_step, MoveGroup, MoveType, MoveStopCondition, create_gripper_jaw_step, create_tip_action_step, ) +from opentrons_hardware.hardware_control.constants import interrupts_per_sec GRIPPER_JAW_HOME_TIME: float = 10 GRIPPER_JAW_GRIP_TIME: float = 10 @@ -83,6 +86,8 @@ USB_SUBSYSTEM = {target: subsystem for subsystem, target in SUBSYSTEM_USB.items()} +LOG = getLogger(__name__) + def axis_nodes() -> List["NodeId"]: return [ @@ -331,6 +336,11 @@ def create_move_group( for move in moves: unit_vector = move.unit_vector for block in move.blocks: + if block.time < (3.0 / interrupts_per_sec): + LOG.info( + f"Skipping move block with time {block.time} (<{3.0/interrupts_per_sec})" + ) + continue distances = unit_vector_multiplication(unit_vector, block.distance) node_id_distances = _convert_to_node_id_dict(distances) velocities = unit_vector_multiplication(unit_vector, block.initial_speed) @@ -349,21 +359,39 @@ def create_move_group( return move_group, {k: float(v) for k, v in pos.items()} -def create_home_group( +def create_home_groups( distance: Dict[Axis, float], velocity: Dict[Axis, float] -) -> MoveGroup: +) -> List[MoveGroup]: node_id_distances = _convert_to_node_id_dict(distance) node_id_velocities = _convert_to_node_id_dict(velocity) - home = create_home_step( - distance=node_id_distances, - velocity=node_id_velocities, - ) + home_group = [ + create_home_step(distance=node_id_distances, velocity=node_id_velocities) + ] # halve the homing speed for backoff backoff_velocities = {k: v / 2 for k, v in node_id_velocities.items()} - backoff = create_backoff_step(backoff_velocities) + backoff_group = [create_backoff_step(backoff_velocities)] + return [home_group, backoff_group] - move_group: MoveGroup = [home, backoff] - return move_group + +def create_tip_action_home_group( + axes: Sequence[Axis], distance: float, velocity: float +) -> List[MoveGroup]: + current_nodes = [axis_to_node(ax) for ax in axes] + home_group = [ + create_tip_action_step( + velocity={node_id: np.float64(velocity) for node_id in current_nodes}, + distance={node_id: np.float64(distance) for node_id in current_nodes}, + present_nodes=current_nodes, + action=PipetteTipActionType.home, + ) + ] + + backoff_group = [ + create_tip_action_backoff_step( + velocity={node_id: np.float64(velocity / 2) for node_id in current_nodes} + ) + ] + return [home_group, backoff_group] def create_tip_action_group( diff --git a/api/src/opentrons/hardware_control/backends/simulator.py b/api/src/opentrons/hardware_control/backends/simulator.py index f51b378360e..7766260ab11 100644 --- a/api/src/opentrons/hardware_control/backends/simulator.py +++ b/api/src/opentrons/hardware_control/backends/simulator.py @@ -3,14 +3,18 @@ import copy import logging from threading import Event -from typing import Dict, Optional, List, Tuple, TYPE_CHECKING, Sequence, Iterator +from typing import Dict, Optional, List, Tuple, TYPE_CHECKING, Sequence, Iterator, cast from contextlib import contextmanager -from opentrons_shared_data.pipette import dummy_model_for_name +from opentrons_shared_data.pipette import ( + pipette_load_name_conversions as pipette_load_name, + mutable_configurations, + pipette_definition, +) from opentrons import types -from opentrons.config.pipette_config import config_models, config_names, configs, load from opentrons.config.types import RobotConfig +from opentrons.config import get_opentrons_path from opentrons.drivers.smoothie_drivers import SimulatingDriver from opentrons.drivers.rpi_drivers.gpio_simulator import SimulatingGPIOCharDev @@ -22,7 +26,7 @@ from ..util import ot2_axis_to_string if TYPE_CHECKING: - from opentrons_shared_data.pipette.dev_types import PipetteName + from opentrons_shared_data.pipette.dev_types import PipetteName, PipetteModel from ..dev_types import ( AttachedPipette, AttachedInstruments, @@ -119,17 +123,23 @@ def __init__( self._gpio_chardev = gpio_chardev def _sanitize_attached_instrument( - passed_ai: Optional[Dict[str, Optional[str]]] = None + passed_ai: Optional[PipetteSpec] = None, ) -> PipetteSpec: if not passed_ai or not passed_ai.get("model"): return {"model": None, "id": None} - if passed_ai["model"] in config_models: - return passed_ai # type: ignore - if passed_ai["model"] in config_names: - return { - "model": dummy_model_for_name(passed_ai["model"]), # type: ignore - "id": passed_ai.get("id"), - } + if pipette_load_name.supported_pipette( + cast("PipetteName", passed_ai["model"]) + ): + if pipette_load_name.is_model(passed_ai["model"]): + return passed_ai + else: + get_pip_model = pipette_load_name.convert_pipette_name( + cast("PipetteName", passed_ai["model"]) + ) + return { + "model": PipetteModel(str(get_pip_model)), + "id": passed_ai.get("id"), + } raise KeyError( "If you specify attached_instruments, the model " "should be pipette names or pipette models, but " @@ -137,7 +147,7 @@ def _sanitize_attached_instrument( ) self._attached_instruments = { - m: _sanitize_attached_instrument(attached_instruments.get(m)) + m: _sanitize_attached_instrument(attached_instruments.get(m)) # type: ignore for m in types.Mount.ot2_mounts() } self._stubbed_attached_modules = attached_modules @@ -213,18 +223,33 @@ async def fast_home(self, axis: Sequence[str], margin: float) -> Dict[str, float return self._position def _attached_to_mount( - self, mount: types.Mount, expected_instr: Optional[PipetteName] + self, mount: types.Mount, expected_instr: Optional["PipetteName"] ) -> AttachedPipette: init_instr = self._attached_instruments.get(mount, {"model": None, "id": None}) found_model = init_instr["model"] back_compat: List["PipetteName"] = [] + + path_to_overrides = get_opentrons_path("pipette_config_overrides_dir") + found_model_configs: Optional[pipette_definition.PipetteConfigurations] = None + + converted_found_name: Optional[pipette_definition.PipetteNameType] = None if found_model: - back_compat = configs[found_model].get("backCompatNames", []) + converted_found_model = pipette_load_name.convert_pipette_model(found_model) + converted_found_name = pipette_load_name.convert_to_pipette_name_type( + found_model + ) + found_model_configs = ( + mutable_configurations.load_with_mutable_configurations( + converted_found_model, path_to_overrides, init_instr["id"] + ) + ) + back_compat = found_model_configs.pipette_backcompat_names if ( expected_instr and found_model + and found_model_configs and ( - configs[found_model]["name"] != expected_instr + str(converted_found_name) != expected_instr and expected_instr not in back_compat ) ): @@ -235,34 +260,42 @@ def _attached_to_mount( ) ) else: + converted_expected_model = pipette_load_name.convert_pipette_name( + expected_instr + ) return { - "config": load(dummy_model_for_name(expected_instr)), + "config": mutable_configurations.load_with_mutable_configurations( + converted_expected_model, path_to_overrides + ), "id": None, } - elif found_model and expected_instr: + elif found_model and found_model_configs: # Instrument detected matches instrument expected (note: # "instrument detected" means passed as an argument to the - # constructor of this class) - return { - "config": load(found_model, init_instr["id"]), - "id": init_instr["id"], - } - elif found_model: + # constructor of this class) OR, # Instrument detected and no expected instrument specified return { - "config": load(found_model, init_instr["id"]), + "config": found_model_configs, "id": init_instr["id"], } elif expected_instr: # Expected instrument specified and no instrument detected - return {"config": load(dummy_model_for_name(expected_instr)), "id": None} + converted_expected_model = pipette_load_name.convert_pipette_name( + expected_instr + ) + return { + "config": mutable_configurations.load_with_mutable_configurations( + converted_expected_model, path_to_overrides + ), + "id": None, + } else: # No instrument detected or expected return {"config": None, "id": None} @ensure_yield async def get_attached_instruments( - self, expected: Dict[types.Mount, PipetteName] + self, expected: Dict[types.Mount, "PipetteName"] ) -> AttachedInstruments: """Update the internal cache of attached instruments. diff --git a/api/src/opentrons/hardware_control/dev_types.py b/api/src/opentrons/hardware_control/dev_types.py index ef661467b21..5a4a991c5e8 100644 --- a/api/src/opentrons/hardware_control/dev_types.py +++ b/api/src/opentrons/hardware_control/dev_types.py @@ -23,7 +23,6 @@ from opentrons.drivers.types import MoveSplit from opentrons.types import Mount -from opentrons.config.pipette_config import PipetteConfig from opentrons.hardware_control.types import GripperJawState @@ -40,11 +39,6 @@ class GripperSpec(InstrumentSpec): class AttachedPipette(TypedDict): - config: Optional[PipetteConfig] - id: Optional[str] - - -class OT3AttachedPipette(TypedDict): config: Optional[PipetteConfigurations] id: Optional[str] @@ -56,7 +50,7 @@ class AttachedGripper(TypedDict): AttachedInstruments = Dict[Mount, AttachedPipette] -OT3AttachedInstruments = Union[OT3AttachedPipette, AttachedGripper] +OT3AttachedInstruments = Union[AttachedPipette, AttachedGripper] EIGHT_CHANNELS = Literal[8] ONE_CHANNEL = Literal[1] diff --git a/api/src/opentrons/hardware_control/estop_state.py b/api/src/opentrons/hardware_control/estop_state.py new file mode 100644 index 00000000000..2c8884dcb26 --- /dev/null +++ b/api/src/opentrons/hardware_control/estop_state.py @@ -0,0 +1,161 @@ +"""opentrons.hardware_control.estop_state: module to manage estop state machine on OT-3.""" + +from typing import List, Optional + +from opentrons_hardware.hardware_control.estop.detector import ( + EstopSummary, + EstopDetector, +) + +from opentrons.hardware_control.types import ( + EstopState, + EstopPhysicalStatus, + EstopAttachLocation, + EstopStateNotification, + HardwareEventHandler, +) + + +class EstopStateMachine: + """Class to manage global Estop state.""" + + def __init__(self, detector: Optional[EstopDetector]) -> None: + """Create a new EstopStateMachine. + + If detector is None, the state machine will be initialized in + a happy state (Disengaged, both estops detected) until it is + hooked up to a valid detector. + """ + self._detector: Optional[EstopDetector] = None + self._state: EstopState = EstopState.DISENGAGED + # Start off in a happy state until a detector is added + self._summary = EstopSummary( + left_detected=True, right_detected=True, engaged=False + ) + if detector is not None: + self.subscribe_to_detector(detector=detector) + self._listeners: List[HardwareEventHandler] = [] + + def subscribe_to_detector(self, detector: EstopDetector) -> None: + """Configure the estop state machine to listen to a detector. + + This function will also transition the state based on the current + status of the detector.""" + if self._detector is not None: + self._detector.remove_listener(self.detector_listener) + self._detector = detector + detector.add_listener(listener=self.detector_listener) + self._handle_state_transition(new_summary=detector.status) + + def __del__(self) -> None: + if self._detector is not None: + self._detector.remove_listener(self.detector_listener) + + def add_listener(self, listener: HardwareEventHandler) -> None: + """Add a hardware event listener for estop event changes.""" + if listener not in self._listeners: + self._listeners.append(listener) + + def remove_listener(self, listener: HardwareEventHandler) -> None: + """Remove an existing hardware event listener for estop detector changes.""" + if listener in self._listeners: + self._listeners.remove(listener) + + def detector_listener(self, summary: EstopSummary) -> None: + """Callback from the detector.""" + self._handle_state_transition(new_summary=summary) + + @staticmethod + def _transition_from_physically_engaged(summary: EstopSummary) -> EstopState: + if not summary.engaged: + # Estop disengaged, move to Logically Engaged + return EstopState.LOGICALLY_ENGAGED + return EstopState.PHYSICALLY_ENGAGED + + @staticmethod + def _transition_from_disengaged(summary: EstopSummary) -> EstopState: + if summary.engaged: + # Estop engaged, move to physically engaged + return EstopState.PHYSICALLY_ENGAGED + if summary.left_detected or summary.right_detected: + # An estop is still plugged in, stay disengaged + return EstopState.DISENGAGED + # Everything unplugged, block all action + return EstopState.NOT_PRESENT + + @staticmethod + def _transition_from_not_present(summary: EstopSummary) -> EstopState: + if summary.engaged: + # Estop plugged in and is ON, go to physically engaged + return EstopState.PHYSICALLY_ENGAGED + if summary.left_detected or summary.right_detected: + # Plugged in and NOT on, go to Disengaged + return EstopState.DISENGAGED + return EstopState.NOT_PRESENT + + @staticmethod + def _transition_from_logically_engaged(summary: EstopSummary) -> EstopState: + if summary.engaged: + # Estop was turned on, go back to physically engaged + return EstopState.PHYSICALLY_ENGAGED + return EstopState.LOGICALLY_ENGAGED + + def _emit_event(self, prev_state: EstopState) -> None: + """Broadcast a state change to all listeners.""" + event = EstopStateNotification(old_state=prev_state, new_state=self._state) + for listener in self._listeners: + listener(event) + + def _handle_state_transition(self, new_summary: EstopSummary) -> None: + """Caches the new state summary and changes the _state variable.""" + self._summary = new_summary + + prev_state = self._state + + self._state = { + EstopState.PHYSICALLY_ENGAGED: self._transition_from_physically_engaged, + EstopState.DISENGAGED: self._transition_from_disengaged, + EstopState.NOT_PRESENT: self._transition_from_not_present, + EstopState.LOGICALLY_ENGAGED: self._transition_from_logically_engaged, + }[prev_state](new_summary) + + if self._state != prev_state: + self._emit_event(prev_state=prev_state) + + def get_physical_status(self, location: EstopAttachLocation) -> EstopPhysicalStatus: + """Get the physical status of an attach location""" + detected = ( + self._summary.left_detected + if location == EstopAttachLocation.LEFT + else self._summary.right_detected + ) + + if not detected: + return EstopPhysicalStatus.NOT_PRESENT + # Note that we actually *don't* have a way to check if an individual + # estop is activated or not. But we can return Engaged or Disengaged + # based on the global state. + return ( + EstopPhysicalStatus.ENGAGED + if self._summary.engaged + else EstopPhysicalStatus.DISENGAGED + ) + + @property + def state(self) -> EstopState: + return self._state + + def acknowledge_and_clear(self) -> EstopState: + """Acknowledge a `logically_engaged` status if relevant. + + If the current state is not LOGICALLY_ENGAGED, this does nothing. + + If the current state *is* LOGICALLY_ENGAGED, this will move to the + correct return state (NOT_PRESENT or ENGAGED)""" + if self._state == EstopState.LOGICALLY_ENGAGED: + if self._summary.left_detected or self._summary.right_detected: + self._state = EstopState.DISENGAGED + else: + self._state = EstopState.NOT_PRESENT + self._emit_event(EstopState.LOGICALLY_ENGAGED) + return self._state diff --git a/api/src/opentrons/hardware_control/instruments/instrument_abc.py b/api/src/opentrons/hardware_control/instruments/instrument_abc.py index 451d161311f..46b4810e22f 100644 --- a/api/src/opentrons/hardware_control/instruments/instrument_abc.py +++ b/api/src/opentrons/hardware_control/instruments/instrument_abc.py @@ -1,5 +1,5 @@ from abc import ABC, abstractmethod -from typing import Any, Optional, Generic, TypeVar +from typing import Any, Optional, Generic, TypeVar, Dict from opentrons.types import Point from opentrons.hardware_control.types import CriticalPoint @@ -27,7 +27,7 @@ def reload_configurations(self) -> None: ... @abstractmethod - def update_config_item(self, elem_name: str, elem_val: Any) -> None: + def update_config_item(self, elements: Dict[str, Any]) -> None: """Update instrument config item.""" ... diff --git a/api/src/opentrons/hardware_control/instruments/instrument_helpers.py b/api/src/opentrons/hardware_control/instruments/instrument_helpers.py new file mode 100644 index 00000000000..3423f0f49e5 --- /dev/null +++ b/api/src/opentrons/hardware_control/instruments/instrument_helpers.py @@ -0,0 +1,33 @@ +from typing import List, Tuple + +from opentrons_shared_data.pipette.pipette_definition import PipetteFunctionKeyType + +PIPETTING_FUNCTION_FALLBACK_VERSION: PipetteFunctionKeyType = "1" +PIPETTING_FUNCTION_LATEST_VERSION: PipetteFunctionKeyType = "2" + + +def piecewise_volume_conversion( + ul: float, sequence: List[Tuple[float, float, float]] +) -> float: + """ + Takes a volume in microliters and a sequence representing a piecewise + function for the slope and y-intercept of a ul/mm function, where each + sub-list in the sequence contains: + + - the max volume for the piece of the function (minimum implied from the + max of the previous item or 0 + - the slope of the segment + - the y-intercept of the segment + + :return: the ul/mm value for the specified volume + """ + # pick the first item from the seq for which the target is less than + # the bracketing element + for x in sequence: + if ul <= x[0]: + # use that element to calculate the movement distance in mm + return x[1] * ul + x[2] + + # Compatibility with previous implementation of search. + # list(filter(lambda x: ul <= x[0], sequence))[0] + raise IndexError() diff --git a/api/src/opentrons/hardware_control/instruments/ot2/pipette.py b/api/src/opentrons/hardware_control/instruments/ot2/pipette.py index 8d6c23ac8a2..c861cc82de2 100644 --- a/api/src/opentrons/hardware_control/instruments/ot2/pipette.py +++ b/api/src/opentrons/hardware_control/instruments/ot2/pipette.py @@ -4,17 +4,33 @@ """ Classes and functions for pipette state tracking """ -from dataclasses import asdict, replace import logging -from typing import Any, Dict, Optional, Set, Tuple, Union - -from opentrons_shared_data.pipette import name_config as pipette_name_config +from typing import Any, Dict, Optional, Set, Tuple, Union, cast, List + +from opentrons_shared_data.pipette.pipette_definition import ( + PipetteConfigurations, + PlungerPositions, + MotorConfigurations, + SupportedTipsDefinition, + TipHandlingConfigurations, + PipetteModelVersionType, + PipetteNameType, +) +from opentrons_shared_data.pipette import ( + load_data as load_pipette_data, + types as pip_types, +) from opentrons.types import Point, Mount -from opentrons.config import pipette_config, robot_configs +from opentrons.config import robot_configs, feature_flags as ff from opentrons.config.types import RobotConfig from opentrons.drivers.types import MoveSplit from ..instrument_abc import AbstractInstrument +from ..instrument_helpers import ( + piecewise_volume_conversion, + PIPETTING_FUNCTION_FALLBACK_VERSION, + PIPETTING_FUNCTION_LATEST_VERSION, +) from .instrument_calibration import ( PipetteOffsetByPipetteMount, load_pipette_offset, @@ -42,12 +58,12 @@ INTERNOZZLE_SPACING_MM: Final[float] = 9 -# TODO (lc 11-1-2022) We need to separate out the pipette object -# into a separate category for OT2 vs OT3 pipettes. At which point -# this union will be unneccessary +# TODO (lc 11-1-2022) Once we unify calibration loading +# for the hardware controller, we will be able to +# unify the pipette classes again. -class Pipette(AbstractInstrument[pipette_config.PipetteConfig]): +class Pipette(AbstractInstrument[PipetteConfigurations]): """A class to gather and track pipette state and configs. This class should not touch hardware or call back out to the hardware @@ -59,22 +75,35 @@ class Pipette(AbstractInstrument[pipette_config.PipetteConfig]): def __init__( self, - config: pipette_config.PipetteConfig, + config: PipetteConfigurations, pipette_offset_cal: PipetteOffsetByPipetteMount, pipette_id: Optional[str] = None, ) -> None: self._config = config + self._config_as_dict = config.dict() self._pipette_offset = pipette_offset_cal - self._acting_as = self._config.name - self._name = self._config.name - self._model = self._config.model + self._pipette_type = self._config.pipette_type + self._pipette_version = self._config.version + self._max_channels = self._config.channels + self._backlash_distance = config.backlash_distance + + # TODO (lc 12-05-2022) figure out how we can safely deprecate "name" and "model" + self._pipette_name = PipetteNameType( + pipette_type=config.pipette_type, + pipette_channels=config.channels, + pipette_generation=config.display_category, + ) + self._acting_as = self._pipette_name + self._pipette_model = PipetteModelVersionType( + pipette_type=config.pipette_type, + pipette_channels=config.channels, + pipette_version=config.version, + ) self._nozzle_offset = self._config.nozzle_offset self._current_volume = 0.0 - self._working_volume = self._config.max_volume + self._working_volume = float(self._config.max_volume) self._current_tip_length = 0.0 self._current_tiprack_diameter = 0.0 - self._fallback_tip_length = self._config.tip_length - self._tip_overlap_map = self._config.tip_overlap self._has_tip = False self._pipette_id = pipette_id self._log = mod_log.getChild( @@ -82,19 +111,44 @@ def __init__( ) self._log.info( "loaded: {}, pipette offset: {}".format( - config.model, self._pipette_offset.offset + self._pipette_model, self._pipette_offset.offset ) ) self.ready_to_aspirate = False #: True if ready to aspirate - self._aspirate_flow_rate = self._config.default_aspirate_flow_rates["2.0"] - self._dispense_flow_rate = self._config.default_dispense_flow_rates["2.0"] - self._blow_out_flow_rate = self._config.default_blow_out_flow_rates["2.0"] - # cache a dict representation of config for improved performance of - # as_dict. - self._config_as_dict = asdict(config) - - def act_as(self, name: PipetteName) -> None: + # TODO Clean this lookup up! + self._active_tip_settings = self._config.supported_tips.get( + pip_types.PipetteTipType(self._working_volume), + self._config.supported_tips[list(self._config.supported_tips.keys())[0]], + ) + self._fallback_tip_length = self._active_tip_settings.default_tip_length + self._aspirate_flow_rates_lookup = ( + self._active_tip_settings.default_aspirate_flowrate.values_by_api_level + ) + self._dispense_flow_rates_lookup = ( + self._active_tip_settings.default_dispense_flowrate.values_by_api_level + ) + self._blowout_flow_rates_lookup = ( + self._active_tip_settings.default_blowout_flowrate.values_by_api_level + ) + self._aspirate_flow_rate = ( + self._active_tip_settings.default_aspirate_flowrate.default + ) + self._dispense_flow_rate = ( + self._active_tip_settings.default_dispense_flowrate.default + ) + self._blow_out_flow_rate = ( + self._active_tip_settings.default_blowout_flowrate.default + ) + + self._tip_overlap_lookup = self._config.tip_overlap_dictionary + + if ff.use_old_aspiration_functions(): + self._pipetting_function_version = PIPETTING_FUNCTION_FALLBACK_VERSION + else: + self._pipetting_function_version = PIPETTING_FUNCTION_LATEST_VERSION + + def act_as(self, name: PipetteNameType) -> None: """Reconfigure to act as ``name``. ``name`` must be either the actual name of the pipette, or a name in its back-compatibility config. @@ -102,54 +156,113 @@ def act_as(self, name: PipetteName) -> None: if name == self._acting_as: return - assert name in self._config.back_compat_names + [ + str_name = f"{name.pipette_type.name}_{str(name.pipette_channels)}" + assert str_name in self._config.pipette_backcompat_names + [ self.name - ], f"{self._name} is not back-compatible with {name}" - name_conf = pipette_name_config() - bc_conf = name_conf[name] - self.working_volume = bc_conf["maxVolume"] - self.update_config_item("min_volume", bc_conf["minVolume"]) - self.update_config_item("max_volume", bc_conf["maxVolume"]) + ], f"{self.name} is not back-compatible with {name}" + + liquid_model = load_pipette_data.load_liquid_model( + name.pipette_type, name.pipette_channels, name.get_version() + ) + # TODO need to grab name config here to deal with act as test + self.working_volume = liquid_model.max_volume + self.update_config_item( + { + "min_volume": liquid_model.min_volume, + "max_volume": liquid_model.max_volume, + } + ) @property - def acting_as(self) -> PipetteName: + def acting_as(self) -> PipetteNameType: return self._acting_as @property - def config(self) -> pipette_config.PipetteConfig: + def config(self) -> PipetteConfigurations: return self._config @property - def nozzle_offset(self) -> Tuple[float, float, float]: + def nozzle_offset(self) -> List[float]: return self._nozzle_offset @property def pipette_offset(self) -> PipetteOffsetByPipetteMount: return self._pipette_offset - def update_config_item(self, elem_name: str, elem_val: Any) -> None: - self._log.info("updated config: {}={}".format(elem_name, elem_val)) - self._config = replace(self._config, **{elem_name: elem_val}) + @property + def tip_overlap(self) -> Dict[str, float]: + return self._tip_overlap_lookup + + @property + def channels(self) -> pip_types.PipetteChannelType: + return self._max_channels + + @property + def plunger_positions(self) -> PlungerPositions: + return self._config.plunger_positions_configurations + + @property + def plunger_motor_current(self) -> MotorConfigurations: + return self._config.plunger_motor_configurations + + @property + def pick_up_configurations(self) -> TipHandlingConfigurations: + return self._config.pick_up_tip_configurations + + @pick_up_configurations.setter + def pick_up_configurations( + self, pick_up_configs: TipHandlingConfigurations + ) -> None: + self._pick_up_configurations = pick_up_configs + + @property + def drop_configurations(self) -> TipHandlingConfigurations: + return self._config.drop_tip_configurations + + @property + def active_tip_settings(self) -> SupportedTipsDefinition: + return self._active_tip_settings + + def update_config_item(self, elements: Dict[str, Any]) -> None: + self._log.info(f"updated config: {elements}") + self._config = load_pipette_data.update_pipette_configuration( + self._config, elements + ) # Update the cached dict representation - self._config_as_dict = asdict(self._config) + self._config_as_dict = self._config.dict() def reload_configurations(self) -> None: - self._config = pipette_config.load(self.model, self.pipette_id) - self._config_as_dict = asdict(self._config) + self._config = load_pipette_data.load_definition( + self._pipette_model.pipette_type, + self._pipette_model.pipette_channels, + self._pipette_model.pipette_version, + ) + self._config_as_dict = self._config.dict() def reset_state(self) -> None: self._current_volume = 0.0 - self._working_volume = self._config.max_volume + self._working_volume = float(self._config.max_volume) self._current_tip_length = 0.0 self._current_tiprack_diameter = 0.0 - self._fallback_tip_length = self._config.tip_length - self._tip_overlap_map = self._config.tip_overlap self._has_tip = False self.ready_to_aspirate = False #: True if ready to aspirate - self._aspirate_flow_rate = self._config.default_aspirate_flow_rates["2.0"] - self._dispense_flow_rate = self._config.default_dispense_flow_rates["2.0"] - self._blow_out_flow_rate = self._config.default_blow_out_flow_rates["2.0"] + self._active_tip_settings = self._config.supported_tips[ + pip_types.PipetteTipType(self._working_volume) + ] + self._fallback_tip_length = self.active_tip_settings.default_tip_length + + self._aspirate_flow_rate = ( + self.active_tip_settings.default_aspirate_flowrate.default + ) + self._dispense_flow_rate = ( + self.active_tip_settings.default_dispense_flowrate.default + ) + self._blow_out_flow_rate = ( + self.active_tip_settings.default_blowout_flowrate.default + ) + + self._tip_overlap_lookup = self._config.tip_overlap_dictionary def reset_pipette_offset(self, mount: Mount, to_default: bool) -> None: """Reset the pipette offset to system defaults.""" @@ -166,11 +279,15 @@ def save_pipette_offset(self, mount: Mount, offset: Point) -> None: @property def name(self) -> PipetteName: - return self._name + return cast(PipetteName, f"{self._pipette_name}") @property def model(self) -> PipetteModel: - return self._model + return cast(PipetteModel, f"{self._pipette_model}") + + @property + def pipette_type(self) -> pip_types.PipetteModelType: + return self._pipette_type @property def pipette_id(self) -> Optional[str]: @@ -293,6 +410,18 @@ def blow_out_flow_rate(self, new_flow_rate: float) -> None: assert new_flow_rate > 0 self._blow_out_flow_rate = new_flow_rate + @property + def aspirate_flow_rates_lookup(self) -> Dict[str, float]: + return self._aspirate_flow_rates_lookup + + @property + def dispense_flow_rates_lookup(self) -> Dict[str, float]: + return self._dispense_flow_rates_lookup + + @property + def blow_out_flow_rates_lookup(self) -> Dict[str, float]: + return self._blowout_flow_rates_lookup + @property def working_volume(self) -> float: """The working volume of the pipette""" @@ -302,6 +431,10 @@ def working_volume(self) -> float: def working_volume(self, tip_volume: float) -> None: """The working volume is the current tip max volume""" self._working_volume = min(self.config.max_volume, tip_volume) + self._active_tip_settings = self._config.supported_tips[ + pip_types.PipetteTipType(int(self._working_volume)) + ] + self._fallback_tip_length = self._active_tip_settings.default_tip_length @property def available_volume(self) -> float: @@ -355,10 +488,21 @@ def has_tip(self) -> bool: # want this to unbounded. @functools.lru_cache(maxsize=100) def ul_per_mm(self, ul: float, action: UlPerMmAction) -> float: - if action == "blowout": - action = "dispense" - sequence = self._config.ul_per_mm[action] - return pipette_config.piecewise_volume_conversion(ul, sequence) + if action == "aspirate": + fallback = self._active_tip_settings.aspirate.default[ + PIPETTING_FUNCTION_FALLBACK_VERSION + ] + sequence = self._active_tip_settings.aspirate.default.get( + self._pipetting_function_version, fallback + ) + else: + fallback = self._active_tip_settings.dispense.default[ + PIPETTING_FUNCTION_FALLBACK_VERSION + ] + sequence = self._active_tip_settings.dispense.default.get( + self._pipetting_function_version, fallback + ) + return piecewise_volume_conversion(ul, sequence) def __str__(self) -> str: return "{} current volume {}ul critical point: {} at {}".format( @@ -386,13 +530,20 @@ def as_dict(self) -> "Pipette.DictType": "aspirate_flow_rate": self.aspirate_flow_rate, "dispense_flow_rate": self.dispense_flow_rate, "blow_out_flow_rate": self.blow_out_flow_rate, + "default_aspirate_flow_rates": self.active_tip_settings.default_aspirate_flowrate.values_by_api_level, + "default_blow_out_flow_rates": self.active_tip_settings.default_blowout_flowrate.values_by_api_level, + "default_dispense_flow_rates": self.active_tip_settings.default_dispense_flowrate.values_by_api_level, + "tip_length": self.current_tip_length, + "return_tip_height": self.active_tip_settings.default_return_tip_height, + "tip_overlap": self.tip_overlap, + "back_compat_names": self._config.pipette_backcompat_names, } ) return self._config_as_dict def _reload_and_check_skip( - new_config: pipette_config.PipetteConfig, + new_config: PipetteConfigurations, attached_instr: Pipette, pipette_offset: PipetteOffsetByPipetteMount, ) -> Tuple[Pipette, bool]: @@ -407,8 +558,8 @@ def _reload_and_check_skip( # Same config, good enough return attached_instr, True else: - newdict = asdict(new_config) - olddict = asdict(attached_instr.config) + newdict = new_config.dict() + olddict = attached_instr.config.dict() changed: Set[str] = set() for k in newdict.keys(): if newdict[k] != olddict[k]: @@ -423,7 +574,7 @@ def _reload_and_check_skip( def load_from_config_and_check_skip( - config: Optional[pipette_config.PipetteConfig], + config: Optional[PipetteConfigurations], attached: Optional[Pipette], requested: Optional[PipetteName], serial: Optional[str], @@ -453,13 +604,13 @@ def load_from_config_and_check_skip( # to checking if the old and new responses are the same # we also have to make sure the old pipette is properly # configured to the request - if requested == attached.acting_as: + if requested == str(attached.acting_as): # similar enough to check return _reload_and_check_skip(config, attached, pipette_offset) else: # if there is no request, make sure that the old pipette # did not have backcompat applied - if attached.acting_as == attached.name: + if str(attached.acting_as) == attached.name: # similar enough to check return _reload_and_check_skip(config, attached, pipette_offset) @@ -470,7 +621,7 @@ def load_from_config_and_check_skip( def _build_splits(pipette: Pipette) -> Optional[MoveSplit]: - if "needsUnstick" in pipette.config.quirks: + if pip_types.Quirks.needsUnstick in pipette.config.quirks: return MoveSplit( split_distance=1, split_current=1.75, @@ -491,10 +642,10 @@ def generate_hardware_configs( """ if pipette: return { - "steps_per_mm": pipette.config.steps_per_mm, - "home_pos": pipette.config.home_position, - "max_travel": pipette.config.max_travel, - "idle_current": pipette.config.idle_current, + "steps_per_mm": pipette.config.mount_configurations.stepsPerMM, + "home_pos": pipette.config.mount_configurations.homePosition, + "max_travel": pipette.config.mount_configurations.travelDistance, + "idle_current": pipette.plunger_motor_current.idle, "splits": _build_splits(pipette), } else: diff --git a/api/src/opentrons/hardware_control/instruments/ot2/pipette_handler.py b/api/src/opentrons/hardware_control/instruments/ot2/pipette_handler.py index 9d2619308da..d7fa5f10acb 100644 --- a/api/src/opentrons/hardware_control/instruments/ot2/pipette_handler.py +++ b/api/src/opentrons/hardware_control/instruments/ot2/pipette_handler.py @@ -17,6 +17,7 @@ ) from opentrons_shared_data.pipette.dev_types import UlPerMmAction +from opentrons_shared_data.pipette.types import Quirks from opentrons import types as top_types from opentrons.hardware_control.types import ( @@ -201,7 +202,6 @@ def get_attached_instrument(self, mount: MountType) -> PipetteDict: "name", "min_volume", "max_volume", - "channels", "aspirate_flow_rate", "dispense_flow_rate", "pipette_id", @@ -225,6 +225,7 @@ def get_attached_instrument(self, mount: MountType) -> PipetteDict: # this dict newly every time? Any why only a few items are being updated? for key in configs: result[key] = instr_dict[key] + result["channels"] = instr.channels result["has_tip"] = instr.has_tip result["tip_length"] = instr.current_tip_length result["aspirate_speed"] = self.plunger_speed( @@ -240,16 +241,17 @@ def get_attached_instrument(self, mount: MountType) -> PipetteDict: # TODO (12-5-2022) figure out why this is using default aspirate flow rate # rather than default dispense flow rate. result["default_blow_out_speeds"] = { - alvl: self.plunger_speed(instr, fr, "dispense") - for alvl, fr in instr.config.default_aspirate_flow_rates.items() + alvl: self.plunger_speed(instr, fr, "blowout") + for alvl, fr in instr.blow_out_flow_rates_lookup.items() } + result["default_dispense_speeds"] = { alvl: self.plunger_speed(instr, fr, "dispense") - for alvl, fr in instr.config.default_dispense_flow_rates.items() + for alvl, fr in instr.dispense_flow_rates_lookup.items() } result["default_aspirate_speeds"] = { alvl: self.plunger_speed(instr, fr, "aspirate") - for alvl, fr in instr.config.default_aspirate_flow_rates.items() + for alvl, fr in instr.aspirate_flow_rates_lookup.items() } return cast(PipetteDict, result) @@ -305,10 +307,10 @@ def calibrate_plunger( """ instr = self.get_pipette(mount) pos_dict: Dict[str, float] = { - "top": instr.config.top, - "bottom": instr.config.bottom, - "blow_out": instr.config.blow_out, - "drop_tip": instr.config.drop_tip, + "top": instr.plunger_positions.top, + "bottom": instr.plunger_positions.bottom, + "blow_out": instr.plunger_positions.blow_out, + "drop_tip": instr.plunger_positions.drop_tip, } if top is not None: pos_dict["top"] = top @@ -318,8 +320,7 @@ def calibrate_plunger( pos_dict["blow_out"] = blow_out if drop_tip is not None: pos_dict["drop_tip"] = drop_tip - for key in pos_dict.keys(): - instr.update_config_item(key, pos_dict[key]) + instr.update_config_item(pos_dict) def set_flow_rate( self, @@ -369,7 +370,9 @@ def instrument_max_height( pip = self.get_pipette(mount) cp = self.critical_point_for(mount, critical_point) - max_height = pip.config.home_position - retract_distance + cp.z + max_height = ( + pip.config.mount_configurations.homePosition - retract_distance + cp.z + ) return max_height @@ -441,7 +444,7 @@ def plunger_position( self, instr: Pipette, ul: float, action: "UlPerMmAction" ) -> float: mm = ul / instr.ul_per_mm(ul, action) - position = mm + instr.config.bottom + position = mm + instr.plunger_positions.bottom return round(position, 6) def plunger_speed( @@ -521,7 +524,7 @@ def plan_check_aspirate( # type: ignore[no-untyped-def] plunger_distance=dist, speed=speed, instr=instrument, - current=instrument.config.plunger_current, + current=instrument.plunger_motor_current.run, ) else: return LiquidActionSpec( @@ -530,7 +533,7 @@ def plan_check_aspirate( # type: ignore[no-untyped-def] plunger_distance=dist, speed=speed, instr=instrument, - current=instrument.config.plunger_current, + current=instrument.plunger_motor_current.run, ) @overload @@ -598,7 +601,7 @@ def plan_check_dispense( # type: ignore[no-untyped-def] plunger_distance=dist, speed=speed, instr=instrument, - current=instrument.config.plunger_current, + current=instrument.plunger_motor_current.run, ) else: return LiquidActionSpec( @@ -607,7 +610,7 @@ def plan_check_dispense( # type: ignore[no-untyped-def] plunger_distance=dist, speed=speed, instr=instrument, - current=instrument.config.plunger_current, + current=instrument.plunger_motor_current.run, ) @overload @@ -630,19 +633,19 @@ def plan_check_blow_out(self, mount): # type: ignore[no-untyped-def] return LiquidActionSpec( axis=Axis.of_plunger(mount), volume=0, - plunger_distance=instrument.config.blow_out, + plunger_distance=instrument.plunger_positions.blow_out, speed=speed, instr=instrument, - current=instrument.config.plunger_current, + current=instrument.plunger_motor_current.run, ) else: return LiquidActionSpec( axis=Axis.of_main_tool_actuator(mount), volume=0, - plunger_distance=instrument.config.blow_out, + plunger_distance=instrument.plunger_positions.blow_out, speed=speed, instr=instrument, - current=instrument.config.plunger_current, + current=instrument.plunger_motor_current.run, ) @staticmethod @@ -662,7 +665,7 @@ def build_one_shake() -> List[Tuple[top_types.Point, Optional[float]]]: (top_types.Point(0, 0, DROP_TIP_RELEASE_DISTANCE), None), # up ] - if "pickupTipShake" in instrument.config.quirks: + if Quirks.pickupTipShake in instrument.config.quirks: return build_one_shake() + build_one_shake() else: return [] @@ -702,16 +705,16 @@ def plan_check_pick_up_tip( # type: ignore[no-untyped-def] self._ihp_log.debug(f"Picking up tip on {mount.name}") if presses is None or presses < 0: - checked_presses = instrument.config.pick_up_presses + checked_presses = instrument.pick_up_configurations.presses else: checked_presses = presses if not increment or increment < 0: - check_incr = instrument.config.pick_up_increment + check_incr = instrument.pick_up_configurations.increment else: check_incr = increment - pick_up_speed = instrument.config.pick_up_speed + pick_up_speed = instrument.pick_up_configurations.speed def build_presses() -> Iterator[Tuple[float, float]]: # Press the nozzle into the tip number of times, @@ -719,7 +722,8 @@ def build_presses() -> Iterator[Tuple[float, float]]: for i in range(checked_presses): # move nozzle down into the tip press_dist = ( - -1.0 * instrument.config.pick_up_distance + -1.0 * check_incr * i + -1.0 * instrument.pick_up_configurations.distance + + -1.0 * check_incr * i ) # move nozzle back up backup_dist = -press_dist @@ -732,14 +736,16 @@ def add_tip_to_instr() -> None: if isinstance(mount, top_types.Mount): return ( PickUpTipSpec( - plunger_prep_pos=instrument.config.bottom, + plunger_prep_pos=instrument.plunger_positions.bottom, plunger_currents={ - Axis.of_plunger(mount): instrument.config.plunger_current + Axis.of_plunger(mount): instrument.plunger_motor_current.run }, presses=[ PickUpTipPressSpec( current={ - Axis.by_mount(mount): instrument.config.pick_up_current + Axis.by_mount( + mount + ): instrument.pick_up_configurations.current }, speed=pick_up_speed, relative_down=top_types.Point(0, 0, press_dist), @@ -748,7 +754,7 @@ def add_tip_to_instr() -> None: for press_dist, backup_dist in build_presses() ], shake_off_list=self._build_pickup_shakes(instrument), - retract_target=instrument.config.pick_up_distance + retract_target=instrument.pick_up_configurations.distance + check_incr * checked_presses + 2, ), @@ -757,16 +763,18 @@ def add_tip_to_instr() -> None: else: return ( PickUpTipSpec( - plunger_prep_pos=instrument.config.bottom, + plunger_prep_pos=instrument.plunger_positions.bottom, plunger_currents={ Axis.of_main_tool_actuator( mount - ): instrument.config.plunger_current + ): instrument.plunger_motor_current.run }, presses=[ PickUpTipPressSpec( current={ - Axis.by_mount(mount): instrument.config.pick_up_current + Axis.by_mount( + mount + ): instrument.pick_up_configurations.current }, speed=pick_up_speed, relative_down=top_types.Point(0, 0, press_dist), @@ -775,7 +783,7 @@ def add_tip_to_instr() -> None: for press_dist, backup_dist in build_presses() ], shake_off_list=self._build_pickup_shakes(instrument), - retract_target=instrument.config.pick_up_distance + retract_target=instrument.pick_up_configurations.distance + check_incr * checked_presses + 2, ), @@ -853,11 +861,11 @@ def plan_check_drop_tip( # type: ignore[no-untyped-def] instrument = self.get_pipette(mount) self.ready_for_tip_action(instrument, HardwareAction.DROPTIP) - bottom = instrument.config.bottom - droptip = instrument.config.drop_tip - speed = instrument.config.drop_tip_speed + bottom = instrument.plunger_positions.bottom + droptip = instrument.plunger_positions.drop_tip + speed = instrument.drop_configurations.speed shakes: List[Tuple[top_types.Point, Optional[float]]] = [] - if "dropTipShake" in instrument.config.quirks: + if Quirks.dropTipShake in instrument.config.quirks: diameter = instrument.current_tiprack_diameter shakes = self._shake_off_tips_drop(diameter) @@ -870,21 +878,21 @@ def _remove_tips() -> None: seq_builder_ot2 = self._droptip_sequence_builder( bottom, droptip, - {Axis.of_plunger(mount): instrument.config.plunger_current}, - {Axis.of_plunger(mount): instrument.config.drop_tip_current}, + {Axis.of_plunger(mount): instrument.plunger_motor_current.run}, + {Axis.of_plunger(mount): instrument.drop_configurations.current}, speed, home_after, (Axis.of_plunger(mount),), ) seq_ot2 = seq_builder_ot2() - if "doubleDropTip" in instrument.config.quirks: + if Quirks.doubleDropTip in instrument.config.quirks: seq_ot2 = seq_ot2 + seq_builder_ot2() return ( DropTipSpec( drop_moves=seq_ot2, shake_moves=shakes, ending_current={ - Axis.of_plunger(mount): instrument.config.plunger_current + Axis.of_plunger(mount): instrument.plunger_motor_current.run }, ), _remove_tips, @@ -893,15 +901,23 @@ def _remove_tips() -> None: seq_builder_ot3 = self._droptip_sequence_builder( bottom, droptip, - {Axis.of_main_tool_actuator(mount): instrument.config.plunger_current}, - {Axis.of_main_tool_actuator(mount): instrument.config.drop_tip_current}, + { + Axis.of_main_tool_actuator( + mount + ): instrument.plunger_motor_current.run + }, + { + Axis.of_main_tool_actuator( + mount + ): instrument.drop_configurations.current + }, speed, home_after, (Axis.of_main_tool_actuator(mount),), ) seq_ot3 = seq_builder_ot3() - if "doubleDropTip" in instrument.config.quirks: + if Quirks.doubleDropTip in instrument.config.quirks: seq_ot3 = seq_ot3 + seq_builder_ot3() return ( DropTipSpec( @@ -910,7 +926,7 @@ def _remove_tips() -> None: ending_current={ Axis.of_main_tool_actuator( mount - ): instrument.config.plunger_current + ): instrument.plunger_motor_current.run }, ), _remove_tips, @@ -932,7 +948,7 @@ def plunger_position( self, instr: Pipette, ul: float, action: "UlPerMmAction" ) -> float: mm = ul / instr.ul_per_mm(ul, action) - position = instr.config.bottom - mm + position = instr.plunger_positions.bottom - mm return round(position, 6) def critical_point_for( diff --git a/api/src/opentrons/hardware_control/instruments/ot3/gripper.py b/api/src/opentrons/hardware_control/instruments/ot3/gripper.py index 6da1f8b428e..ac68dc691b9 100644 --- a/api/src/opentrons/hardware_control/instruments/ot3/gripper.py +++ b/api/src/opentrons/hardware_control/instruments/ot3/gripper.py @@ -3,7 +3,7 @@ """ Classes and functions for gripper state tracking """ import logging -from typing import Any, Optional, Set +from typing import Any, Optional, Set, Dict, Tuple from opentrons.types import Point from opentrons.config import gripper_config @@ -141,7 +141,7 @@ def state(self, s: GripperJawState) -> None: def config(self) -> GripperDefinition: return self._config - def update_config_item(self, elem_name: str, elem_val: Any) -> None: + def update_config_item(self, elements: Dict[str, Any]) -> None: raise NotImplementedError("Update config is not supported at this time.") @property @@ -237,7 +237,7 @@ def _reload_gripper( new_config: GripperDefinition, attached_instr: Gripper, cal_offset: GripperCalibrationOffset, -) -> Gripper: +) -> Tuple[Gripper, bool]: # Once we have determined that the new and attached grippers # are similar enough that we might skip, see if the configs # match closely enough. @@ -247,7 +247,7 @@ def _reload_gripper( and cal_offset == attached_instr._calibration_offset ): # Same config, good enough - return attached_instr + return attached_instr, True else: newdict = new_config.dict() olddict = attached_instr.config.dict() @@ -257,22 +257,25 @@ def _reload_gripper( changed.add(k) if changed.intersection(RECONFIG_KEYS): # Something has changed that requires reconfig - return Gripper( - new_config, - cal_offset, - attached_instr._gripper_id, + return ( + Gripper( + new_config, + cal_offset, + attached_instr._gripper_id, + ), + False, ) else: # update just the cal offset and update info attached_instr._calibration_offset = cal_offset - return attached_instr + return attached_instr, True def compare_gripper_config_and_check_skip( freshly_detected: AttachedGripper, attached: Optional[Gripper], cal_offset: GripperCalibrationOffset, -) -> Optional[Gripper]: +) -> Tuple[Optional[Gripper], bool]: """ Given the gripper config for an attached gripper (if any) freshly read from disk, and any attached instruments, @@ -288,7 +291,7 @@ def compare_gripper_config_and_check_skip( if not config and not attached: # nothing attached now, nothing used to be attached, nothing # to reconfigure - return attached + return attached, True if config and attached: # something was attached and something is attached. are they @@ -298,6 +301,6 @@ def compare_gripper_config_and_check_skip( return _reload_gripper(config, attached, cal_offset) if config: - return Gripper(config, cal_offset, serial) + return Gripper(config, cal_offset, serial), False else: - return None + return None, False diff --git a/api/src/opentrons/hardware_control/instruments/ot3/pipette.py b/api/src/opentrons/hardware_control/instruments/ot3/pipette.py index 815dada3b92..b468e38cc77 100644 --- a/api/src/opentrons/hardware_control/instruments/ot3/pipette.py +++ b/api/src/opentrons/hardware_control/instruments/ot3/pipette.py @@ -6,17 +6,22 @@ from opentrons.types import Point +from opentrons.config import feature_flags as ff from opentrons_shared_data.pipette.pipette_definition import ( PipetteConfigurations, - PipetteTipType, PlungerPositions, MotorConfigurations, SupportedTipsDefinition, TipHandlingConfigurations, - PipetteModelType, - PipetteChannelType, + PipetteNameType, + PipetteModelVersionType, ) from ..instrument_abc import AbstractInstrument +from ..instrument_helpers import ( + piecewise_volume_conversion, + PIPETTING_FUNCTION_FALLBACK_VERSION, + PIPETTING_FUNCTION_LATEST_VERSION, +) from .instrument_calibration import ( save_pipette_offset_calibration, load_pipette_offset, @@ -28,8 +33,8 @@ PipetteModel, ) from opentrons_shared_data.pipette import ( - pipette_load_name_conversions as pipette_load_name, load_data as load_pipette_data, + types as pip_types, ) from opentrons.hardware_control.types import CriticalPoint, OT3Mount from opentrons.hardware_control.errors import InvalidMoveError @@ -40,33 +45,6 @@ INTERNOZZLE_SPACING_MM: Final[float] = 9 -def piecewise_volume_conversion( - ul: float, sequence: List[Tuple[float, float, float]] -) -> float: - """ - Takes a volume in microliters and a sequence representing a piecewise - function for the slope and y-intercept of a ul/mm function, where each - sub-list in the sequence contains: - - - the max volume for the piece of the function (minimum implied from the - max of the previous item or 0 - - the slope of the segment - - the y-intercept of the segment - - :return: the ul/mm value for the specified volume - """ - # pick the first item from the seq for which the target is less than - # the bracketing element - for x in sequence: - if ul <= x[0]: - # use that element to calculate the movement distance in mm - return x[1] * ul + x[2] - - # Compatibility with previous implementation of search. - # list(filter(lambda x: ul <= x[0], sequence))[0] - raise IndexError() - - class Pipette(AbstractInstrument[PipetteConfigurations]): """A class to gather and track pipette state and configs. @@ -96,13 +74,13 @@ def __init__( self._backlash_distance = config.backlash_distance # TODO (lc 12-05-2022) figure out how we can safely deprecate "name" and "model" - self._pipette_name = pipette_load_name.PipetteNameType( + self._pipette_name = PipetteNameType( pipette_type=config.pipette_type, pipette_channels=config.channels, pipette_generation=config.display_category, ) self._acting_as = self._pipette_name - self._pipette_model = pipette_load_name.PipetteModelVersionType( + self._pipette_model = PipetteModelVersionType( pipette_type=config.pipette_type, pipette_channels=config.channels, pipette_version=config.version, @@ -125,26 +103,42 @@ def __init__( self.ready_to_aspirate = False #: True if ready to aspirate self._active_tip_settings = self._config.supported_tips[ - PipetteTipType(self._working_volume) + pip_types.PipetteTipType(self._working_volume) ] self._fallback_tip_length = self._active_tip_settings.default_tip_length - self._aspirate_flow_rate = self._active_tip_settings.default_aspirate_flowrate - self._dispense_flow_rate = self._active_tip_settings.default_dispense_flowrate - self._blow_out_flow_rate = self._active_tip_settings.default_blowout_flowrate - # TODO (lc 12-6-2022) When we switch over to sending pipette state, we - # we should also try to make sure the python api isn't reaching into - # Pipette interals. For now, we want to make sure the shape of - # tip overlap matches the shape of OT2 pipettes. We'll also need - # to revisit some liquid configurations for tiprack types. - self._tip_overlap = {"default": self._active_tip_settings.default_tip_overlap} + self._aspirate_flow_rates_lookup = ( + self._active_tip_settings.default_aspirate_flowrate.values_by_api_level + ) + self._dispense_flow_rates_lookup = ( + self._active_tip_settings.default_dispense_flowrate.values_by_api_level + ) + self._blowout_flow_rates_lookup = ( + self._active_tip_settings.default_blowout_flowrate.values_by_api_level + ) + self._aspirate_flow_rate = ( + self._active_tip_settings.default_aspirate_flowrate.default + ) + self._dispense_flow_rate = ( + self._active_tip_settings.default_dispense_flowrate.default + ) + self._blow_out_flow_rate = ( + self._active_tip_settings.default_blowout_flowrate.default + ) + + self._tip_overlap_lookup = self._config.tip_overlap_dictionary + + if ff.use_old_aspiration_functions(): + self._pipetting_function_version = PIPETTING_FUNCTION_FALLBACK_VERSION + else: + self._pipetting_function_version = PIPETTING_FUNCTION_LATEST_VERSION @property def config(self) -> PipetteConfigurations: return self._config @property - def channels(self) -> PipetteChannelType: + def channels(self) -> pip_types.PipetteChannelType: return self._max_channels @property @@ -153,7 +147,7 @@ def backlash_distance(self) -> float: @property def tip_overlap(self) -> Dict[str, float]: - return self._tip_overlap + return self._tip_overlap_lookup @property def nozzle_offset(self) -> List[float]: @@ -198,7 +192,7 @@ def act_as(self, name: PipetteName) -> None: "Backwards compatibility is not supported at this time." ) - def update_config_item(self, elem_name: str, elem_val: Any) -> None: + def update_config_item(self, elem_name: Dict[str, Any]) -> None: raise NotImplementedError("Update config is not supported at this time.") @property @@ -222,14 +216,21 @@ def reset_state(self) -> None: self.ready_to_aspirate = False #: True if ready to aspirate self._active_tip_settings = self._config.supported_tips[ - PipetteTipType(self._working_volume) + pip_types.PipetteTipType(self._working_volume) ] self._fallback_tip_length = self._active_tip_settings.default_tip_length - self._aspirate_flow_rate = self._active_tip_settings.default_aspirate_flowrate - self._dispense_flow_rate = self._active_tip_settings.default_dispense_flowrate - self._blow_out_flow_rate = self._active_tip_settings.default_blowout_flowrate - self._tip_overlap = {"default": self._active_tip_settings.default_tip_overlap} + self._aspirate_flow_rate = ( + self._active_tip_settings.default_aspirate_flowrate.default + ) + self._dispense_flow_rate = ( + self._active_tip_settings.default_dispense_flowrate.default + ) + self._blow_out_flow_rate = ( + self._active_tip_settings.default_blowout_flowrate.default + ) + + self._tip_overlap_lookup = self._config.tip_overlap_dictionary def reset_pipette_offset(self, mount: OT3Mount, to_default: bool) -> None: """Reset the pipette offset to system defaults.""" @@ -255,7 +256,7 @@ def model(self) -> PipetteModel: return cast(PipetteModel, f"{self._pipette_model}") @property - def pipette_type(self) -> PipetteModelType: + def pipette_type(self) -> pip_types.PipetteModelType: return self._pipette_type @property @@ -280,11 +281,11 @@ def critical_point(self, cp_override: Optional[CriticalPoint] = None) -> Point: # the pipette configurations. X_DIRECTION_VALUE = 1 Y_DIVISION = 2 - if self.channels.value == 96: + if self.channels == 96: NUM_ROWS = 12 NUM_COLS = 8 X_DIRECTION_VALUE = -1 - elif self.channels.value == 8: + elif self.channels == 8: NUM_ROWS = 1 NUM_COLS = 8 else: @@ -400,6 +401,18 @@ def blow_out_flow_rate(self, new_flow_rate: float) -> None: assert new_flow_rate > 0 self._blow_out_flow_rate = new_flow_rate + @property + def aspirate_flow_rates_lookup(self) -> Dict[str, float]: + return self._aspirate_flow_rates_lookup + + @property + def dispense_flow_rates_lookup(self) -> Dict[str, float]: + return self._dispense_flow_rates_lookup + + @property + def blow_out_flow_rates_lookup(self) -> Dict[str, float]: + return self._blowout_flow_rates_lookup + @property def working_volume(self) -> float: """The working volume of the pipette""" @@ -410,10 +423,10 @@ def working_volume(self, tip_volume: float) -> None: """The working volume is the current tip max volume""" self._working_volume = min(self.config.max_volume, tip_volume) self._active_tip_settings = self._config.supported_tips[ - PipetteTipType(int(self._working_volume)) + pip_types.PipetteTipType(int(self._working_volume)) ] self._fallback_tip_length = self._active_tip_settings.default_tip_length - self._tip_overlap = {"default": self._active_tip_settings.default_tip_overlap} + self._tip_overlap_lookup = self._config.tip_overlap_dictionary @property def available_volume(self) -> float: @@ -466,15 +479,23 @@ def has_tip(self) -> bool: # Cache max is chosen somewhat arbitrarily. With a float is input we don't # want this to unbounded. @functools.lru_cache(maxsize=100) - def ul_per_mm( - self, ul: float, action: UlPerMmAction, specific_tip: str = "default" - ) -> float: + def ul_per_mm(self, ul: float, action: UlPerMmAction) -> float: if action == "aspirate": - sequence = self._active_tip_settings.aspirate[specific_tip] + fallback = self._active_tip_settings.aspirate.default[ + PIPETTING_FUNCTION_FALLBACK_VERSION + ] + sequence = self._active_tip_settings.aspirate.default.get( + self._pipetting_function_version, fallback + ) elif action == "blowout": return self._config.shaft_ul_per_mm else: - sequence = self._active_tip_settings.dispense[specific_tip] + fallback = self._active_tip_settings.dispense.default[ + PIPETTING_FUNCTION_FALLBACK_VERSION + ] + sequence = self._active_tip_settings.dispense.default.get( + self._pipetting_function_version, fallback + ) return piecewise_volume_conversion(ul, sequence) def __str__(self) -> str: @@ -504,9 +525,9 @@ def as_dict(self) -> "Pipette.DictType": "aspirate_flow_rate": self.aspirate_flow_rate, "dispense_flow_rate": self.dispense_flow_rate, "blow_out_flow_rate": self.blow_out_flow_rate, - "default_aspirate_flow_rates": self.active_tip_settings.default_aspirate_flowrate, - "default_blow_out_flow_rates": self.active_tip_settings.default_blowout_flowrate, - "default_dispense_flow_rates": self.active_tip_settings.default_dispense_flowrate, + "default_aspirate_flow_rates": self.active_tip_settings.default_aspirate_flowrate.values_by_api_level, + "default_blow_out_flow_rates": self.active_tip_settings.default_blowout_flowrate.values_by_api_level, + "default_dispense_flow_rates": self.active_tip_settings.default_dispense_flowrate.values_by_api_level, "tip_length": self.current_tip_length, "return_tip_height": self.active_tip_settings.default_return_tip_height, "tip_overlap": self.tip_overlap, diff --git a/api/src/opentrons/hardware_control/instruments/ot3/pipette_handler.py b/api/src/opentrons/hardware_control/instruments/ot3/pipette_handler.py index f6a18bcd1e8..8c805c0e466 100644 --- a/api/src/opentrons/hardware_control/instruments/ot3/pipette_handler.py +++ b/api/src/opentrons/hardware_control/instruments/ot3/pipette_handler.py @@ -213,7 +213,6 @@ def get_attached_instrument(self, mount: OT3Mount) -> PipetteDict: "name", "min_volume", "max_volume", - "channels", "aspirate_flow_rate", "dispense_flow_rate", "pipette_id", @@ -237,7 +236,7 @@ def get_attached_instrument(self, mount: OT3Mount) -> PipetteDict: # this dict newly every time? Any why only a few items are being updated? for key in configs: result[key] = instr_dict[key] - result["channels"] = instr._max_channels.as_int + result["channels"] = instr._max_channels result["has_tip"] = instr.has_tip result["tip_length"] = instr.current_tip_length result["aspirate_speed"] = self.plunger_speed( @@ -250,29 +249,19 @@ def get_attached_instrument(self, mount: OT3Mount) -> PipetteDict: instr, instr.blow_out_flow_rate, "dispense" ) result["ready_to_aspirate"] = instr.ready_to_aspirate - # TODO (12-5-2022) Not really sure what this is supposed to - # be for.... revisit when we separate out static configs and - # stateful configs. + result["default_blow_out_speeds"] = { - "2.0": self.plunger_speed( - instr, - instr.active_tip_settings.default_dispense_flowrate, - "dispense", - ) + alvl: self.plunger_speed(instr, fr, "blowout") + for alvl, fr in instr.blow_out_flow_rates_lookup.items() } + result["default_dispense_speeds"] = { - "2.0": self.plunger_speed( - instr, - instr.active_tip_settings.default_dispense_flowrate, - "dispense", - ) + alvl: self.plunger_speed(instr, fr, "dispense") + for alvl, fr in instr.dispense_flow_rates_lookup.items() } result["default_aspirate_speeds"] = { - "2.0": self.plunger_speed( - instr, - instr._active_tip_settings.default_aspirate_flowrate, - "aspirate", - ) + alvl: self.plunger_speed(instr, fr, "aspirate") + for alvl, fr in instr.aspirate_flow_rates_lookup.items() } result[ "default_blow_out_volume" @@ -344,8 +333,7 @@ def calibrate_plunger( pos_dict["blow_out"] = blow_out if drop_tip is not None: pos_dict["drop_tip"] = drop_tip - for key in pos_dict.keys(): - instr.update_config_item(key, pos_dict[key]) + instr.update_config_item(pos_dict) def set_flow_rate( self, @@ -675,7 +663,7 @@ def build_presses() -> Iterator[Tuple[float, float]]: backup_dist = -press_dist yield (press_dist, backup_dist) - if instrument.channels.value == 96: + if instrument.channels == 96: return ( PickUpTipSpec( plunger_prep_pos=instrument.plunger_positions.bottom, @@ -791,7 +779,7 @@ def plan_check_drop_tip( instrument = self.get_pipette(mount) self.ready_for_tip_action(instrument, HardwareAction.DROPTIP) - is_96_chan = instrument.channels.value == 96 + is_96_chan = instrument.channels == 96 bottom = instrument.plunger_positions.bottom droptip = ( diff --git a/api/src/opentrons/hardware_control/ot3_calibration.py b/api/src/opentrons/hardware_control/ot3_calibration.py index c387bf8d740..cfd87f0b032 100644 --- a/api/src/opentrons/hardware_control/ot3_calibration.py +++ b/api/src/opentrons/hardware_control/ot3_calibration.py @@ -726,19 +726,18 @@ async def calibrate_gripper_jaw( the average of the pin offsets, which can be obtained by passing the two offsets into the `gripper_pin_offsets_mean` func. """ - async with hcapi.instrument_cache_lock(): - try: - await hcapi.reset_instrument_offset(OT3Mount.GRIPPER) - hcapi.add_gripper_probe(probe) - await hcapi.grip(GRIPPER_GRIP_FORCE) - offset = await _calibrate_mount( - hcapi, OT3Mount.GRIPPER, slot, method, raise_verify_error - ) - LOG.info(f"Gripper {probe.name} probe offset: {offset}") - return offset - finally: - hcapi.remove_gripper_probe() - await hcapi.ungrip() + try: + await hcapi.reset_instrument_offset(OT3Mount.GRIPPER) + hcapi.add_gripper_probe(probe) + await hcapi.grip(GRIPPER_GRIP_FORCE) + offset = await _calibrate_mount( + hcapi, OT3Mount.GRIPPER, slot, method, raise_verify_error + ) + LOG.info(f"Gripper {probe.name} probe offset: {offset}") + return offset + finally: + hcapi.remove_gripper_probe() + await hcapi.ungrip() async def calibrate_gripper( @@ -766,17 +765,14 @@ async def calibrate_pipette( tip has been attached, or the conductive probe has been attached, or the probe has been lowered). """ - async with hcapi.instrument_cache_lock(): - try: - await hcapi.reset_instrument_offset(mount) - await hcapi.add_tip(mount, hcapi.config.calibration.probe_length) - offset = await _calibrate_mount( - hcapi, mount, slot, method, raise_verify_error - ) - await hcapi.save_instrument_offset(mount, offset) - return offset - finally: - await hcapi.remove_tip(mount) + try: + await hcapi.reset_instrument_offset(mount) + await hcapi.add_tip(mount, hcapi.config.calibration.probe_length) + offset = await _calibrate_mount(hcapi, mount, slot, method, raise_verify_error) + await hcapi.save_instrument_offset(mount, offset) + return offset + finally: + await hcapi.remove_tip(mount) async def calibrate_module( @@ -800,39 +796,38 @@ async def calibrate_module( The robot should be homed before calling this function. """ - async with hcapi.instrument_cache_lock(): - try: - # add the probe depending on the mount - if mount == OT3Mount.GRIPPER: - hcapi.add_gripper_probe(GripperProbe.FRONT) - else: - await hcapi.add_tip(mount, hcapi.config.calibration.probe_length) + try: + # add the probe depending on the mount + if mount == OT3Mount.GRIPPER: + hcapi.add_gripper_probe(GripperProbe.FRONT) + else: + await hcapi.add_tip(mount, hcapi.config.calibration.probe_length) - LOG.info( - f"Starting module calibration for {module_id} at {nominal_position} using {mount}" - ) - # FIXME (ba, 2023-04-04): Well B1 of the module adapter definition includes the z prep offset - # of 13x13mm in the nominial position, but we are still using PREP_OFFSET_DEPTH in - # find_calibration_structure_height which effectively doubles the offset. We plan - # on removing PREP_OFFSET_DEPTH in the near future, but for now just subtract PREP_OFFSET_DEPTH - # from the nominal position so we dont have to alter any other part of the system. - nominal_position = nominal_position - PREP_OFFSET_DEPTH - offset = await find_calibration_structure_position( - hcapi, - mount, - nominal_position, - method=CalibrationMethod.BINARY_SEARCH, - target=CalibrationTarget.DECK_OBJECT, - ) - await hcapi.save_module_offset(module_id, mount, slot, offset) - return offset - finally: - # remove probe - if mount == OT3Mount.GRIPPER: - hcapi.remove_gripper_probe() - await hcapi.ungrip() - else: - await hcapi.remove_tip(mount) + LOG.info( + f"Starting module calibration for {module_id} at {nominal_position} using {mount}" + ) + # FIXME (ba, 2023-04-04): Well B1 of the module adapter definition includes the z prep offset + # of 13x13mm in the nominial position, but we are still using PREP_OFFSET_DEPTH in + # find_calibration_structure_height which effectively doubles the offset. We plan + # on removing PREP_OFFSET_DEPTH in the near future, but for now just subtract PREP_OFFSET_DEPTH + # from the nominal position so we dont have to alter any other part of the system. + nominal_position = nominal_position - PREP_OFFSET_DEPTH + offset = await find_calibration_structure_position( + hcapi, + mount, + nominal_position, + method=CalibrationMethod.BINARY_SEARCH, + target=CalibrationTarget.DECK_OBJECT, + ) + await hcapi.save_module_offset(module_id, mount, slot, offset) + return offset + finally: + # remove probe + if mount == OT3Mount.GRIPPER: + hcapi.remove_gripper_probe() + await hcapi.ungrip() + else: + await hcapi.remove_tip(mount) async def calibrate_belts( @@ -852,18 +847,17 @@ async def calibrate_belts( ------- A listed matrix of the linear transform in the x and y dimensions that accounts for the stretch of the gantry x and y belts. """ - async with hcapi.instrument_cache_lock(): - if mount == OT3Mount.GRIPPER: - raise RuntimeError("Must use pipette mount, not gripper") - try: - hcapi.reset_deck_calibration() - await hcapi.add_tip(mount, hcapi.config.calibration.probe_length) - belt_attitude = await _determine_transform_matrix(hcapi, mount) - save_robot_belt_attitude(belt_attitude, pipette_id) - return belt_attitude - finally: - hcapi.load_deck_calibration() - await hcapi.remove_tip(mount) + if mount == OT3Mount.GRIPPER: + raise RuntimeError("Must use pipette mount, not gripper") + try: + hcapi.reset_deck_calibration() + await hcapi.add_tip(mount, hcapi.config.calibration.probe_length) + belt_attitude = await _determine_transform_matrix(hcapi, mount) + save_robot_belt_attitude(belt_attitude, pipette_id) + return belt_attitude + finally: + hcapi.load_deck_calibration() + await hcapi.remove_tip(mount) def apply_machine_transform( diff --git a/api/src/opentrons/hardware_control/ot3api.py b/api/src/opentrons/hardware_control/ot3api.py index d9a43dfa5c4..48b4ff4b915 100644 --- a/api/src/opentrons/hardware_control/ot3api.py +++ b/api/src/opentrons/hardware_control/ot3api.py @@ -7,7 +7,6 @@ from collections import OrderedDict from typing import ( AsyncIterator, - AsyncGenerator, cast, Callable, Dict, @@ -98,6 +97,8 @@ StatusBarState, SubSystemState, TipStateType, + EstopOverallStatus, + EstopAttachLocation, ) from .errors import ( MustHomeError, @@ -137,7 +138,7 @@ from .dev_types import ( AttachedGripper, - OT3AttachedPipette, + AttachedPipette, PipetteDict, InstrumentDict, GripperDict, @@ -201,7 +202,6 @@ def __init__( self._config = config self._backend = backend self._loop = loop - self._instrument_cache_lock = asyncio.Lock() self._callbacks: Set[HardwareEventHandler] = set() # {'X': 0.0, 'Y': 0.0, 'Z': 0.0, 'A': 0.0, 'B': 0.0, 'C': 0.0} @@ -325,11 +325,13 @@ async def build_hardware_controller( api_instance, board_revision=backend.board_revision ) backend.module_controls = module_controls + await backend.build_estop_detector() door_state = await backend.door_state() api_instance._update_door_state(door_state) backend.add_door_state_listener(api_instance._update_door_state) checked_loop.create_task(backend.watch(loop=checked_loop)) backend.initialized = True + await api_instance.refresh_positions() return api_instance @classmethod @@ -374,6 +376,7 @@ async def build_hardware_simulator( ) backend.module_controls = module_controls await backend.watch(api_instance.loop) + await api_instance.refresh_positions() return api_instance def __repr__(self) -> str: @@ -501,22 +504,22 @@ def _gantry_load_from_instruments(self) -> GantryLoad: left = self._pipette_handler.has_pipette(OT3Mount.LEFT) if left: pip = self._pipette_handler.get_pipette(OT3Mount.LEFT) - if pip.config.channels.as_int > 8: + if pip.config.channels > 8: return GantryLoad.HIGH_THROUGHPUT return GantryLoad.LOW_THROUGHPUT async def cache_pipette( self, mount: OT3Mount, - instrument_data: OT3AttachedPipette, + instrument_data: AttachedPipette, req_instr: Optional[PipetteName], - ) -> None: + ) -> bool: """Set up pipette based on scanned information.""" config = instrument_data.get("config") pip_id = instrument_data.get("id") pip_offset_cal = load_pipette_offset(pip_id, mount) - p, _ = load_from_config_and_check_skip( + p, skipped = load_from_config_and_check_skip( config, self._pipette_handler.hardware_instruments[mount], req_instr, @@ -526,16 +529,18 @@ async def cache_pipette( self._pipette_handler.hardware_instruments[mount] = p # TODO (lc 12-5-2022) Properly support backwards compatibility # when applicable + return skipped - async def cache_gripper(self, instrument_data: AttachedGripper) -> None: + async def cache_gripper(self, instrument_data: AttachedGripper) -> bool: """Set up gripper based on scanned information.""" grip_cal = load_gripper_calibration_offset(instrument_data.get("id")) - g = compare_gripper_config_and_check_skip( + g, skipped = compare_gripper_config_and_check_skip( instrument_data, self._gripper_handler._gripper, grip_cal, ) self._gripper_handler.gripper = g + return skipped def get_all_attached_instr(self) -> Dict[OT3Mount, Optional[InstrumentDict]]: # NOTE (spp, 2023-03-07): The return type of this method indicates that @@ -557,21 +562,25 @@ async def cache_instruments( Scan the attached instruments, take necessary configuration actions, and set up hardware controller internal state if necessary. """ - if self._instrument_cache_lock.locked(): - self._log.info("Instrument cache is locked, not refreshing") - return - async with self.instrument_cache_lock(): - await self._cache_instruments(require) + skip_configure = await self._cache_instruments(require) + self._log.info( + f"Instrument model cache updated, skip configure: {skip_configure}" + ) + if not skip_configure: await self._configure_instruments() - async def _cache_instruments( + async def _cache_instruments( # noqa: C901 self, require: Optional[Dict[top_types.Mount, PipetteName]] = None - ) -> None: - """Actually cache instruments and scan network.""" - self._log.info("Updating instrument model cache") + ) -> bool: + """Actually cache instruments and scan network. + + Returns True if nothing changed since the last call and can skip any follow-up + configuration; False if we need to reconfigure. + """ checked_require = { OT3Mount.from_mount(m): v for m, v in (require or {}).items() } + skip_configure = True for mount, name in checked_require.items(): # TODO (lc 12-5-2022) cache instruments should be receiving # a pipette type / channels rather than the named config. @@ -585,27 +594,50 @@ async def _cache_instruments( found = await self._backend.get_attached_instruments(checked_require) if OT3Mount.GRIPPER in found.keys(): - await self.cache_gripper(cast(AttachedGripper, found.get(OT3Mount.GRIPPER))) + # Is now a gripper, ask if it's ok to skip + gripper_skip = await self.cache_gripper( + cast(AttachedGripper, found.get(OT3Mount.GRIPPER)) + ) + skip_configure &= gripper_skip + if not gripper_skip: + self._log.info( + "cache_instruments: must configure because gripper now attached or changed config" + ) elif self._gripper_handler.gripper: + # Is no gripper, have a cached gripper, definitely need to reconfig await self._gripper_handler.reset() + skip_configure = False + self._log.info("cache_instruments: must configure because gripper now gone") for pipette_mount in [OT3Mount.LEFT, OT3Mount.RIGHT]: if pipette_mount in found.keys(): + # is now a pipette, ask if we need to reconfig req_instr_name = checked_require.get(pipette_mount, None) - await self.cache_pipette( + pipette_skip = await self.cache_pipette( pipette_mount, - cast(OT3AttachedPipette, found.get(pipette_mount)), + cast(AttachedPipette, found.get(pipette_mount)), req_instr_name, ) - else: + skip_configure &= pipette_skip + if not pipette_skip: + self._log.info( + f"cache_instruments: must configure because {pipette_mount.name} now attached or changed" + ) + + elif self._pipette_handler.hardware_instruments[pipette_mount]: + # Is no pipette, have a cached pipette, need to reconfig + skip_configure = False self._pipette_handler.hardware_instruments[pipette_mount] = None + self._log.info( + f"cache_instruments: must configure because {pipette_mount.name} now empty" + ) - await self.refresh_positions() + return skip_configure async def _configure_instruments(self) -> None: """Configure instruments""" - await self._backend.update_motor_status() await self.set_gantry_load(self._gantry_load_from_instruments()) + await self.refresh_positions() @ExecutionManagerProvider.wait_for_running async def _update_position_estimation( @@ -2160,11 +2192,6 @@ async def capacitive_probe( await self.move_to(mount, pass_start_pos) return moving_axis.of_point(end_pos) - @contextlib.asynccontextmanager - async def instrument_cache_lock(self) -> AsyncGenerator[None, None]: - async with self._instrument_cache_lock: - yield - async def capacitive_sweep( self, mount: OT3Mount, @@ -2216,3 +2243,22 @@ async def capacitive_sweep( def attached_subsystems(self) -> Dict[SubSystem, SubSystemState]: """Get a view of the state of the currently-attached subsystems.""" return self._backend.subsystems + + @property + def estop_status(self) -> EstopOverallStatus: + return EstopOverallStatus( + state=self._backend.estop_state_machine.state, + left_physical_state=self._backend.estop_state_machine.get_physical_status( + EstopAttachLocation.LEFT + ), + right_physical_state=self._backend.estop_state_machine.get_physical_status( + EstopAttachLocation.RIGHT + ), + ) + + def estop_acknowledge_and_clear(self) -> EstopOverallStatus: + """Attempt to acknowledge an Estop event and clear the status. + + Returns the estop status after clearing the status.""" + self._backend.estop_state_machine.acknowledge_and_clear() + return self.estop_status diff --git a/api/src/opentrons/hardware_control/types.py b/api/src/opentrons/hardware_control/types.py index b42f93d336f..831293b0eca 100644 --- a/api/src/opentrons/hardware_control/types.py +++ b/api/src/opentrons/hardware_control/types.py @@ -4,7 +4,7 @@ from typing import cast, Tuple, Union, List, Callable, Dict, TypeVar, Type from typing_extensions import Literal from opentrons import types as top_types -from opentrons_shared_data.pipette.pipette_definition import PipetteChannelType +from opentrons_shared_data.pipette.types import PipetteChannelType MODULE_LOG = logging.getLogger(__name__) @@ -343,9 +343,41 @@ def __str__(self) -> str: return self.name.lower() +class EstopState(enum.Enum): + """Enumerated state machine for the estop status.""" + + PHYSICALLY_ENGAGED = enum.auto() + LOGICALLY_ENGAGED = enum.auto() + DISENGAGED = enum.auto() + NOT_PRESENT = enum.auto() + + +class EstopAttachLocation(enum.Enum): + """Enumerated estop attach locations.""" + + LEFT = enum.auto() + RIGHT = enum.auto() + + +class EstopPhysicalStatus(enum.Enum): + """Possible status of an estop.""" + + ENGAGED = enum.auto() + DISENGAGED = enum.auto() + NOT_PRESENT = enum.auto() + + class HardwareEventType(enum.Enum): DOOR_SWITCH_CHANGE = enum.auto() ERROR_MESSAGE = enum.auto() + ESTOP_CHANGE = enum.auto() + + +@dataclass +class EstopOverallStatus: + state: EstopState + left_physical_state: EstopPhysicalStatus + right_physical_state: EstopPhysicalStatus @dataclass(frozen=True) @@ -356,6 +388,13 @@ class DoorStateNotification: new_state: DoorState = DoorState.CLOSED +@dataclass(frozen=True) +class EstopStateNotification: + event: Literal[HardwareEventType.ESTOP_CHANGE] = HardwareEventType.ESTOP_CHANGE + old_state: EstopState = EstopState.NOT_PRESENT + new_state: EstopState = EstopState.NOT_PRESENT + + @dataclass(frozen=True) class ErrorMessageNotification: message: str @@ -364,7 +403,9 @@ class ErrorMessageNotification: # new event types get new dataclasses # when we add more event types we add them here -HardwareEvent = Union[DoorStateNotification, ErrorMessageNotification] +HardwareEvent = Union[ + DoorStateNotification, ErrorMessageNotification, EstopStateNotification +] HardwareEventHandler = Callable[[HardwareEvent], None] diff --git a/api/src/opentrons/protocol_api/core/engine/protocol.py b/api/src/opentrons/protocol_api/core/engine/protocol.py index 3935a757ab4..e7c979e0372 100644 --- a/api/src/opentrons/protocol_api/core/engine/protocol.py +++ b/api/src/opentrons/protocol_api/core/engine/protocol.py @@ -253,8 +253,6 @@ def move_labware( DeckSlotName, LabwareCore, ModuleCore, NonConnectedModuleCore, OffDeckType ], use_gripper: bool, - use_pick_up_location_lpc_offset: bool, - use_drop_location_lpc_offset: bool, pick_up_offset: Optional[Tuple[float, float, float]], drop_offset: Optional[Tuple[float, float, float]], ) -> None: @@ -286,8 +284,6 @@ def move_labware( labware_id=labware_core.labware_id, new_location=to_location, strategy=strategy, - use_pick_up_location_lpc_offset=use_pick_up_location_lpc_offset, - use_drop_location_lpc_offset=use_drop_location_lpc_offset, pick_up_offset=_pick_up_offset, drop_offset=_drop_offset, ) diff --git a/api/src/opentrons/protocol_api/core/legacy/legacy_protocol_core.py b/api/src/opentrons/protocol_api/core/legacy/legacy_protocol_core.py index dd23229b6a2..f68b77d5a6d 100644 --- a/api/src/opentrons/protocol_api/core/legacy/legacy_protocol_core.py +++ b/api/src/opentrons/protocol_api/core/legacy/legacy_protocol_core.py @@ -254,8 +254,6 @@ def move_labware( OffDeckType, ], use_gripper: bool, - use_pick_up_location_lpc_offset: bool, - use_drop_location_lpc_offset: bool, pick_up_offset: Optional[Tuple[float, float, float]], drop_offset: Optional[Tuple[float, float, float]], ) -> None: diff --git a/api/src/opentrons/protocol_api/core/protocol.py b/api/src/opentrons/protocol_api/core/protocol.py index 2fba8be2e32..c8f826b0d44 100644 --- a/api/src/opentrons/protocol_api/core/protocol.py +++ b/api/src/opentrons/protocol_api/core/protocol.py @@ -86,8 +86,6 @@ def move_labware( labware_core: LabwareCoreType, new_location: Union[DeckSlotName, LabwareCoreType, ModuleCoreType, OffDeckType], use_gripper: bool, - use_pick_up_location_lpc_offset: bool, - use_drop_location_lpc_offset: bool, pick_up_offset: Optional[Tuple[float, float, float]], drop_offset: Optional[Tuple[float, float, float]], ) -> None: diff --git a/api/src/opentrons/protocol_api/protocol_context.py b/api/src/opentrons/protocol_api/protocol_context.py index 59f3ed4d1ac..5ce639ee123 100644 --- a/api/src/opentrons/protocol_api/protocol_context.py +++ b/api/src/opentrons/protocol_api/protocol_context.py @@ -529,8 +529,6 @@ def move_labware( labware: Labware, new_location: Union[DeckLocation, Labware, ModuleTypes, OffDeckType], use_gripper: bool = False, - use_pick_up_location_lpc_offset: bool = False, - use_drop_location_lpc_offset: bool = False, pick_up_offset: Optional[Mapping[str, float]] = None, drop_offset: Optional[Mapping[str, float]] = None, ) -> None: @@ -600,8 +598,6 @@ def move_labware( labware_core=labware._core, new_location=location, use_gripper=use_gripper, - use_pick_up_location_lpc_offset=use_pick_up_location_lpc_offset, - use_drop_location_lpc_offset=use_drop_location_lpc_offset, pick_up_offset=_pick_up_offset, drop_offset=_drop_offset, ) @@ -648,14 +644,18 @@ def load_module( :type location: str or int or None :returns: The loaded and initialized module---a - :py:class:`TemperatureModuleContext`, - :py:class:`MagneticModuleContext`, - :py:class:`ThermocyclerContext`, or :py:class:`HeaterShakerContext`, + :py:class:`MagneticBlockContext`, + :py:class:`MagneticModuleContext`, + :py:class:`TemperatureModuleContext`, or + :py:class:`ThermocyclerContext`, depending on what you requested with ``module_name``. + .. versionchanged:: 2.13 + Added ``HeaterShakerContext`` return value. + .. versionchanged:: 2.15 - Added :py:class:`MagneticBlockContext` return value. + Added ``MagneticBlockContext`` return value. """ if configuration: if self._api_version < APIVersion(2, 4): diff --git a/api/src/opentrons/protocol_engine/clients/sync_client.py b/api/src/opentrons/protocol_engine/clients/sync_client.py index 3e96ce473ad..0560e868836 100644 --- a/api/src/opentrons/protocol_engine/clients/sync_client.py +++ b/api/src/opentrons/protocol_engine/clients/sync_client.py @@ -145,8 +145,6 @@ def move_labware( labware_id: str, new_location: LabwareLocation, strategy: LabwareMovementStrategy, - use_pick_up_location_lpc_offset: bool, - use_drop_location_lpc_offset: bool, pick_up_offset: Optional[LabwareOffsetVector], drop_offset: Optional[LabwareOffsetVector], ) -> commands.MoveLabwareResult: @@ -156,8 +154,6 @@ def move_labware( labwareId=labware_id, newLocation=new_location, strategy=strategy, - usePickUpLocationLpcOffset=use_pick_up_location_lpc_offset, - useDropLocationLpcOffset=use_drop_location_lpc_offset, pickUpOffset=pick_up_offset, dropOffset=drop_offset, ) diff --git a/api/src/opentrons/protocol_engine/commands/move_labware.py b/api/src/opentrons/protocol_engine/commands/move_labware.py index c832612bd24..1700b40428f 100644 --- a/api/src/opentrons/protocol_engine/commands/move_labware.py +++ b/api/src/opentrons/protocol_engine/commands/move_labware.py @@ -10,7 +10,7 @@ OnLabwareLocation, LabwareMovementStrategy, LabwareOffsetVector, - ExperimentalOffsetData, + LabwareMovementOffsetData, ) from ..errors import LabwareMovementNotAllowedError from ..resources import labware_validation @@ -35,16 +35,6 @@ class MoveLabwareParams(BaseModel): description="Whether to use the gripper to perform the labware movement" " or to perform a manual movement with an option to pause.", ) - usePickUpLocationLpcOffset: bool = Field( - False, - description="Whether to use LPC offset of the labware associated with its " - "pick up location. Experimental param, subject to change.", - ) - useDropLocationLpcOffset: bool = Field( - False, - description="Whether to use LPC offset of the labware associated with its " - "drop off location. Experimental param, subject to change.", - ) pickUpOffset: Optional[LabwareOffsetVector] = Field( None, description="Offset to use when picking up labware. " @@ -145,9 +135,7 @@ async def execute(self, params: MoveLabwareParams) -> MoveLabwareResult: validated_new_loc = self._labware_movement.ensure_valid_gripper_location( available_new_location, ) - experimental_offset_data = ExperimentalOffsetData( - usePickUpLocationLpcOffset=params.usePickUpLocationLpcOffset, - useDropLocationLpcOffset=params.useDropLocationLpcOffset, + user_offset_data = LabwareMovementOffsetData( pickUpOffset=params.pickUpOffset, dropOffset=params.dropOffset, ) @@ -156,8 +144,7 @@ async def execute(self, params: MoveLabwareParams) -> MoveLabwareResult: labware_id=params.labwareId, current_location=validated_current_loc, new_location=validated_new_loc, - experimental_offset_data=experimental_offset_data, - new_offset_id=new_offset_id, + user_offset_data=user_offset_data, ) elif params.strategy == LabwareMovementStrategy.MANUAL_MOVE_WITH_PAUSE: # Pause to allow for manual labware movement diff --git a/api/src/opentrons/protocol_engine/execution/equipment.py b/api/src/opentrons/protocol_engine/execution/equipment.py index 4ec2a7809b9..2320d2f3d73 100644 --- a/api/src/opentrons/protocol_engine/execution/equipment.py +++ b/api/src/opentrons/protocol_engine/execution/equipment.py @@ -39,6 +39,7 @@ LabwareLocation, DeckSlotLocation, ModuleLocation, + OnLabwareLocation, LabwareOffset, LabwareOffsetLocation, ModuleModel, @@ -387,16 +388,26 @@ def find_applicable_labware_offset_id( The ID of the labware offset that will apply, or None if no labware offset will apply. """ - if isinstance(labware_location, DeckSlotLocation): - offset = self._state_store.labware.find_applicable_labware_offset( - definition_uri=labware_definition_uri, - location=LabwareOffsetLocation( - slotName=labware_location.slotName, - moduleModel=None, - ), - ) - return self._get_id_from_offset(offset) + labware_offset_location = ( + self._get_labware_offset_location_from_labware_location(labware_location) + ) + if labware_offset_location is None: + # No offset for off-deck location. + # Returning None instead of raising an exception allows loading a labware + # with 'offDeck' as valid location. + # Also allows using `moveLabware` with 'offDeck' location. + return None + offset = self._state_store.labware.find_applicable_labware_offset( + definition_uri=labware_definition_uri, + location=labware_offset_location, + ) + return self._get_id_from_offset(offset) + def _get_labware_offset_location_from_labware_location( + self, labware_location: LabwareLocation + ) -> Optional[LabwareOffsetLocation]: + if isinstance(labware_location, DeckSlotLocation): + return LabwareOffsetLocation(slotName=labware_location.slotName) elif isinstance(labware_location, ModuleLocation): module_id = labware_location.moduleId # Allow ModuleNotLoadedError to propagate. @@ -430,20 +441,32 @@ def find_applicable_labware_offset_id( module_id=module_id ) slot_name = module_location.slotName - offset = self._state_store.labware.find_applicable_labware_offset( - definition_uri=labware_definition_uri, - location=LabwareOffsetLocation( - slotName=slot_name, - moduleModel=module_model, - ), + return LabwareOffsetLocation(slotName=slot_name, moduleModel=module_model) + elif isinstance(labware_location, OnLabwareLocation): + parent_labware_id = labware_location.labwareId + parent_labware_uri = self._state_store.labware.get_definition_uri( + parent_labware_id ) - return self._get_id_from_offset(offset) - else: - # No offset for off-deck location. - # Returning None instead of raising an exception allows loading a labware - # with 'offDeck' as valid location. - # Also allows using `moveLabware` with 'offDeck' location. + base_location = self._state_store.labware.get_parent_location( + parent_labware_id + ) + base_labware_offset_location = ( + self._get_labware_offset_location_from_labware_location(base_location) + ) + if base_labware_offset_location is None: + # No offset for labware sitting on labware off-deck + return None + + # If labware is being stacked on itself, all labware in the stack will share a labware offset due to + # them sharing the same definitionUri in `LabwareOffsetLocation`. This will not be true for the + # bottom-most labware, which will have a `DeckSlotLocation` and have its definitionUri field empty. + return LabwareOffsetLocation( + slotName=base_labware_offset_location.slotName, + moduleModel=base_labware_offset_location.moduleModel, + definitionUri=parent_labware_uri, + ) + else: # Off deck return None @staticmethod diff --git a/api/src/opentrons/protocol_engine/execution/labware_movement.py b/api/src/opentrons/protocol_engine/execution/labware_movement.py index 8f5646e2de8..fa592dae5f6 100644 --- a/api/src/opentrons/protocol_engine/execution/labware_movement.py +++ b/api/src/opentrons/protocol_engine/execution/labware_movement.py @@ -31,7 +31,7 @@ OnLabwareLocation, LabwareLocation, LabwareOffsetVector, - ExperimentalOffsetData, + LabwareMovementOffsetData, ) if TYPE_CHECKING: @@ -89,8 +89,7 @@ async def move_labware_with_gripper( labware_id: str, current_location: Union[DeckSlotLocation, ModuleLocation, OnLabwareLocation], new_location: Union[DeckSlotLocation, ModuleLocation, OnLabwareLocation], - experimental_offset_data: ExperimentalOffsetData, - new_offset_id: Optional[str], + user_offset_data: LabwareMovementOffsetData, ) -> None: """Move a loaded labware from one location to another.""" use_virtual_gripper = self._state_store.config.use_virtual_gripper @@ -125,12 +124,8 @@ async def move_labware_with_gripper( async with self._thermocycler_plate_lifter.lift_plate_for_labware_movement( labware_location=current_location ): - labware_pickup_offset = self.get_experimental_labware_movement_offset_vector( - use_current_offset=experimental_offset_data.usePickUpLocationLpcOffset, - current_offset_vector=self._state_store.labware.get_labware_offset_vector( - labware_id - ), - additional_offset_vector=experimental_offset_data.pickUpOffset, + labware_pickup_offset = self.get_final_labware_movement_offset_vector( + additional_offset_vector=user_offset_data.pickUpOffset, is_pickup_from_tc2=is_tc2_pickup, ) @@ -153,18 +148,9 @@ async def move_labware_with_gripper( await ot3api.move_to( mount=gripper_mount, abs_position=waypoints_to_labware[-1] ) - await ot3api.grip(force_newtons=LABWARE_GRIP_FORCE) - - new_labware_offset = ( - self._state_store.labware.get_labware_offset(new_offset_id).vector - if new_offset_id - else None - ) - labware_drop_offset = self.get_experimental_labware_movement_offset_vector( - use_current_offset=experimental_offset_data.useDropLocationLpcOffset, - current_offset_vector=new_labware_offset, - additional_offset_vector=experimental_offset_data.dropOffset, + labware_drop_offset = self.get_final_labware_movement_offset_vector( + additional_offset_vector=user_offset_data.dropOffset ) # TODO: see https://opentrons.atlassian.net/browse/RLAB-215 @@ -220,31 +206,19 @@ def _get_gripper_movement_waypoints( # TODO (spp, 2022-12-14): https://opentrons.atlassian.net/browse/RLAB-237 @staticmethod - def get_experimental_labware_movement_offset_vector( - use_current_offset: bool, - current_offset_vector: Optional[LabwareOffsetVector], + def get_final_labware_movement_offset_vector( additional_offset_vector: Optional[LabwareOffsetVector], is_pickup_from_tc2: bool = False, ) -> LabwareOffsetVector: """Calculate the final labware offset vector to use in labware movement.""" - _current_offset_vector = current_offset_vector or LabwareOffsetVector( - x=0, y=0, z=0 - ) - _additional_offset_vector = additional_offset_vector or LabwareOffsetVector( + user_offset_vector = additional_offset_vector or LabwareOffsetVector( x=0, y=0, z=0 ) if is_pickup_from_tc2: # TODO (fps, 2022-05-30): Remove this once RLAB-295 is merged - _additional_offset_vector.z += _ADDITIONAL_TC2_PICKUP_OFFSET - - if not use_current_offset: - return _additional_offset_vector - else: - return LabwareOffsetVector( - x=_current_offset_vector.x + _additional_offset_vector.x, - y=_current_offset_vector.y + _additional_offset_vector.y, - z=_current_offset_vector.z + _additional_offset_vector.z, - ) + user_offset_vector.z += _ADDITIONAL_TC2_PICKUP_OFFSET + + return user_offset_vector # TODO (spp, 2022-10-20): move to labware view @staticmethod diff --git a/api/src/opentrons/protocol_engine/resources/pipette_data_provider.py b/api/src/opentrons/protocol_engine/resources/pipette_data_provider.py index e34dff79f8b..cf1b3c91ba5 100644 --- a/api/src/opentrons/protocol_engine/resources/pipette_data_provider.py +++ b/api/src/opentrons/protocol_engine/resources/pipette_data_provider.py @@ -2,11 +2,14 @@ from dataclasses import dataclass from typing import Dict -from opentrons_shared_data.pipette import dummy_model_for_name from opentrons_shared_data.pipette.dev_types import PipetteName +from opentrons_shared_data.pipette import ( + pipette_load_name_conversions as pipette_load_name, + load_data as load_pipette_data, + types as pip_types, +) from opentrons.hardware_control.dev_types import PipetteDict -from opentrons.config.pipette_config import load as load_pipette_config from ..types import FlowRates @@ -31,24 +34,31 @@ def get_virtual_pipette_static_config( pipette_name: PipetteName, ) -> LoadedStaticPipetteData: """Get the config for a virtual pipette, given only the pipette name.""" - pipette_model = dummy_model_for_name(pipette_name) - config = load_pipette_config(pipette_model) + pipette_model = pipette_load_name.convert_pipette_name(pipette_name) + config = load_pipette_data.load_definition( + pipette_model.pipette_type, + pipette_model.pipette_channels, + pipette_model.pipette_version, + ) + tip_configuration = config.supported_tips[ + pip_types.PipetteTipType(config.max_volume) + ] return LoadedStaticPipetteData( - model=config.model, + model=str(pipette_model), display_name=config.display_name, min_volume=config.min_volume, max_volume=config.max_volume, channels=config.channels, - home_position=config.home_position, + home_position=config.mount_configurations.homePosition, nozzle_offset_z=config.nozzle_offset[2], flow_rates=FlowRates( - default_blow_out=config.default_blow_out_flow_rates, - default_aspirate=config.default_aspirate_flow_rates, - default_dispense=config.default_dispense_flow_rates, + default_blow_out=tip_configuration.default_blowout_flowrate.values_by_api_level, + default_aspirate=tip_configuration.default_aspirate_flowrate.values_by_api_level, + default_dispense=tip_configuration.default_dispense_flowrate.values_by_api_level, ), - return_tip_scale=config.return_tip_height, - nominal_tip_overlap=config.tip_overlap, + return_tip_scale=tip_configuration.default_return_tip_height, + nominal_tip_overlap=config.tip_overlap_dictionary, ) diff --git a/api/src/opentrons/protocol_engine/types.py b/api/src/opentrons/protocol_engine/types.py index d40fbe6a134..1b7d0c1e5ae 100644 --- a/api/src/opentrons/protocol_engine/types.py +++ b/api/src/opentrons/protocol_engine/types.py @@ -92,13 +92,10 @@ class LabwareMovementStrategy(str, Enum): MANUAL_MOVE_WITHOUT_PAUSE = "manualMoveWithoutPause" -# TODO (spp, 2022-12-14): https://opentrons.atlassian.net/browse/RLAB-237 -@dataclass(frozen=True) -class ExperimentalOffsetData(BaseModel): - """The result of a load module procedure.""" +@dataclass +class LabwareMovementOffsetData: + """Offsets to be used during labware movement.""" - usePickUpLocationLpcOffset: bool - useDropLocationLpcOffset: bool pickUpOffset: Optional[LabwareOffsetVector] dropOffset: Optional[LabwareOffsetVector] @@ -510,6 +507,9 @@ class LabwareOffsetLocation(BaseModel): description=( "The definition URI of a labware that a labware can be loaded onto," " if applicable." + "\n\n" + "This can be combined with moduleModel if the labware is loaded on top of" + " an adapter that is loaded on a module." ), ) diff --git a/api/tests/opentrons/config/test_pipette_config.py b/api/tests/opentrons/config/test_pipette_config.py deleted file mode 100644 index 7967039d40f..00000000000 --- a/api/tests/opentrons/config/test_pipette_config.py +++ /dev/null @@ -1,376 +0,0 @@ -import json -from pathlib import Path -from typing import Any, AsyncGenerator, Dict, Generator, Sequence, cast -from unittest.mock import patch - -import pytest -from decoy import Decoy -from numpy import isclose - -from opentrons.config import CONFIG, pipette_config, feature_flags as ff -from opentrons.hardware_control import API -from opentrons.hardware_control.dev_types import PipetteSpec -from opentrons_shared_data import load_shared_data -from opentrons_shared_data.pipette.dev_types import PipetteModel - -from opentrons.hardware_control.backends import Simulator - -defs = json.loads(load_shared_data("pipette/definitions/1/pipetteModelSpecs.json")) - - -def check_sequences_close( - first: Sequence[Sequence[float]], - second: Sequence[Sequence[float]], -) -> None: - """ - Check two ul/mm sequences are the same (replaces pytest.approx nested ) - """ - assert len(first) == len(second) - for f, s in zip(first, second): - assert f == pytest.approx(s) - - -@pytest.mark.parametrize( - "pipette_model", - [ - PipetteModel(c) - for c in pipette_config.config_models - if not ( - c.startswith("p1000") - or c.startswith("p300_multi") - or c.endswith("1.5") - or c.endswith("1.6") - or "v2" in c - or "v3" in c - or "v4" in c - ) - ], -) -def test_versioned_aspiration( - decoy: Decoy, - pipette_model: PipetteModel, - mock_feature_flags: None, -) -> None: - decoy.when(ff.use_old_aspiration_functions()).then_return(True) - - was = pipette_config.load(pipette_model) - check_sequences_close( - was.ul_per_mm["aspirate"], - defs["config"][pipette_model]["ulPerMm"][0]["aspirate"], - ) - check_sequences_close( - was.ul_per_mm["dispense"], - defs["config"][pipette_model]["ulPerMm"][0]["dispense"], - ) - - decoy.when(ff.use_old_aspiration_functions()).then_return(False) - - now = pipette_config.load(pipette_model) - check_sequences_close( - now.ul_per_mm["aspirate"], - defs["config"][pipette_model]["ulPerMm"][-1]["aspirate"], - ) - check_sequences_close( - now.ul_per_mm["dispense"], - defs["config"][pipette_model]["ulPerMm"][-1]["dispense"], - ) - assert now.ul_per_mm["aspirate"] != was.ul_per_mm["aspirate"] - - -# TODO: -# TODO: dispense agree -@pytest.mark.parametrize("pipette_model", pipette_config.config_models) -def test_ul_per_mm_continuous(pipette_model: PipetteModel) -> None: - """ - For each model of pipette, for each boundary between pieces of the - piecewise function describing the ul/mm relationship, test that the - function is continuous. - - This test is utilizing the intermediate value theorem to determine - whether a value c lives in the bounds of [a, b]. In this case, we are - checking that given volumes (X) in a range of lower middle and max, the - output (Y) of the func lives within the range of lower and max. - - See here for further details: - https://en.wikipedia.org/wiki/Intermediate_value_theorem - """ - config = pipette_config.load(pipette_model) - aspirate = config.ul_per_mm["aspirate"] - dispense = config.ul_per_mm["dispense"] - min_vol = 0.000001 # sufficiently small starting volume - for lno in range(len(aspirate) - 1): - line = aspirate[lno] - curr_max_vol = line[0] - # find a halfway point roughly between max and min volume for a given - # piecewise sequence of a pipette function - half_max_vol = (curr_max_vol - min_vol) / 2 + min_vol - - min_ul_per_mm = line[1] * min_vol + line[2] - mid_ul_per_mm = line[1] * half_max_vol + line[2] - max_ul_per_mm = line[1] * curr_max_vol + line[2] - - lower_mm = min_ul_per_mm / min_vol - higher_mm = max_ul_per_mm / curr_max_vol - half_mm = mid_ul_per_mm / half_max_vol - - range_1 = (half_mm >= lower_mm) and (half_mm <= higher_mm) - range_2 = (half_mm <= lower_mm) and (half_mm >= higher_mm) - - assert range_1 or range_2 - - min_vol = curr_max_vol - # make sure the mm of movement for max aspirate and max dispense agree - aspirate_seq = aspirate[len(aspirate) - 1] - dispense_seq = dispense[len(dispense) - 1] - pip_max_vol = config.max_volume - aspirate_mm = (aspirate_seq[1] * pip_max_vol + aspirate_seq[2]) / pip_max_vol - dispense_mm = (dispense_seq[1] * pip_max_vol + dispense_seq[2]) / pip_max_vol - # for many of the older pipettes, the aspirate and dispense values are - # not the same. - assert isclose(round(aspirate_mm), round(dispense_mm)) - - -def test_override_load(ot_config_tempdir: Path) -> None: - cdir = CONFIG["pipette_config_overrides_dir"] - - existing_overrides: Dict[str, Dict[str, Any]] = { - "pickUpCurrent": {"value": 1231.213}, - "dropTipSpeed": {"value": 121}, - "quirks": {"dropTipShake": True}, - } - - existing_id = "ohoahflaseh08102qa" - with (cdir / f"{existing_id}.json").open("w") as ovf: - json.dump(existing_overrides, ovf) - - pconf = pipette_config.load(PipetteModel("p300_multi_v1.4"), existing_id) - - assert pconf.pick_up_current == existing_overrides["pickUpCurrent"]["value"] - assert pconf.drop_tip_speed == existing_overrides["dropTipSpeed"]["value"] - assert pconf.quirks == ["dropTipShake"] - - new_id = "0djaisoa921jas" - new_pconf = pipette_config.load(PipetteModel("p300_multi_v1.4"), new_id) - - assert new_pconf != pconf - - unspecced = pipette_config.load(PipetteModel("p300_multi_v1.4")) - assert unspecced == new_pconf - - -def test_override_save(ot_config_tempdir: Path) -> None: - cdir = CONFIG["pipette_config_overrides_dir"] - - overrides = {"pickUpCurrent": 1231.213, "dropTipSpeed": 121, "dropTipShake": False} - - new_id = "aoa2109j09cj2a" - model = "p300_multi_v1" - - old_pconf = pipette_config.load(PipetteModel("p300_multi_v1.4"), new_id) - - assert old_pconf.quirks == ["dropTipShake"] - - pipette_config.save_overrides(new_id, overrides, PipetteModel(model)) - - assert (cdir / f"{new_id}.json").is_file() - - loaded = pipette_config.load_overrides(new_id) - - assert loaded["pickUpCurrent"]["value"] == overrides["pickUpCurrent"] - assert loaded["dropTipSpeed"]["value"] == overrides["dropTipSpeed"] - - new_pconf = pipette_config.load(PipetteModel("p300_multi_v1.4"), new_id) - assert new_pconf.quirks == [] - - -@pytest.fixture -def new_id_for_save() -> Generator[str, None, None]: - """Fixture to provide a pipette id then delete it's generated file.""" - r = "aoa2109j09cj2a" - yield r - - (CONFIG["pipette_config_overrides_dir"] / f"{r}.json").unlink() - - -def test_mutable_configs_only( - monkeypatch: pytest.MonkeyPatch, - new_id_for_save: str, -) -> None: - # Test that only set mutable configs are populated in this dictionary - - monkeypatch.setattr( - pipette_config, "MUTABLE_CONFIGS", ["tipLength", "plungerCurrent"] - ) - - model = PipetteModel("p300_multi_v1") - - pipette_config.save_overrides(new_id_for_save, {}, model) - - config = pipette_config.list_mutable_configs(new_id_for_save) - # instead of dealing with unordered lists, convert to set and check whether - # these lists have a difference between them - difference = set(list(config.keys())) - set(pipette_config.MUTABLE_CONFIGS) - # ensure empty - assert bool(difference) is False - - -def test_mutable_configs_unknown_pipette_id() -> None: - with patch("opentrons.config.pipette_config.known_pipettes", return_val={}): - config = pipette_config.list_mutable_configs("a") - assert config == {} - - -@pytest.fixture -def mock_pipette_config_model() -> Generator[Dict[str, Any], None, None]: - model = { - "fieldName": { - "min": 1, - "max": 2, - }, - "quirks": {"quirk1": True, "quirk2": True}, - } - # Patch VALID_QUIRKS to reflect quirks in the mock pipette config model - with patch.object(pipette_config, "VALID_QUIRKS", new=["quirk1", "quirk2"]): - yield model - - -@pytest.mark.parametrize( - argnames=["override_field", "expected_error"], - argvalues=[ - [{"unknown": 123}, "Unknown field"], - [{"unknown": True}, "Unknown field"], - [{"unknown": None}, "Unknown field"], - [{"quirk1": 321}, "is invalid for"], - [{"fieldName": "hello"}, "is invalid for"], - [{"fieldName": 0}, "out of range"], - [{"fieldName": 5}, "out of range"], - [{"fieldName": True}, "is invalid for"], - ], -) -def test_validate_overrides_fail( - override_field: Dict[str, Any], - expected_error: str, - mock_pipette_config_model: Dict[str, Any], -) -> None: - with pytest.raises(ValueError, match=expected_error): - pipette_config.validate_overrides(override_field, mock_pipette_config_model) - - -@pytest.mark.parametrize( - argnames=["override_field"], - argvalues=[ - [{"quirk1": False}], - [{"quirk1": None}], - [{"fieldName": None}], - [{"fieldName": 1}], - [{"fieldName": 2}], - ], -) -def test_validate_overrides_pass( - override_field: Dict[str, Any], - mock_pipette_config_model: Dict[str, Any], -) -> None: - # calling validate_overrides should not raise - pipette_config.validate_overrides(override_field, mock_pipette_config_model) - - -# TODO(mc, 2022-06-10): this fixture reaches into internals of the HardwareAPI -# that are only present in the simulator, not the actual controller. It is not -# an effective test of whether anything actually works -# TODO (lc, 12-05-2022): Re-write these tests when the OT2 pipette -# configurations are ported over to the new format. -@pytest.mark.ot2_only -@pytest.fixture -async def attached_pipettes( - hardware: API, - request: pytest.FixtureRequest, -) -> AsyncGenerator[Dict[str, PipetteSpec], None]: - """Fixture the robot to have attached pipettes - - Mark the node with - 'attach_left_model': model_name for left (default: p300_single_v1) - 'attach_right_model': model_name for right (default: p50_multi_v1) - 'attach_left_id': id for left (default: 'abc123') - 'attach_right_id': id for right (default: 'acbcd123') - - Returns the model by mount style dict of - {'left': {'name': str, 'model': str, 'id': str}, 'right'...} - """ - - def marker_with_default(marker: str, default: str) -> str: - return request.node.get_closest_marker(marker) or default - - left_mod = marker_with_default("attach_left_model", "p300_multi_v1") - left_name = left_mod.split("_v")[0] - right_mod = marker_with_default("attach_right_model", "p50_multi_v1") - right_name = right_mod.split("_v")[0] - left_id = marker_with_default("attach_left_id", "abc123") - right_id = marker_with_default("attach_right_id", "abcd123") - backend = cast(Simulator, hardware._backend) - mount_type = type(list(backend._attached_instruments.keys())[0]) - - backend._attached_instruments = { - mount_type.RIGHT: { # type: ignore[typeddict-item] - "model": right_mod, - "id": right_id, - "name": right_name, - }, - mount_type.LEFT: { # type: ignore[typeddict-item] - "model": left_mod, - "id": left_id, - "name": left_name, - }, - } - await hardware.cache_instruments() - yield {k.name.lower(): v for k, v in backend._attached_instruments.items()} - - # Delete created config files - (CONFIG["pipette_config_overrides_dir"] / "abc123.json").unlink() - (CONFIG["pipette_config_overrides_dir"] / "abcd123.json").unlink() - - -@pytest.mark.ot2_only -async def test_override(attached_pipettes: Dict[str, PipetteSpec]) -> None: - # This test will check that setting modified pipette configs - # works as expected - changes = {"pickUpCurrent": 1} - - test_id = cast(str, attached_pipettes["left"]["id"]) - # Check data has not been changed yet - c, _ = pipette_config.load_config_dict(test_id) - assert ( - c["pickUpCurrent"] - == pipette_config.list_mutable_configs(pipette_id=test_id)["pickUpCurrent"] - ) - - # Check that data is changed and matches the changes specified - pipette_config.override(pipette_id=test_id, fields=changes) - - c, _ = pipette_config.load_config_dict(test_id) - assert c["pickUpCurrent"]["value"] == changes["pickUpCurrent"] - - # Check that None reverts a setting to default - changes2 = {"pickUpCurrent": None} - # Check that data is changed and matches the changes specified - pipette_config.override(pipette_id=test_id, fields=changes2) - - c, _ = pipette_config.load_config_dict(test_id) - assert ( - c["pickUpCurrent"]["value"] - == pipette_config.list_mutable_configs(pipette_id=test_id)["pickUpCurrent"][ - "default" - ] - ) - - -@pytest.mark.ot2_only -async def test_incorrect_modify_pipette_settings( - attached_pipettes: Dict[str, PipetteSpec] -) -> None: - out_of_range = {"pickUpCurrent": 1000} - with pytest.raises(ValueError, match="pickUpCurrent out of range with 1000"): - # check over max fails - pipette_config.override( - pipette_id=attached_pipettes["left"]["id"], # type: ignore[arg-type] - fields=out_of_range, - ) diff --git a/api/tests/opentrons/hardware_control/backends/test_ot3_controller.py b/api/tests/opentrons/hardware_control/backends/test_ot3_controller.py index 8e8846bc673..08be08bfc91 100644 --- a/api/tests/opentrons/hardware_control/backends/test_ot3_controller.py +++ b/api/tests/opentrons/hardware_control/backends/test_ot3_controller.py @@ -1,7 +1,6 @@ import mock import pytest from decoy import Decoy -from itertools import chain from contextlib import nullcontext as does_not_raise from typing import ( @@ -64,6 +63,7 @@ from opentrons_hardware.hardware_control.motion import ( MoveType, MoveStopCondition, + MoveGroupSingleAxisStep, ) from opentrons_hardware.hardware_control.types import PCBARevision from opentrons_hardware.hardware_control import current_settings @@ -73,6 +73,7 @@ PipetteInformation, GripperInformation, ) +from opentrons_hardware.hardware_control.move_group_runner import MoveGroupRunner @pytest.fixture @@ -312,91 +313,107 @@ def move_group_run_side_effect( @pytest.mark.parametrize("axes", home_test_params) async def test_home_execute( controller: OT3Controller, - mock_move_group_run: mock.AsyncMock, - axes: List[Axis], - mock_present_devices: None, -) -> None: - mock_move_group_run.side_effect = move_group_run_side_effect(controller, axes) - # nothing has been homed - assert not controller._motor_status - - commanded_homes = set(axes) - await controller.home(axes, GantryLoad.LOW_THROUGHPUT) - all_calls = list(chain([args[0][0] for args in mock_move_group_run.call_args_list])) - for command in all_calls: - for group in command._move_groups: - for node, step in group[0].items(): - commanded_homes.remove(node_to_axis(node)) - assert step.acceleration_mm_sec_sq == 0 - assert step.move_type == MoveType.home - assert step.stop_condition == MoveStopCondition.limit_switch - assert not commanded_homes - - # all commanded axes have been homed - assert all(controller._motor_status[axis_to_node(ax)].motor_ok for ax in axes) - assert controller.check_motor_status(axes) - - -@pytest.mark.parametrize("axes", home_test_params) -async def test_home_prioritize_mount( - controller: OT3Controller, - mock_move_group_run: mock.AsyncMock, axes: List[Axis], mock_present_devices: None, ) -> None: - mock_move_group_run.side_effect = move_group_run_side_effect(controller, axes) - # nothing has been homed - assert not controller._motor_status + config = {"run.side_effect": move_group_run_side_effect(controller, axes)} + with mock.patch( # type: ignore [call-overload] + "opentrons.hardware_control.backends.ot3controller.MoveGroupRunner", + spec=mock.Mock(MoveGroupRunner), + **config + ) as mock_runner: + present_axes = set(ax for ax in axes if controller.axis_is_present(ax)) + + # nothing has been homed + assert not controller._motor_status + await controller.home(axes, GantryLoad.LOW_THROUGHPUT) + + all_groups = [ + group + for arg in mock_runner.call_args_list + for group in arg.kwargs["move_groups"] + ] + + actual_nodes_steps: Dict[Axis, List[MoveGroupSingleAxisStep]] = { + ax: [] for ax in axes + } + for group in all_groups: + for step in group: + for k, v in step.items(): + actual_nodes_steps[node_to_axis(k)].append(v) + + # every single node will receive one home request and one backoff requests + for ax in present_axes: + assert len(actual_nodes_steps[ax]) == 2 + home_request = filter( + lambda m: m.stop_condition == MoveStopCondition.limit_switch, + actual_nodes_steps[ax], + ) + backoff_request = filter( + lambda m: m.stop_condition == MoveStopCondition.limit_switch_backoff, + actual_nodes_steps[ax], + ) + assert len(list(home_request)) == 1 + assert len(list(backoff_request)) == 1 - await controller.home(axes, GantryLoad.LOW_THROUGHPUT) - has_xy = len({Axis.X, Axis.Y} & set(axes)) > 0 - has_mount = len(set(Axis.ot3_mount_axes()) & set(axes)) > 0 - run = mock_move_group_run.call_args_list[0][0][0]._move_groups - if has_xy and has_mount: - assert len(run) > 1 - for node in run[0][0]: - assert node_to_axis(node) in Axis.ot3_mount_axes() - for node in run[1][0]: - assert node in [NodeId.gantry_x, NodeId.gantry_y] - else: - assert len(run) == 1 - - # all commanded axes have been homed - assert all(controller._motor_status[axis_to_node(ax)].motor_ok for ax in axes) - assert controller.check_motor_status(axes) + # all commanded axes have been homed + assert all(controller._motor_status[axis_to_node(ax)].motor_ok for ax in axes) + assert controller.check_motor_status(axes) @pytest.mark.parametrize("axes", home_test_params) -async def test_home_build_runners( +async def test_home_gantry_order( controller: OT3Controller, mock_move_group_run: mock.AsyncMock, axes: List[Axis], mock_present_devices: None, ) -> None: - mock_move_group_run.side_effect = move_group_run_side_effect(controller, axes) - assert not controller._motor_status - - await controller.home(axes, GantryLoad.LOW_THROUGHPUT) - has_pipette = len(set(Axis.pipette_axes()) & set(axes)) > 0 - has_gantry = len(set(Axis.gantry_axes()) & set(axes)) > 0 - - if has_pipette and has_gantry: - assert len(mock_move_group_run.call_args_list) == 2 - run_gantry = mock_move_group_run.call_args_list[0][0][0]._move_groups - run_pipette = mock_move_group_run.call_args_list[1][0][0]._move_groups - for group in run_gantry: - for node in group[0]: - assert node_to_axis(node) in Axis.gantry_axes() - for node in run_pipette[0][0]: - assert node_to_axis(node) in Axis.pipette_axes() - - if not has_pipette or not has_gantry: - assert len(mock_move_group_run.call_args_list) == 1 - mock_move_group_run.assert_awaited_once() + with mock.patch( + "opentrons.hardware_control.backends.ot3controller.MoveGroupRunner", + spec=mock.Mock(MoveGroupRunner), + ) as mock_runner: + controller._build_home_gantry_z_runner(axes, GantryLoad.LOW_THROUGHPUT) + has_mount = len(set(Axis.ot3_mount_axes()) & set(axes)) > 0 + has_x = Axis.X in axes + has_y = Axis.Y in axes + if has_mount or has_x or has_y: + gantry_moves = mock_runner.call_args_list[0].kwargs["move_groups"] + + # mount steps are commanded first + if has_mount: + # only one seq per group + assert len(gantry_moves[0]) == len(gantry_moves[1]) == 1 + assert gantry_moves[0][0].keys() == gantry_moves[1][0].keys() + assert all( + node_to_axis(node) in Axis.ot3_mount_axes() + for node in gantry_moves[0][0].keys() + ) + gantry_moves.pop(0) + gantry_moves.pop(0) + + # then X + if has_x: + # only one seq per group + assert len(gantry_moves[0]) == len(gantry_moves[1]) == 1 + assert gantry_moves[0][0].keys() == gantry_moves[1][0].keys() + assert all( + node_to_axis(node) == Axis.X for node in gantry_moves[0][0].keys() + ) + gantry_moves.pop(0) + gantry_moves.pop(0) + + # lastly Y + if has_y: + # only one seq per group + assert len(gantry_moves[0]) == len(gantry_moves[1]) == 1 + assert gantry_moves[0][0].keys() == gantry_moves[1][0].keys() + assert all( + node_to_axis(node) == Axis.Y for node in gantry_moves[0][0].keys() + ) + gantry_moves.pop(0) + gantry_moves.pop(0) - # all commanded axes have been homed - assert all(controller._motor_status[axis_to_node(ax)].motor_ok for ax in axes) - assert controller.check_motor_status(axes) + assert not gantry_moves @pytest.mark.parametrize("axes", home_test_params) @@ -683,10 +700,13 @@ async def test_tip_action( for move_group in move_group_runner._move_groups: assert move_group # don't pass in empty groups assert len(move_group) == 1 + + move_groups = move_group_runner._move_groups # we should be sending this command to the pipette axes to process. - assert list(move_group[0].keys()) == [NodeId.pipette_left] - step = move_group[0][NodeId.pipette_left] - assert step.stop_condition == MoveStopCondition.limit_switch + home_step = move_groups[0][0][NodeId.pipette_left] + assert home_step.stop_condition == MoveStopCondition.limit_switch + backoff_step = move_groups[1][0][NodeId.pipette_left] + assert backoff_step.stop_condition == MoveStopCondition.limit_switch_backoff async def test_update_motor_status( diff --git a/api/tests/opentrons/hardware_control/backends/test_ot3_utils.py b/api/tests/opentrons/hardware_control/backends/test_ot3_utils.py index 192fc06b35e..06de8282028 100644 --- a/api/tests/opentrons/hardware_control/backends/test_ot3_utils.py +++ b/api/tests/opentrons/hardware_control/backends/test_ot3_utils.py @@ -2,6 +2,7 @@ from opentrons.hardware_control.backends import ot3utils from opentrons_hardware.firmware_bindings.constants import NodeId from opentrons.hardware_control.types import Axis +from numpy import float64 as f64 def test_create_step() -> None: @@ -14,6 +15,12 @@ def test_create_step() -> None: Axis.P_R: 0, } moves = [Move.build_dummy([Axis.X, Axis.Y, Axis.Z_L, Axis.Z_R, Axis.P_L])] + for block in moves[0].blocks: + block.distance = f64(25.0) + block.time = f64(1.0) + block.initial_speed = f64(25.0) + block.acceleration = f64(0.0) + block.final_speed = f64(25.0) present_nodes = [NodeId.gantry_x, NodeId.gantry_y, NodeId.head_l] move_group, final_pos = ot3utils.create_move_group( origin=origin, @@ -25,6 +32,33 @@ def test_create_step() -> None: assert set(present_nodes) == set(step.keys()) +def test_filter_zero_duration_step() -> None: + origin = { + Axis.X: 0, + Axis.Y: 0, + Axis.Z_L: 0, + Axis.Z_R: 0, + Axis.P_L: 0, + Axis.P_R: 0, + } + moves = [Move.build_dummy([Axis.X, Axis.Y, Axis.Z_L, Axis.Z_R, Axis.P_L])] + for block in (moves[0].blocks[0], moves[0].blocks[1]): + block.distance = f64(25.0) + block.time = f64(1.0) + block.initial_speed = f64(25.0) + block.acceleration = f64(0.0) + block.final_speed = f64(25.0) + present_nodes = [NodeId.gantry_x, NodeId.gantry_y, NodeId.head_l] + move_group, final_pos = ot3utils.create_move_group( + origin=origin, + moves=moves, + present_nodes=present_nodes, + ) + assert len(move_group) == 2 + for step in move_group: + assert set(present_nodes) == set(step.keys()) + + def test_nodeid_replace_head() -> None: assert ot3utils.replace_head_node(set([NodeId.head, NodeId.gantry_x])) == set( [NodeId.head_l, NodeId.head_r, NodeId.gantry_x] diff --git a/api/tests/opentrons/hardware_control/integration/test_controller.py b/api/tests/opentrons/hardware_control/integration/test_controller.py index 2015817c5dc..4efbc9243a1 100644 --- a/api/tests/opentrons/hardware_control/integration/test_controller.py +++ b/api/tests/opentrons/hardware_control/integration/test_controller.py @@ -31,9 +31,9 @@ async def test_get_attached_instruments(subject: Controller): """It should get the attached instruments.""" instruments = await subject.get_attached_instruments({}) assert instruments[Mount.RIGHT]["id"] == "P20SV202020070101" - assert instruments[Mount.RIGHT]["config"].name == "p20_single_gen2" + assert instruments[Mount.RIGHT]["config"].display_name == "P20 Single-Channel GEN2" assert instruments[Mount.LEFT]["id"] == "P3HMV202020041605" - assert instruments[Mount.LEFT]["config"].name == "p20_multi_gen2" + assert instruments[Mount.LEFT]["config"].display_name == "P20 8-Channel GEN2" async def test_move(subject: Controller): diff --git a/api/tests/opentrons/hardware_control/test_gripper.py b/api/tests/opentrons/hardware_control/test_gripper.py index 20ec386e155..1578538b777 100644 --- a/api/tests/opentrons/hardware_control/test_gripper.py +++ b/api/tests/opentrons/hardware_control/test_gripper.py @@ -80,9 +80,13 @@ def test_reload_instrument_cal_ot3(fake_offset: "GripperCalibrationOffset") -> N source=cal_types.SourceType.user, status=cal_types.CalibrationStatus(), ) - new_gripper = gripper._reload_gripper(old_gripper.config, old_gripper, new_cal) + new_gripper, skip = gripper._reload_gripper( + old_gripper.config, old_gripper, new_cal + ) - # it's the same pipette + # it's the same gripper assert new_gripper == old_gripper + # we said upstream could skip + assert skip # only pipette offset has been updated assert new_gripper._calibration_offset == new_cal diff --git a/api/tests/opentrons/hardware_control/test_moves.py b/api/tests/opentrons/hardware_control/test_moves.py index 175276146d1..47b25859cf5 100644 --- a/api/tests/opentrons/hardware_control/test_moves.py +++ b/api/tests/opentrons/hardware_control/test_moves.py @@ -202,7 +202,7 @@ async def test_gripper_critical_points_fail_on_pipettes( ) -async def test_critical_point_applied(hardware_api, monkeypatch, is_robot): +async def test_critical_point_applied(hardware_api): await hardware_api.home() hardware_api._backend._attached_instruments = { types.Mount.LEFT: {"model": None, "id": None}, diff --git a/api/tests/opentrons/hardware_control/test_ot3_api.py b/api/tests/opentrons/hardware_control/test_ot3_api.py index 6c903432895..4f4b7d361e3 100644 --- a/api/tests/opentrons/hardware_control/test_ot3_api.py +++ b/api/tests/opentrons/hardware_control/test_ot3_api.py @@ -15,7 +15,7 @@ ) from opentrons.hardware_control.dev_types import ( AttachedGripper, - OT3AttachedPipette, + AttachedPipette, GripperDict, ) from opentrons.hardware_control.motion_utilities import target_position_from_plunger @@ -63,7 +63,7 @@ from opentrons.config import gripper_config as gc from opentrons_shared_data.gripper.gripper_definition import GripperModel -from opentrons_shared_data.pipette.pipette_definition import ( +from opentrons_shared_data.pipette.types import ( PipetteModelType, PipetteChannelType, PipetteVersionType, @@ -354,7 +354,7 @@ async def test_gantry_load_transform( PipetteChannelType(configs["channels"]), PipetteVersionType(*configs["version"]), ) - instr_data = OT3AttachedPipette(config=pipette_config, id="fakepip") + instr_data = AttachedPipette(config=pipette_config, id="fakepip") await ot3_hardware.cache_pipette(mount, instr_data, None) assert ot3_hardware._gantry_load_from_instruments() == load @@ -445,8 +445,9 @@ async def prepare_for_mock_blowout( PipetteChannelType(configs["channels"]), PipetteVersionType(*configs["version"]), ) - instr_data = OT3AttachedPipette(config=pipette_config, id="fakepip") + instr_data = AttachedPipette(config=pipette_config, id="fakepip") await ot3_hardware.cache_pipette(mount, instr_data, None) + await ot3_hardware.refresh_positions() with patch.object( ot3_hardware, "pick_up_tip", AsyncMock(spec=ot3_hardware.liquid_probe) ) as mock_tip_pickup: @@ -1055,7 +1056,7 @@ async def test_home_plunger( mock_home: AsyncMock, ): mount = OT3Mount.LEFT - instr_data = OT3AttachedPipette( + instr_data = AttachedPipette( config=load_pipette_data.load_definition( PipetteModelType("p1000"), PipetteChannelType(1), PipetteVersionType(3, 4) ), @@ -1074,7 +1075,7 @@ async def test_prepare_for_aspirate( mock_move_to_plunger_bottom: AsyncMock, ): mount = OT3Mount.LEFT - instr_data = OT3AttachedPipette( + instr_data = AttachedPipette( config=load_pipette_data.load_definition( PipetteModelType("p1000"), PipetteChannelType(1), @@ -1095,7 +1096,7 @@ async def test_move_to_plunger_bottom( mock_move: AsyncMock, ): mount = OT3Mount.LEFT - instr_data = OT3AttachedPipette( + instr_data = AttachedPipette( config=load_pipette_data.load_definition( PipetteModelType("p1000"), PipetteChannelType(1), PipetteVersionType(3, 4) ), @@ -1659,7 +1660,7 @@ async def test_tip_presence_disabled_ninety_six_channel( PipetteChannelType(96), PipetteVersionType(3, 3), ) - instr_data = OT3AttachedPipette(config=pipette_config, id="fakepip") + instr_data = AttachedPipette(config=pipette_config, id="fakepip") await ot3_hardware.cache_pipette(OT3Mount.LEFT, instr_data, None) await ot3_hardware._configure_instruments() await ot3_hardware.pick_up_tip(OT3Mount.LEFT, 60) diff --git a/api/tests/opentrons/hardware_control/test_ot3_estop_state.py b/api/tests/opentrons/hardware_control/test_ot3_estop_state.py new file mode 100644 index 00000000000..af660606b9a --- /dev/null +++ b/api/tests/opentrons/hardware_control/test_ot3_estop_state.py @@ -0,0 +1,251 @@ +import pytest +from decoy import Decoy +from typing import List, Tuple, Optional + +from opentrons.hardware_control.estop_state import EstopStateMachine +from opentrons_hardware.hardware_control.estop.detector import ( + EstopSummary, + EstopDetector, +) +from opentrons.hardware_control.types import ( + EstopState, + EstopPhysicalStatus, + EstopAttachLocation, + EstopStateNotification, + HardwareEvent, +) + + +@pytest.mark.ot3_only +@pytest.fixture +def initial_state() -> "EstopSummary": + return EstopSummary(left_detected=True, right_detected=True, engaged=False) + + +@pytest.mark.ot3_only +@pytest.fixture +def mock_estop_detector(decoy: Decoy, initial_state: "EstopSummary") -> "EstopDetector": + """Create a mocked estop detector.""" + mock = decoy.mock(cls=EstopDetector) + decoy.when(mock.status).then_return(initial_state) + return mock + + +@pytest.mark.ot3_only +@pytest.fixture +def subject(mock_estop_detector: "EstopDetector") -> "EstopStateMachine": + return EstopStateMachine(detector=mock_estop_detector) + + +@pytest.mark.ot3_only +async def test_estop_state_no_detector( + mock_estop_detector: "EstopDetector", decoy: Decoy +) -> None: + """Test that the estop state machine works without a detector.""" + subject = EstopStateMachine(detector=None) + assert subject.state == EstopState.DISENGAGED + assert ( + subject.get_physical_status(EstopAttachLocation.LEFT) + == EstopPhysicalStatus.DISENGAGED + ) + assert ( + subject.get_physical_status(EstopAttachLocation.RIGHT) + == EstopPhysicalStatus.DISENGAGED + ) + + decoy.when(mock_estop_detector.status).then_return( + EstopSummary(left_detected=False, right_detected=True, engaged=True) + ) + + subject.subscribe_to_detector(detector=mock_estop_detector) + + assert subject.state == EstopState.PHYSICALLY_ENGAGED + assert ( + subject.get_physical_status(EstopAttachLocation.LEFT) + == EstopPhysicalStatus.NOT_PRESENT + ) + assert ( + subject.get_physical_status(EstopAttachLocation.RIGHT) + == EstopPhysicalStatus.ENGAGED + ) + + # Check that adding a second listener will wipe out the first one + subject.subscribe_to_detector(detector=mock_estop_detector) + + decoy.verify( + [ + mock_estop_detector.add_listener(subject.detector_listener), + mock_estop_detector.remove_listener(subject.detector_listener), + mock_estop_detector.add_listener(subject.detector_listener), + ] + ) + + +@pytest.mark.ot3_only +async def test_estop_state_listener( + subject: "EstopStateMachine", mock_estop_detector: "EstopDetector", decoy: Decoy +) -> None: + """Test that the state machine broadcasts to listeners.""" + decoy.verify(mock_estop_detector.add_listener(subject.detector_listener)) + + events: List[EstopStateNotification] = [] + + def mock_listener(event: HardwareEvent) -> None: + assert isinstance(event, EstopStateNotification) + events.append(event) + + subject.add_listener(mock_listener) + + steps: List[Tuple[EstopSummary, EstopState]] = [ + ( + EstopSummary(left_detected=False, right_detected=False, engaged=False), + EstopState.NOT_PRESENT, + ), + ( + EstopSummary(left_detected=True, right_detected=False, engaged=False), + EstopState.DISENGAGED, + ), + ( + EstopSummary(left_detected=True, right_detected=False, engaged=True), + EstopState.PHYSICALLY_ENGAGED, + ), + ] + + prev: Optional[EstopState] = None + for (input, result) in steps: + subject.detector_listener(summary=input) + assert len(events) == 1 + event = events.pop(0) + assert event.new_state == result + assert event.new_state == subject.state + if prev is not None: + assert event.old_state == prev + prev = event.new_state + + # Don't transmit event if nothing changed here + assert subject.acknowledge_and_clear() == EstopState.PHYSICALLY_ENGAGED + assert len(events) == 0 + + # Now unsubscribe, change state, and assert we didn't get a callback + subject.remove_listener(mock_listener) + + subject.detector_listener( + summary=EstopSummary(left_detected=True, right_detected=True, engaged=False) + ) + assert subject.state == EstopState.LOGICALLY_ENGAGED + assert len(events) == 0 + + subject.add_listener(mock_listener) + assert subject.acknowledge_and_clear() == EstopState.DISENGAGED + assert len(events) == 1 + assert events.pop().new_state == EstopState.DISENGAGED + + +@pytest.mark.ot3_only +@pytest.mark.parametrize( + argnames=["left_connected", "right_connected"], + argvalues=[ + [False, False], + [True, False], + [False, True], + [True, True], + ], +) +async def test_estop_physical_status( + subject: "EstopStateMachine", left_connected: bool, right_connected: bool +) -> None: + """Test that physical status maps to expected""" + summary = EstopSummary( + left_detected=left_connected, right_detected=right_connected, engaged=False + ) + subject.detector_listener(summary=summary) + assert ( + subject.get_physical_status(location=EstopAttachLocation.LEFT) + == EstopPhysicalStatus.DISENGAGED + if left_connected + else EstopPhysicalStatus.NOT_PRESENT + ) + assert ( + subject.get_physical_status(location=EstopAttachLocation.RIGHT) + == EstopPhysicalStatus.DISENGAGED + if right_connected + else EstopPhysicalStatus.NOT_PRESENT + ) + + summary.engaged = True + subject.detector_listener(summary=summary) + assert ( + subject.get_physical_status(location=EstopAttachLocation.LEFT) + == EstopPhysicalStatus.ENGAGED + if left_connected + else EstopPhysicalStatus.NOT_PRESENT + ) + assert ( + subject.get_physical_status(location=EstopAttachLocation.RIGHT) + == EstopPhysicalStatus.ENGAGED + if right_connected + else EstopPhysicalStatus.NOT_PRESENT + ) + + +@pytest.mark.ot3_only +@pytest.mark.parametrize("clear_to_disengaged", [True, False]) +async def test_estop_state_machine( + subject: "EstopStateMachine", clear_to_disengaged: bool +) -> None: + """Test traversal through the state machine.""" + + steps: List[Tuple[EstopSummary, EstopState]] = [ + ( + EstopSummary(left_detected=False, right_detected=False, engaged=False), + EstopState.NOT_PRESENT, + ), + ( + EstopSummary(left_detected=True, right_detected=False, engaged=False), + EstopState.DISENGAGED, + ), + ( + EstopSummary(left_detected=True, right_detected=True, engaged=False), + EstopState.DISENGAGED, + ), + ( + EstopSummary(left_detected=False, right_detected=False, engaged=False), + EstopState.NOT_PRESENT, + ), + ( + EstopSummary(left_detected=True, right_detected=True, engaged=False), + EstopState.DISENGAGED, + ), + ( + EstopSummary(left_detected=True, right_detected=True, engaged=True), + EstopState.PHYSICALLY_ENGAGED, + ), + ( + EstopSummary(left_detected=True, right_detected=True, engaged=False), + EstopState.LOGICALLY_ENGAGED, + ), + ( + EstopSummary(left_detected=True, right_detected=False, engaged=True), + EstopState.PHYSICALLY_ENGAGED, + ), + ( + EstopSummary(left_detected=True, right_detected=False, engaged=False), + EstopState.LOGICALLY_ENGAGED, + ), + ( + EstopSummary( + left_detected=False, right_detected=clear_to_disengaged, engaged=False + ), + EstopState.LOGICALLY_ENGAGED, + ), + ] + + for (input, result) in steps: + subject.detector_listener(input) + assert subject.state == result + + assert ( + subject.acknowledge_and_clear() == EstopState.DISENGAGED + if clear_to_disengaged + else EstopState.NOT_PRESENT + ) diff --git a/api/tests/opentrons/hardware_control/test_pipette.py b/api/tests/opentrons/hardware_control/test_pipette.py index 82e1d70e64c..d2e043f6c22 100644 --- a/api/tests/opentrons/hardware_control/test_pipette.py +++ b/api/tests/opentrons/hardware_control/test_pipette.py @@ -1,6 +1,7 @@ import pytest from mock import patch from typing import Union, Callable +from pathlib import Path from opentrons.calibration_storage import types as cal_types from opentrons.types import Point, Mount from pytest_lazyfixture import lazy_fixture # type: ignore[import] @@ -13,10 +14,11 @@ instrument_calibration as ot3_calibration, ) from opentrons.hardware_control import types -from opentrons.config import pipette_config from opentrons_shared_data.pipette import ( + pipette_definition, pipette_load_name_conversions as pipette_load_name, load_data as load_pipette_data, + mutable_configurations, ) OT2_PIP_CAL = instrument_calibration.PipetteOffsetByPipetteMount( @@ -39,7 +41,11 @@ def _create_pipette( calibration: instrument_calibration.PipetteOffsetByPipetteMount = OT2_PIP_CAL, id: str = "testID", ): - return ot2_pipette.Pipette(pipette_config.load(model), calibration, id) + pipette_model = pipette_load_name.convert_pipette_model(model) + configurations = mutable_configurations.load_with_mutable_configurations( + pipette_model, Path("fake/path"), "testiId" + ) + return ot2_pipette.Pipette(configurations, calibration, id) return _create_pipette @@ -47,7 +53,7 @@ def _create_pipette( @pytest.fixture def hardware_pipette_ot3() -> Callable: def _create_pipette( - model: pipette_load_name.PipetteModelVersionType, + model: pipette_definition.PipetteModelVersionType, calibration: ot3_calibration.PipetteOffsetByPipetteMount = OT3_PIP_CAL, id: str = "testID", ): @@ -74,7 +80,7 @@ def _create_pipette( ) def test_tip_tracking( pipette_builder: Callable, - model: Union[str, pipette_load_name.PipetteModelVersionType], + model: Union[str, pipette_definition.PipetteModelVersionType], ) -> None: hw_pipette = pipette_builder(model) with pytest.raises(AssertionError): @@ -104,7 +110,7 @@ def test_tip_tracking( ) def test_tip_nozzle_position_tracking( pipette_builder: Callable, - model: Union[str, pipette_load_name.PipetteModelVersionType], + model: Union[str, pipette_definition.PipetteModelVersionType], nozzle_offset: Point, ) -> None: hw_pipette = pipette_builder(model) @@ -150,7 +156,7 @@ def test_tip_nozzle_position_tracking( ) def test_critical_points_pipette_offset( pipette_builder: Callable, - model: Union[str, pipette_load_name.PipetteModelVersionType], + model: Union[str, pipette_definition.PipetteModelVersionType], calibration: Union[ instrument_calibration.PipetteOffsetByPipetteMount, ot3_calibration.PipetteOffsetByPipetteMount, @@ -188,7 +194,7 @@ def test_critical_points_pipette_offset( ) def test_volume_tracking( pipette_builder: Callable, - model: Union[str, pipette_load_name.PipetteModelVersionType], + model: Union[str, pipette_definition.PipetteModelVersionType], max_volume: float, ) -> None: hw_pipette = pipette_builder(model) @@ -216,8 +222,8 @@ def test_volume_tracking( def test_config_update(hardware_pipette_ot2: Callable): hw_pipette = hardware_pipette_ot2("p10_single_v1") sample_plunger_pos = {"top": 19.5} - hw_pipette.update_config_item("top", sample_plunger_pos.get("top")) - assert hw_pipette.config.top == sample_plunger_pos.get("top") + hw_pipette.update_config_item(sample_plunger_pos) + assert hw_pipette.plunger_positions.top == sample_plunger_pos.get("top") @pytest.mark.ot2_only @@ -226,37 +232,19 @@ def test_flow_rate_setting( ) -> None: hw_pipette = hardware_pipette_ot2("p10_single_v1") # pipettes should load settings from config at init time - assert ( - hw_pipette.aspirate_flow_rate - == hw_pipette.config.default_aspirate_flow_rates["2.0"] - ) - assert ( - hw_pipette.dispense_flow_rate - == hw_pipette.config.default_dispense_flow_rates["2.0"] - ) - assert ( - hw_pipette.blow_out_flow_rate - == hw_pipette.config.default_blow_out_flow_rates["2.0"] - ) + assert hw_pipette.aspirate_flow_rate == hw_pipette.aspirate_flow_rates_lookup["2.0"] + assert hw_pipette.dispense_flow_rate == hw_pipette.dispense_flow_rates_lookup["2.0"] + assert hw_pipette.blow_out_flow_rate == hw_pipette.blow_out_flow_rates_lookup["2.0"] # changing flow rates with normal property access shouldn't touch # config or other flow rates hw_pipette.aspirate_flow_rate = 2 assert hw_pipette.aspirate_flow_rate == 2 - assert ( - hw_pipette.dispense_flow_rate - == hw_pipette.config.default_dispense_flow_rates["2.0"] - ) - assert ( - hw_pipette.blow_out_flow_rate - == hw_pipette.config.default_blow_out_flow_rates["2.0"] - ) + assert hw_pipette.dispense_flow_rate == hw_pipette.dispense_flow_rates_lookup["2.0"] + assert hw_pipette.blow_out_flow_rate == hw_pipette.blow_out_flow_rates_lookup["2.0"] hw_pipette.dispense_flow_rate = 3 assert hw_pipette.aspirate_flow_rate == 2 assert hw_pipette.dispense_flow_rate == 3 - assert ( - hw_pipette.blow_out_flow_rate - == hw_pipette.config.default_blow_out_flow_rates["2.0"] - ) + assert hw_pipette.blow_out_flow_rate == hw_pipette.blow_out_flow_rates_lookup["2.0"] hw_pipette.blow_out_flow_rate = 4 assert hw_pipette.aspirate_flow_rate == 2 assert hw_pipette.dispense_flow_rate == 3 @@ -305,7 +293,7 @@ def test_flow_rate_setting( ) def test_alternative_critical_points( pipette_builder: Callable, - model: Union[str, pipette_load_name.PipetteModelVersionType], + model: Union[str, pipette_definition.PipetteModelVersionType], expected_xy_critical_point: Point, expected_front_critical_point: Point, ) -> None: @@ -345,7 +333,7 @@ def test_alternative_critical_points( ) def test_reset_instrument_offset( pipette_builder: Callable, - model: Union[str, pipette_load_name.PipetteModelVersionType], + model: Union[str, pipette_definition.PipetteModelVersionType], calibration: Union[ instrument_calibration.PipetteOffsetByPipetteMount, ot3_calibration.PipetteOffsetByPipetteMount, diff --git a/api/tests/opentrons/hardware_control/test_pipette_handler.py b/api/tests/opentrons/hardware_control/test_pipette_handler.py index 58eaf2d2425..2df9306c98b 100644 --- a/api/tests/opentrons/hardware_control/test_pipette_handler.py +++ b/api/tests/opentrons/hardware_control/test_pipette_handler.py @@ -61,11 +61,11 @@ def test_plan_check_pick_up_tip_with_presses_argument( decoy.when(mock_pipette.has_tip).then_return(False) decoy.when(mock_pipette.config.quirks).then_return([]) - decoy.when(mock_pipette.config.pick_up_distance).then_return(0) - decoy.when(mock_pipette.config.pick_up_increment).then_return(0) + decoy.when(mock_pipette.pick_up_configurations.distance).then_return(0) + decoy.when(mock_pipette.pick_up_configurations.increment).then_return(0) if presses_input is None: - decoy.when(mock_pipette.config.pick_up_presses).then_return( + decoy.when(mock_pipette.pick_up_configurations.presses).then_return( expected_array_length ) @@ -118,7 +118,7 @@ def test_plan_check_pick_up_tip_with_presses_argument_ot3( decoy.when(mock_pipette_ot3.pick_up_configurations.distance).then_return(0) decoy.when(mock_pipette_ot3.pick_up_configurations.current).then_return(1) decoy.when(mock_pipette_ot3.config.quirks).then_return([]) - decoy.when(mock_pipette_ot3.channels.value).then_return(channels) + decoy.when(mock_pipette_ot3.channels).then_return(channels) if presses_input is None: decoy.when(mock_pipette_ot3.config.pick_up_presses).then_return( diff --git a/api/tests/opentrons/protocol_api/core/engine/test_protocol_core.py b/api/tests/opentrons/protocol_api/core/engine/test_protocol_core.py index cfc795e1647..a77d8d48ad4 100644 --- a/api/tests/opentrons/protocol_api/core/engine/test_protocol_core.py +++ b/api/tests/opentrons/protocol_api/core/engine/test_protocol_core.py @@ -517,17 +517,11 @@ def test_load_adapter( ], ) @pytest.mark.parametrize( - argnames=[ - "use_pick_up_location_lpc_offset", - "use_drop_location_lpc_offset", - "pick_up_offset", - "drop_offset", - ], + argnames=["pick_up_offset", "drop_offset"], argvalues=[ - (False, False, None, None), - (True, False, None, None), - (False, True, None, (4, 5, 6)), - (True, True, (4, 5, 6), (4, 5, 6)), + (None, None), + (None, (4, 5, 6)), + ((4, 5, 6), (4, 5, 6)), ], ) def test_move_labware( @@ -536,8 +530,6 @@ def test_move_labware( mock_engine_client: EngineClient, expected_strategy: LabwareMovementStrategy, use_gripper: bool, - use_pick_up_location_lpc_offset: bool, - use_drop_location_lpc_offset: bool, pick_up_offset: Optional[Tuple[float, float, float]], drop_offset: Optional[Tuple[float, float, float]], ) -> None: @@ -552,8 +544,6 @@ def test_move_labware( labware_core=labware, new_location=DeckSlotName.SLOT_5, use_gripper=use_gripper, - use_pick_up_location_lpc_offset=use_pick_up_location_lpc_offset, - use_drop_location_lpc_offset=use_drop_location_lpc_offset, pick_up_offset=pick_up_offset, drop_offset=drop_offset, ) @@ -562,8 +552,6 @@ def test_move_labware( labware_id="labware-id", new_location=DeckSlotLocation(slotName=DeckSlotName.SLOT_5), strategy=expected_strategy, - use_pick_up_location_lpc_offset=use_pick_up_location_lpc_offset, - use_drop_location_lpc_offset=use_drop_location_lpc_offset, pick_up_offset=LabwareOffsetVector(x=4, y=5, z=6) if pick_up_offset else None, @@ -594,8 +582,6 @@ def test_move_labware_on_non_connected_module( labware_core=labware, new_location=non_connected_module_core, use_gripper=False, - use_pick_up_location_lpc_offset=False, - use_drop_location_lpc_offset=False, pick_up_offset=None, drop_offset=None, ) @@ -604,8 +590,6 @@ def test_move_labware_on_non_connected_module( labware_id="labware-id", new_location=ModuleLocation(moduleId="module-id"), strategy=LabwareMovementStrategy.MANUAL_MOVE_WITH_PAUSE, - use_pick_up_location_lpc_offset=False, - use_drop_location_lpc_offset=False, pick_up_offset=None, drop_offset=None, ) @@ -630,8 +614,6 @@ def test_move_labware_off_deck( labware_core=labware, new_location=OFF_DECK, use_gripper=False, - use_pick_up_location_lpc_offset=False, - use_drop_location_lpc_offset=False, pick_up_offset=None, drop_offset=None, ) @@ -640,8 +622,6 @@ def test_move_labware_off_deck( labware_id="labware-id", new_location=OFF_DECK_LOCATION, strategy=LabwareMovementStrategy.MANUAL_MOVE_WITH_PAUSE, - use_pick_up_location_lpc_offset=False, - use_drop_location_lpc_offset=False, pick_up_offset=None, drop_offset=None, ) diff --git a/api/tests/opentrons/protocol_api/test_protocol_context.py b/api/tests/opentrons/protocol_api/test_protocol_context.py index bba2742801f..d03e5a6b72c 100644 --- a/api/tests/opentrons/protocol_api/test_protocol_context.py +++ b/api/tests/opentrons/protocol_api/test_protocol_context.py @@ -504,7 +504,6 @@ def test_move_labware_to_slot( subject.move_labware( labware=movable_labware, new_location=42, - use_pick_up_location_lpc_offset=True, drop_offset=drop_offset, ) @@ -513,8 +512,6 @@ def test_move_labware_to_slot( labware_core=mock_labware_core, new_location=DeckSlotName.SLOT_1, use_gripper=False, - use_pick_up_location_lpc_offset=True, - use_drop_location_lpc_offset=False, pick_up_offset=None, drop_offset=(1, 2, 3), ) @@ -554,8 +551,6 @@ def test_move_labware_to_module( labware_core=mock_labware_core, new_location=mock_module_core, use_gripper=False, - use_pick_up_location_lpc_offset=False, - use_drop_location_lpc_offset=False, pick_up_offset=None, drop_offset=None, ) @@ -586,8 +581,6 @@ def test_move_labware_off_deck( labware_core=mock_labware_core, new_location=OFF_DECK, use_gripper=False, - use_pick_up_location_lpc_offset=False, - use_drop_location_lpc_offset=False, pick_up_offset=None, drop_offset=None, ) diff --git a/api/tests/opentrons/protocol_api_old/core/simulator/conftest.py b/api/tests/opentrons/protocol_api_old/core/simulator/conftest.py index a2f6f890fa0..015040a39f9 100644 --- a/api/tests/opentrons/protocol_api_old/core/simulator/conftest.py +++ b/api/tests/opentrons/protocol_api_old/core/simulator/conftest.py @@ -117,6 +117,8 @@ def tip_rack(minimal_labware_def: LabwareDefinition) -> LegacyLabwareCore: tip_rack_parameters["isTiprack"] = True tip_rack_parameters["tipLength"] = 123 tip_rack_definition["parameters"] = tip_rack_parameters + tip_rack_definition["wells"]["A1"]["totalLiquidVolume"] = 200 # type: ignore + tip_rack_definition["wells"]["A2"]["totalLiquidVolume"] = 200 # type: ignore """Labware fixture.""" return LegacyLabwareCore( diff --git a/api/tests/opentrons/protocol_api_old/core/simulator/test_instrument_context.py b/api/tests/opentrons/protocol_api_old/core/simulator/test_instrument_context.py index 4ebe28751ef..fcadaac81a2 100644 --- a/api/tests/opentrons/protocol_api_old/core/simulator/test_instrument_context.py +++ b/api/tests/opentrons/protocol_api_old/core/simulator/test_instrument_context.py @@ -202,7 +202,7 @@ def test_working_volume(subject: InstrumentCore, tip_rack: LabwareCore) -> None: increment=None, prep_after=False, ) - assert subject.get_hardware_state()["working_volume"] == 100 + assert subject.get_hardware_state()["working_volume"] == 200 @pytest.mark.parametrize( diff --git a/api/tests/opentrons/protocol_engine/clients/test_sync_client.py b/api/tests/opentrons/protocol_engine/clients/test_sync_client.py index 1991052df6e..2e1fcb49638 100644 --- a/api/tests/opentrons/protocol_engine/clients/test_sync_client.py +++ b/api/tests/opentrons/protocol_engine/clients/test_sync_client.py @@ -29,6 +29,8 @@ DropTipWellLocation, MotorAxis, Liquid, + LabwareMovementStrategy, + LabwareOffsetVector, ) @@ -235,6 +237,35 @@ def test_load_pipette( assert result == expected_result +def test_move_labware( + decoy: Decoy, + transport: ChildThreadTransport, + subject: SyncClient, +) -> None: + """It should execute a move labware command.""" + request = commands.MoveLabwareCreate( + params=commands.MoveLabwareParams( + labwareId="movable-labware-id", + newLocation=DeckSlotLocation(slotName=DeckSlotName.SLOT_4), + strategy=LabwareMovementStrategy.USING_GRIPPER, + pickUpOffset=LabwareOffsetVector(x=1, y=2, z=3), + dropOffset=LabwareOffsetVector(x=10, y=20, z=30), + ) + ) + + response = commands.MoveLabwareResult(offsetId="offset-id") + decoy.when(transport.execute_command(request=request)).then_return(response) + + result = subject.move_labware( + labware_id="movable-labware-id", + new_location=DeckSlotLocation(slotName=DeckSlotName.SLOT_4), + strategy=LabwareMovementStrategy.USING_GRIPPER, + pick_up_offset=LabwareOffsetVector(x=1, y=2, z=3), + drop_offset=LabwareOffsetVector(x=10, y=20, z=30), + ) + assert result == response + + def test_move_to_well( decoy: Decoy, transport: ChildThreadTransport, diff --git a/api/tests/opentrons/protocol_engine/commands/test_move_labware.py b/api/tests/opentrons/protocol_engine/commands/test_move_labware.py index 9ad2f797d8d..d57c52e0dc1 100644 --- a/api/tests/opentrons/protocol_engine/commands/test_move_labware.py +++ b/api/tests/opentrons/protocol_engine/commands/test_move_labware.py @@ -14,7 +14,7 @@ LoadedLabware, LabwareMovementStrategy, LabwareOffsetVector, - ExperimentalOffsetData, + LabwareMovementOffsetData, ) from opentrons.protocol_engine.state import StateView from opentrons.protocol_engine.commands.move_labware import ( @@ -183,7 +183,6 @@ async def test_gripper_move_labware_implementation( labwareId="my-cool-labware-id", newLocation=DeckSlotLocation(slotName=DeckSlotName.SLOT_4), strategy=LabwareMovementStrategy.USING_GRIPPER, - usePickUpLocationLpcOffset=True, pickUpOffset=LabwareOffsetVector(x=1, y=2, z=3), ) @@ -224,10 +223,7 @@ async def test_gripper_move_labware_implementation( labware_id="my-cool-labware-id", current_location=validated_from_location, new_location=validated_new_location, - new_offset_id="wowzers-a-new-offset-id", - experimental_offset_data=ExperimentalOffsetData( - usePickUpLocationLpcOffset=True, - useDropLocationLpcOffset=False, + user_offset_data=LabwareMovementOffsetData( pickUpOffset=LabwareOffsetVector(x=1, y=2, z=3), dropOffset=None, ), diff --git a/api/tests/opentrons/protocol_engine/execution/test_equipment_handler.py b/api/tests/opentrons/protocol_engine/execution/test_equipment_handler.py index 3a5e02cf6cd..45444e037b9 100644 --- a/api/tests/opentrons/protocol_engine/execution/test_equipment_handler.py +++ b/api/tests/opentrons/protocol_engine/execution/test_equipment_handler.py @@ -3,7 +3,7 @@ import inspect from datetime import datetime from decoy import Decoy, matchers -from typing import Any, cast +from typing import Any, Optional, cast from opentrons_shared_data.pipette.dev_types import PipetteNameType from opentrons_shared_data.labware.dev_types import LabwareUri @@ -26,6 +26,8 @@ DeckSlotLocation, DeckType, ModuleLocation, + OnLabwareLocation, + NonStackedLocation, LoadedPipette, LabwareOffset, LabwareOffsetVector, @@ -474,6 +476,112 @@ def test_find_offset_id_of_labware_on_module( assert result == "labware-offset-id" +@pytest.mark.parametrize( + argnames=["parent_location", "expected_result"], + argvalues=[ + (DeckSlotLocation(slotName=DeckSlotName.SLOT_1), "labware-offset-id"), + (OFF_DECK_LOCATION, None), + ], +) +def test_find_offset_id_of_labware_on_labware( + decoy: Decoy, + parent_location: NonStackedLocation, + expected_result: Optional[str], + state_store: StateStore, + subject: EquipmentHandler, +) -> None: + """It should find an offset for a labware on a labware.""" + decoy.when(state_store.labware.get_definition_uri("labware-id")).then_return( + LabwareUri("opentrons-test/load-name-2/1") + ) + + decoy.when(state_store.labware.get_parent_location("labware-id")).then_return( + parent_location + ) + + decoy.when( + state_store.labware.find_applicable_labware_offset( + definition_uri="opentrons-test/load-name-1/1", + location=LabwareOffsetLocation( + slotName=DeckSlotName.SLOT_1, + moduleModel=None, + definitionUri="opentrons-test/load-name-2/1", + ), + ) + ).then_return( + LabwareOffset( + id="labware-offset-id", + createdAt=datetime(year=2021, month=1, day=2), + definitionUri="opentrons-test/load-name/1", + location=LabwareOffsetLocation( + slotName=DeckSlotName.SLOT_1, + definitionUri="opentrons-test/load-name-2/1", + ), + vector=LabwareOffsetVector(x=1, y=2, z=3), + ) + ) + + result = subject.find_applicable_labware_offset_id( + labware_definition_uri="opentrons-test/load-name-1/1", + labware_location=OnLabwareLocation(labwareId="labware-id"), + ) + + assert result == expected_result + + +def test_find_offset_id_of_labware_on_labware_on_modules( + decoy: Decoy, + state_store: StateStore, + subject: EquipmentHandler, +) -> None: + """It should find an offset for a labware on a labware on a module.""" + decoy.when(state_store.labware.get_definition_uri("labware-id")).then_return( + LabwareUri("opentrons-test/load-name-2/1") + ) + + decoy.when(state_store.labware.get_parent_location("labware-id")).then_return( + ModuleLocation(moduleId="module-id"), + ) + + decoy.when(state_store.modules.get_requested_model("module-id")).then_return( + ModuleModel.HEATER_SHAKER_MODULE_V1 + ) + + decoy.when(state_store.modules.get_location("module-id")).then_return( + DeckSlotLocation(slotName=DeckSlotName.SLOT_1) + ) + + decoy.when( + state_store.labware.find_applicable_labware_offset( + definition_uri="opentrons-test/load-name-1/1", + location=LabwareOffsetLocation( + slotName=DeckSlotName.SLOT_1, + moduleModel=ModuleModel.HEATER_SHAKER_MODULE_V1, + definitionUri="opentrons-test/load-name-2/1", + ), + ) + ).then_return( + LabwareOffset( + id="labware-offset-id", + createdAt=datetime(year=2021, month=1, day=2), + definitionUri="opentrons-test/load-name/1", + location=LabwareOffsetLocation( + slotName=DeckSlotName.SLOT_1, + moduleModel=ModuleModel.HEATER_SHAKER_MODULE_V1, + definitionUri="opentrons-test/load-name-2/1", + ), + vector=LabwareOffsetVector(x=1, y=2, z=3), + ) + ) + + result = subject.find_applicable_labware_offset_id( + labware_definition_uri="opentrons-test/load-name-1/1", + labware_location=OnLabwareLocation(labwareId="labware-id"), + ) + + assert result == "labware-offset-id" + + def test_find_offset_id_of_labware_off_deck(subject: EquipmentHandler) -> None: """It should return None for offset_id of labware off-deck.""" result = subject.find_applicable_labware_offset_id( diff --git a/api/tests/opentrons/protocol_engine/execution/test_labware_movement_handler.py b/api/tests/opentrons/protocol_engine/execution/test_labware_movement_handler.py index eba6f09c842..92d1a6ff111 100644 --- a/api/tests/opentrons/protocol_engine/execution/test_labware_movement_handler.py +++ b/api/tests/opentrons/protocol_engine/execution/test_labware_movement_handler.py @@ -26,7 +26,7 @@ LabwareOffsetVector, LabwareLocation, NonStackedLocation, - ExperimentalOffsetData, + LabwareMovementOffsetData, ModuleModel, ) from opentrons.protocol_engine.execution.thermocycler_plate_lifter import ( @@ -91,11 +91,9 @@ def heater_shaker_movement_flagger(decoy: Decoy) -> HeaterShakerMovementFlagger: return decoy.mock(cls=HeaterShakerMovementFlagger) -def default_experimental_movement_data() -> ExperimentalOffsetData: +def default_experimental_movement_data() -> LabwareMovementOffsetData: """Experimental movement data with default values.""" - return ExperimentalOffsetData( - usePickUpLocationLpcOffset=False, - useDropLocationLpcOffset=False, + return LabwareMovementOffsetData( pickUpOffset=None, dropOffset=None, ) @@ -188,10 +186,6 @@ async def test_move_labware_with_gripper( ) ).then_return(Point(201, 202, 219.5)) - decoy.when( - state_store.labware.get_labware_offset_vector("my-teleporting-labware") - ).then_return(LabwareOffsetVector(x=0.1, y=0.2, z=0.3)) - mock_tc_context_manager = decoy.mock() decoy.when( thermocycler_plate_lifter.lift_plate_for_labware_movement( @@ -210,18 +204,16 @@ async def test_move_labware_with_gripper( vector=LabwareOffsetVector(x=0.5, y=0.6, z=0.7), ) ) - experimental_offset_data = ExperimentalOffsetData( - usePickUpLocationLpcOffset=True, - useDropLocationLpcOffset=False, + user_offset_data = LabwareMovementOffsetData( pickUpOffset=LabwareOffsetVector(x=-1, y=-2, z=-3), dropOffset=LabwareOffsetVector(x=1, y=2, z=3), ) expected_waypoints = [ Point(777, 888, 999), # gripper retract at current location - Point(100.1, 100.2, 999), # move to above slot 1 - Point(100.1, 100.2, 116.8 + extra_pickup_offset), # move to labware on slot 1 - Point(100.1, 100.2, 999), # gripper retract at current location + Point(100, 100, 999), # move to above slot 1 + Point(100, 100, 116.5 + extra_pickup_offset), # move to labware on slot 1 + Point(100, 100, 999), # gripper retract at current location Point(202.0, 204.0, 999), # move to above slot 3 Point(202.0, 204.0, 222.5), # move down to labware drop height on slot 3 Point(201.5, 202.6, 999), # retract in place @@ -231,8 +223,7 @@ async def test_move_labware_with_gripper( labware_id="my-teleporting-labware", current_location=from_location, new_location=to_location, - new_offset_id="new-offset-id", - experimental_offset_data=experimental_offset_data, + user_offset_data=user_offset_data, ) gripper = OT3Mount.GRIPPER @@ -291,8 +282,7 @@ async def test_labware_movement_raises_on_ot2( labware_id="labware-id", current_location=DeckSlotLocation(slotName=DeckSlotName.SLOT_3), new_location=DeckSlotLocation(slotName=DeckSlotName.SLOT_1), - new_offset_id=None, - experimental_offset_data=default_experimental_movement_data(), + user_offset_data=default_experimental_movement_data(), ) @@ -309,8 +299,7 @@ async def test_labware_movement_skips_for_virtual_gripper( labware_id="labware-id", current_location=DeckSlotLocation(slotName=DeckSlotName.SLOT_3), new_location=DeckSlotLocation(slotName=DeckSlotName.SLOT_1), - experimental_offset_data=default_experimental_movement_data(), - new_offset_id=None, + user_offset_data=default_experimental_movement_data(), ) decoy.verify( await ot3_hardware_api.move_to( @@ -336,8 +325,7 @@ async def test_labware_movement_raises_without_gripper( labware_id="labware-id", current_location=DeckSlotLocation(slotName=DeckSlotName.SLOT_3), new_location=DeckSlotLocation(slotName=DeckSlotName.SLOT_1), - experimental_offset_data=default_experimental_movement_data(), - new_offset_id=None, + user_offset_data=default_experimental_movement_data(), ) diff --git a/api/tests/opentrons/protocol_engine/test_slot_standardization.py b/api/tests/opentrons/protocol_engine/test_slot_standardization.py index b6fcfe0012d..99a3c5c2f33 100644 --- a/api/tests/opentrons/protocol_engine/test_slot_standardization.py +++ b/api/tests/opentrons/protocol_engine/test_slot_standardization.py @@ -257,8 +257,6 @@ def test_standardize_move_labware_command( newLocation=original_location, labwareId="labwareId", strategy=LabwareMovementStrategy.USING_GRIPPER, - usePickUpLocationLpcOffset=True, - useDropLocationLpcOffset=True, pickUpOffset=LabwareOffsetVector(x=1, y=2, z=3), dropOffset=LabwareOffsetVector(x=4, y=5, z=6), ), @@ -270,8 +268,6 @@ def test_standardize_move_labware_command( newLocation=expected_location, labwareId="labwareId", strategy=LabwareMovementStrategy.USING_GRIPPER, - usePickUpLocationLpcOffset=True, - useDropLocationLpcOffset=True, pickUpOffset=LabwareOffsetVector(x=1, y=2, z=3), dropOffset=LabwareOffsetVector(x=4, y=5, z=6), ), diff --git a/api/tests/opentrons/test_execute.py b/api/tests/opentrons/test_execute.py index f084f6124ed..e5d829b2ba6 100644 --- a/api/tests/opentrons/test_execute.py +++ b/api/tests/opentrons/test_execute.py @@ -12,11 +12,13 @@ from opentrons_shared_data import get_shared_data_root, load_shared_data from opentrons_shared_data.pipette.dev_types import PipetteModel - +from opentrons_shared_data.pipette import ( + pipette_load_name_conversions as pipette_load_name, + load_data as load_pipette_data, +) from opentrons import execute, types -from opentrons.hardware_control import Controller, api from opentrons.protocols.api_support.types import APIVersion -from opentrons.config.pipette_config import load +from opentrons.hardware_control import Controller, api if TYPE_CHECKING: from tests.opentrons.conftest import Bundle, Protocol @@ -79,12 +81,27 @@ def test_execute_function_apiv2( mock_get_attached_instr: mock.AsyncMock, ) -> None: """Test `execute()` with a Python file.""" + converted_model_v15 = pipette_load_name.convert_pipette_model( + cast(PipetteModel, "p10_single_v1.5") + ) + converted_model_v1 = pipette_load_name.convert_pipette_model( + cast(PipetteModel, "p1000_single_v1") + ) + mock_get_attached_instr.return_value[types.Mount.LEFT] = { - "config": load(PipetteModel("p10_single_v1.5")), + "config": load_pipette_data.load_definition( + converted_model_v15.pipette_type, + converted_model_v15.pipette_channels, + converted_model_v15.pipette_version, + ), "id": "testid", } mock_get_attached_instr.return_value[types.Mount.RIGHT] = { - "config": load(PipetteModel("p1000_single_v1")), + "config": load_pipette_data.load_definition( + converted_model_v1.pipette_type, + converted_model_v1.pipette_channels, + converted_model_v1.pipette_version, + ), "id": "testid2", } entries = [] @@ -116,8 +133,15 @@ def emit_runlog(entry: Any) -> None: nonlocal entries entries.append(entry) + converted_model_v15 = pipette_load_name.convert_pipette_model( + cast(PipetteModel, "p10_single_v1.5") + ) mock_get_attached_instr.return_value[types.Mount.LEFT] = { - "config": load(PipetteModel("p10_single_v1.5")), + "config": load_pipette_data.load_definition( + converted_model_v15.pipette_type, + converted_model_v15.pipette_channels, + converted_model_v15.pipette_version, + ), "id": "testid", } execute.execute(filelike, "simple.json", emit_runlog=emit_runlog) @@ -147,8 +171,15 @@ def emit_runlog(entry: Any) -> None: nonlocal entries entries.append(entry) + converted_model_v15 = pipette_load_name.convert_pipette_model( + cast(PipetteModel, "p10_single_v1.5") + ) mock_get_attached_instr.return_value[types.Mount.LEFT] = { - "config": load(PipetteModel("p10_single_v1.5")), + "config": load_pipette_data.load_definition( + converted_model_v15.pipette_type, + converted_model_v15.pipette_channels, + converted_model_v15.pipette_version, + ), "id": "testid", } execute.execute(filelike, "simple.json", emit_runlog=emit_runlog) @@ -178,8 +209,15 @@ def emit_runlog(entry: Any) -> None: nonlocal entries entries.append(entry) + converted_model_v15 = pipette_load_name.convert_pipette_model( + cast(PipetteModel, "p10_single_v1.5") + ) mock_get_attached_instr.return_value[types.Mount.LEFT] = { - "config": load(PipetteModel("p10_single_v1.5")), + "config": load_pipette_data.load_definition( + converted_model_v15.pipette_type, + converted_model_v15.pipette_channels, + converted_model_v15.pipette_version, + ), "id": "testid", } execute.execute(filelike, "simple.json", emit_runlog=emit_runlog) @@ -210,8 +248,15 @@ def emit_runlog(entry: Any) -> None: nonlocal entries entries.append(entry) + converted_model_v15 = pipette_load_name.convert_pipette_model( + cast(PipetteModel, "p10_single_v1.5") + ) mock_get_attached_instr.return_value[types.Mount.LEFT] = { - "config": load(PipetteModel("p10_single_v1.5")), + "config": load_pipette_data.load_definition( + converted_model_v15.pipette_type, + converted_model_v15.pipette_channels, + converted_model_v15.pipette_version, + ), "id": "testid", } execute.execute( diff --git a/app/src/App/DesktopApp.tsx b/app/src/App/DesktopApp.tsx index 5da35e00235..d3f7d653413 100644 --- a/app/src/App/DesktopApp.tsx +++ b/app/src/App/DesktopApp.tsx @@ -5,7 +5,7 @@ import { Box, POSITION_RELATIVE, COLORS, - OVERFLOW_SCROLL, + OVERFLOW_AUTO, } from '@opentrons/components' import { Alerts } from '../organisms/Alerts' @@ -102,7 +102,7 @@ export const DesktopApp = (): JSX.Element => { width="100%" height="100%" backgroundColor={COLORS.fundamentalsBackground} - overflow={OVERFLOW_SCROLL} + overflow={OVERFLOW_AUTO} > diff --git a/app/src/App/OnDeviceDisplayApp.tsx b/app/src/App/OnDeviceDisplayApp.tsx index 4aa2264b570..dbe77eb3fc1 100644 --- a/app/src/App/OnDeviceDisplayApp.tsx +++ b/app/src/App/OnDeviceDisplayApp.tsx @@ -18,6 +18,7 @@ import { BackButton } from '../atoms/buttons' import { SleepScreen } from '../atoms/SleepScreen' import { ToasterOven } from '../organisms/ToasterOven' import { MaintenanceRunTakeover } from '../organisms/TakeoverModal' +import { FirmwareUpdateTakeover } from '../organisms/FirmwareUpdateModal/FirmwareUpdateTakeover' import { ConnectViaEthernet } from '../pages/OnDeviceDisplay/ConnectViaEthernet' import { ConnectViaUSB } from '../pages/OnDeviceDisplay/ConnectViaUSB' import { ConnectViaWifi } from '../pages/OnDeviceDisplay/ConnectViaWifi' @@ -253,6 +254,7 @@ export const OnDeviceDisplayApp = (): JSX.Element => { } }, [dispatch, isIdle, usersBrightness]) + // TODO (sb:6/12/23) Create a notification manager to set up preference and order of takeover modals return ( @@ -261,6 +263,7 @@ export const OnDeviceDisplayApp = (): JSX.Element => { ) : ( + diff --git a/app/src/App/OnDeviceDisplayAppFallback.tsx b/app/src/App/OnDeviceDisplayAppFallback.tsx index 991a7728196..bb2e19ef9e5 100644 --- a/app/src/App/OnDeviceDisplayAppFallback.tsx +++ b/app/src/App/OnDeviceDisplayAppFallback.tsx @@ -39,7 +39,7 @@ export function OnDeviceDisplayAppFallback({ const modalHeader: ModalHeaderBaseProps = { title: t('error_boundary_title'), iconName: 'information', - iconColor: COLORS.white, + iconColor: COLORS.red2, } // immediately report to robot logs that something fatal happened @@ -50,7 +50,6 @@ export function OnDeviceDisplayAppFallback({ return ( action.actionType === RUN_ACTION_TYPE_PLAY ) if ( - status === RUN_STATUS_SUCCEEDED || - status === RUN_STATUS_STOPPED || - status === RUN_STATUS_FAILED + runStatus === RUN_STATUS_SUCCEEDED || + runStatus === RUN_STATUS_STOPPED || + runStatus === RUN_STATUS_FAILED ) { - return `/runs/${currentRun.id}/summary` + return `/runs/${runId}/summary` } else if ( - status === RUN_STATUS_IDLE || - (!hasBeenStarted && status === RUN_STATUS_BLOCKED_BY_OPEN_DOOR) + runStatus === RUN_STATUS_IDLE || + (!hasBeenStarted && runStatus === RUN_STATUS_BLOCKED_BY_OPEN_DOOR) ) { - return `/runs/${currentRun.id}/setup` + return `/runs/${runId}/setup` } else { - return `/runs/${currentRun.id}/run` + return `/runs/${runId}/run` } } diff --git a/app/src/assets/images/flex_gripper.png b/app/src/assets/images/flex_gripper.png new file mode 100644 index 00000000000..eaf67d85f38 Binary files /dev/null and b/app/src/assets/images/flex_gripper.png differ diff --git a/app/src/assets/images/flex_gripper.svg b/app/src/assets/images/flex_gripper.svg deleted file mode 100644 index f4871edaa34..00000000000 --- a/app/src/assets/images/flex_gripper.svg +++ /dev/null @@ -1,65 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/assets/localization/en/device_details.json b/app/src/assets/localization/en/device_details.json index d2482031711..0d93f5531c8 100644 --- a/app/src/assets/localization/en/device_details.json +++ b/app/src/assets/localization/en/device_details.json @@ -1,13 +1,17 @@ { + "about_flex_gripper": "About Flex Gripper", + "about_gripper": "About gripper", "about_module": "About {{name}}", "about_pipette_name": "About {{name}} Pipette", "about_pipette": "About pipette", "an_error_occurred_while_updating_module": "An error occurred while updating your {{moduleName}}. Please try again.", "an_error_occurred_while_updating_please_try_again": "An error occurred while updating your pipette's settings. Please try again.", "an_error_occurred_while_updating": "An error occurred while updating your pipette's settings.", + "attach_gripper": "Attach gripper", "attach_pipette": "Attach pipette", "both_mounts": "Both Mounts", "bundle_firmware_file_not_found": "Bundled fw file not found for module of type: {{module}}", + "calibrate_gripper": "Calibrate gripper", "calibrate_now": "Calibrate now", "calibrate_pipette_offset": "Calibrate pipette offset", "calibrate_pipette": "Calibrate pipette", @@ -24,6 +28,7 @@ "deck_cal_missing": "Pipette Offset calibration missing. Calibrate deck first.", "deck_slot": "deck slot {{slot}}", "delete_run": "Delete protocol run record", + "detach_gripper": "Detach gripper", "detach_pipette": "Detach pipette", "disengaged": "Disengaged", "download_run_log": "Download run log", @@ -31,6 +36,7 @@ "error_details": "error details", "failed": "failed", "firmware_update_available": "Firmware update available.", + "firmware_update_available_now": "Firmware update available. Update now", "firmware_update_failed": "Failed to update module firmware", "firmware_update_installation_successful": "Installation successful", "got_it": "Got it", @@ -41,6 +47,7 @@ "hot_to_the_touch": "Module is hot to the touch", "input_out_of_range": "Input out of range", "instruments_and_modules": "Instruments and Modules", + "instrument_attached": "Instrument attached", "labware_bottom": "Labware Bottom", "last_run_time": "last run {{number}}", "left_right": "Left+Right Mounts", @@ -89,6 +96,7 @@ "protocol": "Protocol", "ready_to_run": "ready to run", "ready": "Ready", + "recalibrate_gripper": "Recalibrate gripper", "recalibrate_now": "Recalibrate now", "recalibrate_pipette_offset": "Recalibrate pipette offset", "recalibrate_pipette": "Recalibrate pipette", diff --git a/app/src/assets/localization/en/firmware_update.json b/app/src/assets/localization/en/firmware_update.json new file mode 100644 index 00000000000..64c11d59190 --- /dev/null +++ b/app/src/assets/localization/en/firmware_update.json @@ -0,0 +1,10 @@ +{ + "download_logs": "Download the robot logs from the Opentrons App and send them to support@opentrons.com for assistance.", + "firmware_out_of_date": "The firmware for {{mount}} {{instrument}} is out of date. You need to update it before running protocols that use this instrument.", + "ready_to_use": "Your {{instrument}} is ready to use!", + "successful_update": "Successful update!", + "update_failed": "Update failed", + "update_firmware": "Update firmware", + "update_needed": "Instrument firmware update needed", + "updating_firmware": "Updating firmware..." +} diff --git a/app/src/assets/localization/en/gripper_wizard_flows.json b/app/src/assets/localization/en/gripper_wizard_flows.json index f0a258d3e9d..e484f748061 100644 --- a/app/src/assets/localization/en/gripper_wizard_flows.json +++ b/app/src/assets/localization/en/gripper_wizard_flows.json @@ -1,7 +1,7 @@ { "are_you_sure_exit": "Are you sure you want to exit before completing {{flow}}?", "attach_gripper": "Attach Gripper", - "attached_gripper_and_screw_in": "Attach the gripper to the robot by alinging the connector and ensuring a secure connection. Hold the gripper in place and use the hex screwdriver to tighten the gripper screws. Then test that the gripper is securely attached by gently pulling it side to side.", + "attached_gripper_and_screw_in": "Attach the gripper to the robot by aligning the connector and ensuring a secure connection. Hold the gripper in place and use the hex screwdriver to tighten the gripper screws. Then test that the gripper is securely attached by gently pulling it side to side.", "before_you_begin": "Before you begin", "begin_calibration": "Begin calibration", "calibrate_gripper": "Calibrate gripper", @@ -37,6 +37,7 @@ "remove_labware_to_get_started_detaching": "To get started, remove labware from the rest of the deck and clean up the work area to make attachment and calibration easier. Also gather the needed equipment shown on the right hand side", "remove_labware_to_get_started_recalibrating": "To get started, remove labware from the rest of the deck and clean up the work area to make attachment and calibration easier. Also gather the needed equipment shown on the right hand sideThe calibration pin is included with the gripper and should be stored on the exposed panel of the gripper.", "remove_probe": "Unlatch the calibration probe, remove it from the pipette nozzle, and return it to its storage location.", + "return_pin_error": "Return the calibration pin to its storage location before exiting. {{error}}", "stand_back_gripper_is_calibrating": "Stand Back, Flex Gripper is Calibrating", "try_again": "Try again", "unable_to_detect_gripper": "Unable to detect Gripper" diff --git a/app/src/assets/localization/en/index.ts b/app/src/assets/localization/en/index.ts index 2cd942e36ab..f92edfc5510 100644 --- a/app/src/assets/localization/en/index.ts +++ b/app/src/assets/localization/en/index.ts @@ -5,6 +5,7 @@ import protocol_command_text from './protocol_command_text.json' import device_details from './device_details.json' import device_settings from './device_settings.json' import devices_landing from './devices_landing.json' +import firmware_update from './firmware_update.json' import gripper_wizard_flows from './gripper_wizard_flows.json' import heater_shaker from './heater_shaker.json' import instruments_dashboard from './instruments_dashboard.json' @@ -35,6 +36,7 @@ export const en = { device_details, device_settings, devices_landing, + firmware_update, gripper_wizard_flows, heater_shaker, instruments_dashboard, diff --git a/app/src/assets/localization/en/instruments_dashboard.json b/app/src/assets/localization/en/instruments_dashboard.json index 2791088de08..c0dc087f89a 100644 --- a/app/src/assets/localization/en/instruments_dashboard.json +++ b/app/src/assets/localization/en/instruments_dashboard.json @@ -1,4 +1,5 @@ { + "calibrate": "calibrate", "detach": "detach", "firmware_version": "firmware version", "last_calibrated": "last calibrated", diff --git a/app/src/assets/localization/en/pipette_wizard_flows.json b/app/src/assets/localization/en/pipette_wizard_flows.json index d0064efb331..fd3718e09c7 100644 --- a/app/src/assets/localization/en/pipette_wizard_flows.json +++ b/app/src/assets/localization/en/pipette_wizard_flows.json @@ -1,4 +1,5 @@ { + "align_the_connector": "Attach the pipette to the robot by aligning the connector and pressing to ensure a secure connection. Hold the pipette in place and use the hex screwdriver to tighten the pipette screws. Then test that the pipette is securely attached by gently pulling it side to side.", "all_pipette_detached": "All pipettes successfully detached", "are_you_sure_exit": "Are you sure you want to exit before completing {{flow}}?", "attach_96_channel_plus_detach": "Detach {{pipetteName}} and Attach 96-Channel Pipette", diff --git a/app/src/assets/localization/en/protocol_setup.json b/app/src/assets/localization/en/protocol_setup.json index 0c05d05564a..58601cf0426 100644 --- a/app/src/assets/localization/en/protocol_setup.json +++ b/app/src/assets/localization/en/protocol_setup.json @@ -78,6 +78,7 @@ "liquid_setup_step_description": "View liquid starting locations and volumes", "liquid_setup_step_title": "Initial Liquid Setup", "liquids_not_in_setup": "Liquids not in setup", + "liquids_not_in_the_protocol": "no liquids are specified for this protocol.", "liquids": "Liquids", "list_view": "List View", "loading_data": "Loading data...", @@ -122,6 +123,7 @@ "no_data": "no data", "no_labware_offset_data": "No Labware Offset Data yet", "no_modules_used_in_this_protocol": "No modules used in this protocol", + "no_modules_specified": "no modules are specified for this protocol.", "no_tiprack_loaded": "Protocol must load a tip rack", "no_tiprack_used": "Protocol must pick up a tip", "no_usb_connection_required": "No USB connection required", diff --git a/app/src/atoms/ListItem/ListItem.stories.tsx b/app/src/atoms/ListItem/ListItem.stories.tsx new file mode 100644 index 00000000000..3f7cc3da4b3 --- /dev/null +++ b/app/src/atoms/ListItem/ListItem.stories.tsx @@ -0,0 +1,39 @@ +import * as React from 'react' +import { DIRECTION_COLUMN, Flex, SPACING } from '@opentrons/components' +import { StyledText } from '../text' +import { ListItem } from '.' +import type { Story, Meta } from '@storybook/react' + +export default { + title: 'ODD/Atoms/ListItem', + argTypes: { + type: { + control: { + type: 'select', + options: ['error', 'noActive', 'success', 'warning'], + }, + }, + }, +} as Meta + +const ListItemTemplate: Story> = args => ( + +) + +export const Item = ListItemTemplate.bind({}) +Item.args = { + type: 'noActive', + children: ( + + + Slot Component: Replace me using the component panel. + + + Slot Component: Replace me using the component panel. + + + Slot Component: Replace me using the component panel. + + + ), +} diff --git a/app/src/atoms/ListItem/__tests__/ListItem.test.tsx b/app/src/atoms/ListItem/__tests__/ListItem.test.tsx new file mode 100644 index 00000000000..0f17babdf1b --- /dev/null +++ b/app/src/atoms/ListItem/__tests__/ListItem.test.tsx @@ -0,0 +1,68 @@ +import * as React from 'react' + +import { + BORDERS, + COLORS, + renderWithProviders, + SPACING, +} from '@opentrons/components' + +import { ListItem } from '..' + +const render = (props: React.ComponentProps) => + renderWithProviders() + +describe('ListItem', () => { + let props: React.ComponentProps + + beforeEach(() => { + props = { + type: 'error', + children:
mock listitem content
, + } + }) + + it('should render correct style - error', () => { + const [{ getByText, getByTestId }] = render(props) + getByText('mock listitem content') + const listItem = getByTestId('ListItem_error') + expect(listItem).toHaveStyle(`backgroundColor: ${COLORS.red3}`) + expect(listItem).toHaveStyle( + `padding: ${SPACING.spacing16} ${SPACING.spacing24}` + ) + expect(listItem).toHaveStyle(`borderRadius: ${BORDERS.borderRadiusSize3}`) + }) + it('should render correct style - noActive', () => { + props.type = 'noActive' + const [{ getByText, getByTestId }] = render(props) + getByText('mock listitem content') + const listItem = getByTestId('ListItem_noActive') + expect(listItem).toHaveStyle(`backgroundColor: ${COLORS.light1}`) + expect(listItem).toHaveStyle( + `padding: ${SPACING.spacing16} ${SPACING.spacing24}` + ) + expect(listItem).toHaveStyle(`borderRadius: ${BORDERS.borderRadiusSize3}`) + }) + it('should render correct style - success', () => { + props.type = 'success' + const [{ getByText, getByTestId }] = render(props) + getByText('mock listitem content') + const listItem = getByTestId('ListItem_success') + expect(listItem).toHaveStyle(`backgroundColor: ${COLORS.green3}`) + expect(listItem).toHaveStyle( + `padding: ${SPACING.spacing16} ${SPACING.spacing24}` + ) + expect(listItem).toHaveStyle(`borderRadius: ${BORDERS.borderRadiusSize3}`) + }) + it('should render correct style - warning', () => { + props.type = 'warning' + const [{ getByText, getByTestId }] = render(props) + getByText('mock listitem content') + const listItem = getByTestId('ListItem_warning') + expect(listItem).toHaveStyle(`backgroundColor: ${COLORS.yellow3}`) + expect(listItem).toHaveStyle( + `padding: ${SPACING.spacing16} ${SPACING.spacing24}` + ) + expect(listItem).toHaveStyle(`borderRadius: ${BORDERS.borderRadiusSize3}`) + }) +}) diff --git a/app/src/atoms/ListItem/index.tsx b/app/src/atoms/ListItem/index.tsx new file mode 100644 index 00000000000..1ce33bb9cb2 --- /dev/null +++ b/app/src/atoms/ListItem/index.tsx @@ -0,0 +1,51 @@ +import * as React from 'react' + +import { BORDERS, COLORS, Flex, SPACING } from '@opentrons/components' + +import type { StyleProps } from '@opentrons/components' + +export type ListItemType = 'error' | 'noActive' | 'success' | 'warning' + +interface ListItemProps extends StyleProps { + /** ListItem state type */ + type: ListItemType + /** ListItem contents */ + children: React.ReactNode +} + +const LISTITEM_PROPS_BY_TYPE: Record< + ListItemType, + { backgroundColor: string } +> = { + error: { + backgroundColor: COLORS.red3, + }, + noActive: { + backgroundColor: COLORS.light1, + }, + success: { + backgroundColor: COLORS.green3, + }, + warning: { + backgroundColor: COLORS.yellow3, + }, +} + +export function ListItem(props: ListItemProps): JSX.Element { + const { type, children, ...styleProps } = props + const listItemProps = LISTITEM_PROPS_BY_TYPE[type] + + return ( + + {children} + + ) +} diff --git a/app/src/atoms/Slideout/index.tsx b/app/src/atoms/Slideout/index.tsx index 0486c0cf11e..fc8e137ae66 100644 --- a/app/src/atoms/Slideout/index.tsx +++ b/app/src/atoms/Slideout/index.tsx @@ -196,7 +196,7 @@ export const Slideout = (props: SlideoutProps): JSX.Element => { - {typeof header === 'string' ? {header} : header} - {bodyText} + + {typeof header === 'string' ? {header} : header} + + {bodyText}
{rightHandBody} diff --git a/app/src/molecules/InstrumentCard/index.tsx b/app/src/molecules/InstrumentCard/index.tsx index f26334de3be..c00bb82c19b 100644 --- a/app/src/molecules/InstrumentCard/index.tsx +++ b/app/src/molecules/InstrumentCard/index.tsx @@ -14,7 +14,7 @@ import { SPACING, TYPOGRAPHY, } from '@opentrons/components' -import flexGripper from '../../assets/images/flex_gripper.svg' +import flexGripper from '../../assets/images/flex_gripper.png' import { useMenuHandleClickOutside } from '../../atoms/MenuList/hooks' import { OverflowBtn } from '../../atoms/MenuList/OverflowBtn' @@ -27,7 +27,7 @@ import type { MenuOverlayItemProps } from './MenuOverlay' interface InstrumentCardProps extends StyleProps { description: string label: string - menuOverlayItems: MenuOverlayItemProps[] + menuOverlayItems?: MenuOverlayItemProps[] hasDivider?: boolean instrumentDiagramProps?: InstrumentDiagramProps // special casing the gripper at least for now @@ -75,7 +75,7 @@ export function InstrumentCard(props: InstrumentCardProps): JSX.Element { width="3.75rem" height="3.75rem" > - + flex gripper ) : null} {instrumentDiagramProps?.pipetteSpecs != null ? ( @@ -106,21 +106,26 @@ export function InstrumentCard(props: InstrumentCardProps): JSX.Element { {description} - - - {menuOverlay} - {showOverflowMenu ? ( - + - ) : null} - + {menuOverlay} + {showOverflowMenu ? ( + + ) : null} + + )} ) } diff --git a/app/src/molecules/SimpleWizardBody/index.tsx b/app/src/molecules/SimpleWizardBody/index.tsx index 4a4199b8588..ee0ebe74b62 100644 --- a/app/src/molecules/SimpleWizardBody/index.tsx +++ b/app/src/molecules/SimpleWizardBody/index.tsx @@ -25,7 +25,7 @@ interface Props extends StyleProps { header: string isSuccess: boolean children?: React.ReactNode - subHeader?: string + subHeader?: string | JSX.Element isPending?: boolean } const BACKGROUND_SIZE = '47rem' diff --git a/app/src/molecules/WizardRequiredEquipmentList/equipmentImages.ts b/app/src/molecules/WizardRequiredEquipmentList/equipmentImages.ts index 4e9063c4a35..12628a80222 100644 --- a/app/src/molecules/WizardRequiredEquipmentList/equipmentImages.ts +++ b/app/src/molecules/WizardRequiredEquipmentList/equipmentImages.ts @@ -8,5 +8,5 @@ export const equipmentImages = { flex_pipette: require('../../assets/images/change-pip/single_mount_pipettes.png'), pipette_96: require('../../assets/images/change-pip/ninety-six-channel.png'), mounting_plate_96_channel: require('../../assets/images/change-pip/mounting-plate-96-channel.png'), - flex_gripper: require('../../assets/images/flex_gripper.svg'), + flex_gripper: require('../../assets/images/flex_gripper.png'), } diff --git a/app/src/organisms/ConfigurePipette/ConfigForm.tsx b/app/src/organisms/ConfigurePipette/ConfigForm.tsx index a1b44d14a75..5c640e6957b 100644 --- a/app/src/organisms/ConfigurePipette/ConfigForm.tsx +++ b/app/src/organisms/ConfigurePipette/ConfigForm.tsx @@ -7,7 +7,7 @@ import forOwn from 'lodash/forOwn' import keys from 'lodash/keys' import omit from 'lodash/omit' import set from 'lodash/set' -import { Box } from '@opentrons/components' +import { Box, OVERFLOW_AUTO } from '@opentrons/components' import { ConfigFormResetButton } from './ConfigFormResetButton' import { ConfigFormGroup, @@ -209,7 +209,7 @@ export class ConfigForm extends React.Component { formProps.resetForm({ values: newValues }) } return ( - +
(null) const { data: attachedInstruments } = useInstrumentsQuery() // TODO(bc, 2023-03-20): reintroduce this poll, once it is safe to call cache_instruments during sensor reads on CAN bus @@ -61,16 +81,34 @@ export function InstrumentsAndModules({ (attachedInstruments?.data ?? []).find( (i): i is GripperData => i.instrumentType === 'gripper' && i.ok ) ?? null + const badGripper = + (attachedInstruments?.data ?? []).find( + (i): i is BadGripper => i.subsystem === 'gripper' && !i.ok + ) ?? null const attachedLeftPipette = attachedInstruments?.data?.find( (i): i is PipetteData => i.instrumentType === 'pipette' && i.ok && i.mount === 'left' ) ?? null + const badLeftPipette = + attachedInstruments?.data?.find( + (i): i is BadPipette => + i.instrumentType === 'pipette' && + !i.ok && + i.subsystem === 'pipette_left' + ) ?? null const attachedRightPipette = attachedInstruments?.data?.find( (i): i is PipetteData => i.instrumentType === 'pipette' && i.ok && i.mount === 'right' ) ?? null + const badRightPipette = + attachedInstruments?.data?.find( + (i): i is BadPipette => + i.instrumentType === 'pipette' && + !i.ok && + i.subsystem === 'pipette_right' + ) ?? null const is96ChannelAttached = getIs96ChannelPipetteAttached( attachedPipettes?.left ?? null ) @@ -112,6 +150,15 @@ export function InstrumentsAndModules({ flexDirection={DIRECTION_COLUMN} width="100%" > + {subsystemToUpdate != null && ( + + setSubsystemToUpdate(null)} + description={t('updating_firmware')} + /> + + )} - - {isOT3 ? ( + {badLeftPipette == null ? ( + + ) : ( + + + ), + }} + /> + + } + /> + )} + {isOT3 && badGripper == null && ( - ) : null} + )} + {isOT3 && badGripper != null && ( + + setSubsystemToUpdate('gripper')} + /> + ), + }} + /> + + } + /> + )} {leftColumnModules.map((module, index) => ( - {!Boolean(is96ChannelAttached) ? ( + {!Boolean(is96ChannelAttached) && badRightPipette == null && ( - ) : null} + )} + {badRightPipette != null && ( + + + ), + }} + /> + + } + /> + )} {rightColumnModules.map((module, index) => ( unknown isExpanded: boolean } @@ -24,8 +27,14 @@ interface AboutPipetteSlideoutProps { export const AboutPipetteSlideout = ( props: AboutPipetteSlideoutProps ): JSX.Element | null => { - const { pipetteId, pipetteName, isExpanded, onCloseClick } = props - const { t } = useTranslation(['device_details', 'shared']) + const { pipetteId, pipetteName, isExpanded, mount, onCloseClick } = props + const { i18n, t } = useTranslation(['device_details', 'shared']) + const { data: attachedInstruments } = useInstrumentsQuery() + const instrumentInfo = + attachedInstruments?.data?.find( + (i): i is PipetteData => + i.instrumentType === 'pipette' && i.ok && i.mount === mount + ) ?? null return ( - {t('shared:close')} + {i18n.format(t('shared:close'), 'capitalize')} } > + {instrumentInfo?.firmwareVersion != null && ( + <> + + {t('current_version')} + + + {instrumentInfo.firmwareVersion} + + + )} const render = (props: React.ComponentProps) => { return renderWithProviders(, { @@ -17,9 +25,13 @@ describe('AboutPipetteSlideout', () => { props = { pipetteId: '123', pipetteName: mockLeftSpecs.displayName, + mount: LEFT, isExpanded: true, onCloseClick: jest.fn(), } + mockUseInstrumentsQuery.mockReturnValue({ + data: { data: [] }, + } as any) }) afterEach(() => { jest.resetAllMocks() @@ -35,4 +47,23 @@ describe('AboutPipetteSlideout', () => { fireEvent.click(button) expect(props.onCloseClick).toHaveBeenCalled() }) + it('renders the firmware version if it exists', () => { + mockUseInstrumentsQuery.mockReturnValue({ + data: { + data: [ + { + instrumentType: 'pipette', + mount: LEFT, + ok: true, + firmwareVersion: 12, + } as any, + ], + }, + } as any) + + const { getByText } = render(props) + + getByText('Current Version') + getByText('12') + }) }) diff --git a/app/src/organisms/Devices/PipetteCard/index.tsx b/app/src/organisms/Devices/PipetteCard/index.tsx index 7303957b329..d6294b7ab7f 100644 --- a/app/src/organisms/Devices/PipetteCard/index.tsx +++ b/app/src/organisms/Devices/PipetteCard/index.tsx @@ -166,6 +166,7 @@ export const PipetteCard = (props: PipetteCardProps): JSX.Element => { setShowAboutSlideout(false)} isExpanded={true} /> diff --git a/app/src/organisms/Devices/ProtocolRun/EmptySetupStep.tsx b/app/src/organisms/Devices/ProtocolRun/EmptySetupStep.tsx new file mode 100644 index 00000000000..4fcebc7fb44 --- /dev/null +++ b/app/src/organisms/Devices/ProtocolRun/EmptySetupStep.tsx @@ -0,0 +1,30 @@ +import * as React from 'react' +import { + Flex, + DIRECTION_COLUMN, + COLORS, + SPACING, + TYPOGRAPHY, +} from '@opentrons/components' +import { StyledText } from '../../../atoms/text' + +interface EmptySetupStepProps { + title: React.ReactNode + description: string + label: string +} + +export function EmptySetupStep(props: EmptySetupStepProps): JSX.Element { + const { title, description, label } = props + return ( + + + {label} + + + {title} + + {description} + + ) +} diff --git a/app/src/organisms/Devices/ProtocolRun/ProtocolRunSetup.tsx b/app/src/organisms/Devices/ProtocolRun/ProtocolRunSetup.tsx index d92057c17c5..951bcd88be0 100644 --- a/app/src/organisms/Devices/ProtocolRun/ProtocolRunSetup.tsx +++ b/app/src/organisms/Devices/ProtocolRun/ProtocolRunSetup.tsx @@ -28,6 +28,8 @@ import { SetupRobotCalibration } from './SetupRobotCalibration' import { SetupModules } from './SetupModules' import { SetupStep } from './SetupStep' import { SetupLiquids } from './SetupLiquids' +import { EmptySetupStep } from './EmptySetupStep' + const ROBOT_CALIBRATION_STEP_KEY = 'robot_calibration_step' as const const MODULE_SETUP_KEY = 'module_setup_step' as const const LPC_KEY = 'labware_position_check_step' as const @@ -52,7 +54,7 @@ export function ProtocolRunSetup({ robotName, runId, }: ProtocolRunSetupProps): JSX.Element | null { - const { t } = useTranslation('protocol_setup') + const { t, i18n } = useTranslation('protocol_setup') const robotProtocolAnalysis = useMostRecentCompletedAnalysis(runId) const storedProtocolAnalysis = useStoredProtocolAnalysis(runId) const protocolData = robotProtocolAnalysis ?? storedProtocolAnalysis @@ -73,11 +75,8 @@ export function ProtocolRunSetup({ React.useEffect(() => { let nextStepKeysInOrder = stepsKeysInOrder - const showModuleSetup = protocolData != null && modules.length > 0 - const showLiquidSetup = - protocolData != null && protocolData.liquids?.length > 0 - if (showModuleSetup && showLiquidSetup) { + if (protocolData != null) { nextStepKeysInOrder = [ ROBOT_CALIBRATION_STEP_KEY, MODULE_SETUP_KEY, @@ -85,25 +84,13 @@ export function ProtocolRunSetup({ LABWARE_SETUP_KEY, LIQUID_SETUP_KEY, ] - } else if (showModuleSetup) { - nextStepKeysInOrder = [ - ROBOT_CALIBRATION_STEP_KEY, - MODULE_SETUP_KEY, - LPC_KEY, - LABWARE_SETUP_KEY, - ] - } else if (showLiquidSetup) { - nextStepKeysInOrder = [ - ROBOT_CALIBRATION_STEP_KEY, - LPC_KEY, - LABWARE_SETUP_KEY, - LIQUID_SETUP_KEY, - ] } setStepKeysInOrder(nextStepKeysInOrder) }, [Boolean(protocolData), protocolData?.commands]) if (robot == null) return null + const hasLiquids = protocolData != null && protocolData.liquids?.length > 0 + const hasModules = protocolData != null && modules.length > 0 const StepDetailMap: Record< StepKey, @@ -138,9 +125,11 @@ export function ProtocolRunSetup({ runId={runId} /> ), - description: t(`${MODULE_SETUP_KEY}_description`, { - count: modules.length, - }), + description: !hasModules + ? i18n.format(t('no_modules_specified'), 'capitalize') + : t(`${MODULE_SETUP_KEY}_description`, { + count: modules.length, + }), }, [LPC_KEY]: { stepInternals: ( @@ -176,7 +165,9 @@ export function ProtocolRunSetup({ runId={runId} /> ), - description: t(`${LIQUID_SETUP_KEY}_description`), + description: hasLiquids + ? t(`${LIQUID_SETUP_KEY}_description`) + : i18n.format(t('liquids_not_in_the_protocol'), 'capitalize'), }, } @@ -198,24 +189,33 @@ export function ProtocolRunSetup({ ) : ( stepsKeysInOrder.map((stepKey, index) => ( - - stepKey === expandedStepKey - ? setExpandedStepKey(null) - : setExpandedStepKey(stepKey) - } - calibrationStatusComplete={ - stepKey === ROBOT_CALIBRATION_STEP_KEY && !runHasStarted - ? calibrationStatus.complete - : null - } - > - {StepDetailMap[stepKey].stepInternals} - + {(stepKey === 'liquid_setup_step' && !hasLiquids) || + (stepKey === 'module_setup_step' && !hasModules) ? ( + + ) : ( + + stepKey === expandedStepKey + ? setExpandedStepKey(null) + : setExpandedStepKey(stepKey) + } + calibrationStatusComplete={ + stepKey === ROBOT_CALIBRATION_STEP_KEY && !runHasStarted + ? calibrationStatus.complete + : null + } + > + {StepDetailMap[stepKey].stepInternals} + + )} {index !== stepsKeysInOrder.length - 1 ? ( ) : null} diff --git a/app/src/organisms/Devices/ProtocolRun/__tests__/EmptySetupStep.test.tsx b/app/src/organisms/Devices/ProtocolRun/__tests__/EmptySetupStep.test.tsx new file mode 100644 index 00000000000..496197aaf98 --- /dev/null +++ b/app/src/organisms/Devices/ProtocolRun/__tests__/EmptySetupStep.test.tsx @@ -0,0 +1,28 @@ +import React from 'react' +import { renderWithProviders } from '@opentrons/components' +import { i18n } from '../../../../i18n' +import { EmptySetupStep } from '../EmptySetupStep' + +const render = (props: React.ComponentProps) => { + return renderWithProviders(, { + i18nInstance: i18n, + })[0] +} + +describe('EmptySetupStep', () => { + let props: React.ComponentProps + beforeEach(() => { + props = { + title: 'mockTitle', + description: 'mockDescription', + label: 'mockLabel', + } + }) + + it('should render the title, description, and label', () => { + const { getByText } = render(props) + getByText('mockTitle') + getByText('mockDescription') + getByText('mockLabel') + }) +}) diff --git a/app/src/organisms/Devices/ProtocolRun/__tests__/ProtocolRunSetup.test.tsx b/app/src/organisms/Devices/ProtocolRun/__tests__/ProtocolRunSetup.test.tsx index 4eed9f2f00b..28410d69ebb 100644 --- a/app/src/organisms/Devices/ProtocolRun/__tests__/ProtocolRunSetup.test.tsx +++ b/app/src/organisms/Devices/ProtocolRun/__tests__/ProtocolRunSetup.test.tsx @@ -6,6 +6,10 @@ import { partialComponentPropsMatcher, renderWithProviders, } from '@opentrons/components' +import { + ProtocolAnalysisOutput, + protocolHasLiquids, +} from '@opentrons/shared-data' import noModulesProtocol from '@opentrons/shared-data/protocol/fixtures/4/simpleV4.json' import withModulesProtocol from '@opentrons/shared-data/protocol/fixtures/4/testModulesProtocol.json' @@ -25,11 +29,7 @@ import { SetupRobotCalibration } from '../SetupRobotCalibration' import { SetupLiquids } from '../SetupLiquids' import { ProtocolRunSetup } from '../ProtocolRunSetup' import { SetupModules } from '../SetupModules' - -import { - ProtocolAnalysisOutput, - protocolHasLiquids, -} from '@opentrons/shared-data' +import { EmptySetupStep } from '../EmptySetupStep' jest.mock('@opentrons/api-client') jest.mock('../../hooks') @@ -37,6 +37,7 @@ jest.mock('../SetupLabware') jest.mock('../SetupRobotCalibration') jest.mock('../SetupModules') jest.mock('../SetupLiquids') +jest.mock('../EmptySetupStep') jest.mock('../../../LabwarePositionCheck/useMostRecentCompletedAnalysis') jest.mock('@opentrons/shared-data/js/helpers/parseProtocolData') @@ -75,6 +76,9 @@ const mockSetupLiquids = SetupLiquids as jest.MockedFunction< const mockProtocolHasLiquids = protocolHasLiquids as jest.MockedFunction< typeof protocolHasLiquids > +const mockEmptySetupStep = EmptySetupStep as jest.MockedFunction< + typeof EmptySetupStep +> const ROBOT_NAME = 'otie' const RUN_ID = '1' @@ -137,6 +141,7 @@ describe('ProtocolRunSetup', () => { .mockReturnValue(Mock SetupLabware) when(mockSetupModules).mockReturnValue(
Mock SetupModules
) when(mockSetupLiquids).mockReturnValue(
Mock SetupLiquids
) + when(mockEmptySetupStep).mockReturnValue(
Mock EmptySetupStep
) }) afterEach(() => { resetAllWhenMocks() @@ -207,9 +212,9 @@ describe('ProtocolRunSetup', () => { labwareSetup.click() expect(getByText('Mock SetupLabware')).toBeVisible() }) - it('does NOT render module setup', () => { - const { queryByText } = render() - expect(queryByText(/module setup/i)).toBeNull() + it('renders the empty states for modules and liquids when no modules in protocol', () => { + const { getAllByText } = render() + getAllByText('Mock EmptySetupStep') }) it('defaults to no step expanded', () => { @@ -239,7 +244,7 @@ describe('ProtocolRunSetup', () => { mockProtocolHasLiquids.mockReturnValue(true) const { getByText } = render() - getByText('STEP 3') + getByText('STEP 5') getByText('Initial Liquid Setup') getByText('View liquid starting locations and volumes') getByText('Mock SetupLiquids') diff --git a/app/src/organisms/EstopModal/EstopPressedModal.tsx b/app/src/organisms/EstopModal/EstopPressedModal.tsx index 9c81d510f52..b4de4e2f2bb 100644 --- a/app/src/organisms/EstopModal/EstopPressedModal.tsx +++ b/app/src/organisms/EstopModal/EstopPressedModal.tsx @@ -3,7 +3,6 @@ import { useSelector } from 'react-redux' import { useTranslation } from 'react-i18next' import { ALIGN_CENTER, - BORDERS, COLORS, DIRECTION_COLUMN, DIRECTION_ROW, @@ -17,6 +16,7 @@ import { import { Banner } from '../../atoms/Banner' import { Chip } from '../../atoms/Chip' +import { ListItem } from '../../atoms/ListItem' import { SmallButton } from '../../atoms/buttons' import { StyledText } from '../../atoms/text' import { LegacyModal } from '../../molecules/LegacyModal' @@ -72,10 +72,8 @@ function TouchscreenModal({ {t('estop_pressed_description')} - - + (false) + const instrumentsData = useInstrumentsQuery({ + refetchInterval: INSTRUMENT_POLL_INTERVAL, + }).data?.data + const { data: maintenanceRunData } = useCurrentMaintenanceRun() + const subsystemUpdateInstrument = instrumentsData?.find( + instrument => instrument.ok === false + ) + + React.useEffect(() => { + if (subsystemUpdateInstrument != null && maintenanceRunData == null) { + setShowUpdateNeededModal(true) + } + }, [subsystemUpdateInstrument]) + + return ( + <> + {subsystemUpdateInstrument != null && showUpdateNeededModal ? ( + + ) : null} + + ) +} diff --git a/app/src/organisms/FirmwareUpdateModal/UpdateInProgressModal.tsx b/app/src/organisms/FirmwareUpdateModal/UpdateInProgressModal.tsx new file mode 100644 index 00000000000..9c66a775df1 --- /dev/null +++ b/app/src/organisms/FirmwareUpdateModal/UpdateInProgressModal.tsx @@ -0,0 +1,59 @@ +import * as React from 'react' +import { useTranslation } from 'react-i18next' +import { css } from 'styled-components' +import { + ALIGN_CENTER, + BORDERS, + COLORS, + DIRECTION_COLUMN, + Flex, + SPACING, + TYPOGRAPHY, +} from '@opentrons/components' +import { ProgressBar } from '../../atoms/ProgressBar' +import { StyledText } from '../../atoms/text' +import { Modal } from '../../molecules/Modal' + +interface UpdateInProgressModalProps { + percentComplete: number +} + +const OUTER_STYLES = css` + background: ${COLORS.medGreyEnabled}; + width: 100%; +` + +export function UpdateInProgressModal( + props: UpdateInProgressModalProps +): JSX.Element { + const { percentComplete } = props + const { i18n, t } = useTranslation('firmware_update') + + return ( + + + + {i18n.format(t('updating_firmware'), 'capitalize')} + + + + + ) +} diff --git a/app/src/organisms/FirmwareUpdateModal/UpdateNeededModal.tsx b/app/src/organisms/FirmwareUpdateModal/UpdateNeededModal.tsx new file mode 100644 index 00000000000..d1ff201287c --- /dev/null +++ b/app/src/organisms/FirmwareUpdateModal/UpdateNeededModal.tsx @@ -0,0 +1,99 @@ +import * as React from 'react' +import { useTranslation, Trans } from 'react-i18next' +import capitalize from 'lodash/capitalize' +import { COLORS, DIRECTION_COLUMN, Flex, SPACING } from '@opentrons/components' +import { + useInstrumentsQuery, + useSubsystemUpdateQuery, + useUpdateSubsystemMutation, +} from '@opentrons/react-api-client' +import { LEFT, RIGHT } from '@opentrons/shared-data' +import { Portal } from '../../App/portal' +import { SmallButton } from '../../atoms/buttons' +import { StyledText } from '../../atoms/text' +import { Modal } from '../../molecules/Modal' +import { UpdateInProgressModal } from './UpdateInProgressModal' +import { UpdateResultsModal } from './UpdateResultsModal' +import type { Subsystem } from '@opentrons/api-client' + +import type { ModalHeaderBaseProps } from '../../molecules/Modal/types' + +interface UpdateNeededModalProps { + setShowUpdateModal: React.Dispatch> + subsystem: Subsystem +} + +export function UpdateNeededModal(props: UpdateNeededModalProps): JSX.Element { + const { setShowUpdateModal, subsystem } = props + const { t } = useTranslation('firmware_update') + const [updateId, setUpdateId] = React.useState('') + const { + data: instrumentsData, + refetch: refetchInstruments, + } = useInstrumentsQuery() + const instrument = instrumentsData?.data.find( + instrument => instrument.subsystem === subsystem + ) + + const { updateSubsystem } = useUpdateSubsystemMutation({ + onSuccess: data => { + setUpdateId(data.data.id) + }, + }) + + const { data: updateData } = useSubsystemUpdateQuery(updateId) + const status = updateData?.data.updateStatus + const percentComplete = updateData?.data.updateProgress ?? 0 + const updateError = updateData?.data.updateError + const instrumentType = subsystem === 'gripper' ? 'gripper' : 'pipette' + let mount = '' + if (subsystem === 'pipette_left') mount = LEFT + else if (subsystem === 'pipette_right') mount = RIGHT + + const updateNeededHeader: ModalHeaderBaseProps = { + title: t('update_needed'), + iconName: 'ot-alert', + iconColor: COLORS.yellow2, + } + + let modalContent = ( + + + + , + }} + /> + + updateSubsystem(subsystem)} + buttonText={t('update_firmware')} + width="100%" + /> + + + ) + if (status === 'updating' || status === 'queued') { + modalContent = + } else if (status === 'done' || instrument?.ok) { + modalContent = ( + { + refetchInstruments().catch(error => console.error(error)) + setShowUpdateModal(false) + }} + /> + ) + } + + return {modalContent} +} diff --git a/app/src/organisms/FirmwareUpdateModal/UpdateResultsModal.tsx b/app/src/organisms/FirmwareUpdateModal/UpdateResultsModal.tsx new file mode 100644 index 00000000000..ec3666b46b0 --- /dev/null +++ b/app/src/organisms/FirmwareUpdateModal/UpdateResultsModal.tsx @@ -0,0 +1,111 @@ +import * as React from 'react' +import { useTranslation, Trans } from 'react-i18next' +import capitalize from 'lodash/capitalize' +import { + ALIGN_CENTER, + BORDERS, + COLORS, + DIRECTION_COLUMN, + Flex, + Icon, + SPACING, + TYPOGRAPHY, +} from '@opentrons/components' +import { SmallButton } from '../../atoms/buttons' +import { StyledText } from '../../atoms/text' +import { Modal } from '../../molecules/Modal' + +import type { InstrumentData } from '@opentrons/api-client' +import type { ModalHeaderBaseProps } from '../../molecules/Modal/types' + +interface UpdateResultsModalProps { + isSuccess: boolean + closeModal: () => void + instrument?: InstrumentData +} + +export function UpdateResultsModal( + props: UpdateResultsModalProps +): JSX.Element { + const { isSuccess, closeModal, instrument } = props + const { i18n, t } = useTranslation(['firmware_update', 'shared']) + + const updateFailedHeader: ModalHeaderBaseProps = { + title: t('update_failed'), + iconName: 'ot-alert', + iconColor: COLORS.red2, + } + + return ( + <> + {!isSuccess || instrument?.ok !== true ? ( + + + + {t('download_logs')} + + closeModal()} + buttonText={i18n.format(t('shared:close'), 'capitalize')} + width="100%" + /> + + + ) : ( + + + + + + {t('successful_update')} + + + , + }} + /> + + + closeModal()} + buttonText={i18n.format(t('shared:close'), 'capitalize')} + width="100%" + /> + + + )} + + ) +} diff --git a/app/src/molecules/FirmwareUpdateModal/__tests__/FirmwareUpdateModal.test.tsx b/app/src/organisms/FirmwareUpdateModal/__tests__/FirmwareUpdateModal.test.tsx similarity index 94% rename from app/src/molecules/FirmwareUpdateModal/__tests__/FirmwareUpdateModal.test.tsx rename to app/src/organisms/FirmwareUpdateModal/__tests__/FirmwareUpdateModal.test.tsx index baccdcf12d1..bac61418eb7 100644 --- a/app/src/molecules/FirmwareUpdateModal/__tests__/FirmwareUpdateModal.test.tsx +++ b/app/src/organisms/FirmwareUpdateModal/__tests__/FirmwareUpdateModal.test.tsx @@ -1,5 +1,5 @@ import * as React from 'react' -import { waitFor } from '@testing-library/react' +import { act, waitFor } from '@testing-library/react' import { renderWithProviders } from '@opentrons/components' import { useInstrumentsQuery, @@ -7,7 +7,7 @@ import { useUpdateSubsystemMutation, } from '@opentrons/react-api-client' import { i18n } from '../../../i18n' -import { FirmwareUpdateModal } from '../' +import { FirmwareUpdateModal } from '..' import { BadPipette, PipetteData, @@ -95,9 +95,13 @@ describe('FirmwareUpdateModal', () => { expect(updateSubsystem).toHaveBeenCalled() }) it('calls refetch instruments and then proceed once update is complete', async () => { + jest.useFakeTimers() const { getByText } = render(props) getByText('A firmware update is required, instrument is updating') await waitFor(() => expect(refetch).toHaveBeenCalled()) + act(() => { + jest.advanceTimersByTime(10000) + }) await waitFor(() => expect(props.proceed).toHaveBeenCalled()) }) }) diff --git a/app/src/organisms/FirmwareUpdateModal/__tests__/FirmwareUpdateTakeover.test.tsx b/app/src/organisms/FirmwareUpdateModal/__tests__/FirmwareUpdateTakeover.test.tsx new file mode 100644 index 00000000000..39f52210fcd --- /dev/null +++ b/app/src/organisms/FirmwareUpdateModal/__tests__/FirmwareUpdateTakeover.test.tsx @@ -0,0 +1,73 @@ +import * as React from 'react' +import { renderWithProviders } from '@opentrons/components' +import { + useInstrumentsQuery, + useCurrentMaintenanceRun, +} from '@opentrons/react-api-client' +import { i18n } from '../../../i18n' +import { FirmwareUpdateTakeover } from '../FirmwareUpdateTakeover' +import { UpdateNeededModal } from '../UpdateNeededModal' +import type { BadPipette, PipetteData } from '@opentrons/api-client' + +jest.mock('@opentrons/react-api-client') +jest.mock('../UpdateNeededModal') + +const mockUseInstrumentQuery = useInstrumentsQuery as jest.MockedFunction< + typeof useInstrumentsQuery +> +const mockUseCurrentMaintenanceRun = useCurrentMaintenanceRun as jest.MockedFunction< + typeof useCurrentMaintenanceRun +> +const mockUpdateNeededModal = UpdateNeededModal as jest.MockedFunction< + typeof UpdateNeededModal +> + +const render = () => { + return renderWithProviders(, { + i18nInstance: i18n, + })[0] +} + +describe('FirmwareUpdateTakeover', () => { + beforeEach(() => { + mockUseInstrumentQuery.mockReturnValue({ + data: { + data: [ + { + subsystem: 'pipette_left', + ok: false, + } as BadPipette, + ], + }, + } as any) + mockUpdateNeededModal.mockReturnValue(<>Mock Update Needed Modal) + mockUseCurrentMaintenanceRun.mockReturnValue({ data: undefined } as any) + }) + it('renders update needed modal when an instrument is not ok', () => { + const { getByText } = render() + getByText('Mock Update Needed Modal') + }) + it('does not render modal when no update is needed', () => { + mockUseInstrumentQuery.mockReturnValue({ + data: { + data: [ + { + subsystem: 'pipette_left', + ok: true, + } as PipetteData, + ], + }, + } as any) + const { queryByText } = render() + expect(queryByText('Mock Update In Progress Modal')).not.toBeInTheDocument() + }) + it('does not render modal when a maintenance run is active', () => { + mockUseCurrentMaintenanceRun.mockReturnValue({ + data: { + runId: 'mock run id', + }, + } as any) + const { queryByText } = render() + expect(queryByText('Mock Update In Progress Modal')).not.toBeInTheDocument() + }) +}) diff --git a/app/src/organisms/FirmwareUpdateModal/__tests__/UpdateInProgressModal.test.tsx b/app/src/organisms/FirmwareUpdateModal/__tests__/UpdateInProgressModal.test.tsx new file mode 100644 index 00000000000..3fc096e69bb --- /dev/null +++ b/app/src/organisms/FirmwareUpdateModal/__tests__/UpdateInProgressModal.test.tsx @@ -0,0 +1,30 @@ +import * as React from 'react' +import { renderWithProviders } from '@opentrons/components' +import { i18n } from '../../../i18n' +import { ProgressBar } from '../../../atoms/ProgressBar' +import { UpdateInProgressModal } from '../UpdateInProgressModal' + +jest.mock('../../../atoms/ProgressBar') + +const mockProgressBar = ProgressBar as jest.MockedFunction + +const render = (props: React.ComponentProps) => { + return renderWithProviders(, { + i18nInstance: i18n, + })[0] +} + +describe('UpdateInProgressModal', () => { + let props: React.ComponentProps + beforeEach(() => { + props = { + percentComplete: 12, + } + mockProgressBar.mockReturnValue('12' as any) + }) + it('renders test and progress bar', () => { + const { getByText } = render(props) + getByText('Updating firmware...') + getByText('12') + }) +}) diff --git a/app/src/organisms/FirmwareUpdateModal/__tests__/UpdateNeededModal.test.tsx b/app/src/organisms/FirmwareUpdateModal/__tests__/UpdateNeededModal.test.tsx new file mode 100644 index 00000000000..178d237e31b --- /dev/null +++ b/app/src/organisms/FirmwareUpdateModal/__tests__/UpdateNeededModal.test.tsx @@ -0,0 +1,124 @@ +import * as React from 'react' +import { nestedTextMatcher, renderWithProviders } from '@opentrons/components' +import { + useInstrumentsQuery, + useSubsystemUpdateQuery, + useUpdateSubsystemMutation, +} from '@opentrons/react-api-client' +import { i18n } from '../../../i18n' +import { UpdateNeededModal } from '../UpdateNeededModal' +import { UpdateInProgressModal } from '../UpdateInProgressModal' +import { UpdateResultsModal } from '../UpdateResultsModal' +import type { + BadPipette, + SubsystemUpdateProgressData, +} from '@opentrons/api-client' + +jest.mock('@opentrons/react-api-client') +jest.mock('../UpdateInProgressModal') +jest.mock('../UpdateResultsModal') + +const mockUseInstrumentQuery = useInstrumentsQuery as jest.MockedFunction< + typeof useInstrumentsQuery +> +const mockUseSubsystemUpdateQuery = useSubsystemUpdateQuery as jest.MockedFunction< + typeof useSubsystemUpdateQuery +> +const mockUseUpdateSubsystemMutation = useUpdateSubsystemMutation as jest.MockedFunction< + typeof useUpdateSubsystemMutation +> +const mockUpdateInProgressModal = UpdateInProgressModal as jest.MockedFunction< + typeof UpdateInProgressModal +> +const mockUpdateResultsModal = UpdateResultsModal as jest.MockedFunction< + typeof UpdateResultsModal +> + +const render = (props: React.ComponentProps) => { + return renderWithProviders(, { + i18nInstance: i18n, + })[0] +} + +describe('UpdateNeededModal', () => { + let props: React.ComponentProps + const refetch = jest.fn(() => Promise.resolve()) + const updateSubsystem = jest.fn(() => Promise.resolve()) + beforeEach(() => { + props = { + setShowUpdateModal: jest.fn(), + subsystem: 'pipette_left', + } + mockUseInstrumentQuery.mockReturnValue({ + data: { + data: [ + { + subsystem: 'pipette_left', + ok: false, + } as BadPipette, + ], + }, + refetch, + } as any) + mockUseSubsystemUpdateQuery.mockReturnValue({ + data: { + data: { + id: 'update id', + updateStatus: 'updating', + } as any, + } as SubsystemUpdateProgressData, + } as any) + mockUseUpdateSubsystemMutation.mockReturnValue({ + data: { + data: { + id: 'update id', + updateStatus: 'updating', + updateProgress: 20, + } as any, + } as SubsystemUpdateProgressData, + updateSubsystem, + } as any) + mockUpdateInProgressModal.mockReturnValue( + <>Mock Update In Progress Modal + ) + mockUpdateResultsModal.mockReturnValue(<>Mock Update Results Modal) + }) + it('renders update needed info and calles update firmware when button pressed', () => { + mockUseSubsystemUpdateQuery.mockReturnValue({} as any) + const { getByText } = render(props) + getByText('Instrument firmware update needed') + getByText( + nestedTextMatcher( + 'The firmware for Left Pipette is out of date. You need to update it before running protocols that use this instrument' + ) + ) + getByText('Update firmware').click() + expect(mockUseUpdateSubsystemMutation).toHaveBeenCalled() + }) + it('renders the update in progress modal when update is pending', () => { + const { getByText } = render(props) + getByText('Mock Update In Progress Modal') + }) + it('renders the update results modal when update is done', () => { + mockUseSubsystemUpdateQuery.mockReturnValue({ + data: { + data: { + id: 'update id', + updateStatus: 'done', + } as any, + } as SubsystemUpdateProgressData, + } as any) + mockUseUpdateSubsystemMutation.mockReturnValue({ + data: { + data: { + id: 'update id', + updateStatus: 'done', + updateProgress: 100, + } as any, + } as SubsystemUpdateProgressData, + updateSubsystem, + } as any) + const { getByText } = render(props) + getByText('Mock Update Results Modal') + }) +}) diff --git a/app/src/organisms/FirmwareUpdateModal/__tests__/UpdateResultsModal.test.tsx b/app/src/organisms/FirmwareUpdateModal/__tests__/UpdateResultsModal.test.tsx new file mode 100644 index 00000000000..b3cb2156a7d --- /dev/null +++ b/app/src/organisms/FirmwareUpdateModal/__tests__/UpdateResultsModal.test.tsx @@ -0,0 +1,49 @@ +import * as React from 'react' +import { renderWithProviders, nestedTextMatcher } from '@opentrons/components' +import { i18n } from '../../../i18n' +import { UpdateResultsModal } from '../UpdateResultsModal' + +const render = (props: React.ComponentProps) => { + return renderWithProviders(, { + i18nInstance: i18n, + })[0] +} + +describe('UpdateResultsModal', () => { + let props: React.ComponentProps + beforeEach(() => { + props = { + isSuccess: true, + closeModal: jest.fn(), + instrument: { + ok: true, + subsystem: 'gripper', + instrumentModel: 'gripper', + } as any, + } + }) + it('renders correct text for a successful instrument update', () => { + const { getByText } = render(props) + getByText('Successful update!') + getByText(nestedTextMatcher('Your Gripper is ready to use!')) + }) + it('calls close modal when the close button is pressed', () => { + const { getByText } = render(props) + getByText('Close').click() + expect(props.closeModal).toHaveBeenCalled() + }) + it('renders correct text for a failed instrument update', () => { + props = { + isSuccess: false, + closeModal: jest.fn(), + instrument: { + ok: false, + } as any, + } + const { getByText } = render(props) + getByText('Update failed') + getByText( + 'Download the robot logs from the Opentrons App and send them to support@opentrons.com for assistance.' + ) + }) +}) diff --git a/app/src/molecules/FirmwareUpdateModal/index.tsx b/app/src/organisms/FirmwareUpdateModal/index.tsx similarity index 86% rename from app/src/molecules/FirmwareUpdateModal/index.tsx rename to app/src/organisms/FirmwareUpdateModal/index.tsx index f575e180a49..c7fa737d399 100644 --- a/app/src/molecules/FirmwareUpdateModal/index.tsx +++ b/app/src/organisms/FirmwareUpdateModal/index.tsx @@ -66,7 +66,7 @@ export const FirmwareUpdateModal = ( const { data: attachedInstruments, refetch: refetchInstruments, - } = useInstrumentsQuery() + } = useInstrumentsQuery({ refetchInterval: 5000 }) const { updateSubsystem } = useUpdateSubsystemMutation({ onSuccess: data => { setUpdateId(data.data.id) @@ -88,16 +88,22 @@ export const FirmwareUpdateModal = ( const percentComplete = updateData?.data.updateProgress ?? 0 React.useEffect(() => { - if (status === 'done') { + if (status === 'done' && updateNeeded) { refetchInstruments() .then(() => { - proceed() - }) - .catch(() => { - proceed() + if (!updateNeeded) proceed() + else { + setTimeout(() => { + proceed() + }, 10000) + } }) + .catch(error => console.error(error.message)) + } else if (status === 'done' && !updateNeeded) { + proceed() } - }, [status, proceed, refetchInstruments]) + }, [status, proceed, refetchInstruments, updateNeeded]) + return ( {description} diff --git a/app/src/organisms/GripperCard/AboutGripperSlideout.tsx b/app/src/organisms/GripperCard/AboutGripperSlideout.tsx new file mode 100644 index 00000000000..aa325526003 --- /dev/null +++ b/app/src/organisms/GripperCard/AboutGripperSlideout.tsx @@ -0,0 +1,75 @@ +import * as React from 'react' +import { useTranslation } from 'react-i18next' +import { + Flex, + DIRECTION_COLUMN, + SPACING, + PrimaryButton, + TYPOGRAPHY, + COLORS, +} from '@opentrons/components' +import { StyledText } from '../../atoms/text' +import { Slideout } from '../../atoms/Slideout' + +interface AboutGripperSlideoutProps { + serialNumber: string + firmwareVersion?: string + onCloseClick: () => unknown + isExpanded: boolean +} + +export const AboutGripperSlideout = ( + props: AboutGripperSlideoutProps +): JSX.Element | null => { + const { serialNumber, firmwareVersion, isExpanded, onCloseClick } = props + const { i18n, t } = useTranslation(['device_details', 'shared']) + + return ( + + {i18n.format(t('shared:close'), 'capitalize')} + + } + > + + {firmwareVersion != null && ( + <> + + {t('current_version')} + + + {firmwareVersion} + + + )} + + {i18n.format(t('serial_number'), 'upperCase')} + + + {serialNumber} + + + + ) +} diff --git a/app/src/organisms/GripperCard/__tests__/AboutGripperSlideout.test.tsx b/app/src/organisms/GripperCard/__tests__/AboutGripperSlideout.test.tsx new file mode 100644 index 00000000000..8b457b50116 --- /dev/null +++ b/app/src/organisms/GripperCard/__tests__/AboutGripperSlideout.test.tsx @@ -0,0 +1,40 @@ +import * as React from 'react' +import { renderWithProviders } from '@opentrons/components' +import { fireEvent } from '@testing-library/react' +import { i18n } from '../../../i18n' +import { AboutGripperSlideout } from '../AboutGripperSlideout' + +const render = (props: React.ComponentProps) => { + return renderWithProviders(, { + i18nInstance: i18n, + })[0] +} + +describe('AboutGripperSlideout', () => { + let props: React.ComponentProps + beforeEach(() => { + props = { + serialNumber: '123', + isExpanded: true, + onCloseClick: jest.fn(), + } + }) + + it('renders correct info', () => { + const { getByText, getByRole } = render(props) + + getByText('About Flex Gripper') + getByText('123') + getByText('SERIAL NUMBER') + const button = getByRole('button', { name: /exit/i }) + fireEvent.click(button) + expect(props.onCloseClick).toHaveBeenCalled() + }) + it('renders the firmware version if it exists', () => { + props = { ...props, firmwareVersion: '12' } + const { getByText } = render(props) + + getByText('Current Version') + getByText('12') + }) +}) diff --git a/app/src/organisms/GripperCard/__tests__/GripperCard.test.tsx b/app/src/organisms/GripperCard/__tests__/GripperCard.test.tsx new file mode 100644 index 00000000000..1774bc0b68b --- /dev/null +++ b/app/src/organisms/GripperCard/__tests__/GripperCard.test.tsx @@ -0,0 +1,131 @@ +import * as React from 'react' +import { resetAllWhenMocks } from 'jest-when' +import { renderWithProviders } from '@opentrons/components' +import { fireEvent } from '@testing-library/react' +import { i18n } from '../../../i18n' +import { Banner } from '../../../atoms/Banner' +import { GripperWizardFlows } from '../../GripperWizardFlows' +import { AboutGripperSlideout } from '../AboutGripperSlideout' +import { GripperCard } from '../' +import type { GripperData } from '@opentrons/api-client' + +jest.mock('../../../atoms/Banner') +jest.mock('../../GripperWizardFlows') +jest.mock('../AboutGripperSlideout') + +const mockBanner = Banner as jest.MockedFunction +const mockGripperWizardFlows = GripperWizardFlows as jest.MockedFunction< + typeof GripperWizardFlows +> +const mockAboutGripperSlideout = AboutGripperSlideout as jest.MockedFunction< + typeof AboutGripperSlideout +> + +const render = (props: React.ComponentProps) => { + return renderWithProviders(, { + i18nInstance: i18n, + })[0] +} + +describe('GripperCard', () => { + let props: React.ComponentProps + beforeEach(() => { + props = { + attachedGripper: { + instrumentModel: 'gripperV1.1', + serialNumber: '123', + firmwareVersion: '12', + data: { + calibratedOffset: { + last_modified: '12/2/4', + }, + }, + } as GripperData, + isCalibrated: true, + } + mockBanner.mockReturnValue(<>calibration needed) + mockGripperWizardFlows.mockReturnValue(<>wizard flow launched) + mockAboutGripperSlideout.mockReturnValue(<>about gripper) + }) + afterEach(() => { + jest.resetAllMocks() + resetAllWhenMocks() + }) + + it('renders correct info when gripper is attached', () => { + const { getByText, getByRole } = render(props) + const image = getByRole('img', { name: 'flex gripper' }) + expect(image.getAttribute('src')).toEqual('flex_gripper.png') + getByText('extension mount') + getByText('Flex Gripper') + const overflowButton = getByRole('button', { + name: /overflow/i, + }) + fireEvent.click(overflowButton) + getByText('Recalibrate gripper') + getByText('Detach gripper') + getByText('About gripper') + }) + it('renders recalibrate banner when no calibration data is present', () => { + props = props = { + attachedGripper: { + instrumentModel: 'gripperV1.1', + serialNumber: '123', + firmwareVersion: '12', + data: { + calibratedOffset: { + last_modified: undefined, + }, + }, + } as GripperData, + isCalibrated: false, + } + + const { getByText } = render(props) + getByText('calibration needed') + }) + it('opens the about gripper slideout when button is pressed', () => { + const { getByText, getByRole } = render(props) + const overflowButton = getByRole('button', { + name: /overflow/i, + }) + overflowButton.click() + const aboutGripperButton = getByText('About gripper') + aboutGripperButton.click() + getByText('about gripper') + }) + it('renders wizard flow when recalibrate button is pressed', () => { + const { getByText, getByRole } = render(props) + const overflowButton = getByRole('button', { + name: /overflow/i, + }) + overflowButton.click() + const recalibrateGripperButton = getByText('Recalibrate gripper') + recalibrateGripperButton.click() + getByText('wizard flow launched') + }) + it('renders wizard flow when detach button is pressed', () => { + const { getByText, getByRole } = render(props) + const overflowButton = getByRole('button', { + name: /InstrumentCard_overflowMenu/i, + }) + overflowButton.click() + const detachGripperButton = getByText('Detach gripper') + detachGripperButton.click() + getByText('wizard flow launched') + }) + it('renders wizard flow when attach button is pressed', () => { + props = { + attachedGripper: null, + isCalibrated: false, + } + const { getByText, getByRole } = render(props) + const overflowButton = getByRole('button', { + name: /overflow/i, + }) + overflowButton.click() + const attachGripperButton = getByText('Attach gripper') + attachGripperButton.click() + getByText('wizard flow launched') + }) +}) diff --git a/app/src/organisms/GripperCard/index.tsx b/app/src/organisms/GripperCard/index.tsx index 2fe8469faa9..d0b1ca936cb 100644 --- a/app/src/organisms/GripperCard/index.tsx +++ b/app/src/organisms/GripperCard/index.tsx @@ -8,6 +8,7 @@ import { Banner } from '../../atoms/Banner' import { StyledText } from '../../atoms/text' import { InstrumentCard } from '../../molecules/InstrumentCard' import { GripperWizardFlows } from '../GripperWizardFlows' +import { AboutGripperSlideout } from './AboutGripperSlideout' import { GRIPPER_FLOW_TYPES } from '../GripperWizardFlows/constants' import type { GripperWizardFlowType } from '../GripperWizardFlows/types' @@ -25,6 +26,10 @@ export function GripperCard({ openWizardFlowType, setOpenWizardFlowType, ] = React.useState(null) + const [ + showAboutGripperSlideout, + setShowAboutGripperSlideout, + ] = React.useState(false) const handleAttach: React.MouseEventHandler = () => { setOpenWizardFlowType(GRIPPER_FLOW_TYPES.ATTACH) @@ -42,22 +47,30 @@ export function GripperCard({ attachedGripper == null ? [ { - label: 'Attach gripper', + label: t('attach_gripper'), disabled: attachedGripper != null, onClick: handleAttach, }, ] : [ { - label: 'Recalibrate gripper', + label: + attachedGripper.data.calibratedOffset?.last_modified != null + ? t('recalibrate_gripper') + : t('calibrate_gripper'), disabled: attachedGripper == null, onClick: handleCalibrate, }, { - label: 'Detach gripper', + label: t('detach_gripper'), disabled: attachedGripper == null, onClick: handleDetach, }, + { + label: t('about_gripper'), + disabled: attachedGripper == null, + onClick: () => setShowAboutGripperSlideout(true), + }, ] return ( <> @@ -103,6 +116,14 @@ export function GripperCard({ closeFlow={() => setOpenWizardFlowType(null)} /> ) : null} + {attachedGripper != null && showAboutGripperSlideout && ( + setShowAboutGripperSlideout(false)} + /> + )} ) } diff --git a/app/src/organisms/GripperWizardFlows/BeforeBeginning.tsx b/app/src/organisms/GripperWizardFlows/BeforeBeginning.tsx index 467227b382a..c871229d4bd 100644 --- a/app/src/organisms/GripperWizardFlows/BeforeBeginning.tsx +++ b/app/src/organisms/GripperWizardFlows/BeforeBeginning.tsx @@ -68,7 +68,7 @@ export const BeforeBeginning = ( isRobotMoving, chainRunCommands, errorMessage, - setShowErrorMessage, + setErrorMessage, } = props const { t } = useTranslation(['gripper_wizard_flows', 'shared']) React.useEffect(() => { @@ -92,7 +92,7 @@ export const BeforeBeginning = ( proceed() }) .catch(error => { - setShowErrorMessage(error.message) + setErrorMessage(error.message) }) } diff --git a/app/src/organisms/GripperWizardFlows/MovePin.tsx b/app/src/organisms/GripperWizardFlows/MovePin.tsx index a54abddfac1..f593975016a 100644 --- a/app/src/organisms/GripperWizardFlows/MovePin.tsx +++ b/app/src/organisms/GripperWizardFlows/MovePin.tsx @@ -1,7 +1,7 @@ import * as React from 'react' -import { useTranslation } from 'react-i18next' +import { useTranslation, Trans } from 'react-i18next' import { LEFT } from '@opentrons/shared-data' -import { COLORS } from '@opentrons/components' +import { COLORS, TYPOGRAPHY } from '@opentrons/components' import { css } from 'styled-components' import { StyledText } from '../../atoms/text' import { SimpleWizardBody } from '../../molecules/SimpleWizardBody' @@ -38,7 +38,7 @@ export const MovePin = (props: MovePinProps): JSX.Element | null => { frontJawOffset, createRunCommand, errorMessage, - setShowErrorMessage, + setErrorMessage, } = props const { t } = useTranslation(['gripper_wizard_flows', 'shared']) @@ -56,7 +56,10 @@ export const MovePin = (props: MovePinProps): JSX.Element | null => { }, waitUntilComplete: true, }) - .then(() => { + .then(({ data }) => { + if (data.status === 'failed') { + setErrorMessage(data.error?.detail ?? null) + } createRunCommand({ command: { // @ts-expect-error(BC, 2022-03-10): this will pass type checks when we update command types from V6 to V7 in shared-data @@ -69,6 +72,9 @@ export const MovePin = (props: MovePinProps): JSX.Element | null => { waitUntilComplete: true, }) .then(({ data }) => { + if (data.status === 'failed') { + setErrorMessage(data.error?.detail ?? null) + } if (jaw === 'front' && data?.result?.jawOffset != null) { setFrontJawOffset(data.result.jawOffset) } @@ -82,14 +88,17 @@ export const MovePin = (props: MovePinProps): JSX.Element | null => { }, waitUntilComplete: true, }) - .then(() => { + .then(({ data }) => { + if (data.status === 'failed') { + setErrorMessage(data.error?.detail ?? null) + } proceed() }) - .catch(error => setShowErrorMessage(error.message)) + .catch(error => setErrorMessage(error.message)) }) - .catch(error => setShowErrorMessage(error.message)) + .catch(error => setErrorMessage(error.message)) }) - .catch(error => setShowErrorMessage(error.message)) + .catch(error => setErrorMessage(error.message)) } } const infoByMovement: { @@ -203,8 +212,12 @@ export const MovePin = (props: MovePinProps): JSX.Element | null => { if (isRobotMoving) return ( ) return errorMessage != null ? ( @@ -212,7 +225,19 @@ export const MovePin = (props: MovePinProps): JSX.Element | null => { isSuccess={false} iconColor={COLORS.errorEnabled} header={t('shared:error_encountered')} - subHeader={errorMessage} + subHeader={ + , + bold: ( + + ), + }} + /> + } /> ) : ( { createMaintenanceRun: jest.fn(), isCreateLoading: false, isRobotMoving: false, - setShowErrorMessage: jest.fn(), + setErrorMessage: jest.fn(), errorMessage: null, } // mockNeedHelpLink.mockReturnValue(
mock need help link
) diff --git a/app/src/organisms/GripperWizardFlows/__tests__/MountGripper.test.tsx b/app/src/organisms/GripperWizardFlows/__tests__/MountGripper.test.tsx index acbb27cafc2..4394fa088ee 100644 --- a/app/src/organisms/GripperWizardFlows/__tests__/MountGripper.test.tsx +++ b/app/src/organisms/GripperWizardFlows/__tests__/MountGripper.test.tsx @@ -23,7 +23,7 @@ describe('MountGripper', () => { let mockGoBack: jest.Mock let mockProceed: jest.Mock let mockChainRunCommands: jest.Mock - let mockSetShowErrorMessage: jest.Mock + let mockSetErrorMessage: jest.Mock beforeEach(() => { mockGoBack = jest.fn() @@ -41,7 +41,7 @@ describe('MountGripper', () => { isRobotMoving={false} goBack={mockGoBack} errorMessage={null} - setShowErrorMessage={mockSetShowErrorMessage} + setErrorMessage={mockSetErrorMessage} {...props} />, { i18nInstance: i18n } @@ -101,7 +101,7 @@ describe('MountGripper', () => { const { getByText } = render()[0] getByText('Connect and Screw In Gripper') getByText( - 'Attach the gripper to the robot by alinging the connector and ensuring a secure connection. Hold the gripper in place and use the hex screwdriver to tighten the gripper screws. Then test that the gripper is securely attached by gently pulling it side to side.' + 'Attach the gripper to the robot by aligning the connector and ensuring a secure connection. Hold the gripper in place and use the hex screwdriver to tighten the gripper screws. Then test that the gripper is securely attached by gently pulling it side to side.' ) }) }) diff --git a/app/src/organisms/GripperWizardFlows/__tests__/MovePin.test.tsx b/app/src/organisms/GripperWizardFlows/__tests__/MovePin.test.tsx index a58692a7735..dbcab3d6456 100644 --- a/app/src/organisms/GripperWizardFlows/__tests__/MovePin.test.tsx +++ b/app/src/organisms/GripperWizardFlows/__tests__/MovePin.test.tsx @@ -18,7 +18,7 @@ describe('MovePin', () => { props?: Partial> ) => ReturnType let mockCreateRunCommand: jest.Mock - let mockSetShowErrorMessage: jest.Mock + let mockSetErrorMessage: jest.Mock const mockGoBack = jest.fn() const mockProceed = jest.fn() @@ -46,7 +46,7 @@ describe('MovePin', () => { frontJawOffset={{ x: 0, y: 0, z: 0 }} createRunCommand={mockCreateRunCommand} errorMessage={null} - setShowErrorMessage={mockSetShowErrorMessage} + setErrorMessage={mockSetErrorMessage} {...props} />, { i18nInstance: i18n } diff --git a/app/src/organisms/GripperWizardFlows/__tests__/UnmountGripper.test.tsx b/app/src/organisms/GripperWizardFlows/__tests__/UnmountGripper.test.tsx index e597d71f53d..3897451d8e7 100644 --- a/app/src/organisms/GripperWizardFlows/__tests__/UnmountGripper.test.tsx +++ b/app/src/organisms/GripperWizardFlows/__tests__/UnmountGripper.test.tsx @@ -23,7 +23,7 @@ describe('UnmountGripper', () => { let mockGoBack: jest.Mock let mockProceed: jest.Mock let mockChainRunCommands: jest.Mock - let mockSetShowErrorMessage: jest.Mock + let mockSetErrorMessage: jest.Mock beforeEach(() => { mockGoBack = jest.fn() @@ -41,7 +41,7 @@ describe('UnmountGripper', () => { isRobotMoving={false} goBack={mockGoBack} errorMessage={null} - setShowErrorMessage={mockSetShowErrorMessage} + setErrorMessage={mockSetErrorMessage} {...props} />, { i18nInstance: i18n } diff --git a/app/src/organisms/GripperWizardFlows/index.tsx b/app/src/organisms/GripperWizardFlows/index.tsx index b8f406557c5..1d967e8d6fc 100644 --- a/app/src/organisms/GripperWizardFlows/index.tsx +++ b/app/src/organisms/GripperWizardFlows/index.tsx @@ -17,7 +17,7 @@ import { import { LegacyModalShell } from '../../molecules/LegacyModal' import { Portal } from '../../App/portal' import { WizardHeader } from '../../molecules/WizardHeader' -import { FirmwareUpdateModal } from '../../molecules/FirmwareUpdateModal' +import { FirmwareUpdateModal } from '../FirmwareUpdateModal' import { getIsOnDevice } from '../../redux/config' import { useChainMaintenanceCommands } from '../../resources/runs/hooks' import { getGripperWizardSteps } from './getGripperWizardSteps' @@ -67,9 +67,7 @@ export function GripperWizardFlows( }, }) const [isExiting, setIsExiting] = React.useState(false) - const [errorMessage, setShowErrorMessage] = React.useState( - null - ) + const [errorMessage, setErrorMessage] = React.useState(null) const handleCleanUpAndClose = (): void => { setIsExiting(true) @@ -101,7 +99,7 @@ export function GripperWizardFlows( chainRunCommands={chainRunCommands} createRunCommand={createMaintenanceCommand} errorMessage={errorMessage} - setShowErrorMessage={setShowErrorMessage} + setErrorMessage={setErrorMessage} /> ) } @@ -118,7 +116,7 @@ interface GripperWizardProps { > isCreateLoading: boolean isRobotMoving: boolean - setShowErrorMessage: (message: string | null) => void + setErrorMessage: (message: string | null) => void errorMessage: string | null handleCleanUpAndClose: () => void chainRunCommands: ReturnType< @@ -142,7 +140,7 @@ export const GripperWizard = ( isCreateLoading, isRobotMoving, createRunCommand, - setShowErrorMessage, + setErrorMessage, errorMessage, } = props const isOnDevice = useSelector(getIsOnDevice) @@ -184,7 +182,7 @@ export const GripperWizard = ( proceed: handleProceed, goBack, chainRunCommands, - setShowErrorMessage, + setErrorMessage, errorMessage, } let onExit @@ -255,7 +253,7 @@ export const GripperWizard = ( let handleExit = onExit if (isRobotMoving) { handleExit = undefined - } else if (showConfirmExit) { + } else if (showConfirmExit || errorMessage != null) { handleExit = handleCleanUpAndClose } diff --git a/app/src/organisms/GripperWizardFlows/types.ts b/app/src/organisms/GripperWizardFlows/types.ts index 532c716aa59..c929a68189c 100644 --- a/app/src/organisms/GripperWizardFlows/types.ts +++ b/app/src/organisms/GripperWizardFlows/types.ts @@ -78,5 +78,5 @@ export interface GripperWizardStepProps { maintenanceRunId: string attachedGripper: {} | null errorMessage: string | null - setShowErrorMessage: (message: string | null) => void + setErrorMessage: (message: string | null) => void } diff --git a/app/src/organisms/InstrumentInfo/__tests__/InstrumentInfo.test.tsx b/app/src/organisms/InstrumentInfo/__tests__/InstrumentInfo.test.tsx index 7fc42beeb3f..a0b5f62fe33 100644 --- a/app/src/organisms/InstrumentInfo/__tests__/InstrumentInfo.test.tsx +++ b/app/src/organisms/InstrumentInfo/__tests__/InstrumentInfo.test.tsx @@ -41,6 +41,7 @@ const mockGripperData: GripperData = { source: 'mockSource', }, }, + firmwareVersion: '12', instrumentModel: 'gripperModel_v1', instrumentType: 'gripper', mount: 'extension', @@ -58,6 +59,7 @@ const mockGripperDataWithCalData: GripperData = { last_modified: 'mockLastModified', }, }, + firmwareVersion: '12', instrumentModel: 'gripperModel_v1', instrumentType: 'gripper', mount: 'extension', @@ -80,6 +82,7 @@ describe('InstrumentInfo', () => { getByText('last calibrated') getByText('No calibration data') getByText('firmware version') + getByText('12') getByText('serial number') getByText('123') getByRole('button', { name: 'MediumButton_secondary' }).click() @@ -96,6 +99,7 @@ describe('InstrumentInfo', () => { getByText('last calibrated') getByText('mockLastModified') getByText('firmware version') + getByText('12') getByText('serial number') getByText('123') getByRole('button', { name: 'MediumButton_secondary' }).click() @@ -104,14 +108,13 @@ describe('InstrumentInfo', () => { getByText('mock GripperWizardFlows') }) - it('returns the correct information for a pipette with cal data', () => { + it('returns the correct information for a pipette with cal data and no firmware version', () => { props = { instrument: mockPipetteData1Channel, } const { getByText, getByRole } = render(props) getByText('last calibrated') getByText('08/25/2020 20:25:00') - getByText('firmware version') getByText('serial number') getByText('abc') getByRole('button', { name: 'MediumButton_secondary' }).click() diff --git a/app/src/organisms/InstrumentInfo/index.tsx b/app/src/organisms/InstrumentInfo/index.tsx index 74df7028312..c12b0a94788 100644 --- a/app/src/organisms/InstrumentInfo/index.tsx +++ b/app/src/organisms/InstrumentInfo/index.tsx @@ -118,46 +118,56 @@ export const InstrumentInfo = (props: InstrumentInfoProps): JSX.Element => { height="100%" > {instrument != null && instrument.ok ? ( - - - - - + <> + + + {instrument.firmwareVersion != null && ( + + )} + + + + + + + ) : null} - - - - {wizardProps != null && 'mount' in wizardProps ? ( ) : null} diff --git a/app/src/organisms/LabwareDetails/Dimensions.tsx b/app/src/organisms/LabwareDetails/Dimensions.tsx index 6d64ec5c44a..c0ef65a3553 100644 --- a/app/src/organisms/LabwareDetails/Dimensions.tsx +++ b/app/src/organisms/LabwareDetails/Dimensions.tsx @@ -1,10 +1,9 @@ import * as React from 'react' import { useTranslation } from 'react-i18next' import round from 'lodash/round' -import { Box, SPACING } from '@opentrons/components' +import { Box, SPACING, getFootprintDiagram } from '@opentrons/components' import { LabeledValue } from './StyledComponents/LabeledValue' import { ExpandingTitle } from './StyledComponents/ExpandingTitle' -import { getFootprintDiagram } from './measurementGuide' import type { LabwareDefinition } from '../../pages/Labware/types' const toFixed = (n: number): string => round(n, 2).toFixed(2) diff --git a/app/src/organisms/LabwareDetails/InsertDetails.tsx b/app/src/organisms/LabwareDetails/InsertDetails.tsx index 622159816a7..42687c07971 100644 --- a/app/src/organisms/LabwareDetails/InsertDetails.tsx +++ b/app/src/organisms/LabwareDetails/InsertDetails.tsx @@ -1,7 +1,7 @@ import * as React from 'react' import { Box, SPACING, BORDERS, TYPOGRAPHY } from '@opentrons/components' +import { getUniqueWellProperties } from '@opentrons/shared-data' import { StyledText } from '../../atoms/text' -import { getUniqueWellProperties } from './helpers/labwareInference' import { getWellLabel } from './helpers/labels' import { WellProperties } from './WellProperties' import { WellDimensions } from './WellDimensions' diff --git a/app/src/organisms/LabwareDetails/StyledComponents/__tests__/ExpandingTitle.test.tsx b/app/src/organisms/LabwareDetails/StyledComponents/__tests__/ExpandingTitle.test.tsx index e05b81d69ff..807592f4c54 100644 --- a/app/src/organisms/LabwareDetails/StyledComponents/__tests__/ExpandingTitle.test.tsx +++ b/app/src/organisms/LabwareDetails/StyledComponents/__tests__/ExpandingTitle.test.tsx @@ -1,7 +1,6 @@ import * as React from 'react' import { fireEvent } from '@testing-library/react' -import { renderWithProviders } from '@opentrons/components' -import { getFootprintDiagram } from '../../measurementGuide' +import { renderWithProviders, getFootprintDiagram } from '@opentrons/components' import { ExpandingTitle } from '../ExpandingTitle' const render = (props: React.ComponentProps) => { diff --git a/app/src/organisms/LabwareDetails/WellDimensions.tsx b/app/src/organisms/LabwareDetails/WellDimensions.tsx index 82528156d39..c056cb409f7 100644 --- a/app/src/organisms/LabwareDetails/WellDimensions.tsx +++ b/app/src/organisms/LabwareDetails/WellDimensions.tsx @@ -1,10 +1,9 @@ import * as React from 'react' import { useTranslation } from 'react-i18next' import round from 'lodash/round' -import { Box, SPACING } from '@opentrons/components' +import { Box, SPACING, getMeasurementDiagram } from '@opentrons/components' import { LabeledValue } from './StyledComponents/LabeledValue' import { ExpandingTitle } from './StyledComponents/ExpandingTitle' -import { getMeasurementDiagram } from './measurementGuide' import type { LabwareWellGroupProperties, diff --git a/app/src/organisms/LabwareDetails/WellSpacing.tsx b/app/src/organisms/LabwareDetails/WellSpacing.tsx index dc8b049d985..2eb9bb6b028 100644 --- a/app/src/organisms/LabwareDetails/WellSpacing.tsx +++ b/app/src/organisms/LabwareDetails/WellSpacing.tsx @@ -1,9 +1,9 @@ import * as React from 'react' import { useTranslation } from 'react-i18next' import round from 'lodash/round' +import { getSpacingDiagram } from '@opentrons/components' import { LabeledValue } from './StyledComponents/LabeledValue' import { ExpandingTitle } from './StyledComponents/ExpandingTitle' -import { getSpacingDiagram } from './measurementGuide' import type { LabwareWellGroupProperties } from '../../pages/Labware/types' diff --git a/app/src/organisms/LabwareDetails/helpers/labwareInference.ts b/app/src/organisms/LabwareDetails/helpers/labwareInference.ts deleted file mode 100644 index 2dcce12cc9a..00000000000 --- a/app/src/organisms/LabwareDetails/helpers/labwareInference.ts +++ /dev/null @@ -1,79 +0,0 @@ -import isEqual from 'lodash/isEqual' -import uniqWith from 'lodash/uniqWith' -import round from 'lodash/round' -import sortedUniq from 'lodash/sortedUniq' -import uniq from 'lodash/uniq' -import type { - LabwareWell, - LabwareWellShapeProperties, - LabwareWellGroupProperties, - LabwareDefinition, -} from '../../../pages/Labware/types' - -const ROUNDING_PRECISION = 2 - -export function getUniqueWellProperties( - definition: LabwareDefinition -): LabwareWellGroupProperties[] { - const { groups, wells, dimensions } = definition - - return groups.map(group => { - const wellProps = group.wells.map(n => wells[n]) - - const wellDepths = wellProps.map(w => w.depth) - const wellVolumes = wellProps.map(w => w.totalLiquidVolume) - const wellShapes = wellProps.map( - (well: LabwareWell) => - well.shape === 'circular' - ? { shape: well.shape, diameter: well.diameter } - : { - shape: well.shape, - xDimension: well.xDimension, - yDimension: well.yDimension, - } - ) - - const xStart = wellProps[0].x - const yStart = wellProps[0].y - - return { - metadata: group.metadata, - brand: group.brand || null, - xSpacing: getSpacingIfUniform(wellProps, 'x'), - ySpacing: getSpacingIfUniform(wellProps, 'y'), - xOffsetFromLeft: xStart, - yOffsetFromTop: round(dimensions.yDimension - yStart, ROUNDING_PRECISION), - wellCount: wellProps.length, - depth: getIfConsistent(wellDepths), - totalLiquidVolume: getIfConsistent(wellVolumes), - shape: getIfConsistent(wellShapes), - } - }) -} - -export function getIfConsistent(items: T[]): T | null { - return uniqWith(items, isEqual).length === 1 ? items[0] : null -} - -// returning null means "spacing is irregular"; returning 0 means "there is only 1 well along the given axis" -export function getSpacingIfUniform( - wells: LabwareWell[], - axis: 'x' | 'y' -): number | null { - const wellPositions = sortedUniq(uniq(wells.map(well => well[axis]))) - if (wellPositions.length < 2) return 0 - - const initialSpacing = round( - wellPositions[1] - wellPositions[0], - ROUNDING_PRECISION - ) - - for (let i = 2; i < wellPositions.length; i++) { - const pos = wellPositions[i] - const prevWellPos = wellPositions[i - 1] - const spacing = round(pos - prevWellPos, ROUNDING_PRECISION) - if (spacing !== initialSpacing) return null - } - - return Math.abs(initialSpacing) -} diff --git a/app/src/organisms/LabwareDetails/index.tsx b/app/src/organisms/LabwareDetails/index.tsx index 24021f242a5..014832ac9b0 100644 --- a/app/src/organisms/LabwareDetails/index.tsx +++ b/app/src/organisms/LabwareDetails/index.tsx @@ -20,11 +20,11 @@ import { useHoverTooltip, TOOLTIP_TOP_START, } from '@opentrons/components' +import { getUniqueWellProperties } from '@opentrons/shared-data' import { StyledText } from '../../atoms/text' import { Slideout } from '../../atoms/Slideout' import { Tooltip } from '../../atoms/Tooltip' import { getWellLabel } from './helpers/labels' -import { getUniqueWellProperties } from './helpers/labwareInference' import { WellCount } from './WellCount' import { WellProperties } from './WellProperties' import { Dimensions } from './Dimensions' diff --git a/app/src/organisms/LabwarePositionCheck/CheckItem.tsx b/app/src/organisms/LabwarePositionCheck/CheckItem.tsx index b7b98dd8542..438bb8b5dba 100644 --- a/app/src/organisms/LabwarePositionCheck/CheckItem.tsx +++ b/app/src/organisms/LabwarePositionCheck/CheckItem.tsx @@ -8,7 +8,6 @@ import { PrepareSpace } from './PrepareSpace' import { JogToWell } from './JogToWell' import { CreateCommand, - FIXED_TRASH_ID, getIsTiprack, getLabwareDefURI, getLabwareDisplayName, @@ -217,19 +216,12 @@ export const CheckItem = (props: CheckItemProps): JSX.Element | null => { }, }, { - commandType: 'moveToWell' as const, - params: { - pipetteId: pipetteId, - labwareId: FIXED_TRASH_ID, - wellName: 'A1', - wellLocation: { origin: 'top' as const }, - }, + commandType: 'retractAxis' as const, + params: { axis: 'x' }, }, { commandType: 'retractAxis' as const, - params: { - axis: pipetteZMotorAxis, - }, + params: { axis: 'y' }, }, { commandType: 'moveLabware' as const, diff --git a/app/src/organisms/LabwarePositionCheck/PickUpTip.tsx b/app/src/organisms/LabwarePositionCheck/PickUpTip.tsx index cb78104417f..3b357404cfa 100644 --- a/app/src/organisms/LabwarePositionCheck/PickUpTip.tsx +++ b/app/src/organisms/LabwarePositionCheck/PickUpTip.tsx @@ -9,7 +9,6 @@ import { JogToWell } from './JogToWell' import { CompletedProtocolAnalysis, CreateCommand, - FIXED_TRASH_ID, getLabwareDefURI, getLabwareDisplayName, getModuleType, @@ -215,19 +214,12 @@ export const PickUpTip = (props: PickUpTipProps): JSX.Element | null => { }, }, { - commandType: 'moveToWell' as const, - params: { - pipetteId: pipetteId, - labwareId: FIXED_TRASH_ID, - wellName: 'A1', - wellLocation: { origin: 'top' as const }, - }, + commandType: 'retractAxis' as const, + params: { axis: 'x' }, }, { commandType: 'retractAxis' as const, - params: { - axis: pipetteZMotorAxis, - }, + params: { axis: 'y' }, }, { commandType: 'moveLabware' as const, diff --git a/app/src/organisms/LabwarePositionCheck/__tests__/CheckItem.test.tsx b/app/src/organisms/LabwarePositionCheck/__tests__/CheckItem.test.tsx index 4d339d4c754..46df9aae309 100644 --- a/app/src/organisms/LabwarePositionCheck/__tests__/CheckItem.test.tsx +++ b/app/src/organisms/LabwarePositionCheck/__tests__/CheckItem.test.tsx @@ -218,18 +218,15 @@ describe('CheckItem', () => { }, }, { - commandType: 'moveToWell', + commandType: 'retractAxis' as const, params: { - pipetteId: 'pipetteId1', - labwareId: 'fixedTrash', - wellName: 'A1', - wellLocation: { origin: 'top', offset: undefined }, + axis: 'x', }, }, { commandType: 'retractAxis' as const, params: { - axis: 'leftZ', + axis: 'y', }, }, { @@ -283,19 +280,12 @@ describe('CheckItem', () => { }, }, { - commandType: 'moveToWell', - params: { - pipetteId: 'pipetteId1', - labwareId: 'fixedTrash', - wellName: 'A1', - wellLocation: { origin: 'top', offset: undefined }, - }, + commandType: 'retractAxis' as const, + params: { axis: 'x' }, }, { commandType: 'retractAxis' as const, - params: { - axis: 'leftZ', - }, + params: { axis: 'y' }, }, { commandType: 'moveLabware', diff --git a/app/src/organisms/LabwarePositionCheck/__tests__/PickUpTip.test.tsx b/app/src/organisms/LabwarePositionCheck/__tests__/PickUpTip.test.tsx index 67fba8aa08f..44903812e0f 100644 --- a/app/src/organisms/LabwarePositionCheck/__tests__/PickUpTip.test.tsx +++ b/app/src/organisms/LabwarePositionCheck/__tests__/PickUpTip.test.tsx @@ -389,18 +389,15 @@ describe('PickUpTip', () => { }, }, { - commandType: 'moveToWell', + commandType: 'retractAxis' as const, params: { - pipetteId: 'pipetteId1', - labwareId: 'fixedTrash', - wellName: 'A1', - wellLocation: { origin: 'top' }, + axis: 'x', }, }, { commandType: 'retractAxis' as const, params: { - axis: 'leftZ', + axis: 'y', }, }, { diff --git a/app/src/organisms/OnDeviceDisplay/RunningProtocol/CurrentRunningProtocolCommand.tsx b/app/src/organisms/OnDeviceDisplay/RunningProtocol/CurrentRunningProtocolCommand.tsx index 8f33b6eb310..68e544b7a31 100644 --- a/app/src/organisms/OnDeviceDisplay/RunningProtocol/CurrentRunningProtocolCommand.tsx +++ b/app/src/organisms/OnDeviceDisplay/RunningProtocol/CurrentRunningProtocolCommand.tsx @@ -56,7 +56,7 @@ const TITLE_TEXT_STYLE = css` -webkit-box-orient: vertical; -webkit-line-clamp: 2; overflow: hidden; - overflow-wrap: break-word; + overflow-wrap: anywhere; height: max-content; ` diff --git a/app/src/organisms/OnDeviceDisplay/RunningProtocol/RunFailedModal.tsx b/app/src/organisms/OnDeviceDisplay/RunningProtocol/RunFailedModal.tsx index c2699421754..b91775136da 100644 --- a/app/src/organisms/OnDeviceDisplay/RunningProtocol/RunFailedModal.tsx +++ b/app/src/organisms/OnDeviceDisplay/RunningProtocol/RunFailedModal.tsx @@ -79,6 +79,7 @@ export function RunFailedModal({ })}
{ const { t, i18n } = useTranslation('pipette_wizard_flows') const pipetteWizardStep = { mount, flowType, section: SECTIONS.MOUNT_PIPETTE } const isSingleMountPipette = selectedPipette === SINGLE_MOUNT_PIPETTES + const bodyTextSkeleton = ( { {t('pipette_heavy', { weight: WEIGHT_OF_96_CHANNEL })} ) : null} - {t('hold_pipette_carefully')} + + {isSingleMountPipette + ? t('align_the_connector') + : t('hold_pipette_carefully')} + ) } diff --git a/app/src/organisms/PipetteWizardFlows/__tests__/MountPipette.test.tsx b/app/src/organisms/PipetteWizardFlows/__tests__/MountPipette.test.tsx index 61539b5d574..a9f58f1faac 100644 --- a/app/src/organisms/PipetteWizardFlows/__tests__/MountPipette.test.tsx +++ b/app/src/organisms/PipetteWizardFlows/__tests__/MountPipette.test.tsx @@ -50,7 +50,7 @@ describe('MountPipette', () => { const { getByText, getByTestId, getByLabelText } = render(props) getByText('Connect and secure pipette') getByText( - 'Hold onto the pipette so it does not fall. Connect the pipette by aligning the two protruding rods on the mounting plate. Ensure a secure attachment by screwing in the four front screws with the provided screwdriver.' + 'Attach the pipette to the robot by aligning the connector and pressing to ensure a secure connection. Hold the pipette in place and use the hex screwdriver to tighten the pipette screws. Then test that the pipette is securely attached by gently pulling it side to side.' ) getByTestId('Pipette_Attach_1_8_L.webm') const backBtn = getByLabelText('back') diff --git a/app/src/organisms/PipetteWizardFlows/index.tsx b/app/src/organisms/PipetteWizardFlows/index.tsx index efb69cbd9ec..747c923d5fd 100644 --- a/app/src/organisms/PipetteWizardFlows/index.tsx +++ b/app/src/organisms/PipetteWizardFlows/index.tsx @@ -18,7 +18,7 @@ import { LegacyModalShell } from '../../molecules/LegacyModal' import { Portal } from '../../App/portal' import { InProgressModal } from '../../molecules/InProgressModal/InProgressModal' import { WizardHeader } from '../../molecules/WizardHeader' -import { FirmwareUpdateModal } from '../../molecules/FirmwareUpdateModal' +import { FirmwareUpdateModal } from '../FirmwareUpdateModal' import { useChainMaintenanceCommands } from '../../resources/runs/hooks' import { getIsOnDevice } from '../../redux/config' import { useAttachedPipettesFromInstrumentsQuery } from '../Devices/hooks' diff --git a/app/src/organisms/ProtocolDetails/ProtocolLiquidsDetails.tsx b/app/src/organisms/ProtocolDetails/ProtocolLiquidsDetails.tsx index d51f9386c65..acc3d6bdc27 100644 --- a/app/src/organisms/ProtocolDetails/ProtocolLiquidsDetails.tsx +++ b/app/src/organisms/ProtocolDetails/ProtocolLiquidsDetails.tsx @@ -1,11 +1,21 @@ import * as React from 'react' +import { useTranslation } from 'react-i18next' import { css } from 'styled-components' import { parseLabwareInfoByLiquidId, parseLiquidsInLoadOrder, } from '@opentrons/api-client' -import { DIRECTION_COLUMN, Flex, SPACING } from '@opentrons/components' +import { + ALIGN_CENTER, + COLORS, + DIRECTION_COLUMN, + Flex, + Icon, + SPACING, + TYPOGRAPHY, +} from '@opentrons/components' import { Divider } from '../../atoms/structure' +import { StyledText } from '../../atoms/text' import { LiquidsListItemDetails } from '../Devices/ProtocolRun/SetupLiquids/SetupLiquidsList' import type { Liquid, RunTimeCommand } from '@opentrons/shared-data' @@ -19,6 +29,7 @@ export const ProtocolLiquidsDetails = ( props: ProtocolLiquidsDetailsProps ): JSX.Element => { const { commands, liquids } = props + const { i18n, t } = useTranslation('protocol_details') const liquidsInLoadOrder = parseLiquidsInLoadOrder(liquids, commands) const labwareByLiquidId = parseLabwareInfoByLiquidId(commands) const HIDE_SCROLLBAR = css` @@ -34,22 +45,46 @@ export const ProtocolLiquidsDetails = ( overflowY="auto" data-testid="LiquidsDetailsTab" > - {liquidsInLoadOrder?.map((liquid, index) => { - return ( - - - - - {index < liquidsInLoadOrder.length - 1 && } - - ) - })} + {liquids.length > 0 ? ( + liquidsInLoadOrder?.map((liquid, index) => { + return ( + + + + + {index < liquidsInLoadOrder.length - 1 && } + + ) + }) + ) : ( + + + + {i18n.format(t('liquids_not_in_protocol'), 'capitalize')} + + + )} ) } diff --git a/app/src/organisms/ProtocolDetails/__tests__/ProtocolLiquidsDetails.test.tsx b/app/src/organisms/ProtocolDetails/__tests__/ProtocolLiquidsDetails.test.tsx index d19a65c188b..e657317e2e7 100644 --- a/app/src/organisms/ProtocolDetails/__tests__/ProtocolLiquidsDetails.test.tsx +++ b/app/src/organisms/ProtocolDetails/__tests__/ProtocolLiquidsDetails.test.tsx @@ -1,11 +1,12 @@ import * as React from 'react' import { renderWithProviders } from '@opentrons/components' -import { ProtocolLiquidsDetails } from '../ProtocolLiquidsDetails' -import { LiquidsListItemDetails } from '../../Devices/ProtocolRun/SetupLiquids/SetupLiquidsList' import { parseLiquidsInLoadOrder, parseLabwareInfoByLiquidId, } from '@opentrons/api-client' +import { i18n } from '../../../i18n' +import { ProtocolLiquidsDetails } from '../ProtocolLiquidsDetails' +import { LiquidsListItemDetails } from '../../Devices/ProtocolRun/SetupLiquids/SetupLiquidsList' jest.mock('../../Devices/ProtocolRun/SetupLiquids/SetupLiquidsList') jest.mock('@opentrons/api-client') @@ -23,12 +24,24 @@ const mockParseLabwareInfoByLiquidId = parseLabwareInfoByLiquidId as jest.Mocked > const render = (props: React.ComponentProps) => { - return renderWithProviders() + return renderWithProviders(, { + i18nInstance: i18n, + }) } describe('ProtocolLiquidsDetails', () => { let props: React.ComponentProps beforeEach(() => { + props = { + commands: [], + liquids: [ + { + id: 'mockLiquid', + displayName: 'mockDisplayName', + description: 'mockDescription', + }, + ], + } mockLiquidsListItemDetails.mockReturnValue(
mock liquids list item
) @@ -48,4 +61,10 @@ describe('ProtocolLiquidsDetails', () => { const [{ getAllByText }] = render(props) getAllByText('mock liquids list item') }) + it('renders the correct info for no liquids in the protocol', () => { + props.liquids = [] + const [{ getByText, getByLabelText }] = render(props) + getByText('No liquids are specified for this protocol') + getByLabelText('ProtocolLIquidsDetails_noLiquidsIcon') + }) }) diff --git a/app/src/organisms/ProtocolDetails/index.tsx b/app/src/organisms/ProtocolDetails/index.tsx index e3657011c6f..60691c4f929 100644 --- a/app/src/organisms/ProtocolDetails/index.tsx +++ b/app/src/organisms/ProtocolDetails/index.tsx @@ -36,10 +36,7 @@ import { parseInitialLoadedLabwareBySlot, parseInitialLoadedLabwareByModuleId, } from '@opentrons/api-client' -import { - getGripperDisplayName, - protocolHasLiquids, -} from '@opentrons/shared-data' +import { getGripperDisplayName } from '@opentrons/shared-data' import { Portal } from '../../App/portal' import { Divider } from '../../atoms/structure' @@ -144,7 +141,7 @@ interface ReadMoreContentProps { const ReadMoreContent = (props: ReadMoreContentProps): JSX.Element => { const { metadata, protocolType } = props - const { t } = useTranslation('protocol_details') + const { t, i18n } = useTranslation('protocol_details') const [isReadMore, setIsReadMore] = React.useState(true) const description = isEmpty(metadata.description) @@ -167,10 +164,11 @@ const ReadMoreContent = (props: ReadMoreContentProps): JSX.Element => { role="button" css={TYPOGRAPHY.linkPSemiBold} marginTop={SPACING.spacing8} - textTransform={TYPOGRAPHY.textTransformCapitalize} onClick={() => setIsReadMore(!isReadMore)} > - {isReadMore ? t('read_more') : t('read_less')} + {isReadMore + ? i18n.format(t('read_more'), 'capitalize') + : i18n.format(t('read_less'), 'capitalize')} )}
@@ -185,7 +183,7 @@ export function ProtocolDetails( const trackEvent = useTrackEvent() const dispatch = useDispatch() const { protocolKey, srcFileNames, mostRecentAnalysis, modified } = props - const { t } = useTranslation(['protocol_details', 'shared']) + const { t, i18n } = useTranslation(['protocol_details', 'shared']) const [currentTab, setCurrentTab] = React.useState< 'robot_config' | 'labware' | 'liquids' >('robot_config') @@ -394,6 +392,7 @@ export function ProtocolDetails( css={TYPOGRAPHY.h2SemiBold} marginBottom={SPACING.spacing16} data-testid={`ProtocolDetails_${protocolDisplayName}`} + overflowWrap="anywhere" > {protocolDisplayName}
@@ -556,8 +555,8 @@ export function ProtocolDetails( isCurrent={currentTab === 'robot_config'} onClick={() => setCurrentTab('robot_config')} > - - {t('robot_configuration')} + + {i18n.format(t('robot_configuration'), 'capitalize')} setCurrentTab('labware')} > - - {t('labware')} + + {i18n.format(t('labware'), 'capitalize')} - {mostRecentAnalysis != null && - protocolHasLiquids(mostRecentAnalysis) && ( - setCurrentTab('liquids')} - > - - {t('liquids')} - - - )} + {mostRecentAnalysis != null && ( + setCurrentTab('liquids')} + > + + {i18n.format(t('liquids'), 'capitalize')} + + + )}
  • - After updating the Opentrons App, update your OT-2 to - ensure the app and robot software is in sync. + After updating the Opentrons App, update your robot{' '} + to ensure the app and robot software is in sync.
  • You should update the Opentrons App on all computers{' '} - that you use with your OT-2. + that you use with your robot.
  • diff --git a/app/src/pages/Devices/DeviceDetails/index.tsx b/app/src/pages/Devices/DeviceDetails/index.tsx index 6b6daed2e34..d34f6c45069 100644 --- a/app/src/pages/Devices/DeviceDetails/index.tsx +++ b/app/src/pages/Devices/DeviceDetails/index.tsx @@ -7,7 +7,6 @@ import { Flex, ALIGN_CENTER, DIRECTION_COLUMN, - OVERFLOW_SCROLL, SPACING, COLORS, } from '@opentrons/components' @@ -40,8 +39,7 @@ export function DeviceDetails(): JSX.Element | null { > + float: while time() < start_time + timeout: # return "12.3 N" line = self._force_guage.readline().decode("utf-8").strip() - force_val, units = line.split(" ") - if not force_val: - continue - if units != "N": - self._force_guage.write("N\r\n") # Set force gauge units to Newtons - print(f'Setting gauge units from {units} to "N" (newtons)') - continue try: - return float(force_val) + force_val, units = line.split(" ") + if units != "N": + self._force_guage.write("N\r\n") # Set force gauge units to Newtons + print(f'Setting gauge units from {units} to "N" (newtons)') + continue + else: + return float(force_val) except ValueError as e: print(e) + print(f'bad data: "{line}"') continue raise TimeoutError(f"unable to read from gauge within {timeout} seconds") diff --git a/hardware-testing/hardware_testing/opentrons_api/helpers_ot3.py b/hardware-testing/hardware_testing/opentrons_api/helpers_ot3.py index 7b86085352e..b1de2957112 100644 --- a/hardware-testing/hardware_testing/opentrons_api/helpers_ot3.py +++ b/hardware-testing/hardware_testing/opentrons_api/helpers_ot3.py @@ -5,7 +5,7 @@ from math import pi from subprocess import run from time import time -from typing import Callable, Coroutine, Dict, List, Optional, Tuple, Union, cast +from typing import Callable, Coroutine, Dict, List, Optional, Tuple, Union from opentrons_hardware.drivers.can_bus import DriverSettings, build, CanMessenger from opentrons_hardware.drivers.can_bus import settings as can_bus_settings @@ -23,9 +23,7 @@ # have that well defined. from opentrons.hardware_control.instruments.ot2.pipette import Pipette as PipetteOT2 from opentrons.hardware_control.instruments.ot3.pipette import Pipette as PipetteOT3 -from opentrons.hardware_control.motion_utilities import deck_from_machine from opentrons.hardware_control.ot3api import OT3API -from opentrons_shared_data.robot import RobotType from .types import ( GantryLoad, @@ -493,18 +491,11 @@ async def move_gripper_jaw_relative_ot3(api: OT3API, delta: float) -> None: def get_endstop_position_ot3(api: OT3API, mount: OT3Mount) -> Dict[Axis, float]: """Get the endstop's position per mount.""" - transforms = api._robot_calibration - machine_pos_per_axis = api._backend.home_position() - deck_pos_per_axis = deck_from_machine( - machine_pos=machine_pos_per_axis, - attitude=transforms.deck_calibration.attitude, - offset=transforms.carriage_offset, - robot_type=cast(RobotType, "OT-3 Standard"), + carriage_pos = api._deck_from_machine(api._backend.home_position()) + pos_at_home = api._effector_pos_from_carriage_pos( + OT3Mount.from_mount(mount), carriage_pos, None ) - mount_pos_per_axis = api._effector_pos_from_carriage_pos( - mount, deck_pos_per_axis, None - ) - return {ax: val for ax, val in mount_pos_per_axis.items()} + return {ax: val for ax, val in pos_at_home.items()} def get_gantry_homed_position_ot3(api: OT3API, mount: OT3Mount) -> Point: @@ -973,8 +964,8 @@ def _ul_per_mm_of_shaft_diameter(diameter: float) -> float: pip_nominal_ul_per_mm, ), ] - pip._active_tip_settings.aspirate["default"] = ul_per_mm # type: ignore[assignment] - pip._active_tip_settings.dispense["default"] = ul_per_mm # type: ignore[assignment] + pip._active_tip_settings.aspirate.default["1"] = ul_per_mm # type: ignore[assignment] + pip._active_tip_settings.dispense.default["1"] = ul_per_mm # type: ignore[assignment] pip.ul_per_mm.cache_clear() assert pip.ul_per_mm(1, "aspirate") == pip_nominal_ul_per_mm assert pip.ul_per_mm(pip.working_volume, "aspirate") == pip_nominal_ul_per_mm diff --git a/hardware-testing/hardware_testing/production_qc/gripper_assembly_qc_ot3/__main__.py b/hardware-testing/hardware_testing/production_qc/gripper_assembly_qc_ot3/__main__.py index 972cac80217..6be123ca777 100644 --- a/hardware-testing/hardware_testing/production_qc/gripper_assembly_qc_ot3/__main__.py +++ b/hardware-testing/hardware_testing/production_qc/gripper_assembly_qc_ot3/__main__.py @@ -8,7 +8,7 @@ from hardware_testing.opentrons_api import helpers_ot3 from hardware_testing.opentrons_api.types import OT3Mount, Axis -from .config import TestSection, TestConfig, build_report, TESTS +from .config import TestSection, TestConfig, build_report, TESTS, TESTS_INCREMENT async def _main(cfg: TestConfig) -> None: @@ -65,6 +65,7 @@ async def _main(cfg: TestConfig) -> None: if __name__ == "__main__": parser = argparse.ArgumentParser() parser.add_argument("--simulate", action="store_true") + parser.add_argument("--increment", action="store_true") # add each test-section as a skippable argument (eg: --skip-gantry) for s in TestSection: parser.add_argument(f"--skip-{s.value.lower()}", action="store_true") @@ -75,9 +76,17 @@ async def _main(cfg: TestConfig) -> None: assert ( len(list(_t_sections.keys())) < 2 ), 'use "--only" for just one test, not multiple tests' + elif args.increment: + _t_sections = { + s: f + for s, f in TESTS_INCREMENT + if not getattr(args, f"skip_{s.value.lower()}") + } else: _t_sections = { s: f for s, f in TESTS if not getattr(args, f"skip_{s.value.lower()}") } - _config = TestConfig(simulate=args.simulate, tests=_t_sections) + _config = TestConfig( + simulate=args.simulate, tests=_t_sections, increment=args.increment + ) asyncio.run(_main(_config)) diff --git a/hardware-testing/hardware_testing/production_qc/gripper_assembly_qc_ot3/config.py b/hardware-testing/hardware_testing/production_qc/gripper_assembly_qc_ot3/config.py index 56cf6e0b1a6..474561df595 100644 --- a/hardware-testing/hardware_testing/production_qc/gripper_assembly_qc_ot3/config.py +++ b/hardware-testing/hardware_testing/production_qc/gripper_assembly_qc_ot3/config.py @@ -28,6 +28,7 @@ class TestConfig: simulate: bool tests: Dict[TestSection, Callable] + increment: bool TESTS = [ @@ -36,16 +37,23 @@ class TestConfig: test_mount.run, ), ( - TestSection.FORCE, - test_force.run, + TestSection.PROBE, + test_probe.run, ), ( TestSection.WIDTH, test_width.run, ), ( - TestSection.PROBE, - test_probe.run, + TestSection.FORCE, + test_force.run, + ), +] + +TESTS_INCREMENT = [ + ( + TestSection.FORCE, + test_force.run_increment, # NOTE: different run method ), ] @@ -59,13 +67,13 @@ def build_report(test_name: str) -> CSVReport: title=TestSection.MOUNT.value, lines=test_mount.build_csv_lines() ), CSVSection( - title=TestSection.FORCE.value, lines=test_force.build_csv_lines() + title=TestSection.PROBE.value, lines=test_probe.build_csv_lines() ), CSVSection( title=TestSection.WIDTH.value, lines=test_width.build_csv_lines() ), CSVSection( - title=TestSection.PROBE.value, lines=test_probe.build_csv_lines() + title=TestSection.FORCE.value, lines=test_force.build_csv_lines() ), ], ) diff --git a/hardware-testing/hardware_testing/production_qc/gripper_assembly_qc_ot3/test_force.py b/hardware-testing/hardware_testing/production_qc/gripper_assembly_qc_ot3/test_force.py index a0d11d2caff..03d3c89c349 100644 --- a/hardware-testing/hardware_testing/production_qc/gripper_assembly_qc_ot3/test_force.py +++ b/hardware-testing/hardware_testing/production_qc/gripper_assembly_qc_ot3/test_force.py @@ -19,27 +19,38 @@ from hardware_testing.opentrons_api.types import Axis, OT3Mount, Point -SLOT_FORCE_GAUGE = 4 -GRIP_HEIGHT_MM = 120 +SLOT_FORCE_GAUGE = 6 -FAILURE_THRESHOLD_PERCENTAGE = 10 -GRIP_FORCES_NEWTON: List[int] = [5, 10, 15, 20] +GRIP_DUTY_CYCLES: List[int] = [40, 30, 25, 20, 15, 10, 6] +NUM_DUTY_CYCLE_TRIALS = 20 -NUM_DUTY_CYCLE_TRIALS = 5 -GRIP_DUTY_CYCLES: List[int] = [6, 8, 10, 12, 15, 20, 30, 40, 50] +GRIP_FORCES_NEWTON: List[int] = [20, 15, 10, 5] +NUM_NEWTONS_TRIALS = 5 +FAILURE_THRESHOLD_PERCENTAGE = ( + 10 # TODO: wait for PVT to decide on if this should be tightened or loosened +) + +WARMUP_SECONDS = 10 + +FORCE_GAUGE_TRIAL_SAMPLE_INTERVAL = 0.25 # seconds +FORCE_GAUGE_TRIAL_SAMPLE_COUNT = 20 # 20 samples = 5 seconds @ 4Hz + +GAUGE_OFFSET = Point(x=90, y=37.5, z=75) def _get_test_tag( - newtons: Optional[int] = None, duty_cycle: Optional[int] = None + trial: int, + newtons: Optional[int] = None, + duty_cycle: Optional[int] = None, ) -> str: if newtons and duty_cycle: raise ValueError("must measure either force or duty-cycle, not both") if newtons is None and duty_cycle is None: raise ValueError("both newtons and duty-cycle are None") if newtons is not None: - return f"{newtons}-newtons" + return f"newtons-{newtons}-trial-{trial + 1}" else: - return f"{duty_cycle}-duty-cycle" + return f"duty-cycle-{duty_cycle}-trial-{trial + 1}" def _get_gauge(is_simulating: bool) -> Union[Mark10, SimMark10]: @@ -56,7 +67,7 @@ def _get_gauge(is_simulating: bool) -> Union[Mark10, SimMark10]: def _get_force_gauge_hover_and_grip_positions(api: OT3API) -> Tuple[Point, Point]: grip_pos = helpers_ot3.get_slot_calibration_square_position_ot3(SLOT_FORCE_GAUGE) - grip_pos += Point(z=GRIP_HEIGHT_MM) + grip_pos += GAUGE_OFFSET hover_pos = grip_pos._replace(z=api.get_instrument_max_height(OT3Mount.GRIPPER)) return hover_pos, grip_pos @@ -65,31 +76,38 @@ def build_csv_lines() -> List[Union[CSVLine, CSVLineRepeating]]: """Build CSV Lines.""" lines: List[Union[CSVLine, CSVLineRepeating]] = list() for force in GRIP_FORCES_NEWTON: - tag = _get_test_tag(newtons=force) - lines.append(CSVLine(tag, [int, float, CSVResult])) + for trial in range(NUM_NEWTONS_TRIALS): + tag = _get_test_tag(trial, newtons=force) + force_data_types = [float] * FORCE_GAUGE_TRIAL_SAMPLE_COUNT + data_row = [int] + force_data_types + [CSVResult] # type: ignore[operator,list-item] + lines.append(CSVLine(tag, data_row)) for duty_cycle in GRIP_DUTY_CYCLES: - tag = _get_test_tag(duty_cycle=duty_cycle) - lines.append(CSVLine(tag, [int, float, CSVResult])) + for trial in range(NUM_DUTY_CYCLE_TRIALS): + tag = _get_test_tag(trial, duty_cycle=duty_cycle) + force_data_types = [float] * FORCE_GAUGE_TRIAL_SAMPLE_COUNT + data_row = [int] + force_data_types # type: ignore[operator] + lines.append(CSVLine(tag, data_row)) return lines -async def _read_average_force_from_gauge( - gauge: Union[Mark10, SimMark10], length: int = 10, interval: float = 0.25 -) -> float: +async def _read_forces(gauge: Union[Mark10, SimMark10]) -> List[float]: n = list() - for _ in range(length): - n.append(gauge.read_force()) + for _ in range(FORCE_GAUGE_TRIAL_SAMPLE_COUNT): + force = gauge.read_force() + n.append(force) if not gauge.is_simulator(): - await sleep(interval) - return sum(n) / float(length) + await sleep(FORCE_GAUGE_TRIAL_SAMPLE_INTERVAL) + return n -async def _grip_and_read_force( +async def _grip_and_read_forces( api: OT3API, gauge: Union[Mark10, SimMark10], force: Optional[int] = None, duty: Optional[int] = None, -) -> float: +) -> List[float]: + if not api.is_simulator: + await sleep(2) # let sensor settle if duty is not None: await api._grip(duty_cycle=float(duty)) api._gripper_handler.set_jaw_state(GripperJawState.GRIPPING) @@ -101,15 +119,12 @@ async def _grip_and_read_force( gauge.set_simulation_force(float(duty) * 0.5) # type: ignore[union-attr] elif force is not None: gauge.set_simulation_force(float(force)) # type: ignore[union-attr] - if not api.is_simulator: - await sleep(2) - ret = await _read_average_force_from_gauge(gauge) + ret_list = await _read_forces(gauge) await api.ungrip() - return ret + return ret_list -async def run(api: OT3API, report: CSVReport, section: str) -> None: - """Run.""" +async def _setup(api: OT3API) -> Union[Mark10, SimMark10]: z_ax = Axis.Z_G g_ax = Axis.G mount = OT3Mount.GRIPPER @@ -121,49 +136,78 @@ async def run(api: OT3API, report: CSVReport, section: str) -> None: ui.get_user_ready("plug gauge into USB port on OT3") gauge = _get_gauge(api.is_simulator) gauge.connect() + print("test readings") + ret_list = await _read_forces(gauge) + print(ret_list) # HOME print("homing Z and G...") await api.home([z_ax, g_ax]) # MOVE TO GAUGE await api.ungrip() - hover_pos, _ = _get_force_gauge_hover_and_grip_positions(api) - target_pos = Point(x=64.0, y=123.3, z=67.6) - await helpers_ot3.move_to_arched_ot3(api, mount, target_pos._replace(z=87.6)) + hover_pos, target_pos = _get_force_gauge_hover_and_grip_positions(api) + await helpers_ot3.move_to_arched_ot3(api, mount, target_pos + Point(z=30)) if not api.is_simulator: ui.get_user_ready("please make sure the gauge in the middle of the gripper") await api.move_to(mount, target_pos) if not api.is_simulator: - ui.get_user_ready("prepare to grip") + ui.get_user_ready("about to grip") + await api.grip(20) + for sec in range(WARMUP_SECONDS): + print(f"warmup ({sec + 1}/{WARMUP_SECONDS})") + if not api.is_simulator: + await sleep(1) + await api.ungrip() + return gauge + + +async def run_increment(api: OT3API, report: CSVReport, section: str) -> None: + """Run Increment.""" + gauge = await _setup(api) - # LOOP THROUGH FORCES - ui.print_header("MEASURE NEWTONS") - for expected_force in GRIP_FORCES_NEWTON: - # GRIP AND MEASURE FORCE - actual_force = await _grip_and_read_force(api, gauge, force=expected_force) - print(f"gripping at {expected_force} N = {actual_force} N") - error = (actual_force - expected_force) / expected_force - result = CSVResult.from_bool(abs(error) * 100 < FAILURE_THRESHOLD_PERCENTAGE) - tag = _get_test_tag(newtons=expected_force) - report(section, tag, [expected_force, actual_force, result]) # LOOP THROUGH DUTY-CYCLES ui.print_header("MEASURE DUTY-CYCLES") for duty_cycle in GRIP_DUTY_CYCLES: # GRIP AND MEASURE FORCE - print(f"gripping at {duty_cycle}% duty cycle") - found_forces = list() - # take 2x extra samples, because we'll remove min/max later - for i in range(NUM_DUTY_CYCLE_TRIALS + 2): - actual_force = await _grip_and_read_force(api, gauge, duty=duty_cycle) - print(f" - trial {i + 1}/{NUM_DUTY_CYCLE_TRIALS} = {actual_force} N") - found_forces.append(actual_force) - # remove min/max forces - forces_without_outliers = sorted(found_forces)[1:-1] - # calculate average - actual_force = sum(forces_without_outliers) / float(NUM_DUTY_CYCLE_TRIALS) - print(f"average = {actual_force} N") - tag = _get_test_tag(duty_cycle=duty_cycle) - report(section, tag, [duty_cycle, actual_force, CSVResult.PASS]) - # RETRACT + for trial in range(NUM_DUTY_CYCLE_TRIALS): + print( + f"{duty_cycle}% duty cycle - trial {trial + 1}/{NUM_DUTY_CYCLE_TRIALS}" + ) + actual_forces = await _grip_and_read_forces(api, gauge, duty=duty_cycle) + print(actual_forces) + tag = _get_test_tag(trial, duty_cycle=duty_cycle) + report_data = [duty_cycle] + actual_forces # type: ignore[operator] + report(section, tag, report_data) + + print("done") + await api.retract(OT3Mount.GRIPPER) + + +async def run(api: OT3API, report: CSVReport, section: str) -> None: + """Run.""" + gauge = await _setup(api) + + # LOOP THROUGH FORCES + ui.print_header("MEASURE NEWTONS") + for expected_force in GRIP_FORCES_NEWTON: + for trial in range(NUM_NEWTONS_TRIALS): + print(f"{expected_force}N - trial {trial + 1}/{NUM_NEWTONS_TRIALS}") + actual_forces = await _grip_and_read_forces( + api, gauge, force=expected_force + ) + print(actual_forces) + # base PASS/FAIL on average + avg_force = sum(actual_forces) / len(actual_forces) + error = (avg_force - expected_force) / expected_force + result = CSVResult.from_bool( + abs(error) * 100 < FAILURE_THRESHOLD_PERCENTAGE + ) + # store all data in CSV + tag = _get_test_tag(trial, newtons=expected_force) + report_data = ( + [expected_force] + actual_forces + [result] # type: ignore[operator,list-item] + ) + report(section, tag, report_data) + print("done") - await helpers_ot3.move_to_arched_ot3(api, mount, hover_pos) + await api.retract(OT3Mount.GRIPPER) diff --git a/hardware-testing/hardware_testing/production_qc/pipette_assembly_qc_ot3.py b/hardware-testing/hardware_testing/production_qc/pipette_assembly_qc_ot3.py index 464f3ec44e9..d31dadb89f4 100644 --- a/hardware-testing/hardware_testing/production_qc/pipette_assembly_qc_ot3.py +++ b/hardware-testing/hardware_testing/production_qc/pipette_assembly_qc_ot3.py @@ -413,7 +413,7 @@ async def _fixture_check_pressure( pip = api.hardware_pipettes[mount.to_mount()] assert pip pip_vol = int(pip.working_volume) - pip_channels = int(pip.channels.value) + pip_channels = int(pip.channels) # above the fixture r = await _read_pressure_and_check_results( api, fixture, PressureEvent.PRE, write_cb, accumulate_raw_data_cb, pip_channels @@ -645,8 +645,8 @@ async def _read_cap() -> float: capacitance_open_air = await _read_cap() print(f"open-air capacitance: {capacitance_open_air}") if ( - capacitance_open_air < CAP_THRESH_OPEN_AIR[pip.channels.value][0] - or capacitance_open_air > CAP_THRESH_OPEN_AIR[pip.channels.value][1] + capacitance_open_air < CAP_THRESH_OPEN_AIR[pip.channels][0] + or capacitance_open_air > CAP_THRESH_OPEN_AIR[pip.channels][1] ): capacitive_open_air_pass = False print(f"FAIL: open-air capacitance ({capacitance_open_air}) is not correct") @@ -663,8 +663,8 @@ async def _read_cap() -> float: capacitance_with_probe = await _read_cap() print(f"probe capacitance: {capacitance_with_probe}") if ( - capacitance_with_probe < CAP_THRESH_PROBE[pip.channels.value][0] - or capacitance_with_probe > CAP_THRESH_PROBE[pip.channels.value][1] + capacitance_with_probe < CAP_THRESH_PROBE[pip.channels][0] + or capacitance_with_probe > CAP_THRESH_PROBE[pip.channels][1] ): capacitive_probe_attached_pass = False print(f"FAIL: probe capacitance ({capacitance_with_probe}) is not correct") @@ -683,8 +683,8 @@ async def _read_cap() -> float: capacitance_with_square = await _read_cap() print(f"square capacitance: {capacitance_with_square}") if ( - capacitance_with_square < CAP_THRESH_SQUARE[pip.channels.value][0] - or capacitance_with_square > CAP_THRESH_SQUARE[pip.channels.value][1] + capacitance_with_square < CAP_THRESH_SQUARE[pip.channels][0] + or capacitance_with_square > CAP_THRESH_SQUARE[pip.channels][1] ): capacitive_square_pass = False print(f"FAIL: square capacitance ({capacitance_with_square}) is not correct") @@ -944,7 +944,7 @@ async def _main(test_config: TestConfig) -> None: # setup our labware locations pipette_volume = int(pipette.working_volume) - pipette_channels = int(pipette.channels.as_int) + pipette_channels = int(pipette.channels) IDEAL_LABWARE_LOCATIONS = _get_ideal_labware_locations( test_config, pipette_volume, pipette_channels ) diff --git a/hardware-testing/hardware_testing/scripts/belt_calibration_ot3.py b/hardware-testing/hardware_testing/scripts/belt_calibration_ot3.py index 2ce58359d32..ba5fc0b04e8 100644 --- a/hardware-testing/hardware_testing/scripts/belt_calibration_ot3.py +++ b/hardware-testing/hardware_testing/scripts/belt_calibration_ot3.py @@ -70,38 +70,49 @@ async def _calibrate_belts(api: OT3API, mount: types.OT3Mount) -> None: print(attitude) -async def _main(is_simulating: bool, mount: types.OT3Mount) -> None: +async def _main(is_simulating: bool, mount: types.OT3Mount, test: bool) -> None: ui.print_title("BELT CALIBRATION") api = await helpers_ot3.build_async_ot3_hardware_api( is_simulating=is_simulating, pipette_left="p1000_single_v3.4", pipette_right="p1000_single_v3.4", ) - print("homing") - await api.home() - print("resetting robot calibration") - await api.reset_instrument_offset(mount) - api.reset_robot_calibration() - - # SKIP calibrating the belts, then check accuracy - await _calibrate_pipette(api, mount) - await _check_belt_accuracy(api, mount) - - # DO calibrate the belts, then check accuracy - await _calibrate_belts(api, mount) # <-- !!! - await _calibrate_pipette(api, mount) - await _check_belt_accuracy(api, mount) - - print("done") + try: + print("homing") + await api.home() + attach_pos = helpers_ot3.get_slot_calibration_square_position_ot3(2) + current_pos = await api.gantry_position(mount) + await api.move_to(mount, attach_pos._replace(z=current_pos.z)) + if not api.is_simulator: + ui.get_user_ready("ATTACH a probe") + print("resetting robot calibration") + await api.reset_instrument_offset(mount) + api.reset_robot_calibration() + if test: + # check accuracy of gantry-to-deck + await _calibrate_pipette(api, mount) + await _check_belt_accuracy(api, mount) + # calibrate the belts + await _calibrate_belts(api, mount) # <-- !!! + if test: + # check accuracy of gantry-to-deck + await _calibrate_pipette(api, mount) + await _check_belt_accuracy(api, mount) + print("done") + finally: + if not api.is_simulator: + print("restarting opentrons-robot-server") + helpers_ot3.start_server_ot3() if __name__ == "__main__": parser = argparse.ArgumentParser() parser.add_argument("--simulate", action="store_true") - parser.add_argument("--mount", type=str, choices=["left", "right"], required=True) + parser.add_argument("--test", action="store_true") + parser.add_argument("--mount", type=str, choices=["left", "right"], default="left") args = parser.parse_args() if args.mount == "left": mnt = types.OT3Mount.LEFT else: mnt = types.OT3Mount.RIGHT - asyncio.run(_main(args.simulate, mnt)) + asyncio.run(_main(args.simulate, mnt, args.test)) diff --git a/hardware-testing/hardware_testing/scripts/pipette_sensors_ot3.py b/hardware-testing/hardware_testing/scripts/pipette_sensors_ot3.py index 9f3a5177803..130fb083924 100644 --- a/hardware-testing/hardware_testing/scripts/pipette_sensors_ot3.py +++ b/hardware-testing/hardware_testing/scripts/pipette_sensors_ot3.py @@ -64,7 +64,7 @@ async def _handle_gripper(api: OT3API) -> None: async def _handle_pipette(api: OT3API, mount: OT3Mount) -> None: pip: Optional[Pipette] = api.hardware_pipettes[mount.to_mount()] assert pip, f"no pipette found on {mount.name}" - num_channels = pip.channels.value + num_channels = pip.channels if num_channels == 1: capacitive_channels = [SensorId.S0] pressure_channels = [SensorId.S0] diff --git a/hardware-testing/hardware_testing/scripts/visualize_pipette_function.py b/hardware-testing/hardware_testing/scripts/visualize_pipette_function.py index 47fcc4471c8..59d2dde68e1 100644 --- a/hardware-testing/hardware_testing/scripts/visualize_pipette_function.py +++ b/hardware-testing/hardware_testing/scripts/visualize_pipette_function.py @@ -3,6 +3,7 @@ import asyncio from math import pi as PI from typing import Optional +from pathlib import Path try: import matplotlib.pyplot as plt # type: ignore[import] @@ -10,7 +11,7 @@ raise RuntimeError( "Do NOT run this script on a robot. Please install matplotlib on this computer." ) -from typing import List +from typing import List, cast from opentrons.types import Point from opentrons.calibration_storage.types import ( @@ -18,7 +19,10 @@ CalibrationStatus, ) from opentrons.config.robot_configs import default_pipette_offset -from opentrons.config import pipette_config +from opentrons_shared_data.pipette import ( + pipette_load_name_conversions as pipette_load_name, + mutable_configurations, +) # TODO (lc 10-27-2022) This should be changed to an ot3 pipette object once we # have that well defined. @@ -27,6 +31,7 @@ PipetteOffsetByPipetteMount, ) from opentrons_shared_data.pipette import model_config +from opentrons_shared_data.pipette.dev_types import PipetteModel def _user_select_model(model_includes: Optional[str] = None) -> str: @@ -117,13 +122,18 @@ def _tot_vol_at_sample(index: int) -> float: async def _main(length: int) -> None: while True: model = _user_select_model() - config = pipette_config.load(pipette_model=model) # type: ignore[arg-type] + pipette_model = pipette_load_name.convert_pipette_model( + cast(PipetteModel, model) + ) + configurations = mutable_configurations.load_with_mutable_configurations( + pipette_model, Path("fake/path"), "testiId" + ) pip_cal_obj = PipetteOffsetByPipetteMount( offset=Point(*default_pipette_offset()), source=SourceType.default, status=CalibrationStatus(), ) - pipette = Pipette(config=config, pipette_offset_cal=pip_cal_obj) + pipette = Pipette(config=configurations, pipette_offset_cal=pip_cal_obj) table = _get_accuracy_adjustment_table(pipette, length) _print_errors(table) _plot_table(model, table) diff --git a/hardware-testing/hardware_testing/tools/usb-package/readme.txt b/hardware-testing/hardware_testing/tools/usb-package/readme.txt new file mode 100644 index 00000000000..f0ca3efe995 --- /dev/null +++ b/hardware-testing/hardware_testing/tools/usb-package/readme.txt @@ -0,0 +1,79 @@ +## OVERVIEW +The usb-package bundles up the hardware_testing module so it can run from a usb thumbdrive on the Flex. + +## INSTRUCTIONS + +### How to make package: +make -C hardware-testing setup-usb-module +This will produce a tar file **hardware_testing_usb-.tar.gz** in **hardware-testing/dist/** +example: + hardware_testing_usb-0.0.1.tar.gz + +You can also make and install the tar file to a target with the **usb_dir** option +This will extract the contents to the specified location +make -C hardware-testing setup-usb-module usb_dir="/Volumes/ENFAIN/" + +### How to deploy: +If you use the **usb_dir** option the usb-package will be installed on the usb drive +You can also manually extract the tar file onto a target like so +tar -xvf hardware_testing_usb-0.0.1.tar.gz -C "" + +### How to install on the Flex: +Once you have an usb thumdrive with the usb-packge deployed you can plug in the thumbdrive to +a Flex and start the setup script to install the required files like so + +0. Make sure the Flex is powered on +1. ssh to the robot with + ssh root@ + NOTE: You can also use screen or similar if you are using an FTDI connection + screen /dev/ 115200 +2. Plug in the hardware-testing thumbdrive to the Flex + The device should be mounted to **/media/sda** or similar + Note: You can also manually mount the thumbdrive with + a. From the Linux command line list usb devices with + blkid + Note: + Your drive address should be something like + **/dev/sda: LABEL="ENFAIN"...** + The LABEL should be the name of your usb thumbdrive + b. mount the drive + mount /dev/sda /mnt + c. the device should now be accessed thorugh /mnt +3. Navigate to the mounted drive + a. if drive was automatically mounted, run + cd /media/sdx/hardware_testing_usb where x is the enumerated drive + b. or if mounted manually + cd /mnt/hardware_testing_usb +4. Run the setup script + a. From the usb-packge dir **hardware_testing_usb** run + ./setup +5. Re-logging to apply + a. from the command shell run + logout + b. use ssh or screen to log back in + see step 1 above. +6. You should now see + **Hardware-Testing package enabled at /hardware_testing_usb** + + Note: **** is where the thumbdrive was mounted typically **/media/sdx** + but could also be **/mnt** or different if mounted manually +7. Done + a. The hardware-testing package is now setup and can be used as normal + example: + python3 -m hardware_testing.scripts.module_calibration + + +### How to uninstall from the Flex: +With the usb thumbdrive plugged into the Flex +1. Navigate to usb-packge dir + cd /hardware_testing_usb +2. Run the setup script + ./setup teardown + You should see **Teardown Success** +3. The usb drive can now be removed + + +### Troubleshoting + +If the usb thumbdrive is removed and replugged it could enumerate differently. +This means you will need to run the ./setup script again diff --git a/hardware-testing/hardware_testing/tools/usb-package/setup.sh b/hardware-testing/hardware_testing/tools/usb-package/setup.sh new file mode 100755 index 00000000000..8ca43473dca --- /dev/null +++ b/hardware-testing/hardware_testing/tools/usb-package/setup.sh @@ -0,0 +1,145 @@ +#! /bin/bash + +# This script sets up the hardware-testing module to run from usb or some other dir on the Flex robot. Read the readme.txt file for setup and instructions. + +USB_DIR=$(pwd) +MOUNT_DIR=$(dirname ${USB_DIR}) +PACKAGE_VERSION="" +PACKAGE_NAME="hardware_testing" +PACKAGE_DIR=$(echo ${USB_DIR}/${PACKAGE_NAME}-*/) +PACKAGE_TAR_FILE=$(echo ${USB_DIR}/${PACKAGE_NAME}-*.tar.gz) +PKG_INFO_FILE=$PACKAGE_DIR/PKG-INFO +SYSTEM_VERSION_FILE="/etc/VERSION.json" +ENV_PROFILE="/etc/profile.d/ot-usb-environ.sh" + +# Script entry-point +main() { + echo "Validating files" + validate "$@" + + # execute action + case $1 in + teardown) + echo "Teardown" + teardown + ;; + *) + echo "Setup" + setup + ;; + esac +} + +# Make sure we have the correct files before doing anything +validate() { + # Check if we are running on the robot or not + if [ ! -f $SYSTEM_VERSION_FILE ]; then + echo "${SYSTEM_VERSION_FILE} not found, make sure you're running this from a robot!" + exit 1; + fi + is_flex=$(cat $SYSTEM_VERSION_FILE | grep -o OT-3) + if [ -z $is_flex ]; then + echo "Make sure robot is a Flex before running setup." + exit 1 + fi + + # Extract the tarball + usb_module_filename=$(ls $PACKAGE_TAR_FILE) + if [ ! -f "$usb_module_filename" ]; then + echo "Could not find package tarball - ${PACKAGE_TAR_FILE}" + exit 1; + fi +} + +_extract_tarball() { + echo "Extracting tarball ${usb_module_filename}" + tar -xvf $usb_module_filename -C $USB_DIR + + # Get the version of the package + if [ ! -f $PKG_INFO_FILE ]; then + echo "error: ${PKG_INFO_FILE} was not found!" + exit 1; + fi + PACKAGE_VERSION=$(cat ${PKG_INFO_FILE} | sed -n '/Version/{n;n;p}') +} + + +# Helper function to write/delete environment variable profile script +_env_profile() { + # mount the filesystem rw + mount -o remount,rw / + + if [[ $1 =~ "delete" ]]; then + echo "Deleting usb-package env file - ${ENV_PROFILE}" + rm -rf $ENV_PROFILE + mount -o remount,ro / + return; + fi + + echo "Writing usb-package env profile - $ENV_PROFILE" + +cat < $ENV_PROFILE +#!/usr/bin/env sh + +# Do an auto-teardown if the usb device is not found +if [ ! -d $USB_DIR ]; then + mount -o remount,rw / + rm -rf $ENV_PROFILE + mount -o remount,ro / + return 1; +fi + +echo "Hardware-Testing package enabled at $USB_DIR" +export PYTHONPATH=\$PYTHONPATH:$PACKAGE_DIR + +# set OT_SYSTEM_VERSION if not set +if [ -z \$OT_SYSTEM_VERSION ]; then + export OT_SYSTEM_VERSION="0.0.0" +fi + +# set the TESTING_DATA_DIR +export TESTING_DATA_DIR=$USB_DIR/testing_data +EOF + # remount filesystem as ro + mount -o remount,ro / +} + +# Sets up the hardware-testing module to be used from usb location +setup() { + echo "Setting up hardware-testing module ${PACKAGE_VERSION}" + + # lets extract that tarball + _extract_tarball + + # Lets set up the environment profile + _env_profile + + # TODO (ba, 2023-07-19): set the logging location for hardware-testing scripts to usb + # We need to consilidate hardware-testing logging before being able to do this. + + # Lets deal with plot-webpage since the sdist file only contains .py files + cp -r $USB_DIR/plot $PACKAGE_DIR/$PACKAGE_NAME/tools/ + + # Lets deal with hardware-testing-description file, is /data correct? + cp -r $USB_DIR/.hardware-testing-description /data/ + + echo "Hardware-Testing module has been setup, re-login to apply changes." +} + +# Tearsdown the hardare-testing module +teardown() { + echo "Tearing down hardare-testing module ${PACKAGE_VERSION}" + + # delete the environment profile + _env_profile delete + + # delete the description file + rm -rf /data/.hardware-testing-description + + echo "Teardown Success" +} + +set -eE -o pipefail +trap teardown ERR + +main "$@" diff --git a/hardware-testing/setup.py b/hardware-testing/setup.py index 7e73c6947c6..d13ea34ee47 100644 --- a/hardware-testing/setup.py +++ b/hardware-testing/setup.py @@ -1,10 +1,31 @@ """Setup script.""" +import os +import sys + from setuptools import setup, find_packages +HERE = os.path.abspath(os.path.dirname(__file__)) +sys.path.append(os.path.join(HERE, "..", "scripts")) +from python_build_utils import normalize_version # noqa: E402 + + +def _get_version() -> None: + buildno = os.getenv("BUILD_NUMBER") + project = os.getenv("OPENTRONS_PROJECT", "ot3") + git_dir = os.getenv("OPENTRONS_GIT_DIR", None) + if buildno: + normalize_opts = {"extra_tag": buildno} + else: + normalize_opts = {} + return normalize_version( + "hardware-testing", project, git_dir=git_dir, **normalize_opts + ) + + setup( name="hardware_testing", - version="0.0.1", + version=_get_version(), packages=find_packages(where=".", exclude=["tests.*", "tests"]), url="", license="", diff --git a/hardware/opentrons_hardware/firmware_bindings/binary_constants.py b/hardware/opentrons_hardware/firmware_bindings/binary_constants.py index 869e861995b..d849c8d122b 100644 --- a/hardware/opentrons_hardware/firmware_bindings/binary_constants.py +++ b/hardware/opentrons_hardware/firmware_bindings/binary_constants.py @@ -31,6 +31,7 @@ class BinaryMessageId(int, Enum): aux_id_request = 0x11 aux_id_response = 0x12 estop_button_present_request = 0x13 + estop_state_request = 0x14 write_eeprom_request = 0x100 read_eeprom_request = 0x101 diff --git a/hardware/opentrons_hardware/firmware_bindings/messages/binary_message_definitions.py b/hardware/opentrons_hardware/firmware_bindings/messages/binary_message_definitions.py index 22140f8209a..9d80518b1e9 100644 --- a/hardware/opentrons_hardware/firmware_bindings/messages/binary_message_definitions.py +++ b/hardware/opentrons_hardware/firmware_bindings/messages/binary_message_definitions.py @@ -203,6 +203,16 @@ class EstopButtonPresentRequest(utils.BinarySerializable): length: utils.UInt16Field = utils.UInt16Field(0) +@dataclass +class EstopStateRequest(utils.BinarySerializable): + """Sent from the host to request the estop state.""" + + message_id: utils.UInt16Field = utils.UInt16Field( + BinaryMessageId.estop_state_request + ) + length: utils.UInt16Field = utils.UInt16Field(0) + + @dataclass class AuxPresentDetectionChange(utils.BinarySerializable): """Sent from the rear panel when a aux device is connected or disconnected.""" @@ -394,6 +404,7 @@ class GetDeckLightResponse(utils.BinarySerializable): EngageSyncOut, ReleaseSyncOut, EstopStateChange, + EstopStateRequest, EstopButtonDetectionChange, EstopButtonPresentRequest, DoorSwitchStateRequest, diff --git a/hardware/opentrons_hardware/hardware_control/estop/__init__.py b/hardware/opentrons_hardware/hardware_control/estop/__init__.py new file mode 100644 index 00000000000..973b297e537 --- /dev/null +++ b/hardware/opentrons_hardware/hardware_control/estop/__init__.py @@ -0,0 +1 @@ +"""Interface for managing and detecting the system estop.""" diff --git a/hardware/opentrons_hardware/hardware_control/estop/detector.py b/hardware/opentrons_hardware/hardware_control/estop/detector.py new file mode 100644 index 00000000000..d497cc1ef0d --- /dev/null +++ b/hardware/opentrons_hardware/hardware_control/estop/detector.py @@ -0,0 +1,112 @@ +"""Detector for estop status messages.""" +from opentrons_hardware.drivers.binary_usb import BinaryMessenger + +from typing import List, Callable + +from dataclasses import dataclass + +from opentrons_hardware.firmware_bindings.messages.binary_message_definitions import ( + BinaryMessageDefinition, + EstopButtonDetectionChange, + EstopStateChange, + EstopButtonPresentRequest, + EstopStateRequest, +) +from opentrons_shared_data.errors.exceptions import ( + InternalUSBCommunicationError, +) +from opentrons_hardware.firmware_bindings.binary_constants import BinaryMessageId + + +@dataclass +class EstopSummary: + """Summary of the detected estop state.""" + + left_detected: bool # Whether the left estop is connected + right_detected: bool # Whether the right estop is connected + engaged: bool # Whether either estop is engaged + + +EstopDetectorListener = Callable[[EstopSummary], None] + + +class EstopDetector: + """Class to listen for notification messages regarding estop state changes. + + This class simply listens for the rear panel's broadcasts when the estop + connectivity state changes. Higher-level classes may subscribe to + notifications for when the estop state changes, but no logic is applied + in this class. + """ + + def __init__( + self, usb_messenger: BinaryMessenger, initial_state: EstopSummary + ) -> None: + """Create a new EstopDetector.""" + self._usb_messenger = usb_messenger + self._state = initial_state + self._listeners: List[EstopDetectorListener] = [] + + usb_messenger.add_listener( + self._estop_connected_listener, + lambda message_id: bool( + message_id + in [ + BinaryMessageId.estop_state_change, + BinaryMessageId.estop_button_detection_change, + ] + ), + ) + + def __del__(self) -> None: + self._usb_messenger.remove_listener(self._estop_connected_listener) + + @staticmethod + async def build(usb_messenger: BinaryMessenger) -> "EstopDetector": + """Builder function to create a new estop detector.""" + estop_state = await usb_messenger.send_and_receive( + EstopStateRequest(), EstopStateChange + ) + detected = await usb_messenger.send_and_receive( + EstopButtonPresentRequest(), EstopButtonDetectionChange + ) + if not isinstance(estop_state, EstopStateChange) or not isinstance( + detected, EstopButtonDetectionChange + ): + raise InternalUSBCommunicationError( + "Could not get estop status from rear panel" + ) + initial_state = EstopSummary( + left_detected=detected.aux1_detected.value > 0, + right_detected=detected.aux2_detected.value > 0, + engaged=estop_state.engaged.value > 0, + ) + return EstopDetector(usb_messenger=usb_messenger, initial_state=initial_state) + + def add_listener(self, listener: EstopDetectorListener) -> None: + """Add a new listener for estop detector changes.""" + if listener not in self._listeners: + self._listeners.append(listener) + + def remove_listener(self, listener: EstopDetectorListener) -> None: + """Remove an existing listener for estop detector changes.""" + if listener in self._listeners: + self._listeners.remove(listener) + + @property + def status(self) -> EstopSummary: + """Gets the current estop status summary""" + return self._state + + def _estop_connected_listener(self, msg: BinaryMessageDefinition) -> None: + """The callback to parse messages with estop data.""" + if isinstance(msg, EstopButtonDetectionChange): + self._state.left_detected = msg.aux1_detected.value > 0 + self._state.right_detected = msg.aux2_detected.value > 0 + elif isinstance(msg, EstopStateChange): + self._state.engaged = msg.engaged.value > 0 + else: + # Don't call listeners if this was an unrelated message + return + for listener in self._listeners: + listener(self._state) diff --git a/hardware/opentrons_hardware/hardware_control/motion.py b/hardware/opentrons_hardware/hardware_control/motion.py index 4e2036b5a78..dfc9e9b5521 100644 --- a/hardware/opentrons_hardware/hardware_control/motion.py +++ b/hardware/opentrons_hardware/hardware_control/motion.py @@ -170,6 +170,19 @@ def create_home_step( return step +def create_tip_action_backoff_step(velocity: Dict[NodeId, np.float64]) -> MoveGroupStep: + """Create a sequence to back away from the limit switch and re-home.""" + backoff: MoveGroupStep = {} + for axis, v in velocity.items(): + backoff[axis] = MoveGroupTipActionStep( + velocity_mm_sec=abs(v), + duration_sec=abs(np.float64(BACKOFF_MAX_MM) / abs(v)), + stop_condition=MoveStopCondition.limit_switch_backoff, + action=PipetteTipActionType.home, + ) + return backoff + + def create_tip_action_step( velocity: Dict[NodeId, np.float64], distance: Dict[NodeId, np.float64], diff --git a/hardware/opentrons_hardware/hardware_control/move_group_runner.py b/hardware/opentrons_hardware/hardware_control/move_group_runner.py index 9ac624f2e8c..75b5757d858 100644 --- a/hardware/opentrons_hardware/hardware_control/move_group_runner.py +++ b/hardware/opentrons_hardware/hardware_control/move_group_runner.py @@ -352,27 +352,33 @@ def __init__(self, move_groups: MoveGroups, start_at_index: int = 0) -> None: self._durations: List[float] = [] self._stop_condition: List[List[MoveStopCondition]] = [] self._start_at_index = start_at_index - self._expected_tip_action_motors = [] + self._expected_tip_action_motors: List[List[List[GearMotorId]]] = [] for move_group in move_groups: move_set = set() duration = 0.0 stop_cond = [] + expected_motors = [] for seq_id, move in enumerate(move_group): movesteps = list(move.values()) move_set.update(set((k.value, seq_id) for k in move.keys())) duration += float(movesteps[0].duration_sec) if any(isinstance(g, MoveGroupTipActionStep) for g in movesteps): - self._expected_tip_action_motors = [ - GearMotorId.left, - GearMotorId.right, - ] + expected_motors.append( + [ + GearMotorId.left, + GearMotorId.right, + ] + ) + else: + expected_motors.append([]) for step in move_group[seq_id]: stop_cond.append(move_group[seq_id][step].stop_condition) self._moves.append(move_set) self._stop_condition.append(stop_cond) self._durations.append(duration) + self._expected_tip_action_motors.append(expected_motors) log.debug(f"Move scheduler running for groups {move_groups}") self._completion_queue: asyncio.Queue[_CompletionPacket] = asyncio.Queue() self._event = asyncio.Event() @@ -477,14 +483,21 @@ def __call__( self._remove_move_group(message, arbitration_id) self._handle_move_completed(message, arbitration_id) elif isinstance(message, TipActionResponse): - gear_id = GearMotorId(message.payload.gear_motor_id.value) - self._expected_tip_action_motors.remove(gear_id) - if len(self._expected_tip_action_motors) == 0: + if self._handle_tip_action_motors(message): self._remove_move_group(message, arbitration_id) self._handle_move_completed(message, arbitration_id) elif isinstance(message, ErrorMessage): self._handle_error(message, arbitration_id) + def _handle_tip_action_motors(self, message: TipActionResponse) -> bool: + gear_id = GearMotorId(message.payload.gear_motor_id.value) + group_id = message.payload.group_id.value - self._start_at_index + seq_id = message.payload.seq_id.value + self._expected_tip_action_motors[group_id][seq_id].remove(gear_id) + if len(self._expected_tip_action_motors[group_id][seq_id]) == 0: + return True + return False + def _get_nodes_in_move_group(self, group_id: int) -> List[NodeId]: nodes = [] for (node_id, seq_id) in self._moves[group_id - self._start_at_index]: @@ -539,8 +552,8 @@ async def _run_one_group(self, group_id: int, can_messenger: CanMessenger) -> No if error != ErrorCode.ok: log.error(f"received error trying to execute move group: {str(error)}") - expected_time = max(1.0, self._durations[group_id - self._start_at_index] * 1.1) - full_timeout = max(1.0, self._durations[group_id - self._start_at_index] * 2) + expected_time = max(3.0, self._durations[group_id - self._start_at_index] * 1.1) + full_timeout = max(5.0, self._durations[group_id - self._start_at_index] * 2) start_time = time.time() try: diff --git a/hardware/tests/opentrons_hardware/hardware_control/estop/test_estop_detector.py b/hardware/tests/opentrons_hardware/hardware_control/estop/test_estop_detector.py new file mode 100644 index 00000000000..1c3930d7f4b --- /dev/null +++ b/hardware/tests/opentrons_hardware/hardware_control/estop/test_estop_detector.py @@ -0,0 +1,133 @@ +"""Test the estop.detector module.""" +import pytest +from mock import AsyncMock +from typing import Type, List + +from opentrons_hardware.hardware_control.estop.detector import ( + EstopSummary, + EstopDetector, +) +from opentrons_hardware.firmware_bindings.utils import ( + UInt8Field, +) +from opentrons_shared_data.errors.exceptions import ( + InternalUSBCommunicationError, +) + +from opentrons_hardware.drivers.binary_usb import BinaryMessenger +from opentrons_hardware.firmware_bindings.messages.binary_message_definitions import ( + BinaryMessageDefinition, + EstopButtonDetectionChange, + EstopStateChange, + EstopButtonPresentRequest, + EstopStateRequest, + Ack, + AckFailed, +) +from opentrons_hardware.firmware_bindings.binary_constants import BinaryMessageId + + +@pytest.fixture +async def mock_binary_messenger() -> AsyncMock: + """Create a mocked binary messenger.""" + mock = AsyncMock(BinaryMessenger) + return mock + + +@pytest.fixture +async def subject(mock_binary_messenger: AsyncMock) -> EstopDetector: + """Create a mocked EstopDetector.""" + initial_state = EstopSummary(left_detected=True, right_detected=True, engaged=False) + return EstopDetector( + usb_messenger=mock_binary_messenger, initial_state=initial_state + ) + + +@pytest.mark.parametrize( + "initial_state", + [ + EstopSummary(left_detected=True, right_detected=False, engaged=False), + EstopSummary(left_detected=False, right_detected=True, engaged=True), + ], +) +async def test_estop_detector_builder( + mock_binary_messenger: AsyncMock, initial_state: EstopSummary +) -> None: + """Test the factory function for the estop detector.""" + + async def mock_send_and_receive( + message: BinaryMessageDefinition, response_type: Type[BinaryMessageDefinition] + ) -> BinaryMessageDefinition: + if isinstance(message, EstopButtonPresentRequest): + return EstopButtonDetectionChange( + aux1_detected=UInt8Field(1 if initial_state.left_detected else 0), + aux2_detected=UInt8Field(1 if initial_state.right_detected else 0), + ) + if isinstance(message, EstopStateRequest): + return EstopStateChange( + engaged=UInt8Field(1 if initial_state.engaged else 0) + ) + return response_type() + + mock_binary_messenger.send_and_receive.side_effect = mock_send_and_receive + subject = await EstopDetector.build(usb_messenger=mock_binary_messenger) + + assert subject.status == initial_state + + mock_binary_messenger.add_listener.assert_called_once() + + async def mock_send_and_receive_error( + message: BinaryMessageDefinition, response_type: Type[BinaryMessageDefinition] + ) -> BinaryMessageDefinition: + return AckFailed() + + mock_binary_messenger.send_and_receive.side_effect = mock_send_and_receive_error + with pytest.raises(InternalUSBCommunicationError): + subject = await EstopDetector.build(usb_messenger=mock_binary_messenger) + + +async def test_estop_detector_listener( + subject: EstopDetector, mock_binary_messenger: AsyncMock +) -> None: + """Test the listener filtering.""" + callback = mock_binary_messenger.add_listener.call_args.args[0] + filter = mock_binary_messenger.add_listener.call_args.args[1] + + assert not filter(BinaryMessageId.ack) + assert filter(BinaryMessageId.estop_state_change) + assert filter(BinaryMessageId.estop_button_detection_change) + + responses: List[EstopSummary] = [] + + def test_listener(summary: EstopSummary) -> None: + responses.append(summary) + + subject.add_listener(test_listener) + + # Callback should filter out unexpected messsages + callback(Ack()) + assert len(responses) == 0 + + # When getting a state change, the callback should fire + callback(EstopStateChange(engaged=UInt8Field(1))) + assert len(responses) == 1 + assert responses[0].engaged + assert responses[0] == subject.status + + # When getting a second state cahnge, the state should only change as expected + callback( + EstopButtonDetectionChange( + aux1_detected=UInt8Field(1), aux2_detected=UInt8Field(0) + ) + ) + assert len(responses) == 2 + assert responses[1].engaged + assert responses[1].left_detected + assert not responses[1].right_detected + assert responses[1] == subject.status + + # If we remove the listener, we should not get any more messages + subject.remove_listener(test_listener) + + callback(EstopStateChange(engaged=UInt8Field(0))) + assert len(responses) == 2 diff --git a/labware-library/src/__tests__/__snapshots__/labwareInference.test.ts.snap b/labware-library/src/__tests__/__snapshots__/labwareInference.test.ts.snap deleted file mode 100644 index e64f9dbe865..00000000000 --- a/labware-library/src/__tests__/__snapshots__/labwareInference.test.ts.snap +++ /dev/null @@ -1,58 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`getUniqueWellProperties fixture_96_plate 1`] = ` -Array [ - Object { - "brand": null, - "depth": 10.54, - "metadata": Object { - "wellBottomShape": "flat", - }, - "shape": Object { - "diameter": 6.4, - "shape": "circular", - }, - "totalLiquidVolume": 380, - "wellCount": 96, - "xOffsetFromLeft": 14.38, - "xSpacing": 9, - "yOffsetFromTop": 11.24, - "ySpacing": 9, - }, -] -`; - -exports[`getUniqueWellProperties fixture_irregular_example_1 1`] = ` -Array [ - Object { - "brand": null, - "depth": 10.54, - "metadata": Object {}, - "shape": Object { - "diameter": 10, - "shape": "circular", - }, - "totalLiquidVolume": 3000, - "wellCount": 50, - "xOffsetFromLeft": 10, - "xSpacing": 10, - "yOffsetFromTop": 55.48, - "ySpacing": 5, - }, - Object { - "brand": null, - "depth": 20.54, - "metadata": Object {}, - "shape": Object { - "diameter": 15, - "shape": "circular", - }, - "totalLiquidVolume": 10000, - "wellCount": 5, - "xOffsetFromLeft": 15, - "xSpacing": 10, - "yOffsetFromTop": 70.48, - "ySpacing": 0, - }, -] -`; diff --git a/labware-library/src/components/LabwareDetails/Dimensions.tsx b/labware-library/src/components/LabwareDetails/Dimensions.tsx index 3fccb714642..43d87f8aa32 100644 --- a/labware-library/src/components/LabwareDetails/Dimensions.tsx +++ b/labware-library/src/components/LabwareDetails/Dimensions.tsx @@ -1,6 +1,7 @@ // labware dimensions for details page import * as React from 'react' import round from 'lodash/round' +import { getFootprintDiagram } from '@opentrons/components' import { FOOTPRINT, MM, @@ -9,7 +10,6 @@ import { LABWARE_Z_DIM, } from '../../localization' import { LabeledValueTable, LowercaseText } from '../ui' -import { getFootprintDiagram } from '../measurement-guide' import type { LabwareDefinition } from '../../types' diff --git a/labware-library/src/components/LabwareDetails/InsertDetails.tsx b/labware-library/src/components/LabwareDetails/InsertDetails.tsx index 2b6bde054c7..fd920cdb03b 100644 --- a/labware-library/src/components/LabwareDetails/InsertDetails.tsx +++ b/labware-library/src/components/LabwareDetails/InsertDetails.tsx @@ -1,7 +1,7 @@ // full-width labware details import * as React from 'react' -import { getUniqueWellProperties } from '../../labwareInference' +import { getUniqueWellProperties } from '@opentrons/shared-data' import { getWellLabel, WellProperties, ManufacturerStats } from '../labware-ui' import { DetailsBox } from '../ui' import { WellDimensions } from './WellDimensions' diff --git a/labware-library/src/components/LabwareDetails/LabwareDetailsBox.tsx b/labware-library/src/components/LabwareDetails/LabwareDetailsBox.tsx index d3b00984169..3b34111f00e 100644 --- a/labware-library/src/components/LabwareDetails/LabwareDetailsBox.tsx +++ b/labware-library/src/components/LabwareDetails/LabwareDetailsBox.tsx @@ -1,6 +1,6 @@ // full-width labware details import * as React from 'react' -import { getUniqueWellProperties } from '../../labwareInference' +import { getUniqueWellProperties } from '@opentrons/shared-data' import { getWellLabel, WellCount, diff --git a/labware-library/src/components/LabwareDetails/WellDimensions.tsx b/labware-library/src/components/LabwareDetails/WellDimensions.tsx index 97d00e82340..837d7c92092 100644 --- a/labware-library/src/components/LabwareDetails/WellDimensions.tsx +++ b/labware-library/src/components/LabwareDetails/WellDimensions.tsx @@ -1,7 +1,7 @@ // well dimensions and spacing for details page import * as React from 'react' import round from 'lodash/round' - +import { getMeasurementDiagram } from '@opentrons/components' import { MEASUREMENTS, WELL_X_DIM, @@ -12,7 +12,6 @@ import { MM, } from '../../localization' import { LabeledValueTable, LowercaseText } from '../ui' -import { getMeasurementDiagram } from '../measurement-guide' import type { LabwareWellGroupProperties, LabwareParameters } from '../../types' diff --git a/labware-library/src/components/LabwareDetails/WellSpacing.tsx b/labware-library/src/components/LabwareDetails/WellSpacing.tsx index 4689099bdd2..ad2dd893ad6 100644 --- a/labware-library/src/components/LabwareDetails/WellSpacing.tsx +++ b/labware-library/src/components/LabwareDetails/WellSpacing.tsx @@ -1,7 +1,7 @@ // well dimensions and spacing for details page import * as React from 'react' import round from 'lodash/round' - +import { getSpacingDiagram } from '@opentrons/components' import { SPACING, X_OFFSET, @@ -16,7 +16,6 @@ import { import styles from './styles.css' import { LabeledValueTable, LowercaseText } from '../ui' -import { getSpacingDiagram } from '../measurement-guide' import type { LabwareWellGroupProperties } from '../../types' diff --git a/labware-library/src/components/labware-ui/WellProperties.tsx b/labware-library/src/components/labware-ui/WellProperties.tsx index 4c73176c049..13b93c9f893 100644 --- a/labware-library/src/components/labware-ui/WellProperties.tsx +++ b/labware-library/src/components/labware-ui/WellProperties.tsx @@ -1,7 +1,9 @@ import * as React from 'react' import { Icon } from '@opentrons/components' -import { getDisplayVolume } from '@opentrons/shared-data' -import { getUniqueWellProperties } from '../../labwareInference' +import { + getDisplayVolume, + getUniqueWellProperties, +} from '@opentrons/shared-data' import { MAX_VOLUME, SHAPE, diff --git a/labware-library/src/components/measurement-guide/images/depth/depth-plate-flat@3x.png b/labware-library/src/components/measurement-guide/images/depth/depth-plate-flat@3x.png deleted file mode 100755 index a83dc7f2e22..00000000000 Binary files a/labware-library/src/components/measurement-guide/images/depth/depth-plate-flat@3x.png and /dev/null differ diff --git a/labware-library/src/components/measurement-guide/images/depth/depth-plate-round@3x.png b/labware-library/src/components/measurement-guide/images/depth/depth-plate-round@3x.png deleted file mode 100755 index d4c87c7c63c..00000000000 Binary files a/labware-library/src/components/measurement-guide/images/depth/depth-plate-round@3x.png and /dev/null differ diff --git a/labware-library/src/components/measurement-guide/images/depth/depth-plate-v@3x.png b/labware-library/src/components/measurement-guide/images/depth/depth-plate-v@3x.png deleted file mode 100755 index 2c870ca0688..00000000000 Binary files a/labware-library/src/components/measurement-guide/images/depth/depth-plate-v@3x.png and /dev/null differ diff --git a/labware-library/src/components/measurement-guide/images/depth/depth-reservoir-and-tubes-flat@3x.png b/labware-library/src/components/measurement-guide/images/depth/depth-reservoir-and-tubes-flat@3x.png deleted file mode 100755 index 969b80e5fec..00000000000 Binary files a/labware-library/src/components/measurement-guide/images/depth/depth-reservoir-and-tubes-flat@3x.png and /dev/null differ diff --git a/labware-library/src/components/measurement-guide/images/depth/depth-reservoir-and-tubes-round@3x.png b/labware-library/src/components/measurement-guide/images/depth/depth-reservoir-and-tubes-round@3x.png deleted file mode 100755 index dcc5c0f4408..00000000000 Binary files a/labware-library/src/components/measurement-guide/images/depth/depth-reservoir-and-tubes-round@3x.png and /dev/null differ diff --git a/labware-library/src/components/measurement-guide/images/depth/depth-reservoir-and-tubes-v@3x.png b/labware-library/src/components/measurement-guide/images/depth/depth-reservoir-and-tubes-v@3x.png deleted file mode 100755 index 85fad20a1aa..00000000000 Binary files a/labware-library/src/components/measurement-guide/images/depth/depth-reservoir-and-tubes-v@3x.png and /dev/null differ diff --git a/labware-library/src/components/measurement-guide/images/depth/length-tip-rack@3x.png b/labware-library/src/components/measurement-guide/images/depth/length-tip-rack@3x.png deleted file mode 100755 index 609ac02ff1c..00000000000 Binary files a/labware-library/src/components/measurement-guide/images/depth/length-tip-rack@3x.png and /dev/null differ diff --git a/labware-library/src/components/measurement-guide/images/dimensions/footprint@3x.png b/labware-library/src/components/measurement-guide/images/dimensions/footprint@3x.png deleted file mode 100755 index 4cf1b052683..00000000000 Binary files a/labware-library/src/components/measurement-guide/images/dimensions/footprint@3x.png and /dev/null differ diff --git a/labware-library/src/components/measurement-guide/images/dimensions/height-alum-block-plate@3x.png b/labware-library/src/components/measurement-guide/images/dimensions/height-alum-block-plate@3x.png deleted file mode 100755 index 2c69cf54b15..00000000000 Binary files a/labware-library/src/components/measurement-guide/images/dimensions/height-alum-block-plate@3x.png and /dev/null differ diff --git a/labware-library/src/components/measurement-guide/images/dimensions/height-alum-block-tubes@3x.png b/labware-library/src/components/measurement-guide/images/dimensions/height-alum-block-tubes@3x.png deleted file mode 100755 index 8e168e4ee39..00000000000 Binary files a/labware-library/src/components/measurement-guide/images/dimensions/height-alum-block-tubes@3x.png and /dev/null differ diff --git a/labware-library/src/components/measurement-guide/images/dimensions/height-plate-and-reservoir@3x.png b/labware-library/src/components/measurement-guide/images/dimensions/height-plate-and-reservoir@3x.png deleted file mode 100755 index 1dd41888974..00000000000 Binary files a/labware-library/src/components/measurement-guide/images/dimensions/height-plate-and-reservoir@3x.png and /dev/null differ diff --git a/labware-library/src/components/measurement-guide/images/dimensions/height-tip-rack@3x.png b/labware-library/src/components/measurement-guide/images/dimensions/height-tip-rack@3x.png deleted file mode 100755 index ebde1fe8cbe..00000000000 Binary files a/labware-library/src/components/measurement-guide/images/dimensions/height-tip-rack@3x.png and /dev/null differ diff --git a/labware-library/src/components/measurement-guide/images/dimensions/height-tube-rack-irregular@3x.png b/labware-library/src/components/measurement-guide/images/dimensions/height-tube-rack-irregular@3x.png deleted file mode 100755 index 25237f0ab24..00000000000 Binary files a/labware-library/src/components/measurement-guide/images/dimensions/height-tube-rack-irregular@3x.png and /dev/null differ diff --git a/labware-library/src/components/measurement-guide/images/dimensions/height-tube-rack@3x.png b/labware-library/src/components/measurement-guide/images/dimensions/height-tube-rack@3x.png deleted file mode 100755 index 7bd0963ae6b..00000000000 Binary files a/labware-library/src/components/measurement-guide/images/dimensions/height-tube-rack@3x.png and /dev/null differ diff --git a/labware-library/src/components/measurement-guide/images/offset/offset-reservoir@3x.png b/labware-library/src/components/measurement-guide/images/offset/offset-reservoir@3x.png deleted file mode 100755 index 85919ddcf3a..00000000000 Binary files a/labware-library/src/components/measurement-guide/images/offset/offset-reservoir@3x.png and /dev/null differ diff --git a/labware-library/src/components/measurement-guide/images/offset/offset-well-circular@3x.png b/labware-library/src/components/measurement-guide/images/offset/offset-well-circular@3x.png deleted file mode 100755 index 923ab89828e..00000000000 Binary files a/labware-library/src/components/measurement-guide/images/offset/offset-well-circular@3x.png and /dev/null differ diff --git a/labware-library/src/components/measurement-guide/images/offset/offset-well-rectangular@3x.png b/labware-library/src/components/measurement-guide/images/offset/offset-well-rectangular@3x.png deleted file mode 100755 index f4be15a312d..00000000000 Binary files a/labware-library/src/components/measurement-guide/images/offset/offset-well-rectangular@3x.png and /dev/null differ diff --git a/labware-library/src/components/measurement-guide/images/shape/shape-circular@3x.png b/labware-library/src/components/measurement-guide/images/shape/shape-circular@3x.png deleted file mode 100755 index 1a410a5a67c..00000000000 Binary files a/labware-library/src/components/measurement-guide/images/shape/shape-circular@3x.png and /dev/null differ diff --git a/labware-library/src/components/measurement-guide/images/shape/shape-rectangular@3x.png b/labware-library/src/components/measurement-guide/images/shape/shape-rectangular@3x.png deleted file mode 100755 index d1f51f39fb1..00000000000 Binary files a/labware-library/src/components/measurement-guide/images/shape/shape-rectangular@3x.png and /dev/null differ diff --git a/labware-library/src/components/measurement-guide/images/spacing/spacing-reservoir-multi-row@3x.png b/labware-library/src/components/measurement-guide/images/spacing/spacing-reservoir-multi-row@3x.png deleted file mode 100755 index 65be7dbd29f..00000000000 Binary files a/labware-library/src/components/measurement-guide/images/spacing/spacing-reservoir-multi-row@3x.png and /dev/null differ diff --git a/labware-library/src/components/measurement-guide/images/spacing/spacing-reservoir@3x.png b/labware-library/src/components/measurement-guide/images/spacing/spacing-reservoir@3x.png deleted file mode 100755 index 167a58ed826..00000000000 Binary files a/labware-library/src/components/measurement-guide/images/spacing/spacing-reservoir@3x.png and /dev/null differ diff --git a/labware-library/src/components/measurement-guide/images/spacing/spacing-well-circular@3x.png b/labware-library/src/components/measurement-guide/images/spacing/spacing-well-circular@3x.png deleted file mode 100755 index 77dffac185c..00000000000 Binary files a/labware-library/src/components/measurement-guide/images/spacing/spacing-well-circular@3x.png and /dev/null differ diff --git a/labware-library/src/components/measurement-guide/images/spacing/spacing-well-rectangular@3x.png b/labware-library/src/components/measurement-guide/images/spacing/spacing-well-rectangular@3x.png deleted file mode 100755 index 84d0048da38..00000000000 Binary files a/labware-library/src/components/measurement-guide/images/spacing/spacing-well-rectangular@3x.png and /dev/null differ diff --git a/labware-library/src/components/measurement-guide/index.ts b/labware-library/src/components/measurement-guide/index.ts deleted file mode 100644 index f9091a5b7ef..00000000000 --- a/labware-library/src/components/measurement-guide/index.ts +++ /dev/null @@ -1,174 +0,0 @@ -export interface DiagramProps { - guideType?: string - category?: string - insertCategory?: string - shape?: string - wellBottomShape?: string - guideVisible?: boolean - irregular?: boolean - isMultiRow?: boolean -} - -type Diagrams = Record - -const FOOTPRINT_DIAGRAMS: Diagrams = { - wellPlate: [ - require('./images/dimensions/footprint@3x.png'), - require('./images/dimensions/height-plate-and-reservoir@3x.png'), - ], - tipRack: [ - require('./images/dimensions/footprint@3x.png'), - require('./images/dimensions/height-tip-rack@3x.png'), - ], - tubeRack: [ - require('./images/dimensions/footprint@3x.png'), - require('./images/dimensions/height-tube-rack@3x.png'), - ], - reservoir: [ - require('./images/dimensions/footprint@3x.png'), - require('./images/dimensions/height-plate-and-reservoir@3x.png'), - ], - irregular: [ - require('./images/dimensions/footprint@3x.png'), - require('./images/dimensions/height-tube-rack-irregular@3x.png'), - ], -} - -const ALUM_BLOCK_FOOTPRINTS: Diagrams = { - tubeRack: [ - require('./images/dimensions/footprint@3x.png'), - require('./images/dimensions/height-alum-block-tubes@3x.png'), - ], - wellPlate: [ - require('./images/dimensions/footprint@3x.png'), - require('./images/dimensions/height-alum-block-plate@3x.png'), - ], -} - -const RESERVOIR_SPACING_DIAGRAMS: Diagrams = { - singleRow: [ - require('./images/offset/offset-reservoir@3x.png'), - require('./images/spacing/spacing-reservoir@3x.png'), - ], - multiRow: [ - require('./images/offset/offset-reservoir@3x.png'), - require('./images/spacing/spacing-reservoir-multi-row@3x.png'), - ], -} - -const SPACING_DIAGRAMS: Diagrams = { - circular: [ - require('./images/offset/offset-well-circular@3x.png'), - require('./images/spacing/spacing-well-circular@3x.png'), - ], - rectangular: [ - require('./images/offset/offset-well-rectangular@3x.png'), - require('./images/spacing/spacing-well-rectangular@3x.png'), - ], -} - -const TIPRACK_MEASUREMENT_DIAGRAMS: string[] = [ - require('./images/depth/length-tip-rack@3x.png'), - require('./images/shape/shape-circular@3x.png'), -] - -type NestedDiagrams = Record> - -const PLATE_MEASUREMENT_DIAGRAMS: NestedDiagrams = { - flat: { - circular: [ - require('./images/depth/depth-plate-flat@3x.png'), - require('./images/shape/shape-circular@3x.png'), - ], - rectangular: [ - require('./images/depth/depth-plate-flat@3x.png'), - require('./images/shape/shape-rectangular@3x.png'), - ], - }, - u: { - circular: [ - require('./images/depth/depth-plate-round@3x.png'), - require('./images/shape/shape-circular@3x.png'), - ], - rectangular: [ - require('./images/depth/depth-plate-round@3x.png'), - require('./images/shape/shape-rectangular@3x.png'), - ], - }, - v: { - circular: [ - require('./images/depth/depth-plate-v@3x.png'), - require('./images/shape/shape-circular@3x.png'), - ], - rectangular: [ - require('./images/depth/depth-plate-v@3x.png'), - require('./images/shape/shape-rectangular@3x.png'), - ], - }, -} -const MEASUREMENT_DIAGRAMS: NestedDiagrams = { - flat: { - circular: [ - require('./images/depth/depth-reservoir-and-tubes-flat@3x.png'), - require('./images/shape/shape-circular@3x.png'), - ], - rectangular: [ - require('./images/depth/depth-reservoir-and-tubes-flat@3x.png'), - require('./images/shape/shape-rectangular@3x.png'), - ], - }, - u: { - circular: [ - require('./images/depth/depth-reservoir-and-tubes-round@3x.png'), - require('./images/shape/shape-circular@3x.png'), - ], - rectangular: [ - require('./images/depth/depth-reservoir-and-tubes-round@3x.png'), - require('./images/shape/shape-rectangular@3x.png'), - ], - }, - v: { - circular: [ - require('./images/depth/depth-reservoir-and-tubes-v@3x.png'), - require('./images/shape/shape-circular@3x.png'), - ], - rectangular: [ - require('./images/depth/depth-reservoir-and-tubes-v@3x.png'), - require('./images/shape/shape-rectangular@3x.png'), - ], - }, -} - -export function getFootprintDiagram(props: DiagramProps): string[] { - const { category, insertCategory, irregular } = props - if (category === 'aluminumBlock') { - return insertCategory ? ALUM_BLOCK_FOOTPRINTS[insertCategory] : [] - } else if (category === 'tubeRack' && irregular) { - return FOOTPRINT_DIAGRAMS.irregular - } - return category ? FOOTPRINT_DIAGRAMS[category] : [] -} - -export function getSpacingDiagram(props: DiagramProps): string[] { - const { category, isMultiRow, shape } = props - if (category === 'reservoir') { - return isMultiRow - ? RESERVOIR_SPACING_DIAGRAMS.multiRow - : RESERVOIR_SPACING_DIAGRAMS.singleRow - } - - return shape ? SPACING_DIAGRAMS[shape] : [] -} - -export function getMeasurementDiagram(props: DiagramProps): string[] { - const { category, wellBottomShape, shape } = props - if (category === 'tipRack') return TIPRACK_MEASUREMENT_DIAGRAMS - else if (category === 'wellPlate') { - return wellBottomShape && shape - ? PLATE_MEASUREMENT_DIAGRAMS[wellBottomShape][shape] - : [] - } - return wellBottomShape && shape - ? MEASUREMENT_DIAGRAMS[wellBottomShape][shape] - : [] -} diff --git a/labware-library/src/labware-creator/labwareDefToFields.ts b/labware-library/src/labware-creator/labwareDefToFields.ts index cc9ca65c927..36d6c1aaae9 100644 --- a/labware-library/src/labware-creator/labwareDefToFields.ts +++ b/labware-library/src/labware-creator/labwareDefToFields.ts @@ -1,4 +1,4 @@ -import { getUniqueWellProperties } from '../labwareInference' +import { getUniqueWellProperties } from '@opentrons/shared-data' import type { LabwareDefinition2, LabwareWellGroup, diff --git a/protocol-designer/src/components/StepCreationButton.tsx b/protocol-designer/src/components/StepCreationButton.tsx index 9a26cc44128..53af78e40e0 100644 --- a/protocol-designer/src/components/StepCreationButton.tsx +++ b/protocol-designer/src/components/StepCreationButton.tsx @@ -1,6 +1,5 @@ import * as React from 'react' import { useDispatch, useSelector } from 'react-redux' -import cx from 'classnames' import { Tooltip, DeprecatedPrimaryButton, @@ -72,31 +71,26 @@ export const StepCreationButtonComponent = ( export interface StepButtonItemProps { onClick: () => unknown - disabled: boolean stepType: StepType } export function StepButtonItem(props: StepButtonItemProps): JSX.Element { - const { onClick, disabled, stepType } = props + const { onClick, stepType } = props const [targetProps, tooltipProps] = useHoverTooltip({ placement: TOOLTIP_RIGHT, strategy: TOOLTIP_FIXED, }) - const tooltipMessage = disabled - ? i18n.t(`tooltip.disabled_module_step`) - : i18n.t(`tooltip.step_description.${stepType}`) + const tooltipMessage = i18n.t(`tooltip.step_description.${stepType}`) return ( <> - - {i18n.t(`application.stepType.${stepType}`, stepType)} - +
    + + {i18n.t(`application.stepType.${stepType}`, stepType)} + +
    {tooltipMessage} ) @@ -150,22 +144,23 @@ export const StepCreationButton = (): JSX.Element => { ): ReturnType => dispatch(stepsActions.addAndSelectStepWithHints({ stepType })) - const items = getSupportedSteps().map(stepType => ( - { - setExpanded(false) + const items = getSupportedSteps() + .filter(stepType => isStepTypeEnabled[stepType]) + .map(stepType => ( + { + setExpanded(false) - if (currentFormIsPresaved || formHasChanges) { - setEnqueuedStepType(stepType) - } else { - addStep(stepType) - } - }} - /> - )) + if (currentFormIsPresaved || formHasChanges) { + setEnqueuedStepType(stepType) + } else { + addStep(stepType) + } + }} + /> + )) return ( <> diff --git a/protocol-designer/src/components/__tests__/StepCreationButton.test.tsx b/protocol-designer/src/components/__tests__/StepCreationButton.test.tsx index 4d862fa845f..4dbad0244e2 100644 --- a/protocol-designer/src/components/__tests__/StepCreationButton.test.tsx +++ b/protocol-designer/src/components/__tests__/StepCreationButton.test.tsx @@ -118,20 +118,13 @@ describe('StepCreationButton', () => { }) wrapper.update() const updatedAddStepButton = wrapper.find(StepCreationButtonComponent) - // all 6 step button items render as children + // all 8 step button items render as children const stepButtonItems = updatedAddStepButton.find(StepButtonItem) - expect(stepButtonItems).toHaveLength(8) - // modules are disabled since there are no modules on deck - const disabledModuleSteps = stepButtonItems.find({ disabled: true }) - expect(disabledModuleSteps).toHaveLength(4) + // length 4 since there are no modules on deck + expect(stepButtonItems).toHaveLength(4) // enabled button tooltip const mixTooltip = stepButtonItems.at(2).find(Tooltip) expect(mixTooltip.prop('children')).toBe('Mix contents of wells/tubes.') - // disabled module step button tooltip - const disabledButtonTooltip = stepButtonItems.at(4).find(Tooltip) - expect(disabledButtonTooltip.prop('children')).toBe( - 'Add a relevant module to use this step' - ) }) it('enables module step types when present on the deck', () => { @@ -158,12 +151,10 @@ describe('StepCreationButton', () => { wrapper.update() const updatedAddStepButton = wrapper.find(StepCreationButtonComponent) const stepButtonItems = updatedAddStepButton.find(StepButtonItem) - - // temperature step enabled since it is on the deck - const disabledModuleSteps = stepButtonItems.find({ disabled: true }) - expect(disabledModuleSteps).toHaveLength(3) + // length 5 since there is a temperature module on deck + expect(stepButtonItems).toHaveLength(5) // enabled temperature module step tooltip - const enabledButtonTooltip = stepButtonItems.at(6).find(Tooltip) + const enabledButtonTooltip = stepButtonItems.at(4).find(Tooltip) expect(enabledButtonTooltip.prop('children')).toBe( 'Set temperature command for Temperature module.' ) diff --git a/protocol-designer/src/components/listButtons.css b/protocol-designer/src/components/listButtons.css index 82dd7e9353f..ee55a5cd367 100644 --- a/protocol-designer/src/components/listButtons.css +++ b/protocol-designer/src/components/listButtons.css @@ -1,7 +1,7 @@ @import '@opentrons/components'; .list_item_button { - z-index: 11; + z-index: 10; position: relative; padding: 1rem 2rem 1.25rem 2rem; } diff --git a/protocol-designer/src/components/steplist/StepList.tsx b/protocol-designer/src/components/steplist/StepList.tsx index 175ef088d49..da83c2afb16 100644 --- a/protocol-designer/src/components/steplist/StepList.tsx +++ b/protocol-designer/src/components/steplist/StepList.tsx @@ -48,22 +48,20 @@ export class StepList extends React.Component { render(): React.ReactNode { return ( - - - + + - - - - - - - + + + + + + ) } } diff --git a/protocol-designer/src/localization/en/tooltip.json b/protocol-designer/src/localization/en/tooltip.json index b23c5312cf4..6b15ac530c2 100644 --- a/protocol-designer/src/localization/en/tooltip.json +++ b/protocol-designer/src/localization/en/tooltip.json @@ -15,8 +15,6 @@ "heaterShaker": "Set heat, shake, or labware latch commands for the Heater-Shaker module" }, - "disabled_module_step": "Add a relevant module to use this step", - "step_fields": { "defaults": { "aspirate_airGap_checkbox": "Aspirate air before moving to next well", diff --git a/robot-server/robot_server/hardware.py b/robot-server/robot_server/hardware.py index 2bfa4ea4b36..ed9bca3c5ee 100644 --- a/robot-server/robot_server/hardware.py +++ b/robot-server/robot_server/hardware.py @@ -52,6 +52,8 @@ from .subsystems.models import SubSystem from .service.task_runner import TaskRunner, get_task_runner +from .robot.control.estop_handler import EstopHandler + if TYPE_CHECKING: from opentrons.hardware_control.ot3api import OT3API @@ -69,6 +71,7 @@ _firmware_update_manager_accessor = AppStateAccessor[FirmwareUpdateManager]( "firmware_update_manager" ) +_estop_handler_accessor = AppStateAccessor[EstopHandler]("estop_handler") class _ExcPassthrough(BaseException): @@ -216,6 +219,20 @@ async def get_firmware_update_manager( return update_manager +async def get_estop_handler( + app_state: AppState = Depends(get_app_state), + thread_manager: ThreadManagedHardware = Depends(get_thread_manager), +) -> EstopHandler: + """Get an Estop Handler for working with the estop.""" + hardware = get_ot3_hardware(thread_manager) + estop_handler = _estop_handler_accessor.get_from(app_state) + + if estop_handler is None: + estop_handler = EstopHandler(hw_handle=hardware) + _estop_handler_accessor.set_on(app_state, estop_handler) + return estop_handler + + async def get_robot_type() -> RobotType: """Return what kind of robot this server is running on.""" return "OT-3 Standard" if should_use_ot3() else "OT-2 Standard" diff --git a/robot-server/robot_server/robot/calibration/check/user_flow.py b/robot-server/robot_server/robot/calibration/check/user_flow.py index 189ffcbfe27..1e9547cf29d 100644 --- a/robot-server/robot_server/robot/calibration/check/user_flow.py +++ b/robot-server/robot_server/robot/calibration/check/user_flow.py @@ -533,7 +533,7 @@ def get_instruments(self) -> List[CheckAttachedPipette]: CheckAttachedPipette( model=hw_pip.model, name=hw_pip.name, - tipLength=hw_pip.config.tip_length, + tipLength=hw_pip.active_tip_settings.default_tip_length, tipRackLoadName=info_pip.tip_rack.load_name, tipRackDisplay=info_pip.tip_rack._core.get_definition()["metadata"][ "displayName" @@ -558,7 +558,7 @@ def get_active_pipette(self) -> CheckAttachedPipette: return CheckAttachedPipette( model=self.hw_pipette.model, name=self.hw_pipette.name, - tipLength=self.hw_pipette.config.tip_length, + tipLength=self.hw_pipette.active_tip_settings.default_tip_length, tipRackLoadName=self.active_pipette.tip_rack.load_name, tipRackDisplay=display_name, tipRackUri=self.active_pipette.tip_rack.uri, @@ -840,8 +840,8 @@ def _get_tip_length(self) -> float: self.active_tiprack._core.get_definition(), ).tipLength except cal_types.TipLengthCalNotFound: - tip_overlap = self.hw_pipette.config.tip_overlap.get( - self.active_tiprack.uri, self.hw_pipette.config.tip_overlap["default"] + tip_overlap = self.hw_pipette.tip_overlap.get( + self.active_tiprack.uri, self.hw_pipette.tip_overlap["default"] ) tip_length = self.active_tiprack.tip_length return tip_length - tip_overlap diff --git a/robot-server/robot_server/robot/calibration/deck/user_flow.py b/robot-server/robot_server/robot/calibration/deck/user_flow.py index d926c84830e..4b981b0f559 100644 --- a/robot-server/robot_server/robot/calibration/deck/user_flow.py +++ b/robot-server/robot_server/robot/calibration/deck/user_flow.py @@ -36,6 +36,7 @@ from opentrons.util import linal from opentrons_shared_data.labware.dev_types import LabwareDefinition +from opentrons_shared_data.pipette.dev_types import LabwareUri from robot_server.robot.calibration.constants import TIP_RACK_LOOKUP_BY_MAX_VOL from robot_server.service.errors import RobotServerError @@ -178,7 +179,7 @@ def get_pipette(self) -> Optional[AttachedPipette]: return AttachedPipette( model=self._hw_pipette.model, name=self._hw_pipette.name, - tipLength=self._hw_pipette.config.tip_length, + tipLength=self._hw_pipette.active_tip_settings.default_tip_length, mount=str(self._mount), serial=self._hw_pipette.pipette_id, # type: ignore[arg-type] defaultTipracks=self._default_tipracks, @@ -235,7 +236,9 @@ def _get_tip_rack_lw( return labware.load(lw_load_name, self._deck.position_for(TIP_RACK_SLOT)) def _get_default_tipracks(self): - return uf.get_default_tipracks(self.hw_pipette.config.default_tipracks) + return uf.get_default_tipracks( + cast(List[LabwareUri], self.hw_pipette.config.default_tipracks) + ) def _build_expected_points_dict(self) -> ExpectedPoints: pos_1 = self._deck.get_calibration_position(POINT_ONE_ID).position @@ -356,7 +359,7 @@ def _get_tip_length(self) -> float: self._tip_rack._core.get_definition(), ).tipLength except cal_types.TipLengthCalNotFound: - tip_overlap = self._hw_pipette.config.tip_overlap.get(self._tip_rack.uri, 0) + tip_overlap = self._hw_pipette.tip_overlap.get(self._tip_rack.uri, 0) tip_length = self._tip_rack.tip_length return tip_length - tip_overlap diff --git a/robot-server/robot_server/robot/calibration/pipette_offset/user_flow.py b/robot-server/robot_server/robot/calibration/pipette_offset/user_flow.py index 43fac4978de..b406a0259b1 100644 --- a/robot-server/robot_server/robot/calibration/pipette_offset/user_flow.py +++ b/robot-server/robot_server/robot/calibration/pipette_offset/user_flow.py @@ -8,6 +8,7 @@ Optional, Union, Tuple, + cast, ) from opentrons.calibration_storage import ( helpers, @@ -24,6 +25,7 @@ from opentrons.protocols.api_support.deck_type import ( guess_from_global_config as guess_deck_type_from_global_config, ) +from opentrons_shared_data.pipette.dev_types import LabwareUri from opentrons.protocol_api import labware from opentrons.protocol_api.core.legacy.deck import Deck from opentrons.types import Mount, Point, Location @@ -144,7 +146,7 @@ def __init__( self._hw_pipette.reset_pipette_offset(self._mount, to_default=True) self._default_tipracks = util.get_default_tipracks( - self.hw_pipette.config.default_tipracks + cast(List[LabwareUri], self.hw_pipette.config.default_tipracks) ) self._supported_commands = SupportedCommands(namespace="calibration") self._supported_commands.loadLabware = True @@ -191,7 +193,7 @@ def get_pipette(self) -> AttachedPipette: return AttachedPipette( model=self._hw_pipette.model, name=self._hw_pipette.name, - tipLength=self._hw_pipette.config.tip_length, + tipLength=self._hw_pipette.active_tip_settings.default_tip_length, mount=str(self._mount), serial=self._hw_pipette.pipette_id, # type: ignore[arg-type] defaultTipracks=self._default_tipracks, # type: ignore[arg-type] @@ -320,7 +322,7 @@ def _get_stored_pipette_offset_cal( def _get_tip_length(self) -> float: stored_tip_length_cal = self._get_stored_tip_length_cal() if stored_tip_length_cal is None or self._should_perform_tip_length: - tip_overlap = self._hw_pipette.config.tip_overlap.get(self._tip_rack.uri, 0) + tip_overlap = self._hw_pipette.tip_overlap.get(self._tip_rack.uri, 0) tip_length = self._tip_rack.tip_length return tip_length - tip_overlap else: diff --git a/robot-server/robot_server/robot/calibration/tip_length/user_flow.py b/robot-server/robot_server/robot/calibration/tip_length/user_flow.py index b10ce06ed0a..ba2d649c914 100644 --- a/robot-server/robot_server/robot/calibration/tip_length/user_flow.py +++ b/robot-server/robot_server/robot/calibration/tip_length/user_flow.py @@ -1,5 +1,5 @@ import logging -from typing import Dict, Awaitable, Callable, Any, Set, List, Optional +from typing import Dict, Awaitable, Callable, Any, Set, List, Optional, cast from opentrons.types import Mount, Point, Location from opentrons.hardware_control import HardwareControlAPI, CriticalPoint, Pipette @@ -10,6 +10,7 @@ from opentrons.protocol_api.core.legacy.deck import Deck from opentrons_shared_data.labware.dev_types import LabwareDefinition +from opentrons_shared_data.pipette.dev_types import LabwareUri from robot_server.robot.calibration import util from robot_server.service.errors import RobotServerError @@ -78,7 +79,7 @@ def __init__( CalibrationCommand.exit: self.exit_session, } self._default_tipracks = util.get_default_tipracks( - self.hw_pipette.config.default_tipracks + cast(List[LabwareUri], self.hw_pipette.config.default_tipracks) ) self._supported_commands = SupportedCommands(namespace="calibration") @@ -130,7 +131,7 @@ def get_pipette(self) -> AttachedPipette: return AttachedPipette( model=self._hw_pipette.model, name=self._hw_pipette.name, - tipLength=self._hw_pipette.config.tip_length, + tipLength=self._hw_pipette.active_tip_settings.default_tip_length, mount=str(self._mount), serial=self._hw_pipette.pipette_id, # type: ignore[arg-type] defaultTipracks=self._default_tipracks, # type: ignore[arg-type] @@ -192,7 +193,7 @@ async def save_offset(self): def _get_default_tip_length(self) -> float: tiprack: labware.Labware = self._deck[TIP_RACK_SLOT] # type: ignore full_length = tiprack.tip_length - overlap_dict: Dict[str, float] = self._hw_pipette.config.tip_overlap + overlap_dict: Dict[str, float] = self._hw_pipette.tip_overlap overlap = overlap_dict.get(tiprack.uri, 0) return full_length - overlap diff --git a/robot-server/robot_server/robot/calibration/util.py b/robot-server/robot_server/robot/calibration/util.py index 86da2533b2c..ec8c7aeb536 100644 --- a/robot-server/robot_server/robot/calibration/util.py +++ b/robot-server/robot_server/robot/calibration/util.py @@ -115,13 +115,13 @@ async def invalidate_tip(user_flow: CalibrationUserFlow): @contextlib.contextmanager def save_default_pick_up_current(instr: Pipette): # reduce pick up current for multichannel pipette picking up 1 tip - saved_default = instr.config.pick_up_current - instr.update_config_item("pick_up_current", 0.1) + saved_default = instr.pick_up_configurations.current + instr.update_config_item({"pick_up_current": 0.1}) try: yield finally: - instr.update_config_item("pick_up_current", saved_default) + instr.update_config_item({"pick_up_current": saved_default}) async def pick_up_tip(user_flow: CalibrationUserFlow, tip_length: float): @@ -147,7 +147,7 @@ async def return_tip(user_flow: CalibrationUserFlow, tip_length: float): attached tip's length to determine proper z offset """ if user_flow.tip_origin and user_flow.hw_pipette.has_tip: - coeff = user_flow.hw_pipette.config.return_tip_height + coeff = user_flow.hw_pipette.active_tip_settings.default_return_tip_height to_pt = user_flow.tip_origin - Point(0, 0, tip_length * coeff) cp = user_flow.critical_point_override await user_flow.hardware.move_to( diff --git a/robot-server/robot_server/robot/control/estop_handler.py b/robot-server/robot_server/robot/control/estop_handler.py new file mode 100644 index 00000000000..9b5a6865b9c --- /dev/null +++ b/robot-server/robot_server/robot/control/estop_handler.py @@ -0,0 +1,42 @@ +"""Class to monitor estop status.""" +import logging +from typing import TYPE_CHECKING +from .models import EstopState, EstopPhysicalStatus + +if TYPE_CHECKING: + from opentrons.hardware_control.ot3api import OT3API + +log = logging.getLogger(__name__) + + +class EstopHandler: + """Robot server interface for estop interactions.""" + + _hardware_handle: "OT3API" + + def __init__( + self, + hw_handle: "OT3API", + ) -> None: + """Create a new EstopHandler.""" + self._hardware_handle = hw_handle + + def get_state(self) -> EstopState: + """Get the current estop state.""" + return EstopState.from_hw_state(self._hardware_handle.estop_status.state) + + def get_left_physical_status(self) -> EstopPhysicalStatus: + """Get the physical status of the left estop.""" + return EstopPhysicalStatus.from_hw_physical_status( + self._hardware_handle.estop_status.left_physical_state + ) + + def get_right_physical_status(self) -> EstopPhysicalStatus: + """Get the physical status of the right estop.""" + return EstopPhysicalStatus.from_hw_physical_status( + self._hardware_handle.estop_status.right_physical_state + ) + + def acknowledge_and_clear(self) -> None: + """Clear and acknowledge an Estop event.""" + self._hardware_handle.estop_acknowledge_and_clear() diff --git a/robot-server/robot_server/robot/control/models.py b/robot-server/robot_server/robot/control/models.py index b8c0844674b..eb4976143fc 100644 --- a/robot-server/robot_server/robot/control/models.py +++ b/robot-server/robot_server/robot/control/models.py @@ -2,6 +2,10 @@ import enum from pydantic import BaseModel, Field +from opentrons.hardware_control.types import ( + EstopPhysicalStatus as HwEstopPhysicalStatus, + EstopState as HwEstopState, +) class EstopState(enum.Enum): @@ -12,6 +16,19 @@ class EstopState(enum.Enum): LOGICALLY_ENGAGED = "logicallyEngaged" DISENGAGED = "disengaged" + @classmethod + def from_hw_state(cls, hw_state: HwEstopState) -> "EstopState": + """Build from the hardware equivalent.""" + return _HW_STATE_TO_STATE[hw_state] + + +_HW_STATE_TO_STATE = { + HwEstopState.NOT_PRESENT: EstopState.NOT_PRESENT, + HwEstopState.PHYSICALLY_ENGAGED: EstopState.PHYSICALLY_ENGAGED, + HwEstopState.LOGICALLY_ENGAGED: EstopState.LOGICALLY_ENGAGED, + HwEstopState.DISENGAGED: EstopState.DISENGAGED, +} + class EstopPhysicalStatus(enum.Enum): """Physical status of a specific estop.""" @@ -20,6 +37,20 @@ class EstopPhysicalStatus(enum.Enum): DISENGAGED = "disengaged" NOT_PRESENT = "notPresent" + @classmethod + def from_hw_physical_status( + cls, hw_physical_status: HwEstopPhysicalStatus + ) -> "EstopPhysicalStatus": + """Build from the hardware equivalent.""" + return _HW_PHYSICAL_STATUS_TO_PHYSICAL_STATUS[hw_physical_status] + + +_HW_PHYSICAL_STATUS_TO_PHYSICAL_STATUS = { + HwEstopPhysicalStatus.NOT_PRESENT: EstopPhysicalStatus.NOT_PRESENT, + HwEstopPhysicalStatus.ENGAGED: EstopPhysicalStatus.ENGAGED, + HwEstopPhysicalStatus.DISENGAGED: EstopPhysicalStatus.DISENGAGED, +} + class EstopStatusModel(BaseModel): """Model for the current estop status.""" diff --git a/robot-server/robot_server/robot/control/router.py b/robot-server/robot_server/robot/control/router.py index 06aa5f0bbed..6271cf9605b 100644 --- a/robot-server/robot_server/robot/control/router.py +++ b/robot-server/robot_server/robot/control/router.py @@ -8,17 +8,12 @@ PydanticResponse, SimpleBody, ) -from robot_server.hardware import ( - get_ot3_hardware, - get_thread_manager, -) -from opentrons.hardware_control import ThreadManagedHardware from .models import ( - EstopState, EstopStatusModel, - EstopPhysicalStatus, ) +from .estop_handler import EstopHandler +from robot_server.hardware import get_estop_handler if TYPE_CHECKING: from opentrons.hardware_control.ot3api import OT3API # noqa: F401 @@ -26,17 +21,14 @@ control_router = APIRouter() -async def _get_estop_status( - thread_manager: ThreadManagedHardware, +async def _get_estop_status_response( + estop_handler: EstopHandler, ) -> PydanticResponse[SimpleBody[EstopStatusModel]]: """Helper to generate the current Estop Status as a response model.""" - get_ot3_hardware(thread_manager) - - # TODO - unstub the response here data = EstopStatusModel.construct( - status=EstopState.DISENGAGED, - leftEstopPhysicalStatus=EstopPhysicalStatus.DISENGAGED, - rightEstopPhysicalStatus=EstopPhysicalStatus.DISENGAGED, + status=estop_handler.get_state(), + leftEstopPhysicalStatus=estop_handler.get_left_physical_status(), + rightEstopPhysicalStatus=estop_handler.get_right_physical_status(), ) return await PydanticResponse.create(content=SimpleBody.construct(data=data)) @@ -51,10 +43,10 @@ async def _get_estop_status( }, ) async def get_estop_status( - thread_manager: ThreadManagedHardware = Depends(get_thread_manager), + estop_handler: EstopHandler = Depends(get_estop_handler), ) -> PydanticResponse[SimpleBody[EstopStatusModel]]: """Return the current status of the estop.""" - return await _get_estop_status(thread_manager) + return await _get_estop_status_response(estop_handler) @control_router.put( @@ -68,7 +60,8 @@ async def get_estop_status( }, ) async def put_acknowledge_estop_disengage( - thread_manager: ThreadManagedHardware = Depends(get_thread_manager), + estop_handler: EstopHandler = Depends(get_estop_handler), ) -> PydanticResponse[SimpleBody[EstopStatusModel]]: """Transition from the `logically_engaged` status if applicable.""" - return await _get_estop_status(thread_manager) + estop_handler.acknowledge_and_clear() + return await _get_estop_status_response(estop_handler) diff --git a/robot-server/tests/robot/calibration/check/test_user_flow.py b/robot-server/tests/robot/calibration/check/test_user_flow.py index 71758300fba..e93633c750e 100644 --- a/robot-server/tests/robot/calibration/check/test_user_flow.py +++ b/robot-server/tests/robot/calibration/check/test_user_flow.py @@ -3,11 +3,15 @@ import pytest import datetime +from pathlib import Path from opentrons.hardware_control.instruments.ot2 import pipette from opentrons.types import Mount, Point from opentrons import calibration_storage from opentrons.config import robot_configs -from opentrons.config.pipette_config import load +from opentrons_shared_data.pipette import ( + mutable_configurations, + pipette_load_name_conversions as pipette_load_name, +) from robot_server.robot.calibration.check import user_flow as check_flow from robot_server.robot.calibration.check.user_flow import CheckCalibrationUserFlow @@ -34,10 +38,16 @@ last_modified=datetime.datetime.now(), ) +fake_path = Path("fake/path") + @pytest.fixture def mock_hw(hardware): - pip = pipette.Pipette(load("p300_single_v2.1", "testiId"), PIP_OFFSET, "testId") + pipette_model = pipette_load_name.convert_pipette_model("p300_single_v2.1") + configurations = mutable_configurations.load_with_mutable_configurations( + pipette_model, fake_path, "testiId" + ) + pip = pipette.Pipette(configurations, PIP_OFFSET, "testId") hardware.hardware_instruments = {Mount.RIGHT: pip, Mount.LEFT: pip} hardware._current_pos = Point(0, 0, 0) @@ -73,9 +83,17 @@ async def gantry_pos_mock(*args, **kwargs): def test_user_flow_select_pipette(pipettes, target_mount, hardware): pip, pip2 = None, None if pipettes[0]: - pip = pipette.Pipette(load(pipettes[0], "testId"), PIP_OFFSET, "testId") + pip1_model = pipette_load_name.convert_pipette_model(pipettes[0]) + pip1_configurations = mutable_configurations.load_with_mutable_configurations( + pip1_model, fake_path, "testId" + ) + pip = pipette.Pipette(pip1_configurations, PIP_OFFSET, "testId") if pipettes[1]: - pip2 = pipette.Pipette(load(pipettes[1], "testId"), PIP_OFFSET, "testId2") + pip2_model = pipette_load_name.convert_pipette_model(pipettes[1]) + pip2_configurations = mutable_configurations.load_with_mutable_configurations( + pip2_model, fake_path, "testId" + ) + pip2 = pipette.Pipette(pip2_configurations, PIP_OFFSET, "testId2") hardware.hardware_instruments = {Mount.LEFT: pip, Mount.RIGHT: pip2} # load a labware with calibrations with patch.object( @@ -99,9 +117,17 @@ def test_user_flow_select_pipette(pipettes, target_mount, hardware): async def test_switching_to_second_pipette(pipettes, target_mount, hardware): pip, pip2 = None, None if pipettes[0]: - pip = pipette.Pipette(load(pipettes[0], "testId"), PIP_OFFSET, "testId") + pip1_model = pipette_load_name.convert_pipette_model(pipettes[0]) + pip1_configurations = mutable_configurations.load_with_mutable_configurations( + pip1_model, fake_path, "testId" + ) + pip = pipette.Pipette(pip1_configurations, PIP_OFFSET, "testId") if pipettes[1]: - pip2 = pipette.Pipette(load(pipettes[1], "testId"), PIP_OFFSET, "testId2") + pip2_model = pipette_load_name.convert_pipette_model(pipettes[1]) + pip2_configurations = mutable_configurations.load_with_mutable_configurations( + pip2_model, fake_path, "testId" + ) + pip2 = pipette.Pipette(pip2_configurations, PIP_OFFSET, "testId2") hardware.hardware_instruments = {Mount.LEFT: pip, Mount.RIGHT: pip2} # load a labware with calibrations with patch.object( @@ -336,7 +362,10 @@ async def test_return_tip(mock_user_flow): uf = mock_user_flow uf._tip_origin_pt = Point(1, 1, 1) uf.hw_pipette._has_tip = True - z_offset = uf.hw_pipette.config.return_tip_height * uf._get_tip_length() + z_offset = ( + uf.hw_pipette.active_tip_settings.default_return_tip_height + * uf._get_tip_length() + ) await uf.return_tip() # should move to return tip move_calls = [ diff --git a/robot-server/tests/robot/calibration/deck/test_user_flow.py b/robot-server/tests/robot/calibration/deck/test_user_flow.py index ee05136348c..c27758655bc 100644 --- a/robot-server/tests/robot/calibration/deck/test_user_flow.py +++ b/robot-server/tests/robot/calibration/deck/test_user_flow.py @@ -2,11 +2,15 @@ import datetime from mock import MagicMock, call from typing import List, Tuple +from pathlib import Path from opentrons.calibration_storage import types as cal_types, models from opentrons.types import Mount, Point from opentrons.hardware_control.instruments.ot2 import pipette from opentrons.config import robot_configs -from opentrons.config.pipette_config import load +from opentrons_shared_data.pipette import ( + mutable_configurations, + pipette_load_name_conversions as pipette_load_name, +) from opentrons.protocol_api import labware from robot_server.robot.calibration.deck.user_flow import ( DeckCalibrationUserFlow, @@ -29,10 +33,16 @@ last_modified=datetime.datetime.now(), ) +fake_path = Path("fake/path") + @pytest.fixture def mock_hw(hardware): - pip = pipette.Pipette(load("p300_single_v2.1", "testiId"), PIP_OFFSET, "testId") + pipette_model = pipette_load_name.convert_pipette_model("p300_single_v2.1") + configurations = mutable_configurations.load_with_mutable_configurations( + pipette_model, fake_path, "testiId" + ) + pip = pipette.Pipette(configurations, PIP_OFFSET, "testId") hardware.hardware_instruments = {Mount.RIGHT: pip, Mount.LEFT: pip} hardware._current_pos = Point(0, 0, 0) @@ -69,9 +79,17 @@ async def gantry_pos_mock(*args, **kwargs): def test_user_flow_select_pipette(pipettes, target_mount, hardware): pip, pip2 = None, None if pipettes[0]: - pip = pipette.Pipette(load(pipettes[0], "testId"), PIP_OFFSET, "testId") + pip1_model = pipette_load_name.convert_pipette_model(pipettes[0]) + pip1_configurations = mutable_configurations.load_with_mutable_configurations( + pip1_model, fake_path, "testId" + ) + pip = pipette.Pipette(pip1_configurations, PIP_OFFSET, "testId") if pipettes[1]: - pip2 = pipette.Pipette(load(pipettes[1], "testId"), PIP_OFFSET, "testId2") + pip2_model = pipette_load_name.convert_pipette_model(pipettes[1]) + pip2_configurations = mutable_configurations.load_with_mutable_configurations( + pip2_model, fake_path, "testId" + ) + pip2 = pipette.Pipette(pip2_configurations, PIP_OFFSET, "testId2") hardware.hardware_instruments = {Mount.LEFT: pip, Mount.RIGHT: pip2} uf = DeckCalibrationUserFlow(hardware=hardware) @@ -121,18 +139,22 @@ async def test_pick_up_tip(mock_user_flow): async def test_save_default_pick_up_current(mock_hw): # make sure pick up current for multi-channels is # modified during tip pick up - pip = pipette.Pipette(load("p20_multi_v2.1", "testId"), PIP_OFFSET, "testid") + pipette_model = pipette_load_name.convert_pipette_model("p20_multi_v2.1") + configurations = mutable_configurations.load_with_mutable_configurations( + pipette_model, fake_path, "testiId" + ) + pip = pipette.Pipette(configurations, PIP_OFFSET, "testid") mock_hw.hardware_instruments[Mount.LEFT] = pip uf = DeckCalibrationUserFlow(hardware=mock_hw) - def mock_update_config_item(*args, **kwargs): + def mock_update_config_item(*args): pass uf._hw_pipette.update_config_item = MagicMock(side_effect=mock_update_config_item) - default_current = pip.config.pick_up_current + default_current = pip.pick_up_configurations.current update_config_calls = [ - call("pick_up_current", 0.1), - call("pick_up_current", default_current), + call({"pick_up_current": 0.1}), + call({"pick_up_current": default_current}), ] await uf.pick_up_tip() uf._hw_pipette.update_config_item.assert_has_calls(update_config_calls) @@ -142,7 +164,10 @@ async def test_return_tip(mock_user_flow): uf = mock_user_flow uf._tip_origin_pt = Point(1, 1, 1) uf._hw_pipette._has_tip = True - z_offset = uf._hw_pipette.config.return_tip_height * uf._get_tip_length() + z_offset = ( + uf._hw_pipette.active_tip_settings.default_return_tip_height + * uf._get_tip_length() + ) await uf.return_tip() # should move to return tip move_calls = [ diff --git a/robot-server/tests/robot/calibration/pipette_offset/test_user_flow.py b/robot-server/tests/robot/calibration/pipette_offset/test_user_flow.py index ed158b9eca2..8ac068b85d1 100644 --- a/robot-server/tests/robot/calibration/pipette_offset/test_user_flow.py +++ b/robot-server/tests/robot/calibration/pipette_offset/test_user_flow.py @@ -4,10 +4,14 @@ from mock import MagicMock, call, patch from typing import List, Tuple, Dict, Any from opentrons import config +from pathlib import Path +from opentrons_shared_data.pipette import ( + mutable_configurations, + pipette_load_name_conversions as pipette_load_name, +) from opentrons.calibration_storage import helpers, types as CSTypes, models from opentrons.types import Mount, Point from opentrons.hardware_control.instruments.ot2 import pipette -from opentrons.config.pipette_config import load from opentrons.protocol_api import labware from opentrons_shared_data.labware import load_definition @@ -33,6 +37,8 @@ last_modified=datetime.datetime.now(), ) +fake_path = Path("fake/path") + pipette_map = { "p10_single_v1.5": "opentrons_96_tiprack_10ul", "p50_single_v1.5": "opentrons_96_tiprack_300ul", @@ -81,8 +87,11 @@ def build_mock_stored_tip_length(kind="normal"): @pytest.fixture(params=pipette_map.keys()) def mock_hw_pipette_all_combos(request): - model = request.param - return pipette.Pipette(load(model, "testId"), PIP_CAL, "testId") + pipette_model = pipette_load_name.convert_pipette_model(request.param) + configurations = mutable_configurations.load_with_mutable_configurations( + pipette_model, fake_path, "testId" + ) + return pipette.Pipette(configurations, PIP_CAL, "testId") @pytest.fixture(params=[Mount.RIGHT, Mount.LEFT]) @@ -106,8 +115,12 @@ async def gantry_pos_mock(*args, **kwargs): @pytest.fixture def mock_hw(hardware): + pipette_model = pipette_load_name.convert_pipette_model("p300_single_v2.1") + configurations = mutable_configurations.load_with_mutable_configurations( + pipette_model, fake_path, "testId" + ) pip = pipette.Pipette( - load("p300_single_v2.1", "testId"), # type: ignore[arg-type] + configurations, # type: ignore[arg-type] PIP_CAL, "testId", ) @@ -452,7 +465,10 @@ async def test_return_tip(mock_user_flow): uf = mock_user_flow uf._tip_origin_pt = Point(1, 1, 1) uf._hw_pipette._has_tip = True - z_offset = uf._hw_pipette.config.return_tip_height * uf._get_tip_length() + z_offset = ( + uf._hw_pipette.active_tip_settings.default_return_tip_height + * uf._get_tip_length() + ) await uf.return_tip() # should move to return tip move_calls = [ diff --git a/robot-server/tests/robot/calibration/tip_length/test_user_flow.py b/robot-server/tests/robot/calibration/tip_length/test_user_flow.py index 700499b49ea..79b21c22129 100644 --- a/robot-server/tests/robot/calibration/tip_length/test_user_flow.py +++ b/robot-server/tests/robot/calibration/tip_length/test_user_flow.py @@ -3,10 +3,14 @@ from mock import ANY, patch, call from typing import List, Tuple, Dict, Any from opentrons import config +from pathlib import Path +from opentrons_shared_data.pipette import ( + mutable_configurations, + pipette_load_name_conversions as pipette_load_name, +) from opentrons.types import Mount, Point from opentrons.hardware_control.instruments.ot2 import pipette from opentrons.protocol_api.labware import get_labware_definition -from opentrons.config.pipette_config import load from opentrons.util.helpers import utc_now from opentrons.calibration_storage import types as cal_types, models @@ -24,6 +28,8 @@ last_modified=utc_now(), ) +fake_path = Path("fake/path") + pipette_map = { "p10_single_v1.5": "opentrons_96_tiprack_10ul", "p50_single_v1.5": "opentrons_96_tiprack_300ul", @@ -42,8 +48,11 @@ @pytest.fixture(params=pipette_map.keys()) def mock_hw_pipette_all_combos(request): - model = request.param - return pipette.Pipette(load(model, "testId"), PIP_CAL, "testId") + pipette_model = pipette_load_name.convert_pipette_model(request.param) + configurations = mutable_configurations.load_with_mutable_configurations( + pipette_model, fake_path, "testId" + ) + return pipette.Pipette(configurations, PIP_CAL, "testId") @pytest.fixture(params=[Mount.RIGHT, Mount.LEFT]) @@ -67,7 +76,11 @@ async def gantry_pos_mock(*args, **kwargs): @pytest.fixture def mock_hw(hardware): - pip = pipette.Pipette(load("p300_single_v2.1", "testId"), PIP_CAL, "testId") + pipette_model = pipette_load_name.convert_pipette_model("p300_single_v2.1") + configurations = mutable_configurations.load_with_mutable_configurations( + pipette_model, fake_path, "testId" + ) + pip = pipette.Pipette(configurations, PIP_CAL, "testId") hardware.hardware_instruments = {Mount.RIGHT: pip} hardware._current_pos = Point(0, 0, 0) @@ -217,7 +230,10 @@ async def test_invalidate_tip(mock_user_flow): uf = mock_user_flow uf._tip_origin_pt = Point(1, 1, 1) uf._hw_pipette._has_tip = True - z_offset = uf._hw_pipette.config.return_tip_height * uf._get_default_tip_length() + z_offset = ( + uf._hw_pipette.active_tip_settings.default_return_tip_height + * uf._get_default_tip_length() + ) await uf.invalidate_tip() # should move to return tip move_calls = [ @@ -235,7 +251,10 @@ async def test_exit(mock_user_flow): uf = mock_user_flow uf._tip_origin_pt = Point(1, 1, 1) uf._hw_pipette._has_tip = True - z_offset = uf._hw_pipette.config.return_tip_height * uf._get_default_tip_length() + z_offset = ( + uf._hw_pipette.active_tip_settings.default_return_tip_height + * uf._get_default_tip_length() + ) await uf.invalidate_tip() # should move to return tip move_calls = [ diff --git a/robot-server/tests/robot/control/__init__.py b/robot-server/tests/robot/control/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/robot-server/tests/robot/control/test_estop_handler.py b/robot-server/tests/robot/control/test_estop_handler.py new file mode 100644 index 00000000000..098fd0a7547 --- /dev/null +++ b/robot-server/tests/robot/control/test_estop_handler.py @@ -0,0 +1,109 @@ +"""Test estop handler wrapper class.""" + +from decoy import Decoy +import pytest +from typing import List, Tuple, TYPE_CHECKING + +if TYPE_CHECKING: + from opentrons.hardware_control.ot3api import OT3API + +from robot_server.robot.control.estop_handler import EstopHandler +from robot_server.robot.control.models import ( + EstopState, + EstopPhysicalStatus, +) +from opentrons.hardware_control.types import ( + EstopState as HwEstopState, + EstopPhysicalStatus as HwEstopPhysicalStatus, + EstopOverallStatus, +) + + +@pytest.fixture +def mock_hardware(decoy: Decoy) -> "OT3API": + """Create a mocked hardware api.""" + return decoy.mock(cls="OT3API") + + +@pytest.fixture +def subject(mock_hardware: "OT3API") -> EstopHandler: + """Create an EstopHandler to test.""" + return EstopHandler(hw_handle=mock_hardware) + + +def test_estop_state_transform( + subject: EstopHandler, mock_hardware: "OT3API", decoy: Decoy +) -> None: + """Check that the state is transformed correctly.""" + steps: List[Tuple[HwEstopState, EstopState]] = [ + (HwEstopState.NOT_PRESENT, EstopState.NOT_PRESENT), + (HwEstopState.PHYSICALLY_ENGAGED, EstopState.PHYSICALLY_ENGAGED), + (HwEstopState.LOGICALLY_ENGAGED, EstopState.LOGICALLY_ENGAGED), + (HwEstopState.DISENGAGED, EstopState.DISENGAGED), + ] + for (input, output) in steps: + decoy.when(mock_hardware.estop_status).then_return( + EstopOverallStatus( + state=input, + left_physical_state=EstopPhysicalStatus.NOT_PRESENT, + right_physical_state=EstopPhysicalStatus.NOT_PRESENT, + ) + ) + assert subject.get_state() == output + + +def test_estop_physical_state_transform( + subject: EstopHandler, mock_hardware: "OT3API", decoy: Decoy +) -> None: + """Check that physical state gets transformed correctly.""" + steps: List[Tuple[EstopOverallStatus, EstopPhysicalStatus, EstopPhysicalStatus]] = [ + ( + EstopOverallStatus( + state=HwEstopState.DISENGAGED, + left_physical_state=HwEstopPhysicalStatus.DISENGAGED, + right_physical_state=HwEstopPhysicalStatus.NOT_PRESENT, + ), + EstopPhysicalStatus.DISENGAGED, + EstopPhysicalStatus.NOT_PRESENT, + ), + ( + EstopOverallStatus( + state=HwEstopState.DISENGAGED, + left_physical_state=HwEstopPhysicalStatus.DISENGAGED, + right_physical_state=HwEstopPhysicalStatus.DISENGAGED, + ), + EstopPhysicalStatus.DISENGAGED, + EstopPhysicalStatus.DISENGAGED, + ), + ( + EstopOverallStatus( + state=HwEstopState.DISENGAGED, + left_physical_state=HwEstopPhysicalStatus.NOT_PRESENT, + right_physical_state=HwEstopPhysicalStatus.DISENGAGED, + ), + EstopPhysicalStatus.NOT_PRESENT, + EstopPhysicalStatus.DISENGAGED, + ), + ( + EstopOverallStatus( + state=HwEstopState.PHYSICALLY_ENGAGED, + left_physical_state=HwEstopPhysicalStatus.ENGAGED, + right_physical_state=HwEstopPhysicalStatus.NOT_PRESENT, + ), + EstopPhysicalStatus.ENGAGED, + EstopPhysicalStatus.NOT_PRESENT, + ), + ] + + for (input, left, right) in steps: + decoy.when(mock_hardware.estop_status).then_return(input) + assert subject.get_left_physical_status() == left + assert subject.get_right_physical_status() == right + + +def test_estop_acknowledge_and_clear( + subject: EstopHandler, mock_hardware: "OT3API", decoy: Decoy +) -> None: + """Test that the hardware controller is called correctly.""" + subject.acknowledge_and_clear() + decoy.verify(mock_hardware.estop_acknowledge_and_clear()) diff --git a/scripts/python_build_utils.py b/scripts/python_build_utils.py index c19c447af91..752f0741e34 100644 --- a/scripts/python_build_utils.py +++ b/scripts/python_build_utils.py @@ -29,6 +29,7 @@ 'shared-data': PackageEntry('shared_data'), 'notify-server': PackageEntry('notify_server'), 'hardware': PackageEntry('opentrons_hardware'), + 'hardware-testing': PackageEntry('hardware_testing'), 'usb-bridge': PackageEntry('usb_bridge'), 'system-server': PackageEntry('system_server'), 'server-utils': PackageEntry('server_utils'), diff --git a/shared-data/command/schemas/7.json b/shared-data/command/schemas/7.json index bbc12a62462..142e6b965ef 100644 --- a/shared-data/command/schemas/7.json +++ b/shared-data/command/schemas/7.json @@ -1435,18 +1435,6 @@ } ] }, - "usePickUpLocationLpcOffset": { - "title": "Usepickuplocationlpcoffset", - "description": "Whether to use LPC offset of the labware associated with its pick up location. Experimental param, subject to change.", - "default": false, - "type": "boolean" - }, - "useDropLocationLpcOffset": { - "title": "Usedroplocationlpcoffset", - "description": "Whether to use LPC offset of the labware associated with its drop off location. Experimental param, subject to change.", - "default": false, - "type": "boolean" - }, "pickUpOffset": { "title": "Pickupoffset", "description": "Offset to use when picking up labware. Experimental param, subject to change", diff --git a/labware-library/src/__tests__/labwareInference.test.ts b/shared-data/js/helpers/__tests__/labwareInference.test.ts similarity index 73% rename from labware-library/src/__tests__/labwareInference.test.ts rename to shared-data/js/helpers/__tests__/labwareInference.test.ts index 19267edd109..8c30693d34f 100644 --- a/labware-library/src/__tests__/labwareInference.test.ts +++ b/shared-data/js/helpers/__tests__/labwareInference.test.ts @@ -1,14 +1,4 @@ -import _fixture96Plate from '@opentrons/shared-data/labware/fixtures/2/fixture_96_plate.json' -import _fixtureIrregular from '@opentrons/shared-data/labware/fixtures/2/fixture_irregular_example_1.json' -import { - getIfConsistent, - getSpacingIfUniform, - getUniqueWellProperties, -} from '../labwareInference' -import type { LabwareDefinition2 } from '@opentrons/shared-data' - -const fixture96Plate = _fixture96Plate as LabwareDefinition2 -const fixtureIrregular = _fixtureIrregular as LabwareDefinition2 +import { getIfConsistent, getSpacingIfUniform } from '../labwareInference' describe('getSpacingIfUniform', () => { const testCases = [ @@ -92,12 +82,3 @@ describe('getIfConsistent', () => { expect(getIfConsistent(items)).toBe(null) }) }) - -describe('getUniqueWellProperties', () => { - const defs = [fixture96Plate, fixtureIrregular] - defs.forEach(def => - it(def.parameters.loadName, () => { - expect(getUniqueWellProperties(def)).toMatchSnapshot() - }) - ) -}) diff --git a/shared-data/js/helpers/index.ts b/shared-data/js/helpers/index.ts index 9e1f27a5647..a0b56ec1ac5 100644 --- a/shared-data/js/helpers/index.ts +++ b/shared-data/js/helpers/index.ts @@ -19,6 +19,7 @@ export * from './getVectorDifference' export * from './getVectorSum' export * from './getLoadedLabwareDefinitionsByUri' export * from './getOccludedSlotCountForModule' +export * from './labwareInference' export const getLabwareDefIsStandard = (def: LabwareDefinition2): boolean => def?.namespace === OPENTRONS_LABWARE_NAMESPACE diff --git a/labware-library/src/labwareInference.ts b/shared-data/js/helpers/labwareInference.ts similarity index 83% rename from labware-library/src/labwareInference.ts rename to shared-data/js/helpers/labwareInference.ts index e9d74352b84..7e8395a0ee9 100644 --- a/labware-library/src/labwareInference.ts +++ b/shared-data/js/helpers/labwareInference.ts @@ -6,14 +6,27 @@ import uniq from 'lodash/uniq' import type { LabwareWell, LabwareWellShapeProperties, - LabwareWellGroupProperties, - LabwareDefinition, -} from './types' + LabwareDefinition2, + LabwareWellGroupMetadata, + LabwareBrand, +} from '../types' +export interface LabwareWellGroupProperties { + xOffsetFromLeft: number + yOffsetFromTop: number + xSpacing: number | null + ySpacing: number | null + wellCount: number + shape: LabwareWellShapeProperties | null + depth: number | null + totalLiquidVolume: number | null + metadata: LabwareWellGroupMetadata + brand: LabwareBrand | null +} const ROUNDING_PRECISION = 2 export function getUniqueWellProperties( - definition: LabwareDefinition + definition: LabwareDefinition2 ): LabwareWellGroupProperties[] { const { groups, wells, dimensions } = definition diff --git a/shared-data/pipette/definitions/1/pipetteModelSpecs.json b/shared-data/pipette/definitions/1/pipetteModelSpecs.json index ff171918375..1d724623687 100644 --- a/shared-data/pipette/definitions/1/pipetteModelSpecs.json +++ b/shared-data/pipette/definitions/1/pipetteModelSpecs.json @@ -6323,6 +6323,201 @@ "returnTipHeight": 0.71, "idleCurrent": 0.3 }, + "p1000_single_v3.5": { + "name": "p1000_single_flex", + "backCompatNames": [], + "top": { + "value": 0.5, + "min": 0, + "max": 45, + "units": "mm", + "type": "float" + }, + "bottom": { + "value": 71.5, + "min": 10, + "max": 65, + "type": "float", + "units": "mm" + }, + "blowout": { + "value": 76.5, + "min": 20, + "max": 75, + "units": "mm", + "type": "float" + }, + "dropTip": { + "value": 90.5, + "min": 30, + "max": 80, + "units": "mm", + "type": "float" + }, + "pickUpCurrent": { + "value": 0.15, + "min": 0.05, + "max": 2.0, + "units": "amps", + "type": "float" + }, + "pickUpDistance": { + "value": 13, + "min": 1, + "max": 30, + "units": "mm", + "type": "float" + }, + "pickUpIncrement": { + "value": 0.0, + "min": 0.0, + "max": 10.0, + "units": "mm", + "type": "float" + }, + "pickUpPresses": { + "value": 1, + "min": 0, + "max": 10, + "units": "presses", + "type": "int" + }, + "pickUpSpeed": { + "value": 5, + "min": 1, + "max": 30, + "units": "mm/s", + "type": "float" + }, + "nozzleOffset": [-8.0, -22.0, -259.15], + "modelOffset": [0.0, 0.0, 25.14], + "ulPerMm": [ + { + "aspirate": [ + [0.7511, 3.9556, 6.455], + [1.3075, 2.1664, 5.8839], + [1.8737, 1.1513, 7.2111], + [3.177, 0.9374, 7.612], + [4.5368, 0.5531, 8.8328], + [7.31, 0.3035, 9.9651], + [10.0825, 0.1513, 11.0781], + [12.9776, 0.1293, 11.2991], + [15.9173, 0.0976, 11.7115], + [18.8243, 0.06244, 12.2706], + [21.8529, 0.07004, 12.1275], + [24.8068, 0.04182, 12.7442], + [27.7744, 0.0356, 12.8984], + [35.2873, 0.03031, 13.04544], + [42.799, 0.02015, 13.4038], + [50.4562, 0.01956, 13.4293], + [58.1081, 0.0145, 13.6843], + [65.7267, 0.01036, 13.9252], + [73.2857, 0.006776, 14.1606], + [81.00159, 0.009126, 13.9883], + [88.6617, 0.006448, 14.2052], + [103.9829, 0.005074, 14.3271], + [119.4408, 0.004878, 14.3476], + [134.889, 0.003727, 14.485], + [150.273, 0.00258, 14.6402], + [181.2798, 0.002559, 14.6427], + [212.4724, 0.002242, 14.7002], + [243.577, 0.00151, 14.856], + [274.7216, 0.001244, 14.9205], + [305.8132, 0.0009118, 15.0118], + [368.06968, 0.0007321, 15.06677], + [430.2513, 0.0004805, 15.1594], + [492.3487, 0.0003186, 15.2291], + [554.5713, 0.0003031, 15.237], + [616.6825, 0.0001981, 15.2948], + [694.4168, 0.0001855, 15.3027], + [772.0327, 0.0001181, 15.3494], + [849.617, 0.00008929, 15.3717], + [927.2556, 0.00008601, 15.3745], + [1004.87, 0.00006801, 15.3912], + [1051.4648, 0.00006824, 15.391] + ], + "dispense": [ + [0.7511, 3.9556, 6.455], + [1.3075, 2.1664, 5.8839], + [1.8737, 1.1513, 7.2111], + [3.177, 0.9374, 7.612], + [4.5368, 0.5531, 8.8328], + [7.31, 0.3035, 9.9651], + [10.0825, 0.1513, 11.0781], + [12.9776, 0.1293, 11.2991], + [15.9173, 0.0976, 11.7115], + [18.8243, 0.06244, 12.2706], + [21.8529, 0.07004, 12.1275], + [24.8068, 0.04182, 12.7442], + [27.7744, 0.0356, 12.8984], + [35.2873, 0.03031, 13.04544], + [42.799, 0.02015, 13.4038], + [50.4562, 0.01956, 13.4293], + [58.1081, 0.0145, 13.6843], + [65.7267, 0.01036, 13.9252], + [73.2857, 0.006776, 14.1606], + [81.00159, 0.009126, 13.9883], + [88.6617, 0.006448, 14.2052], + [103.9829, 0.005074, 14.3271], + [119.4408, 0.004878, 14.3476], + [134.889, 0.003727, 14.485], + [150.273, 0.00258, 14.6402], + [181.2798, 0.002559, 14.6427], + [212.4724, 0.002242, 14.7002], + [243.577, 0.00151, 14.856], + [274.7216, 0.001244, 14.9205], + [305.8132, 0.0009118, 15.0118], + [368.06968, 0.0007321, 15.06677], + [430.2513, 0.0004805, 15.1594], + [492.3487, 0.0003186, 15.2291], + [554.5713, 0.0003031, 15.237], + [616.6825, 0.0001981, 15.2948], + [694.4168, 0.0001855, 15.3027], + [772.0327, 0.0001181, 15.3494], + [849.617, 0.00008929, 15.3717], + [927.2556, 0.00008601, 15.3745], + [1004.87, 0.00006801, 15.3912], + [1051.4648, 0.00006824, 15.391] + ] + } + ], + "plungerCurrent": { + "value": 1.0, + "min": 0.1, + "max": 1.5, + "units": "amps", + "type": "float" + }, + "dropTipCurrent": { + "value": 1.0, + "min": 0.1, + "max": 1.25, + "units": "amps", + "type": "float" + }, + "dropTipSpeed": { + "value": 7, + "min": 0.001, + "max": 30, + "units": "mm/sec", + "type": "float" + }, + "tipOverlap": { + "default": 10.5, + "opentrons/opentrons_flex_96_tiprack_1000ul/1": 10.5, + "opentrons/opentrons_flex_96_tiprack_200ul/1": 10.5 + }, + "tipLength": { + "value": 78.3, + "units": "mm", + "type": "float", + "min": 0, + "max": 100 + }, + "quirks": [], + "returnTipHeight": 0.71, + "idleCurrent": 0.3 + }, "p50_single_v3.0": { "name": "p50_single_flex", "backCompatNames": [], @@ -6994,7 +7189,7 @@ "returnTipHeight": 0.78, "idleCurrent": 0.3 }, - "p50_single_v4.3": { + "p50_single_v3.5": { "name": "p50_single_flex", "backCompatNames": [], "top": { @@ -7163,8 +7358,8 @@ "returnTipHeight": 0.78, "idleCurrent": 0.3 }, - "p1000_multi_v3.0": { - "name": "p1000_multi_flex", + "p50_single_v4.3": { + "name": "p50_single_flex", "backCompatNames": [], "top": { "value": 0.5, @@ -7190,19 +7385,19 @@ "dropTip": { "value": 90.5, "min": 78, - "max": 110, + "max": 119, "units": "mm", "type": "float" }, "pickUpCurrent": { - "value": 1.0, + "value": 0.15, "min": 0.05, "max": 2.0, "units": "amps", "type": "float" }, "pickUpDistance": { - "value": 17, + "value": 15, "min": 1, "max": 30, "units": "mm", @@ -7223,64 +7418,233 @@ "type": "int" }, "pickUpSpeed": { - "value": 10, + "value": 5, "min": 1, "max": 30, "units": "mm/s", "type": "float" }, - "nozzleOffset": [-0.5, -16.0, -259.15], + "nozzleOffset": [-8.0, -22.0, -259.15], "modelOffset": [0.0, 0.0, 25.14], "ulPerMm": [ { "aspirate": [ - [0.7511, 3.9556, 6.455], - [1.3075, 2.1664, 5.8839], - [1.8737, 1.1513, 7.2111], - [3.177, 0.9374, 7.612], - [4.5368, 0.5531, 8.8328], - [7.31, 0.3035, 9.9651], - [10.0825, 0.1513, 11.0781], - [12.9776, 0.1293, 11.2991], - [15.9173, 0.0976, 11.7115], - [18.8243, 0.06244, 12.2706], - [21.8529, 0.07004, 12.1275], - [24.8068, 0.04182, 12.7442], - [27.7744, 0.0356, 12.8984], - [35.2873, 0.03031, 13.04544], - [42.799, 0.02015, 13.4038], - [50.4562, 0.01956, 13.4293], - [58.1081, 0.0145, 13.6843], - [65.7267, 0.01036, 13.9252], - [73.2857, 0.006776, 14.1606], - [81.00159, 0.009126, 13.9883], - [88.6617, 0.006448, 14.2052], - [103.9829, 0.005074, 14.3271], - [119.4408, 0.004878, 14.3476], - [134.889, 0.003727, 14.485], - [150.273, 0.00258, 14.6402], - [181.2798, 0.002559, 14.6427], - [212.4724, 0.002242, 14.7002], - [243.577, 0.00151, 14.856], - [274.7216, 0.001244, 14.9205], - [305.8132, 0.0009118, 15.0118], - [368.06968, 0.0007321, 15.06677], - [430.2513, 0.0004805, 15.1594], - [492.3487, 0.0003186, 15.2291], - [554.5713, 0.0003031, 15.237], - [616.6825, 0.0001981, 15.2948], - [694.4168, 0.0001855, 15.3027], - [772.0327, 0.0001181, 15.3494], - [849.617, 0.00008929, 15.3717], - [927.2556, 0.00008601, 15.3745], - [1004.87, 0.00006801, 15.3912], - [1051.4648, 0.00006824, 15.391] - ], - "dispense": [ - [0.7511, 3.9556, 6.455], - [1.3075, 2.1664, 5.8839], - [1.8737, 1.1513, 7.2111], - [3.177, 0.9374, 7.612], + [0.6464, 0.4817, 0.0427], + [1.0889, 0.2539, 0.1591], + [1.5136, 0.1624, 0.2587], + [1.9108, 0.1042, 0.3467], + [2.2941, 0.0719, 0.4085], + [2.9978, 0.037, 0.4886], + [3.7731, 0.0378, 0.4863], + [4.7575, 0.0516, 0.4342], + [5.5024, 0.011, 0.6275], + [6.2686, 0.0114, 0.6253], + [7.005, 0.0054, 0.6625], + [8.5207, 0.0063, 0.6563], + [10.0034, 0.003, 0.6844], + [11.5075, 0.0031, 0.6833], + [13.0327, 0.0032, 0.6829], + [14.5356, 0.0018, 0.7003], + [17.5447, 0.0014, 0.7063], + [20.5576, 0.0011, 0.7126], + [23.5624, 0.0007, 0.7197], + [26.5785, 0.0007, 0.721], + [29.593, 0.0005, 0.7248], + [32.6109, 0.0004, 0.7268], + [35.6384, 0.0004, 0.727], + [38.6439, 0.0002, 0.7343], + [41.6815, 0.0004, 0.7284], + [44.6895, 0.0002, 0.7372], + [47.6926, 0.0001, 0.7393], + [51.4567, 0.0001, 0.7382] + ], + + "dispense": [ + [0.6464, 0.4817, 0.0427], + [1.0889, 0.2539, 0.1591], + [1.5136, 0.1624, 0.2587], + [1.9108, 0.1042, 0.3467], + [2.2941, 0.0719, 0.4085], + [2.9978, 0.037, 0.4886], + [3.7731, 0.0378, 0.4863], + [4.7575, 0.0516, 0.4342], + [5.5024, 0.011, 0.6275], + [6.2686, 0.0114, 0.6253], + [7.005, 0.0054, 0.6625], + [8.5207, 0.0063, 0.6563], + [10.0034, 0.003, 0.6844], + [11.5075, 0.0031, 0.6833], + [13.0327, 0.0032, 0.6829], + [14.5356, 0.0018, 0.7003], + [17.5447, 0.0014, 0.7063], + [20.5576, 0.0011, 0.7126], + [23.5624, 0.0007, 0.7197], + [26.5785, 0.0007, 0.721], + [29.593, 0.0005, 0.7248], + [32.6109, 0.0004, 0.7268], + [35.6384, 0.0004, 0.727], + [38.6439, 0.0002, 0.7343], + [41.6815, 0.0004, 0.7284], + [44.6895, 0.0002, 0.7372], + [47.6926, 0.0001, 0.7393], + [51.4567, 0.0001, 0.7382] + ] + } + ], + "plungerCurrent": { + "value": 1.0, + "min": 0.1, + "max": 1.5, + "units": "amps", + "type": "float" + }, + "dropTipCurrent": { + "value": 1.0, + "min": 0.1, + "max": 1.25, + "units": "amps", + "type": "float" + }, + "dropTipSpeed": { + "value": 7, + "min": 0.001, + "max": 30, + "units": "mm/sec", + "type": "float" + }, + "tipOverlap": { + "default": 10.5, + "opentrons/opentrons_96_tiprack_50ul/1": 10.5 + }, + "tipLength": { + "value": 78.3, + "units": "mm", + "type": "float", + "min": 0, + "max": 100 + }, + "quirks": [], + "returnTipHeight": 0.78, + "idleCurrent": 0.3 + }, + "p1000_multi_v3.0": { + "name": "p1000_multi_flex", + "backCompatNames": [], + "top": { + "value": 0.5, + "min": 0, + "max": 45, + "units": "mm", + "type": "float" + }, + "bottom": { + "value": 71.5, + "min": 55, + "max": 80, + "type": "float", + "units": "mm" + }, + "blowout": { + "value": 76.5, + "min": 60, + "max": 85, + "units": "mm", + "type": "float" + }, + "dropTip": { + "value": 90.5, + "min": 78, + "max": 110, + "units": "mm", + "type": "float" + }, + "pickUpCurrent": { + "value": 1.0, + "min": 0.05, + "max": 2.0, + "units": "amps", + "type": "float" + }, + "pickUpDistance": { + "value": 17, + "min": 1, + "max": 30, + "units": "mm", + "type": "float" + }, + "pickUpIncrement": { + "value": 0.0, + "min": 0.0, + "max": 10.0, + "units": "mm", + "type": "float" + }, + "pickUpPresses": { + "value": 1, + "min": 0, + "max": 10, + "units": "presses", + "type": "int" + }, + "pickUpSpeed": { + "value": 10, + "min": 1, + "max": 30, + "units": "mm/s", + "type": "float" + }, + "nozzleOffset": [-0.5, -16.0, -259.15], + "modelOffset": [0.0, 0.0, 25.14], + "ulPerMm": [ + { + "aspirate": [ + [0.7511, 3.9556, 6.455], + [1.3075, 2.1664, 5.8839], + [1.8737, 1.1513, 7.2111], + [3.177, 0.9374, 7.612], + [4.5368, 0.5531, 8.8328], + [7.31, 0.3035, 9.9651], + [10.0825, 0.1513, 11.0781], + [12.9776, 0.1293, 11.2991], + [15.9173, 0.0976, 11.7115], + [18.8243, 0.06244, 12.2706], + [21.8529, 0.07004, 12.1275], + [24.8068, 0.04182, 12.7442], + [27.7744, 0.0356, 12.8984], + [35.2873, 0.03031, 13.04544], + [42.799, 0.02015, 13.4038], + [50.4562, 0.01956, 13.4293], + [58.1081, 0.0145, 13.6843], + [65.7267, 0.01036, 13.9252], + [73.2857, 0.006776, 14.1606], + [81.00159, 0.009126, 13.9883], + [88.6617, 0.006448, 14.2052], + [103.9829, 0.005074, 14.3271], + [119.4408, 0.004878, 14.3476], + [134.889, 0.003727, 14.485], + [150.273, 0.00258, 14.6402], + [181.2798, 0.002559, 14.6427], + [212.4724, 0.002242, 14.7002], + [243.577, 0.00151, 14.856], + [274.7216, 0.001244, 14.9205], + [305.8132, 0.0009118, 15.0118], + [368.06968, 0.0007321, 15.06677], + [430.2513, 0.0004805, 15.1594], + [492.3487, 0.0003186, 15.2291], + [554.5713, 0.0003031, 15.237], + [616.6825, 0.0001981, 15.2948], + [694.4168, 0.0001855, 15.3027], + [772.0327, 0.0001181, 15.3494], + [849.617, 0.00008929, 15.3717], + [927.2556, 0.00008601, 15.3745], + [1004.87, 0.00006801, 15.3912], + [1051.4648, 0.00006824, 15.391] + ], + "dispense": [ + [0.7511, 3.9556, 6.455], + [1.3075, 2.1664, 5.8839], + [1.8737, 1.1513, 7.2111], + [3.177, 0.9374, 7.612], [4.5368, 0.5531, 8.8328], [7.31, 0.3035, 9.9651], [10.0825, 0.1513, 11.0781], @@ -7943,8 +8307,8 @@ "returnTipHeight": 0.71, "idleCurrent": 0.3 }, - "p50_multi_v3.0": { - "name": "p50_multi_flex", + "p1000_multi_v3.5": { + "name": "p1000_multi_flex", "backCompatNames": [], "top": { "value": 0.5, @@ -7968,21 +8332,550 @@ "type": "float" }, "dropTip": { - "value": 90.5, + "value": 92.5, "min": 78, - "max": 119, + "max": 110, "units": "mm", "type": "float" }, "pickUpCurrent": { - "value": 1.0, + "value": 0.5, + "min": 0.05, + "max": 2.0, + "units": "amps", + "type": "float" + }, + "pickUpDistance": { + "value": 13, + "min": 1, + "max": 30, + "units": "mm", + "type": "float" + }, + "pickUpIncrement": { + "value": 0.0, + "min": 0.0, + "max": 10.0, + "units": "mm", + "type": "float" + }, + "pickUpPresses": { + "value": 1, + "min": 0, + "max": 10, + "units": "presses", + "type": "int" + }, + "pickUpSpeed": { + "value": 10, + "min": 1, + "max": 30, + "units": "mm/s", + "type": "float" + }, + "nozzleOffset": [-8.0, -16.0, -259.15], + "modelOffset": [0.0, 0.0, 25.14], + "ulPerMm": [ + { + "aspirate": [ + [0.7511, 3.9556, 6.455], + [1.3075, 2.1664, 5.8839], + [1.8737, 1.1513, 7.2111], + [3.177, 0.9374, 7.612], + [4.5368, 0.5531, 8.8328], + [7.31, 0.3035, 9.9651], + [10.0825, 0.1513, 11.0781], + [12.9776, 0.1293, 11.2991], + [15.9173, 0.0976, 11.7115], + [18.8243, 0.06244, 12.2706], + [21.8529, 0.07004, 12.1275], + [24.8068, 0.04182, 12.7442], + [27.7744, 0.0356, 12.8984], + [35.2873, 0.03031, 13.04544], + [42.799, 0.02015, 13.4038], + [50.4562, 0.01956, 13.4293], + [58.1081, 0.0145, 13.6843], + [65.7267, 0.01036, 13.9252], + [73.2857, 0.006776, 14.1606], + [81.00159, 0.009126, 13.9883], + [88.6617, 0.006448, 14.2052], + [103.9829, 0.005074, 14.3271], + [119.4408, 0.004878, 14.3476], + [134.889, 0.003727, 14.485], + [150.273, 0.00258, 14.6402], + [181.2798, 0.002559, 14.6427], + [212.4724, 0.002242, 14.7002], + [243.577, 0.00151, 14.856], + [274.7216, 0.001244, 14.9205], + [305.8132, 0.0009118, 15.0118], + [368.06968, 0.0007321, 15.06677], + [430.2513, 0.0004805, 15.1594], + [492.3487, 0.0003186, 15.2291], + [554.5713, 0.0003031, 15.237], + [616.6825, 0.0001981, 15.2948], + [694.4168, 0.0001855, 15.3027], + [772.0327, 0.0001181, 15.3494], + [849.617, 0.00008929, 15.3717], + [927.2556, 0.00008601, 15.3745], + [1004.87, 0.00006801, 15.3912], + [1051.4648, 0.00006824, 15.391] + ], + "dispense": [ + [0.7511, 3.9556, 6.455], + [1.3075, 2.1664, 5.8839], + [1.8737, 1.1513, 7.2111], + [3.177, 0.9374, 7.612], + [4.5368, 0.5531, 8.8328], + [7.31, 0.3035, 9.9651], + [10.0825, 0.1513, 11.0781], + [12.9776, 0.1293, 11.2991], + [15.9173, 0.0976, 11.7115], + [18.8243, 0.06244, 12.2706], + [21.8529, 0.07004, 12.1275], + [24.8068, 0.04182, 12.7442], + [27.7744, 0.0356, 12.8984], + [35.2873, 0.03031, 13.04544], + [42.799, 0.02015, 13.4038], + [50.4562, 0.01956, 13.4293], + [58.1081, 0.0145, 13.6843], + [65.7267, 0.01036, 13.9252], + [73.2857, 0.006776, 14.1606], + [81.00159, 0.009126, 13.9883], + [88.6617, 0.006448, 14.2052], + [103.9829, 0.005074, 14.3271], + [119.4408, 0.004878, 14.3476], + [134.889, 0.003727, 14.485], + [150.273, 0.00258, 14.6402], + [181.2798, 0.002559, 14.6427], + [212.4724, 0.002242, 14.7002], + [243.577, 0.00151, 14.856], + [274.7216, 0.001244, 14.9205], + [305.8132, 0.0009118, 15.0118], + [368.06968, 0.0007321, 15.06677], + [430.2513, 0.0004805, 15.1594], + [492.3487, 0.0003186, 15.2291], + [554.5713, 0.0003031, 15.237], + [616.6825, 0.0001981, 15.2948], + [694.4168, 0.0001855, 15.3027], + [772.0327, 0.0001181, 15.3494], + [849.617, 0.00008929, 15.3717], + [927.2556, 0.00008601, 15.3745], + [1004.87, 0.00006801, 15.3912], + [1051.4648, 0.00006824, 15.391] + ] + } + ], + "plungerCurrent": { + "value": 1, + "min": 0.1, + "max": 1.5, + "units": "amps", + "type": "float" + }, + "dropTipCurrent": { + "value": 1, + "min": 0.1, + "max": 1.25, + "units": "amps", + "type": "float" + }, + "dropTipSpeed": { + "value": 10, + "min": 0.001, + "max": 30, + "units": "mm/sec", + "type": "float" + }, + "tipOverlap": { + "default": 10.5, + "opentrons/opentrons_flex_96_tiprack_1000ul/1": 10.5, + "opentrons/opentrons_flex_96_tiprack_200ul/1": 10.5 + }, + "tipLength": { + "value": 78.3, + "units": "mm", + "type": "float", + "min": 0, + "max": 100 + }, + "quirks": [], + "returnTipHeight": 0.71, + "idleCurrent": 0.3 + }, + "p50_multi_v3.0": { + "name": "p50_multi_flex", + "backCompatNames": [], + "top": { + "value": 0.5, + "min": 0, + "max": 45, + "units": "mm", + "type": "float" + }, + "bottom": { + "value": 71.5, + "min": 55, + "max": 80, + "type": "float", + "units": "mm" + }, + "blowout": { + "value": 76.5, + "min": 60, + "max": 85, + "units": "mm", + "type": "float" + }, + "dropTip": { + "value": 90.5, + "min": 78, + "max": 119, + "units": "mm", + "type": "float" + }, + "pickUpCurrent": { + "value": 1.0, + "min": 0.05, + "max": 2.0, + "units": "amps", + "type": "float" + }, + "pickUpDistance": { + "value": 17, + "min": 1, + "max": 30, + "units": "mm", + "type": "float" + }, + "pickUpIncrement": { + "value": 0.0, + "min": 0.0, + "max": 10.0, + "units": "mm", + "type": "float" + }, + "pickUpPresses": { + "value": 1, + "min": 0, + "max": 10, + "units": "presses", + "type": "int" + }, + "pickUpSpeed": { + "value": 10, + "min": 1, + "max": 30, + "units": "mm/s", + "type": "float" + }, + "nozzleOffset": [-0.5, -16.0, -259.15], + "modelOffset": [0.0, 0.0, 25.14], + "ulPerMm": [ + { + "aspirate": [ + [0.773, 0.4399, 0.1366], + [1.2256, 0.2292, 0.2093], + [1.6427, 0.1375, 0.3218], + [2.0338, 0.0857, 0.4068], + [2.4278, 0.0656, 0.4476], + [3.1383, 0.0292, 0.5361], + [3.8898, 0.0275, 0.5415], + [4.8856, 0.0499, 0.4544], + [5.6343, 0.0085, 0.6566], + [6.3958, 0.0084, 0.6572], + [7.1369, 0.0041, 0.6844], + [8.6419, 0.0043, 0.683], + [10.1384, 0.0027, 0.697], + [11.643, 0.0023, 0.7005], + [13.153, 0.002, 0.7043], + [14.6579, 0.0014, 0.7117], + [17.6672, 0.0011, 0.7171], + [20.6786, 0.0008, 0.7221], + [23.6841, 0.0005, 0.7275], + [26.6973, 0.0005, 0.7286], + [29.713, 0.0004, 0.7307], + [32.7317, 0.0004, 0.7322], + [35.7597, 0.0004, 0.7321], + [38.7849, 0.0003, 0.7347], + [41.8051, 0.0002, 0.7374], + [44.8187, 0.0002, 0.7402], + [47.8244, 0.0001, 0.7428], + [51.5715, 0.0, 0.7453] + ], + "dispense": [ + [1.0899, 0.2566, 0.3211], + [1.5035, 0.1576, 0.2642], + [1.9155, 0.1119, 0.3329], + [2.2801, 0.0624, 0.4278], + [2.997, 0.041, 0.4766], + [3.7688, 0.0372, 0.4878], + [4.7709, 0.0533, 0.4272], + [5.5082, 0.0095, 0.6364], + [6.2685, 0.0105, 0.6308], + [7.0043, 0.0053, 0.663], + [8.5166, 0.0061, 0.6574], + [10.0121, 0.0036, 0.6788], + [11.4941, 0.0022, 0.6934], + [13.039, 0.0039, 0.6737], + [14.5225, 0.0012, 0.7091], + [17.5398, 0.0016, 0.7035], + [20.5523, 0.0011, 0.7123], + [23.5501, 0.0006, 0.7208], + [26.5715, 0.0007, 0.7191], + [29.581, 0.0005, 0.7255], + [32.6007, 0.0005, 0.7258], + [35.6252, 0.0004, 0.7273], + [38.639, 0.0003, 0.7319], + [41.6464, 0.0002, 0.735], + [44.6386, 0.0001, 0.7396], + [47.657, 0.0002, 0.7341], + [51.4341, 0.0002, 0.7348] + ] + } + ], + "plungerCurrent": { + "value": 1, + "min": 0.1, + "max": 1.5, + "units": "amps", + "type": "float" + }, + "dropTipCurrent": { + "value": 1, + "min": 0.1, + "max": 1.25, + "units": "amps", + "type": "float" + }, + "dropTipSpeed": { + "value": 7, + "min": 0.001, + "max": 30, + "units": "mm/sec", + "type": "float" + }, + "tipOverlap": { + "default": 10.5, + "opentrons/opentrons_96_tiprack_50ul/1": 10.5 + }, + "tipLength": { + "value": 78.3, + "units": "mm", + "type": "float", + "min": 0, + "max": 100 + }, + "quirks": [], + "returnTipHeight": 0.78, + "idleCurrent": 0.3 + }, + "p50_multi_v3.1": { + "name": "p50_multi_flex", + "backCompatNames": [], + "top": { + "value": 0.5, + "min": 0, + "max": 45, + "units": "mm", + "type": "float" + }, + "bottom": { + "value": 71.5, + "min": 55, + "max": 80, + "type": "float", + "units": "mm" + }, + "blowout": { + "value": 76.5, + "min": 60, + "max": 85, + "units": "mm", + "type": "float" + }, + "dropTip": { + "value": 90.5, + "min": 78, + "max": 119, + "units": "mm", + "type": "float" + }, + "pickUpCurrent": { + "value": 1.0, + "min": 0.05, + "max": 2.0, + "units": "amps", + "type": "float" + }, + "pickUpDistance": { + "value": 17, + "min": 1, + "max": 30, + "units": "mm", + "type": "float" + }, + "pickUpIncrement": { + "value": 0.0, + "min": 0.0, + "max": 10.0, + "units": "mm", + "type": "float" + }, + "pickUpPresses": { + "value": 1, + "min": 0, + "max": 10, + "units": "presses", + "type": "int" + }, + "pickUpSpeed": { + "value": 10, + "min": 1, + "max": 30, + "units": "mm/s", + "type": "float" + }, + "nozzleOffset": [-0.5, -16.0, -259.15], + "modelOffset": [0.0, 0.0, 25.14], + "ulPerMm": [ + { + "aspirate": [ + [0.773, 0.4399, 0.1366], + [1.2256, 0.2292, 0.2093], + [1.6427, 0.1375, 0.3218], + [2.0338, 0.0857, 0.4068], + [2.4278, 0.0656, 0.4476], + [3.1383, 0.0292, 0.5361], + [3.8898, 0.0275, 0.5415], + [4.8856, 0.0499, 0.4544], + [5.6343, 0.0085, 0.6566], + [6.3958, 0.0084, 0.6572], + [7.1369, 0.0041, 0.6844], + [8.6419, 0.0043, 0.683], + [10.1384, 0.0027, 0.697], + [11.643, 0.0023, 0.7005], + [13.153, 0.002, 0.7043], + [14.6579, 0.0014, 0.7117], + [17.6672, 0.0011, 0.7171], + [20.6786, 0.0008, 0.7221], + [23.6841, 0.0005, 0.7275], + [26.6973, 0.0005, 0.7286], + [29.713, 0.0004, 0.7307], + [32.7317, 0.0004, 0.7322], + [35.7597, 0.0004, 0.7321], + [38.7849, 0.0003, 0.7347], + [41.8051, 0.0002, 0.7374], + [44.8187, 0.0002, 0.7402], + [47.8244, 0.0001, 0.7428], + [51.5715, 0.0, 0.7453] + ], + "dispense": [ + [1.0899, 0.2566, 0.3211], + [1.5035, 0.1576, 0.2642], + [1.9155, 0.1119, 0.3329], + [2.2801, 0.0624, 0.4278], + [2.997, 0.041, 0.4766], + [3.7688, 0.0372, 0.4878], + [4.7709, 0.0533, 0.4272], + [5.5082, 0.0095, 0.6364], + [6.2685, 0.0105, 0.6308], + [7.0043, 0.0053, 0.663], + [8.5166, 0.0061, 0.6574], + [10.0121, 0.0036, 0.6788], + [11.4941, 0.0022, 0.6934], + [13.039, 0.0039, 0.6737], + [14.5225, 0.0012, 0.7091], + [17.5398, 0.0016, 0.7035], + [20.5523, 0.0011, 0.7123], + [23.5501, 0.0006, 0.7208], + [26.5715, 0.0007, 0.7191], + [29.581, 0.0005, 0.7255], + [32.6007, 0.0005, 0.7258], + [35.6252, 0.0004, 0.7273], + [38.639, 0.0003, 0.7319], + [41.6464, 0.0002, 0.735], + [44.6386, 0.0001, 0.7396], + [47.657, 0.0002, 0.7341], + [51.4341, 0.0002, 0.7348] + ] + } + ], + "plungerCurrent": { + "value": 1, + "min": 0.1, + "max": 1.5, + "units": "amps", + "type": "float" + }, + "dropTipCurrent": { + "value": 1, + "min": 0.1, + "max": 1.25, + "units": "amps", + "type": "float" + }, + "dropTipSpeed": { + "value": 7, + "min": 0.001, + "max": 30, + "units": "mm/sec", + "type": "float" + }, + "tipOverlap": { + "default": 10.5, + "opentrons/opentrons_96_tiprack_50ul/1": 10.5 + }, + "tipLength": { + "value": 78.3, + "units": "mm", + "type": "float", + "min": 0, + "max": 100 + }, + "quirks": [], + "returnTipHeight": 0.78, + "idleCurrent": 0.3 + }, + "p50_multi_v3.3": { + "name": "p50_multi_flex", + "backCompatNames": [], + "top": { + "value": 0.5, + "min": 0, + "max": 45, + "units": "mm", + "type": "float" + }, + "bottom": { + "value": 71.5, + "min": 55, + "max": 80, + "type": "float", + "units": "mm" + }, + "blowout": { + "value": 76.5, + "min": 60, + "max": 85, + "units": "mm", + "type": "float" + }, + "dropTip": { + "value": 92.5, + "min": 78, + "max": 119, + "units": "mm", + "type": "float" + }, + "pickUpCurrent": { + "value": 0.5, "min": 0.05, "max": 2.0, "units": "amps", "type": "float" }, "pickUpDistance": { - "value": 17, + "value": 13, "min": 1, "max": 30, "units": "mm", @@ -8009,68 +8902,70 @@ "units": "mm/s", "type": "float" }, - "nozzleOffset": [-0.5, -16.0, -259.15], + "nozzleOffset": [-8.0, -16.0, -259.15], "modelOffset": [0.0, 0.0, 25.14], "ulPerMm": [ { "aspirate": [ - [0.773, 0.4399, 0.1366], - [1.2256, 0.2292, 0.2093], - [1.6427, 0.1375, 0.3218], - [2.0338, 0.0857, 0.4068], - [2.4278, 0.0656, 0.4476], - [3.1383, 0.0292, 0.5361], - [3.8898, 0.0275, 0.5415], - [4.8856, 0.0499, 0.4544], - [5.6343, 0.0085, 0.6566], - [6.3958, 0.0084, 0.6572], - [7.1369, 0.0041, 0.6844], - [8.6419, 0.0043, 0.683], - [10.1384, 0.0027, 0.697], - [11.643, 0.0023, 0.7005], - [13.153, 0.002, 0.7043], - [14.6579, 0.0014, 0.7117], - [17.6672, 0.0011, 0.7171], - [20.6786, 0.0008, 0.7221], - [23.6841, 0.0005, 0.7275], - [26.6973, 0.0005, 0.7286], - [29.713, 0.0004, 0.7307], - [32.7317, 0.0004, 0.7322], - [35.7597, 0.0004, 0.7321], - [38.7849, 0.0003, 0.7347], - [41.8051, 0.0002, 0.7374], - [44.8187, 0.0002, 0.7402], - [47.8244, 0.0001, 0.7428], - [51.5715, 0.0, 0.7453] + [0.6464, 0.4817, 0.0427], + [1.0889, 0.2539, 0.1591], + [1.5136, 0.1624, 0.2587], + [1.9108, 0.1042, 0.3467], + [2.2941, 0.0719, 0.4085], + [2.9978, 0.037, 0.4886], + [3.7731, 0.0378, 0.4863], + [4.7575, 0.0516, 0.4342], + [5.5024, 0.011, 0.6275], + [6.2686, 0.0114, 0.6253], + [7.005, 0.0054, 0.6625], + [8.5207, 0.0063, 0.6563], + [10.0034, 0.003, 0.6844], + [11.5075, 0.0031, 0.6833], + [13.0327, 0.0032, 0.6829], + [14.5356, 0.0018, 0.7003], + [17.5447, 0.0014, 0.7063], + [20.5576, 0.0011, 0.7126], + [23.5624, 0.0007, 0.7197], + [26.5785, 0.0007, 0.721], + [29.593, 0.0005, 0.7248], + [32.6109, 0.0004, 0.7268], + [35.6384, 0.0004, 0.727], + [38.6439, 0.0002, 0.7343], + [41.6815, 0.0004, 0.7284], + [44.6895, 0.0002, 0.7372], + [47.6926, 0.0001, 0.7393], + [51.4567, 0.0001, 0.7382] ], + "dispense": [ - [1.0899, 0.2566, 0.3211], - [1.5035, 0.1576, 0.2642], - [1.9155, 0.1119, 0.3329], - [2.2801, 0.0624, 0.4278], - [2.997, 0.041, 0.4766], - [3.7688, 0.0372, 0.4878], - [4.7709, 0.0533, 0.4272], - [5.5082, 0.0095, 0.6364], - [6.2685, 0.0105, 0.6308], - [7.0043, 0.0053, 0.663], - [8.5166, 0.0061, 0.6574], - [10.0121, 0.0036, 0.6788], - [11.4941, 0.0022, 0.6934], - [13.039, 0.0039, 0.6737], - [14.5225, 0.0012, 0.7091], - [17.5398, 0.0016, 0.7035], - [20.5523, 0.0011, 0.7123], - [23.5501, 0.0006, 0.7208], - [26.5715, 0.0007, 0.7191], - [29.581, 0.0005, 0.7255], - [32.6007, 0.0005, 0.7258], - [35.6252, 0.0004, 0.7273], - [38.639, 0.0003, 0.7319], - [41.6464, 0.0002, 0.735], - [44.6386, 0.0001, 0.7396], - [47.657, 0.0002, 0.7341], - [51.4341, 0.0002, 0.7348] + [0.6464, 0.4817, 0.0427], + [1.0889, 0.2539, 0.1591], + [1.5136, 0.1624, 0.2587], + [1.9108, 0.1042, 0.3467], + [2.2941, 0.0719, 0.4085], + [2.9978, 0.037, 0.4886], + [3.7731, 0.0378, 0.4863], + [4.7575, 0.0516, 0.4342], + [5.5024, 0.011, 0.6275], + [6.2686, 0.0114, 0.6253], + [7.005, 0.0054, 0.6625], + [8.5207, 0.0063, 0.6563], + [10.0034, 0.003, 0.6844], + [11.5075, 0.0031, 0.6833], + [13.0327, 0.0032, 0.6829], + [14.5356, 0.0018, 0.7003], + [17.5447, 0.0014, 0.7063], + [20.5576, 0.0011, 0.7126], + [23.5624, 0.0007, 0.7197], + [26.5785, 0.0007, 0.721], + [29.593, 0.0005, 0.7248], + [32.6109, 0.0004, 0.7268], + [35.6384, 0.0004, 0.727], + [38.6439, 0.0002, 0.7343], + [41.6815, 0.0004, 0.7284], + [44.6895, 0.0002, 0.7372], + [47.6926, 0.0001, 0.7393], + [51.4567, 0.0001, 0.7382] ] } ], @@ -8089,7 +8984,7 @@ "type": "float" }, "dropTipSpeed": { - "value": 7, + "value": 10, "min": 0.001, "max": 30, "units": "mm/sec", @@ -8110,7 +9005,7 @@ "returnTipHeight": 0.78, "idleCurrent": 0.3 }, - "p50_multi_v3.1": { + "p50_multi_v3.4": { "name": "p50_multi_flex", "backCompatNames": [], "top": { @@ -8135,21 +9030,21 @@ "type": "float" }, "dropTip": { - "value": 90.5, + "value": 92.5, "min": 78, "max": 119, "units": "mm", "type": "float" }, "pickUpCurrent": { - "value": 1.0, + "value": 0.5, "min": 0.05, "max": 2.0, "units": "amps", "type": "float" }, "pickUpDistance": { - "value": 17, + "value": 13, "min": 1, "max": 30, "units": "mm", @@ -8176,68 +9071,70 @@ "units": "mm/s", "type": "float" }, - "nozzleOffset": [-0.5, -16.0, -259.15], + "nozzleOffset": [-8.0, -16.0, -259.15], "modelOffset": [0.0, 0.0, 25.14], "ulPerMm": [ { "aspirate": [ - [0.773, 0.4399, 0.1366], - [1.2256, 0.2292, 0.2093], - [1.6427, 0.1375, 0.3218], - [2.0338, 0.0857, 0.4068], - [2.4278, 0.0656, 0.4476], - [3.1383, 0.0292, 0.5361], - [3.8898, 0.0275, 0.5415], - [4.8856, 0.0499, 0.4544], - [5.6343, 0.0085, 0.6566], - [6.3958, 0.0084, 0.6572], - [7.1369, 0.0041, 0.6844], - [8.6419, 0.0043, 0.683], - [10.1384, 0.0027, 0.697], - [11.643, 0.0023, 0.7005], - [13.153, 0.002, 0.7043], - [14.6579, 0.0014, 0.7117], - [17.6672, 0.0011, 0.7171], - [20.6786, 0.0008, 0.7221], - [23.6841, 0.0005, 0.7275], - [26.6973, 0.0005, 0.7286], - [29.713, 0.0004, 0.7307], - [32.7317, 0.0004, 0.7322], - [35.7597, 0.0004, 0.7321], - [38.7849, 0.0003, 0.7347], - [41.8051, 0.0002, 0.7374], - [44.8187, 0.0002, 0.7402], - [47.8244, 0.0001, 0.7428], - [51.5715, 0.0, 0.7453] + [0.6464, 0.4817, 0.0427], + [1.0889, 0.2539, 0.1591], + [1.5136, 0.1624, 0.2587], + [1.9108, 0.1042, 0.3467], + [2.2941, 0.0719, 0.4085], + [2.9978, 0.037, 0.4886], + [3.7731, 0.0378, 0.4863], + [4.7575, 0.0516, 0.4342], + [5.5024, 0.011, 0.6275], + [6.2686, 0.0114, 0.6253], + [7.005, 0.0054, 0.6625], + [8.5207, 0.0063, 0.6563], + [10.0034, 0.003, 0.6844], + [11.5075, 0.0031, 0.6833], + [13.0327, 0.0032, 0.6829], + [14.5356, 0.0018, 0.7003], + [17.5447, 0.0014, 0.7063], + [20.5576, 0.0011, 0.7126], + [23.5624, 0.0007, 0.7197], + [26.5785, 0.0007, 0.721], + [29.593, 0.0005, 0.7248], + [32.6109, 0.0004, 0.7268], + [35.6384, 0.0004, 0.727], + [38.6439, 0.0002, 0.7343], + [41.6815, 0.0004, 0.7284], + [44.6895, 0.0002, 0.7372], + [47.6926, 0.0001, 0.7393], + [51.4567, 0.0001, 0.7382] ], + "dispense": [ - [1.0899, 0.2566, 0.3211], - [1.5035, 0.1576, 0.2642], - [1.9155, 0.1119, 0.3329], - [2.2801, 0.0624, 0.4278], - [2.997, 0.041, 0.4766], - [3.7688, 0.0372, 0.4878], - [4.7709, 0.0533, 0.4272], - [5.5082, 0.0095, 0.6364], - [6.2685, 0.0105, 0.6308], - [7.0043, 0.0053, 0.663], - [8.5166, 0.0061, 0.6574], - [10.0121, 0.0036, 0.6788], - [11.4941, 0.0022, 0.6934], - [13.039, 0.0039, 0.6737], - [14.5225, 0.0012, 0.7091], - [17.5398, 0.0016, 0.7035], - [20.5523, 0.0011, 0.7123], - [23.5501, 0.0006, 0.7208], - [26.5715, 0.0007, 0.7191], - [29.581, 0.0005, 0.7255], - [32.6007, 0.0005, 0.7258], - [35.6252, 0.0004, 0.7273], - [38.639, 0.0003, 0.7319], - [41.6464, 0.0002, 0.735], - [44.6386, 0.0001, 0.7396], - [47.657, 0.0002, 0.7341], - [51.4341, 0.0002, 0.7348] + [0.6464, 0.4817, 0.0427], + [1.0889, 0.2539, 0.1591], + [1.5136, 0.1624, 0.2587], + [1.9108, 0.1042, 0.3467], + [2.2941, 0.0719, 0.4085], + [2.9978, 0.037, 0.4886], + [3.7731, 0.0378, 0.4863], + [4.7575, 0.0516, 0.4342], + [5.5024, 0.011, 0.6275], + [6.2686, 0.0114, 0.6253], + [7.005, 0.0054, 0.6625], + [8.5207, 0.0063, 0.6563], + [10.0034, 0.003, 0.6844], + [11.5075, 0.0031, 0.6833], + [13.0327, 0.0032, 0.6829], + [14.5356, 0.0018, 0.7003], + [17.5447, 0.0014, 0.7063], + [20.5576, 0.0011, 0.7126], + [23.5624, 0.0007, 0.7197], + [26.5785, 0.0007, 0.721], + [29.593, 0.0005, 0.7248], + [32.6109, 0.0004, 0.7268], + [35.6384, 0.0004, 0.727], + [38.6439, 0.0002, 0.7343], + [41.6815, 0.0004, 0.7284], + [44.6895, 0.0002, 0.7372], + [47.6926, 0.0001, 0.7393], + [51.4567, 0.0001, 0.7382] ] } ], @@ -8256,7 +9153,7 @@ "type": "float" }, "dropTipSpeed": { - "value": 7, + "value": 10, "min": 0.001, "max": 30, "units": "mm/sec", @@ -8277,7 +9174,7 @@ "returnTipHeight": 0.78, "idleCurrent": 0.3 }, - "p50_multi_v3.3": { + "p50_multi_v3.5": { "name": "p50_multi_flex", "backCompatNames": [], "top": { @@ -8446,8 +9343,8 @@ "returnTipHeight": 0.78, "idleCurrent": 0.3 }, - "p50_multi_v3.4": { - "name": "p50_multi_flex", + "p1000_96_v1": { + "name": "p1000_96", "backCompatNames": [], "top": { "value": 0.5, @@ -8612,10 +9509,10 @@ "max": 100 }, "quirks": [], - "returnTipHeight": 0.78, + "returnTipHeight": 0.83, "idleCurrent": 0.3 }, - "p1000_96_v1": { + "p1000_96_v3.0": { "name": "p1000_96", "backCompatNames": [], "top": { @@ -8784,7 +9681,7 @@ "returnTipHeight": 0.83, "idleCurrent": 0.3 }, - "p1000_96_v3.0": { + "p1000_96_v3.3": { "name": "p1000_96", "backCompatNames": [], "top": { @@ -8953,7 +9850,7 @@ "returnTipHeight": 0.83, "idleCurrent": 0.3 }, - "p1000_96_v3.3": { + "p1000_96_v3.4": { "name": "p1000_96", "backCompatNames": [], "top": { @@ -9122,7 +10019,7 @@ "returnTipHeight": 0.83, "idleCurrent": 0.3 }, - "p1000_96_v3.4": { + "p1000_96_v3.5": { "name": "p1000_96", "backCompatNames": [], "top": { diff --git a/shared-data/pipette/definitions/2/general/eight_channel/p10/1_0.json b/shared-data/pipette/definitions/2/general/eight_channel/p10/1_0.json index 4dc7340996e..0a859832d05 100644 --- a/shared-data/pipette/definitions/2/general/eight_channel/p10/1_0.json +++ b/shared-data/pipette/definitions/2/general/eight_channel/p10/1_0.json @@ -17,7 +17,7 @@ "increment": 0.0, "distance": 0.0 }, - "plungerMotorConfigurations": { "idle": 0.5, "run": 0.5 }, + "plungerMotorConfigurations": { "idle": 0.05, "run": 0.5 }, "plungerPositionsConfigurations": { "top": 19.5, "bottom": 2.0, diff --git a/shared-data/pipette/definitions/2/general/eight_channel/p10/1_3.json b/shared-data/pipette/definitions/2/general/eight_channel/p10/1_3.json index c586e78d472..e270cafb1d2 100644 --- a/shared-data/pipette/definitions/2/general/eight_channel/p10/1_3.json +++ b/shared-data/pipette/definitions/2/general/eight_channel/p10/1_3.json @@ -17,7 +17,7 @@ "increment": 0.0, "distance": 0.0 }, - "plungerMotorConfigurations": { "idle": 0.5, "run": 0.5 }, + "plungerMotorConfigurations": { "idle": 0.05, "run": 0.5 }, "plungerPositionsConfigurations": { "top": 19.5, "bottom": 0.5, diff --git a/shared-data/pipette/definitions/2/general/eight_channel/p10/1_4.json b/shared-data/pipette/definitions/2/general/eight_channel/p10/1_4.json index 9bd3b00b8e8..116d0afdb95 100644 --- a/shared-data/pipette/definitions/2/general/eight_channel/p10/1_4.json +++ b/shared-data/pipette/definitions/2/general/eight_channel/p10/1_4.json @@ -17,7 +17,7 @@ "increment": 0.0, "distance": 0.0 }, - "plungerMotorConfigurations": { "idle": 0.5, "run": 0.5 }, + "plungerMotorConfigurations": { "idle": 0.05, "run": 0.5 }, "plungerPositionsConfigurations": { "top": 19.5, "bottom": 2.0, diff --git a/shared-data/pipette/definitions/2/general/eight_channel/p10/1_5.json b/shared-data/pipette/definitions/2/general/eight_channel/p10/1_5.json index ed9a66184f2..258d5f5ec82 100644 --- a/shared-data/pipette/definitions/2/general/eight_channel/p10/1_5.json +++ b/shared-data/pipette/definitions/2/general/eight_channel/p10/1_5.json @@ -17,7 +17,7 @@ "increment": 0.0, "distance": 0.0 }, - "plungerMotorConfigurations": { "idle": 0.5, "run": 0.5 }, + "plungerMotorConfigurations": { "idle": 0.05, "run": 0.5 }, "plungerPositionsConfigurations": { "top": 19.5, "bottom": 2.0, diff --git a/shared-data/pipette/definitions/2/general/eight_channel/p10/1_6.json b/shared-data/pipette/definitions/2/general/eight_channel/p10/1_6.json index ed9a66184f2..258d5f5ec82 100644 --- a/shared-data/pipette/definitions/2/general/eight_channel/p10/1_6.json +++ b/shared-data/pipette/definitions/2/general/eight_channel/p10/1_6.json @@ -17,7 +17,7 @@ "increment": 0.0, "distance": 0.0 }, - "plungerMotorConfigurations": { "idle": 0.5, "run": 0.5 }, + "plungerMotorConfigurations": { "idle": 0.05, "run": 0.5 }, "plungerPositionsConfigurations": { "top": 19.5, "bottom": 2.0, diff --git a/shared-data/pipette/definitions/2/general/eight_channel/p1000/3_5.json b/shared-data/pipette/definitions/2/general/eight_channel/p1000/3_5.json new file mode 100644 index 00000000000..6814af2e3a7 --- /dev/null +++ b/shared-data/pipette/definitions/2/general/eight_channel/p1000/3_5.json @@ -0,0 +1,37 @@ +{ + "$otSharedSchema": "#/pipette/schemas/2/pipettePropertiesSchema.json", + "displayName": "Flex 8-Channel 1000 μL", + "model": "p1000", + "displayCategory": "FLEX", + "pickUpTipConfigurations": { + "current": 0.55, + "presses": 1, + "speed": 10, + "increment": 0.0, + "distance": 13.0 + }, + "dropTipConfigurations": { "current": 1.0, "speed": 10 }, + "plungerMotorConfigurations": { "idle": 0.3, "run": 1.0 }, + "plungerPositionsConfigurations": { + "top": 0.0, + "bottom": 71.5, + "blowout": 76.5, + "drop": 91.5 + }, + "availableSensors": { + "sensors": ["pressure", "capacitive", "environment"], + "pressure": { "count": 2 }, + "capacitive": { "count": 2 }, + "environment": { "count": 1 } + }, + "partialTipConfigurations": { + "partialTipSupported": true, + "availableConfigurations": [1, 2, 3, 4, 5, 6, 7, 8] + }, + "backCompatNames": [], + "channels": 8, + "shaftDiameter": 4.5, + "shaftULperMM": 15.904, + "backlashDistance": 0.1, + "quirks": [] +} diff --git a/shared-data/pipette/definitions/2/general/eight_channel/p300/1_0.json b/shared-data/pipette/definitions/2/general/eight_channel/p300/1_0.json index 07672760cf1..63a4fc92314 100644 --- a/shared-data/pipette/definitions/2/general/eight_channel/p300/1_0.json +++ b/shared-data/pipette/definitions/2/general/eight_channel/p300/1_0.json @@ -17,7 +17,7 @@ "increment": 0.0, "distance": 0.0 }, - "plungerMotorConfigurations": { "idle": 0.5, "run": 0.5 }, + "plungerMotorConfigurations": { "idle": 0.05, "run": 0.5 }, "plungerPositionsConfigurations": { "top": 19.5, "bottom": 3.5, diff --git a/shared-data/pipette/definitions/2/general/eight_channel/p300/1_3.json b/shared-data/pipette/definitions/2/general/eight_channel/p300/1_3.json index 27e47216f02..22833bcd638 100644 --- a/shared-data/pipette/definitions/2/general/eight_channel/p300/1_3.json +++ b/shared-data/pipette/definitions/2/general/eight_channel/p300/1_3.json @@ -17,7 +17,7 @@ "increment": 0.0, "distance": 0.0 }, - "plungerMotorConfigurations": { "idle": 0.5, "run": 0.5 }, + "plungerMotorConfigurations": { "idle": 0.05, "run": 0.5 }, "plungerPositionsConfigurations": { "top": 19.5, "bottom": 3.5, diff --git a/shared-data/pipette/definitions/2/general/eight_channel/p300/1_4.json b/shared-data/pipette/definitions/2/general/eight_channel/p300/1_4.json index 27e47216f02..22833bcd638 100644 --- a/shared-data/pipette/definitions/2/general/eight_channel/p300/1_4.json +++ b/shared-data/pipette/definitions/2/general/eight_channel/p300/1_4.json @@ -17,7 +17,7 @@ "increment": 0.0, "distance": 0.0 }, - "plungerMotorConfigurations": { "idle": 0.5, "run": 0.5 }, + "plungerMotorConfigurations": { "idle": 0.05, "run": 0.5 }, "plungerPositionsConfigurations": { "top": 19.5, "bottom": 3.5, diff --git a/shared-data/pipette/definitions/2/general/eight_channel/p300/1_5.json b/shared-data/pipette/definitions/2/general/eight_channel/p300/1_5.json index 315198384e6..ae76c767c4e 100644 --- a/shared-data/pipette/definitions/2/general/eight_channel/p300/1_5.json +++ b/shared-data/pipette/definitions/2/general/eight_channel/p300/1_5.json @@ -17,7 +17,7 @@ "increment": 0.0, "distance": 0.0 }, - "plungerMotorConfigurations": { "idle": 0.5, "run": 0.5 }, + "plungerMotorConfigurations": { "idle": 0.05, "run": 0.5 }, "plungerPositionsConfigurations": { "top": 19.5, "bottom": 3.5, diff --git a/shared-data/pipette/definitions/2/general/eight_channel/p50/1_0.json b/shared-data/pipette/definitions/2/general/eight_channel/p50/1_0.json index 891e468f3dd..348922e294e 100644 --- a/shared-data/pipette/definitions/2/general/eight_channel/p50/1_0.json +++ b/shared-data/pipette/definitions/2/general/eight_channel/p50/1_0.json @@ -17,7 +17,7 @@ "increment": 0.0, "distance": 0.0 }, - "plungerMotorConfigurations": { "idle": 0.5, "run": 0.5 }, + "plungerMotorConfigurations": { "idle": 0.05, "run": 0.5 }, "plungerPositionsConfigurations": { "top": 19.5, "bottom": 2.5, diff --git a/shared-data/pipette/definitions/2/general/eight_channel/p50/1_3.json b/shared-data/pipette/definitions/2/general/eight_channel/p50/1_3.json index b57368b8331..c2ab5b9877b 100644 --- a/shared-data/pipette/definitions/2/general/eight_channel/p50/1_3.json +++ b/shared-data/pipette/definitions/2/general/eight_channel/p50/1_3.json @@ -17,7 +17,7 @@ "increment": 0.0, "distance": 0.0 }, - "plungerMotorConfigurations": { "idle": 0.5, "run": 0.5 }, + "plungerMotorConfigurations": { "idle": 0.05, "run": 0.5 }, "plungerPositionsConfigurations": { "top": 19.5, "bottom": 2.0, diff --git a/shared-data/pipette/definitions/2/general/eight_channel/p50/1_4.json b/shared-data/pipette/definitions/2/general/eight_channel/p50/1_4.json index 42f1b64e844..c022a2b0678 100644 --- a/shared-data/pipette/definitions/2/general/eight_channel/p50/1_4.json +++ b/shared-data/pipette/definitions/2/general/eight_channel/p50/1_4.json @@ -17,7 +17,7 @@ "increment": 0.0, "distance": 0.0 }, - "plungerMotorConfigurations": { "idle": 0.5, "run": 0.5 }, + "plungerMotorConfigurations": { "idle": 0.05, "run": 0.5 }, "plungerPositionsConfigurations": { "top": 19.5, "bottom": 2.0, diff --git a/shared-data/pipette/definitions/2/general/eight_channel/p50/1_5.json b/shared-data/pipette/definitions/2/general/eight_channel/p50/1_5.json index 17c19edf093..b36ce7c5aa3 100644 --- a/shared-data/pipette/definitions/2/general/eight_channel/p50/1_5.json +++ b/shared-data/pipette/definitions/2/general/eight_channel/p50/1_5.json @@ -17,7 +17,7 @@ "increment": 0.0, "distance": 0.0 }, - "plungerMotorConfigurations": { "idle": 0.5, "run": 0.5 }, + "plungerMotorConfigurations": { "idle": 0.05, "run": 0.5 }, "plungerPositionsConfigurations": { "top": 19.5, "bottom": 2.0, diff --git a/shared-data/pipette/definitions/2/general/eight_channel/p50/3_5.json b/shared-data/pipette/definitions/2/general/eight_channel/p50/3_5.json new file mode 100644 index 00000000000..d71fde284e2 --- /dev/null +++ b/shared-data/pipette/definitions/2/general/eight_channel/p50/3_5.json @@ -0,0 +1,37 @@ +{ + "$otSharedSchema": "#/pipette/schemas/2/pipettePropertiesSchema.json", + "displayName": "Flex 8-Channel 50 μL", + "model": "p50", + "displayCategory": "FLEX", + "pickUpTipConfigurations": { + "current": 0.55, + "presses": 1, + "speed": 10, + "increment": 0.0, + "distance": 13.0 + }, + "dropTipConfigurations": { "current": 1.0, "speed": 10 }, + "plungerMotorConfigurations": { "idle": 0.3, "run": 1.0 }, + "plungerPositionsConfigurations": { + "top": 0.0, + "bottom": 71.5, + "blowout": 76.5, + "drop": 91.5 + }, + "availableSensors": { + "sensors": ["pressure", "capacitive", "environment"], + "pressure": { "count": 2 }, + "capacitive": { "count": 2 }, + "environment": { "count": 1 } + }, + "partialTipConfigurations": { + "partialTipSupported": true, + "availableConfigurations": [1, 2, 3, 4, 5, 6, 7, 8] + }, + "backCompatNames": [], + "channels": 8, + "shaftDiameter": 1.0, + "shaftULperMM": 0.785, + "backlashDistance": 0.1, + "quirks": [] +} diff --git a/shared-data/pipette/definitions/2/general/ninety_six_channel/p1000/3_5.json b/shared-data/pipette/definitions/2/general/ninety_six_channel/p1000/3_5.json new file mode 100644 index 00000000000..efdc12e820e --- /dev/null +++ b/shared-data/pipette/definitions/2/general/ninety_six_channel/p1000/3_5.json @@ -0,0 +1,44 @@ +{ + "$otSharedSchema": "#/pipette/schemas/2/pipettePropertiesSchema.json", + "displayName": "Flex 96-Channel 1000 μL", + "model": "p1000", + "displayCategory": "FLEX", + "pickUpTipConfigurations": { + "current": 1.5, + "presses": 0.0, + "speed": 5.5, + "increment": 0.0, + "distance": 19.0 + }, + "dropTipConfigurations": { + "current": 1.5, + "speed": 5.5, + "distance": 29.8 + }, + "plungerMotorConfigurations": { + "idle": 0.3, + "run": 0.8 + }, + "plungerPositionsConfigurations": { + "top": 0.5, + "bottom": 68.5, + "blowout": 73.5, + "drop": 80 + }, + "availableSensors": { + "sensors": ["pressure", "capacitive", "environment"], + "pressure": { "count": 2 }, + "capacitive": { "count": 2 }, + "environment": { "count": 1 } + }, + "partialTipConfigurations": { + "partialTipSupported": true, + "availableConfigurations": [1, 8, 12, 96] + }, + "backCompatNames": [], + "channels": 96, + "shaftDiameter": 4.5, + "shaftULperMM": 15.904, + "backlashDistance": 0.3, + "quirks": [] +} diff --git a/shared-data/pipette/definitions/2/general/single_channel/p10/1_0.json b/shared-data/pipette/definitions/2/general/single_channel/p10/1_0.json index ab6e8f3ba0b..b0d3696f0f9 100644 --- a/shared-data/pipette/definitions/2/general/single_channel/p10/1_0.json +++ b/shared-data/pipette/definitions/2/general/single_channel/p10/1_0.json @@ -17,7 +17,7 @@ "increment": 0.0, "distance": 0.0 }, - "plungerMotorConfigurations": { "idle": 0.3, "run": 0.3 }, + "plungerMotorConfigurations": { "idle": 0.05, "run": 0.3 }, "plungerPositionsConfigurations": { "top": 19.5, "bottom": 2.0, diff --git a/shared-data/pipette/definitions/2/general/single_channel/p10/1_3.json b/shared-data/pipette/definitions/2/general/single_channel/p10/1_3.json index 221aa3a8b67..f4750c1fa9b 100644 --- a/shared-data/pipette/definitions/2/general/single_channel/p10/1_3.json +++ b/shared-data/pipette/definitions/2/general/single_channel/p10/1_3.json @@ -17,7 +17,7 @@ "increment": 0.0, "distance": 0.0 }, - "plungerMotorConfigurations": { "idle": 0.3, "run": 0.3 }, + "plungerMotorConfigurations": { "idle": 0.05, "run": 0.3 }, "plungerPositionsConfigurations": { "top": 19.5, "bottom": 0.5, diff --git a/shared-data/pipette/definitions/2/general/single_channel/p10/1_4.json b/shared-data/pipette/definitions/2/general/single_channel/p10/1_4.json index 76c4cdaa9f6..b80a115e434 100644 --- a/shared-data/pipette/definitions/2/general/single_channel/p10/1_4.json +++ b/shared-data/pipette/definitions/2/general/single_channel/p10/1_4.json @@ -17,7 +17,7 @@ "increment": 0.0, "distance": 0.0 }, - "plungerMotorConfigurations": { "idle": 0.3, "run": 0.3 }, + "plungerMotorConfigurations": { "idle": 0.05, "run": 0.3 }, "plungerPositionsConfigurations": { "top": 19.5, "bottom": 2.5, diff --git a/shared-data/pipette/definitions/2/general/single_channel/p10/1_5.json b/shared-data/pipette/definitions/2/general/single_channel/p10/1_5.json index 76c4cdaa9f6..b80a115e434 100644 --- a/shared-data/pipette/definitions/2/general/single_channel/p10/1_5.json +++ b/shared-data/pipette/definitions/2/general/single_channel/p10/1_5.json @@ -17,7 +17,7 @@ "increment": 0.0, "distance": 0.0 }, - "plungerMotorConfigurations": { "idle": 0.3, "run": 0.3 }, + "plungerMotorConfigurations": { "idle": 0.05, "run": 0.3 }, "plungerPositionsConfigurations": { "top": 19.5, "bottom": 2.5, diff --git a/shared-data/pipette/definitions/2/general/single_channel/p1000/1_0.json b/shared-data/pipette/definitions/2/general/single_channel/p1000/1_0.json index 36978cc39a8..6a8dbe19c07 100644 --- a/shared-data/pipette/definitions/2/general/single_channel/p1000/1_0.json +++ b/shared-data/pipette/definitions/2/general/single_channel/p1000/1_0.json @@ -17,7 +17,7 @@ "increment": 0.0, "distance": 0.0 }, - "plungerMotorConfigurations": { "idle": 0.5, "run": 0.5 }, + "plungerMotorConfigurations": { "idle": 0.05, "run": 0.5 }, "plungerPositionsConfigurations": { "top": 19.5, "bottom": 3.0, diff --git a/shared-data/pipette/definitions/2/general/single_channel/p1000/1_3.json b/shared-data/pipette/definitions/2/general/single_channel/p1000/1_3.json index fbb27df6244..ef90da2f0c4 100644 --- a/shared-data/pipette/definitions/2/general/single_channel/p1000/1_3.json +++ b/shared-data/pipette/definitions/2/general/single_channel/p1000/1_3.json @@ -17,7 +17,7 @@ "increment": 0.0, "distance": 0.0 }, - "plungerMotorConfigurations": { "idle": 0.5, "run": 0.5 }, + "plungerMotorConfigurations": { "idle": 0.05, "run": 0.5 }, "plungerPositionsConfigurations": { "top": 19.5, "bottom": 2.5, diff --git a/shared-data/pipette/definitions/2/general/single_channel/p1000/1_4.json b/shared-data/pipette/definitions/2/general/single_channel/p1000/1_4.json index fbb27df6244..ef90da2f0c4 100644 --- a/shared-data/pipette/definitions/2/general/single_channel/p1000/1_4.json +++ b/shared-data/pipette/definitions/2/general/single_channel/p1000/1_4.json @@ -17,7 +17,7 @@ "increment": 0.0, "distance": 0.0 }, - "plungerMotorConfigurations": { "idle": 0.5, "run": 0.5 }, + "plungerMotorConfigurations": { "idle": 0.05, "run": 0.5 }, "plungerPositionsConfigurations": { "top": 19.5, "bottom": 2.5, diff --git a/shared-data/pipette/definitions/2/general/single_channel/p1000/1_5.json b/shared-data/pipette/definitions/2/general/single_channel/p1000/1_5.json index e2935a6aa0d..a62b863d289 100644 --- a/shared-data/pipette/definitions/2/general/single_channel/p1000/1_5.json +++ b/shared-data/pipette/definitions/2/general/single_channel/p1000/1_5.json @@ -17,7 +17,7 @@ "increment": 0.0, "distance": 0.0 }, - "plungerMotorConfigurations": { "idle": 0.5, "run": 0.5 }, + "plungerMotorConfigurations": { "idle": 0.05, "run": 0.5 }, "plungerPositionsConfigurations": { "top": 19.5, "bottom": 2.5, diff --git a/shared-data/pipette/definitions/2/general/single_channel/p1000/2_0.json b/shared-data/pipette/definitions/2/general/single_channel/p1000/2_0.json index d7b1ebac8a2..5bc5f6e4d9c 100644 --- a/shared-data/pipette/definitions/2/general/single_channel/p1000/2_0.json +++ b/shared-data/pipette/definitions/2/general/single_channel/p1000/2_0.json @@ -17,7 +17,7 @@ "increment": 0.0, "distance": 0.0 }, - "plungerMotorConfigurations": { "idle": 1.0, "run": 1.0 }, + "plungerMotorConfigurations": { "idle": 0.05, "run": 1.0 }, "plungerPositionsConfigurations": { "top": 19.5, "bottom": -18.5, @@ -34,5 +34,5 @@ "shaftULperMM": 28.274, "backCompatNames": ["p1000_single"], "backlashDistance": 0.0, - "quirks": ["pickupTipShake", "dropTipShake"] + "quirks": ["pickupTipShake"] } diff --git a/shared-data/pipette/definitions/2/general/single_channel/p1000/2_1.json b/shared-data/pipette/definitions/2/general/single_channel/p1000/2_1.json index 106659e7754..0f778af1695 100644 --- a/shared-data/pipette/definitions/2/general/single_channel/p1000/2_1.json +++ b/shared-data/pipette/definitions/2/general/single_channel/p1000/2_1.json @@ -34,5 +34,5 @@ "shaftULperMM": 28.274, "backCompatNames": ["p1000_single"], "backlashDistance": 0.0, - "quirks": ["pickupTipShake", "dropTipShake"] + "quirks": ["pickupTipShake"] } diff --git a/shared-data/pipette/definitions/2/general/single_channel/p1000/2_2.json b/shared-data/pipette/definitions/2/general/single_channel/p1000/2_2.json index 106659e7754..0f778af1695 100644 --- a/shared-data/pipette/definitions/2/general/single_channel/p1000/2_2.json +++ b/shared-data/pipette/definitions/2/general/single_channel/p1000/2_2.json @@ -34,5 +34,5 @@ "shaftULperMM": 28.274, "backCompatNames": ["p1000_single"], "backlashDistance": 0.0, - "quirks": ["pickupTipShake", "dropTipShake"] + "quirks": ["pickupTipShake"] } diff --git a/shared-data/pipette/definitions/2/general/single_channel/p1000/3_5.json b/shared-data/pipette/definitions/2/general/single_channel/p1000/3_5.json new file mode 100644 index 00000000000..ece91b326fa --- /dev/null +++ b/shared-data/pipette/definitions/2/general/single_channel/p1000/3_5.json @@ -0,0 +1,34 @@ +{ + "$otSharedSchema": "#/pipette/schemas/2/pipettePropertiesSchema.json", + "displayName": "Flex 1-Channel 1000 μL", + "model": "p1000", + "displayCategory": "FLEX", + "pickUpTipConfigurations": { + "current": 0.2, + "presses": 1, + "speed": 10, + "increment": 0.0, + "distance": 13.0 + }, + "dropTipConfigurations": { "current": 1.0, "speed": 15 }, + "plungerMotorConfigurations": { "idle": 0.3, "run": 1.0 }, + "plungerPositionsConfigurations": { + "top": 0.0, + "bottom": 71.5, + "blowout": 76.5, + "drop": 90.5 + }, + "availableSensors": { + "sensors": ["pressure", "capacitive", "environment"], + "pressure": { "count": 1 }, + "capacitive": { "count": 1 }, + "environment": { "count": 1 } + }, + "partialTipConfigurations": { "partialTipSupported": false }, + "backCompatNames": [], + "channels": 1, + "shaftDiameter": 4.5, + "shaftULperMM": 15.904, + "backlashDistance": 0.1, + "quirks": [] +} diff --git a/shared-data/pipette/definitions/2/general/single_channel/p20/2_0.json b/shared-data/pipette/definitions/2/general/single_channel/p20/2_0.json index 5fc819e2298..c88c282ff50 100644 --- a/shared-data/pipette/definitions/2/general/single_channel/p20/2_0.json +++ b/shared-data/pipette/definitions/2/general/single_channel/p20/2_0.json @@ -17,7 +17,7 @@ "increment": 0.0, "distance": 0.0 }, - "plungerMotorConfigurations": { "idle": 1.0, "run": 1.0 }, + "plungerMotorConfigurations": { "idle": 0.05, "run": 1.0 }, "plungerPositionsConfigurations": { "top": 19.5, "bottom": -8.5, diff --git a/shared-data/pipette/definitions/2/general/single_channel/p300/1_0.json b/shared-data/pipette/definitions/2/general/single_channel/p300/1_0.json index 7b64bd85625..f2ac5d05ac4 100644 --- a/shared-data/pipette/definitions/2/general/single_channel/p300/1_0.json +++ b/shared-data/pipette/definitions/2/general/single_channel/p300/1_0.json @@ -17,7 +17,7 @@ "increment": 0.0, "distance": 0.0 }, - "plungerMotorConfigurations": { "idle": 0.3, "run": 0.3 }, + "plungerMotorConfigurations": { "idle": 0.05, "run": 0.3 }, "plungerPositionsConfigurations": { "top": 19.5, "bottom": 1.5, diff --git a/shared-data/pipette/definitions/2/general/single_channel/p300/1_3.json b/shared-data/pipette/definitions/2/general/single_channel/p300/1_3.json index 66d380b6c7f..d06ad46f607 100644 --- a/shared-data/pipette/definitions/2/general/single_channel/p300/1_3.json +++ b/shared-data/pipette/definitions/2/general/single_channel/p300/1_3.json @@ -17,7 +17,7 @@ "increment": 0.0, "distance": 0.0 }, - "plungerMotorConfigurations": { "idle": 0.3, "run": 0.3 }, + "plungerMotorConfigurations": { "idle": 0.05, "run": 0.3 }, "plungerPositionsConfigurations": { "top": 19.5, "bottom": 1.5, diff --git a/shared-data/pipette/definitions/2/general/single_channel/p300/1_4.json b/shared-data/pipette/definitions/2/general/single_channel/p300/1_4.json index dc4c4775ca4..26151541eeb 100644 --- a/shared-data/pipette/definitions/2/general/single_channel/p300/1_4.json +++ b/shared-data/pipette/definitions/2/general/single_channel/p300/1_4.json @@ -17,7 +17,7 @@ "increment": 0.0, "distance": 0.0 }, - "plungerMotorConfigurations": { "idle": 0.3, "run": 0.3 }, + "plungerMotorConfigurations": { "idle": 0.05, "run": 0.3 }, "plungerPositionsConfigurations": { "top": 19.5, "bottom": 3.0, diff --git a/shared-data/pipette/definitions/2/general/single_channel/p300/1_5.json b/shared-data/pipette/definitions/2/general/single_channel/p300/1_5.json index dc4c4775ca4..26151541eeb 100644 --- a/shared-data/pipette/definitions/2/general/single_channel/p300/1_5.json +++ b/shared-data/pipette/definitions/2/general/single_channel/p300/1_5.json @@ -17,7 +17,7 @@ "increment": 0.0, "distance": 0.0 }, - "plungerMotorConfigurations": { "idle": 0.3, "run": 0.3 }, + "plungerMotorConfigurations": { "idle": 0.05, "run": 0.3 }, "plungerPositionsConfigurations": { "top": 19.5, "bottom": 3.0, diff --git a/shared-data/pipette/definitions/2/general/single_channel/p300/2_0.json b/shared-data/pipette/definitions/2/general/single_channel/p300/2_0.json index d66f81f6639..ee8a492a66d 100644 --- a/shared-data/pipette/definitions/2/general/single_channel/p300/2_0.json +++ b/shared-data/pipette/definitions/2/general/single_channel/p300/2_0.json @@ -17,7 +17,7 @@ "increment": 0.0, "distance": 0.0 }, - "plungerMotorConfigurations": { "idle": 1.0, "run": 1.0 }, + "plungerMotorConfigurations": { "idle": 0.05, "run": 1.0 }, "plungerPositionsConfigurations": { "top": 19.5, "bottom": -14.5, diff --git a/shared-data/pipette/definitions/2/general/single_channel/p50/1_0.json b/shared-data/pipette/definitions/2/general/single_channel/p50/1_0.json index 49ed386831c..bde93a0bcd0 100644 --- a/shared-data/pipette/definitions/2/general/single_channel/p50/1_0.json +++ b/shared-data/pipette/definitions/2/general/single_channel/p50/1_0.json @@ -17,7 +17,7 @@ "increment": 0.0, "distance": 0.0 }, - "plungerMotorConfigurations": { "idle": 0.3, "run": 0.3 }, + "plungerMotorConfigurations": { "idle": 0.05, "run": 0.3 }, "plungerPositionsConfigurations": { "top": 19.5, "bottom": 2.01, diff --git a/shared-data/pipette/definitions/2/general/single_channel/p50/1_3.json b/shared-data/pipette/definitions/2/general/single_channel/p50/1_3.json index 92be5fe4fc0..3de62c7206b 100644 --- a/shared-data/pipette/definitions/2/general/single_channel/p50/1_3.json +++ b/shared-data/pipette/definitions/2/general/single_channel/p50/1_3.json @@ -17,7 +17,7 @@ "increment": 0.0, "distance": 0.0 }, - "plungerMotorConfigurations": { "idle": 0.3, "run": 0.3 }, + "plungerMotorConfigurations": { "idle": 0.05, "run": 0.3 }, "plungerPositionsConfigurations": { "top": 19.5, "bottom": 2.0, diff --git a/shared-data/pipette/definitions/2/general/single_channel/p50/1_4.json b/shared-data/pipette/definitions/2/general/single_channel/p50/1_4.json index 487405452b2..6ee48133a00 100644 --- a/shared-data/pipette/definitions/2/general/single_channel/p50/1_4.json +++ b/shared-data/pipette/definitions/2/general/single_channel/p50/1_4.json @@ -17,7 +17,7 @@ "increment": 0.0, "distance": 0.0 }, - "plungerMotorConfigurations": { "idle": 0.3, "run": 0.3 }, + "plungerMotorConfigurations": { "idle": 0.05, "run": 0.3 }, "plungerPositionsConfigurations": { "top": 19.5, "bottom": 2.0, diff --git a/shared-data/pipette/definitions/2/general/single_channel/p50/1_5.json b/shared-data/pipette/definitions/2/general/single_channel/p50/1_5.json index d83a387e849..4ca47e7d95b 100644 --- a/shared-data/pipette/definitions/2/general/single_channel/p50/1_5.json +++ b/shared-data/pipette/definitions/2/general/single_channel/p50/1_5.json @@ -19,7 +19,7 @@ "increment": 0.0, "distance": 0.0 }, - "plungerMotorConfigurations": { "idle": 0.3, "run": 0.3 }, + "plungerMotorConfigurations": { "idle": 0.05, "run": 0.3 }, "plungerPositionsConfigurations": { "top": 19.5, "bottom": 2.0, diff --git a/shared-data/pipette/definitions/2/general/single_channel/p50/3_5.json b/shared-data/pipette/definitions/2/general/single_channel/p50/3_5.json new file mode 100644 index 00000000000..b615dbca800 --- /dev/null +++ b/shared-data/pipette/definitions/2/general/single_channel/p50/3_5.json @@ -0,0 +1,34 @@ +{ + "$otSharedSchema": "#/pipette/schemas/2/pipettePropertiesSchema.json", + "displayName": "Flex 1-Channel 50 μL", + "model": "p50", + "displayCategory": "FLEX", + "pickUpTipConfigurations": { + "current": 0.2, + "presses": 1, + "speed": 10, + "increment": 0.0, + "distance": 13.0 + }, + "dropTipConfigurations": { "current": 1.0, "speed": 15 }, + "plungerMotorConfigurations": { "idle": 0.3, "run": 1.0 }, + "plungerPositionsConfigurations": { + "top": 0.0, + "bottom": 71.5, + "blowout": 76.5, + "drop": 90.5 + }, + "availableSensors": { + "sensors": ["pressure", "capacitive", "environment"], + "pressure": { "count": 1 }, + "capacitive": { "count": 1 }, + "environment": { "count": 1 } + }, + "partialTipConfigurations": { "partialTipSupported": false }, + "backCompatNames": [], + "channels": 1, + "shaftDiameter": 1.0, + "shaftULperMM": 0.785, + "backlashDistance": 0.1, + "quirks": [] +} diff --git a/shared-data/pipette/definitions/2/geometry/eight_channel/p1000/3_5.json b/shared-data/pipette/definitions/2/geometry/eight_channel/p1000/3_5.json new file mode 100644 index 00000000000..acade0fa951 --- /dev/null +++ b/shared-data/pipette/definitions/2/geometry/eight_channel/p1000/3_5.json @@ -0,0 +1,5 @@ +{ + "$otSharedSchema": "#/pipette/schemas/2/pipetteGeometrySchema.json", + "pathTo3D": "pipette/definitions/2/geometry/eight_channel/p50/placeholder.gltf", + "nozzleOffset": [-8.0, -16.0, -259.15] +} diff --git a/shared-data/pipette/definitions/2/geometry/eight_channel/p50/3_5.json b/shared-data/pipette/definitions/2/geometry/eight_channel/p50/3_5.json new file mode 100644 index 00000000000..c93774f0022 --- /dev/null +++ b/shared-data/pipette/definitions/2/geometry/eight_channel/p50/3_5.json @@ -0,0 +1,5 @@ +{ + "$otSharedSchema": "#/pipette/schemas/2/pipetteGeometrySchema.json", + "pathTo3D": "pipette/definitions/2/geometry/eight_channel/p1000/placeholder.gltf", + "nozzleOffset": [-8.0, -16.0, -259.15] +} diff --git a/shared-data/pipette/definitions/2/geometry/ninety_six_channel/p1000/3_5.json b/shared-data/pipette/definitions/2/geometry/ninety_six_channel/p1000/3_5.json new file mode 100644 index 00000000000..2a18fa5c1d6 --- /dev/null +++ b/shared-data/pipette/definitions/2/geometry/ninety_six_channel/p1000/3_5.json @@ -0,0 +1,5 @@ +{ + "$otSharedSchema": "#/pipette/schemas/2/pipetteGeometrySchema.json", + "pathTo3D": "pipette/definitions/2/geometry/ninety_six_channel/p1000/placeholder.gltf", + "nozzleOffset": [-36.0, -25.5, -259.15] +} diff --git a/shared-data/pipette/definitions/2/geometry/single_channel/p1000/3_5.json b/shared-data/pipette/definitions/2/geometry/single_channel/p1000/3_5.json new file mode 100644 index 00000000000..39731c8aedc --- /dev/null +++ b/shared-data/pipette/definitions/2/geometry/single_channel/p1000/3_5.json @@ -0,0 +1,5 @@ +{ + "$otSharedSchema": "#/pipette/schemas/2/pipetteGeometrySchema.json", + "pathTo3D": "pipette/definitions/2/geometry/single_channel/p1000/placeholder.gltf", + "nozzleOffset": [-8.0, -22.0, -259.15] +} diff --git a/shared-data/pipette/definitions/2/geometry/single_channel/p50/3_5.json b/shared-data/pipette/definitions/2/geometry/single_channel/p50/3_5.json new file mode 100644 index 00000000000..de6c4e07ac1 --- /dev/null +++ b/shared-data/pipette/definitions/2/geometry/single_channel/p50/3_5.json @@ -0,0 +1,5 @@ +{ + "$otSharedSchema": "#/pipette/schemas/2/pipetteGeometrySchema.json", + "pathTo3D": "pipette/definitions/2/geometry/single_channel/p50/placeholder.gltf", + "nozzleOffset": [-8.0, -22.0, -259.15] +} diff --git a/shared-data/pipette/definitions/2/liquid/eight_channel/p10/1_0.json b/shared-data/pipette/definitions/2/liquid/eight_channel/p10/1_0.json index 558e5300d47..b4c3abed957 100644 --- a/shared-data/pipette/definitions/2/liquid/eight_channel/p10/1_0.json +++ b/shared-data/pipette/definitions/2/liquid/eight_channel/p10/1_0.json @@ -2,66 +2,52 @@ "$otSharedSchema": "#/pipette/schemas/2/pipetteLiquidPropertiesSchema.json", "supportedTips": { "t10": { - "defaultAspirateFlowRate": 5.0, - "defaultDispenseFlowRate": 10.0, - "defaultBlowOutFlowRate": 1000.0, + "defaultAspirateFlowRate": { + "default": 5, + "valuesByApiLevel": { "2.0": 5 } + }, + "defaultDispenseFlowRate": { + "default": 10, + "valuesByApiLevel": { "2.0": 10 } + }, + "defaultBlowOutFlowRate": { + "default": 1000, + "valuesByApiLevel": { "2.0": 1000 } + }, "defaultTipLength": 33.0, - "defaultTipOverlap": 3.29, - "defaultReturnTipHeight": null, "aspirate": { - "opentrons/opentrons_96_tiprack_10ul/1": [ - [1.893415617, -1.1069, 3.042593193], - [2.497849452, -0.1888, 1.30410391], - [5.649462387, -0.0081, 0.8528667891], - [12.74444519, -0.0018, 0.8170558891] - ], - "opentrons/opentrons_96_filtertiprack_10ul/1": [ - [1.893415617, -1.1069, 3.042593193], - [2.497849452, -0.1888, 1.30410391], - [5.649462387, -0.0081, 0.8528667891], - [12.74444519, -0.0018, 0.8170558891] - ], - "opentrons/geb_96_tiprack_10ul/1": [ - [1.893415617, -1.1069, 3.042593193], - [2.497849452, -0.1888, 1.30410391], - [5.649462387, -0.0081, 0.8528667891], - [12.74444519, -0.0018, 0.8170558891] - ], - "opentrons/eppendorf_96_tiprack_10ul_eptips/1": [ - [1.893415617, -1.1069, 3.042593193], - [2.497849452, -0.1888, 1.30410391], - [5.649462387, -0.0081, 0.8528667891], - [12.74444519, -0.0018, 0.8170558891] - ], - "default": [ - [1.893415617, -1.1069, 3.042593193], - [2.497849452, -0.1888, 1.30410391], - [5.649462387, -0.0081, 0.8528667891], - [12.74444519, -0.0018, 0.8170558891] - ] + "default": { + "1": [ + [1.893415617, -1.1069, 3.042593193], + [2.497849452, -0.1888, 1.30410391], + [5.649462387, -0.0081, 0.8528667891], + [12.74444519, -0.0018, 0.8170558891] + ], + "2": [ + [1.438649211, 0.01931415115, 0.691538317], + [1.836824579, 0.03868955123, 0.6636639129], + [2.960052684, 0.00470371018, 0.7260899411], + [4.487508789, 0.005175245625, 0.7246941713], + [10.59661421, 0.001470408978, 0.7413196584] + ] + } }, "dispense": { - "opentrons/opentrons_96_tiprack_10ul/1": [ - [12.74444519, 0.0, 0.8058688085] - ], - "opentrons/opentrons_96_filtertiprack_10ul/1": [ - [12.74444519, 0.0, 0.8058688085] - ], - "opentrons/geb_96_tiprack_10ul/1": [[12.74444519, 0.0, 0.8058688085]], - "opentrons/eppendorf_96_tiprack_10ul_eptips/1": [ - [12.74444519, 0.0, 0.8058688085] - ], - "default": [[12.74444519, 0.0, 0.8058688085]] - }, - "defaultTipOverlapDictionary": { - "opentrons/opentrons_96_tiprack_10ul/1": 3.29, - "opentrons/opentrons_96_filtertiprack_10ul/1": 3.29, - "opentrons/geb_96_tiprack_10ul/1": 6.2, - "opentrons/eppendorf_96_tiprack_10ul_eptips/1": 1.0 + "default": { + "1": [[12.74444519, 0.0, 0.8058688085]], + "2": [[12.74444519, 0, 0.8058688085]] + } }, "defaultBlowoutVolume": 2.356 } }, + "defaultTipOverlapDictionary": { + "default": 3.29, + "opentrons/opentrons_96_tiprack_10ul/1": 3.29, + "opentrons/opentrons_96_filtertiprack_10ul/1": 3.29, + "opentrons/geb_96_tiprack_10ul/1": 6.2, + "opentrons/eppendorf_96_tiprack_10ul_eptips/1": 1.0 + }, "maxVolume": 10, "minVolume": 1.0, "defaultTipracks": [ diff --git a/shared-data/pipette/definitions/2/liquid/eight_channel/p10/1_3.json b/shared-data/pipette/definitions/2/liquid/eight_channel/p10/1_3.json index 558e5300d47..b4c3abed957 100644 --- a/shared-data/pipette/definitions/2/liquid/eight_channel/p10/1_3.json +++ b/shared-data/pipette/definitions/2/liquid/eight_channel/p10/1_3.json @@ -2,66 +2,52 @@ "$otSharedSchema": "#/pipette/schemas/2/pipetteLiquidPropertiesSchema.json", "supportedTips": { "t10": { - "defaultAspirateFlowRate": 5.0, - "defaultDispenseFlowRate": 10.0, - "defaultBlowOutFlowRate": 1000.0, + "defaultAspirateFlowRate": { + "default": 5, + "valuesByApiLevel": { "2.0": 5 } + }, + "defaultDispenseFlowRate": { + "default": 10, + "valuesByApiLevel": { "2.0": 10 } + }, + "defaultBlowOutFlowRate": { + "default": 1000, + "valuesByApiLevel": { "2.0": 1000 } + }, "defaultTipLength": 33.0, - "defaultTipOverlap": 3.29, - "defaultReturnTipHeight": null, "aspirate": { - "opentrons/opentrons_96_tiprack_10ul/1": [ - [1.893415617, -1.1069, 3.042593193], - [2.497849452, -0.1888, 1.30410391], - [5.649462387, -0.0081, 0.8528667891], - [12.74444519, -0.0018, 0.8170558891] - ], - "opentrons/opentrons_96_filtertiprack_10ul/1": [ - [1.893415617, -1.1069, 3.042593193], - [2.497849452, -0.1888, 1.30410391], - [5.649462387, -0.0081, 0.8528667891], - [12.74444519, -0.0018, 0.8170558891] - ], - "opentrons/geb_96_tiprack_10ul/1": [ - [1.893415617, -1.1069, 3.042593193], - [2.497849452, -0.1888, 1.30410391], - [5.649462387, -0.0081, 0.8528667891], - [12.74444519, -0.0018, 0.8170558891] - ], - "opentrons/eppendorf_96_tiprack_10ul_eptips/1": [ - [1.893415617, -1.1069, 3.042593193], - [2.497849452, -0.1888, 1.30410391], - [5.649462387, -0.0081, 0.8528667891], - [12.74444519, -0.0018, 0.8170558891] - ], - "default": [ - [1.893415617, -1.1069, 3.042593193], - [2.497849452, -0.1888, 1.30410391], - [5.649462387, -0.0081, 0.8528667891], - [12.74444519, -0.0018, 0.8170558891] - ] + "default": { + "1": [ + [1.893415617, -1.1069, 3.042593193], + [2.497849452, -0.1888, 1.30410391], + [5.649462387, -0.0081, 0.8528667891], + [12.74444519, -0.0018, 0.8170558891] + ], + "2": [ + [1.438649211, 0.01931415115, 0.691538317], + [1.836824579, 0.03868955123, 0.6636639129], + [2.960052684, 0.00470371018, 0.7260899411], + [4.487508789, 0.005175245625, 0.7246941713], + [10.59661421, 0.001470408978, 0.7413196584] + ] + } }, "dispense": { - "opentrons/opentrons_96_tiprack_10ul/1": [ - [12.74444519, 0.0, 0.8058688085] - ], - "opentrons/opentrons_96_filtertiprack_10ul/1": [ - [12.74444519, 0.0, 0.8058688085] - ], - "opentrons/geb_96_tiprack_10ul/1": [[12.74444519, 0.0, 0.8058688085]], - "opentrons/eppendorf_96_tiprack_10ul_eptips/1": [ - [12.74444519, 0.0, 0.8058688085] - ], - "default": [[12.74444519, 0.0, 0.8058688085]] - }, - "defaultTipOverlapDictionary": { - "opentrons/opentrons_96_tiprack_10ul/1": 3.29, - "opentrons/opentrons_96_filtertiprack_10ul/1": 3.29, - "opentrons/geb_96_tiprack_10ul/1": 6.2, - "opentrons/eppendorf_96_tiprack_10ul_eptips/1": 1.0 + "default": { + "1": [[12.74444519, 0.0, 0.8058688085]], + "2": [[12.74444519, 0, 0.8058688085]] + } }, "defaultBlowoutVolume": 2.356 } }, + "defaultTipOverlapDictionary": { + "default": 3.29, + "opentrons/opentrons_96_tiprack_10ul/1": 3.29, + "opentrons/opentrons_96_filtertiprack_10ul/1": 3.29, + "opentrons/geb_96_tiprack_10ul/1": 6.2, + "opentrons/eppendorf_96_tiprack_10ul_eptips/1": 1.0 + }, "maxVolume": 10, "minVolume": 1.0, "defaultTipracks": [ diff --git a/shared-data/pipette/definitions/2/liquid/eight_channel/p10/1_4.json b/shared-data/pipette/definitions/2/liquid/eight_channel/p10/1_4.json index 558e5300d47..b4c3abed957 100644 --- a/shared-data/pipette/definitions/2/liquid/eight_channel/p10/1_4.json +++ b/shared-data/pipette/definitions/2/liquid/eight_channel/p10/1_4.json @@ -2,66 +2,52 @@ "$otSharedSchema": "#/pipette/schemas/2/pipetteLiquidPropertiesSchema.json", "supportedTips": { "t10": { - "defaultAspirateFlowRate": 5.0, - "defaultDispenseFlowRate": 10.0, - "defaultBlowOutFlowRate": 1000.0, + "defaultAspirateFlowRate": { + "default": 5, + "valuesByApiLevel": { "2.0": 5 } + }, + "defaultDispenseFlowRate": { + "default": 10, + "valuesByApiLevel": { "2.0": 10 } + }, + "defaultBlowOutFlowRate": { + "default": 1000, + "valuesByApiLevel": { "2.0": 1000 } + }, "defaultTipLength": 33.0, - "defaultTipOverlap": 3.29, - "defaultReturnTipHeight": null, "aspirate": { - "opentrons/opentrons_96_tiprack_10ul/1": [ - [1.893415617, -1.1069, 3.042593193], - [2.497849452, -0.1888, 1.30410391], - [5.649462387, -0.0081, 0.8528667891], - [12.74444519, -0.0018, 0.8170558891] - ], - "opentrons/opentrons_96_filtertiprack_10ul/1": [ - [1.893415617, -1.1069, 3.042593193], - [2.497849452, -0.1888, 1.30410391], - [5.649462387, -0.0081, 0.8528667891], - [12.74444519, -0.0018, 0.8170558891] - ], - "opentrons/geb_96_tiprack_10ul/1": [ - [1.893415617, -1.1069, 3.042593193], - [2.497849452, -0.1888, 1.30410391], - [5.649462387, -0.0081, 0.8528667891], - [12.74444519, -0.0018, 0.8170558891] - ], - "opentrons/eppendorf_96_tiprack_10ul_eptips/1": [ - [1.893415617, -1.1069, 3.042593193], - [2.497849452, -0.1888, 1.30410391], - [5.649462387, -0.0081, 0.8528667891], - [12.74444519, -0.0018, 0.8170558891] - ], - "default": [ - [1.893415617, -1.1069, 3.042593193], - [2.497849452, -0.1888, 1.30410391], - [5.649462387, -0.0081, 0.8528667891], - [12.74444519, -0.0018, 0.8170558891] - ] + "default": { + "1": [ + [1.893415617, -1.1069, 3.042593193], + [2.497849452, -0.1888, 1.30410391], + [5.649462387, -0.0081, 0.8528667891], + [12.74444519, -0.0018, 0.8170558891] + ], + "2": [ + [1.438649211, 0.01931415115, 0.691538317], + [1.836824579, 0.03868955123, 0.6636639129], + [2.960052684, 0.00470371018, 0.7260899411], + [4.487508789, 0.005175245625, 0.7246941713], + [10.59661421, 0.001470408978, 0.7413196584] + ] + } }, "dispense": { - "opentrons/opentrons_96_tiprack_10ul/1": [ - [12.74444519, 0.0, 0.8058688085] - ], - "opentrons/opentrons_96_filtertiprack_10ul/1": [ - [12.74444519, 0.0, 0.8058688085] - ], - "opentrons/geb_96_tiprack_10ul/1": [[12.74444519, 0.0, 0.8058688085]], - "opentrons/eppendorf_96_tiprack_10ul_eptips/1": [ - [12.74444519, 0.0, 0.8058688085] - ], - "default": [[12.74444519, 0.0, 0.8058688085]] - }, - "defaultTipOverlapDictionary": { - "opentrons/opentrons_96_tiprack_10ul/1": 3.29, - "opentrons/opentrons_96_filtertiprack_10ul/1": 3.29, - "opentrons/geb_96_tiprack_10ul/1": 6.2, - "opentrons/eppendorf_96_tiprack_10ul_eptips/1": 1.0 + "default": { + "1": [[12.74444519, 0.0, 0.8058688085]], + "2": [[12.74444519, 0, 0.8058688085]] + } }, "defaultBlowoutVolume": 2.356 } }, + "defaultTipOverlapDictionary": { + "default": 3.29, + "opentrons/opentrons_96_tiprack_10ul/1": 3.29, + "opentrons/opentrons_96_filtertiprack_10ul/1": 3.29, + "opentrons/geb_96_tiprack_10ul/1": 6.2, + "opentrons/eppendorf_96_tiprack_10ul_eptips/1": 1.0 + }, "maxVolume": 10, "minVolume": 1.0, "defaultTipracks": [ diff --git a/shared-data/pipette/definitions/2/liquid/eight_channel/p10/1_5.json b/shared-data/pipette/definitions/2/liquid/eight_channel/p10/1_5.json index b15fc076270..db4618720ae 100644 --- a/shared-data/pipette/definitions/2/liquid/eight_channel/p10/1_5.json +++ b/shared-data/pipette/definitions/2/liquid/eight_channel/p10/1_5.json @@ -2,71 +2,43 @@ "$otSharedSchema": "#/pipette/schemas/2/pipetteLiquidPropertiesSchema.json", "supportedTips": { "t10": { - "defaultAspirateFlowRate": 5.0, - "defaultDispenseFlowRate": 10.0, - "defaultBlowOutFlowRate": 1000.0, + "defaultAspirateFlowRate": { + "default": 5, + "valuesByApiLevel": { "2.0": 5 } + }, + "defaultDispenseFlowRate": { + "default": 10, + "valuesByApiLevel": { "2.0": 10 } + }, + "defaultBlowOutFlowRate": { + "default": 1000, + "valuesByApiLevel": { "2.0": 1000 } + }, "defaultTipLength": 33.0, - "defaultTipOverlap": 3.29, - "defaultReturnTipHeight": null, "aspirate": { - "opentrons/opentrons_96_tiprack_10ul/1": [ - [1.774444444, -0.1917910448, 1.2026], - [2.151481481, -0.0706286837, 1.0125], - [2.898518519, -0.04343083788, 0.954], - [6.373333333, -0.00905990194, 0.8544], - [11.00259259, -0.002325900358, 0.8115] - ], - "opentrons/opentrons_96_filtertiprack_10ul/1": [ - [1.774444444, -0.1917910448, 1.2026], - [2.151481481, -0.0706286837, 1.0125], - [2.898518519, -0.04343083788, 0.954], - [6.373333333, -0.00905990194, 0.8544], - [11.00259259, -0.002325900358, 0.8115] - ], - "opentrons/geb_96_tiprack_10ul/1": [ - [1.774444444, -0.1917910448, 1.2026], - [2.151481481, -0.0706286837, 1.0125], - [2.898518519, -0.04343083788, 0.954], - [6.373333333, -0.00905990194, 0.8544], - [11.00259259, -0.002325900358, 0.8115] - ], - "opentrons/eppendorf_96_tiprack_10ul_eptips/1": [ - [1.774444444, -0.1917910448, 1.2026], - [2.151481481, -0.0706286837, 1.0125], - [2.898518519, -0.04343083788, 0.954], - [6.373333333, -0.00905990194, 0.8544], - [11.00259259, -0.002325900358, 0.8115] - ], - "default": [ - [1.774444444, -0.1917910448, 1.2026], - [2.151481481, -0.0706286837, 1.0125], - [2.898518519, -0.04343083788, 0.954], - [6.373333333, -0.00905990194, 0.8544], - [11.00259259, -0.002325900358, 0.8115] - ] + "default": { + "1": [ + [1.774444444, -0.1917910448, 1.2026], + [2.151481481, -0.0706286837, 1.0125], + [2.898518519, -0.04343083788, 0.954], + [6.373333333, -0.00905990194, 0.8544], + [11.00259259, -0.002325900358, 0.8115] + ] + } }, "dispense": { - "opentrons/opentrons_96_tiprack_10ul/1": [ - [12.74444519, 0.0, 0.8058688085] - ], - "opentrons/opentrons_96_filtertiprack_10ul/1": [ - [12.74444519, 0.0, 0.8058688085] - ], - "opentrons/geb_96_tiprack_10ul/1": [[12.74444519, 0.0, 0.8058688085]], - "opentrons/eppendorf_96_tiprack_10ul_eptips/1": [ - [12.74444519, 0.0, 0.8058688085] - ], - "default": [[12.74444519, 0.0, 0.8058688085]] - }, - "defaultTipOverlapDictionary": { - "opentrons/opentrons_96_tiprack_10ul/1": 3.29, - "opentrons/opentrons_96_filtertiprack_10ul/1": 3.29, - "opentrons/geb_96_tiprack_10ul/1": 6.2, - "opentrons/eppendorf_96_tiprack_10ul_eptips/1": 1.0 + "default": { "1": [[12.74444519, 0.0, 0.8058688085]] } }, "defaultBlowoutVolume": 2.356 } }, + "defaultTipOverlapDictionary": { + "default": 3.29, + "opentrons/opentrons_96_tiprack_10ul/1": 3.29, + "opentrons/opentrons_96_filtertiprack_10ul/1": 3.29, + "opentrons/geb_96_tiprack_10ul/1": 6.2, + "opentrons/eppendorf_96_tiprack_10ul_eptips/1": 1.0 + }, "maxVolume": 10, "minVolume": 1.0, "defaultTipracks": [ diff --git a/shared-data/pipette/definitions/2/liquid/eight_channel/p10/1_6.json b/shared-data/pipette/definitions/2/liquid/eight_channel/p10/1_6.json index a03e1b9f525..c5581d55101 100644 --- a/shared-data/pipette/definitions/2/liquid/eight_channel/p10/1_6.json +++ b/shared-data/pipette/definitions/2/liquid/eight_channel/p10/1_6.json @@ -2,111 +2,51 @@ "$otSharedSchema": "#/pipette/schemas/2/pipetteLiquidPropertiesSchema.json", "supportedTips": { "t10": { - "defaultAspirateFlowRate": 5.0, - "defaultDispenseFlowRate": 10.0, - "defaultBlowOutFlowRate": 1000.0, + "defaultAspirateFlowRate": { + "default": 5, + "valuesByApiLevel": { "2.0": 5 } + }, + "defaultDispenseFlowRate": { + "default": 10, + "valuesByApiLevel": { "2.0": 10 } + }, + "defaultBlowOutFlowRate": { + "default": 1000, + "valuesByApiLevel": { "2.0": 1000 } + }, "defaultTipLength": 33.0, - "defaultTipOverlap": 3.29, - "defaultReturnTipHeight": null, "aspirate": { - "opentrons/opentrons_96_tiprack_10ul/1": [ - [0.8649, 0.0374, 0.8484], - [1.2416, -0.0987, 0.9503], - [1.6053, -0.069, 0.9134], - [1.9851, -0.0226, 0.839], - [2.3481, -0.0313, 0.8561], - [2.7207, -0.0143, 0.8164], - [3.0702, -0.028, 0.8536], - [4.5998, -0.0006, 0.7694], - [6.1063, -0.0022, 0.7769], - [7.6504, 0.0011, 0.7564], - [9.1863, 0.0003, 0.7626], - [10.7574, 0.0018, 0.7488], - [12.2984, -0.4986, 6.1321] - ], - "opentrons/opentrons_96_filtertiprack_10ul/1": [ - [0.8649, 0.0374, 0.8484], - [1.2416, -0.0987, 0.9503], - [1.6053, -0.069, 0.9134], - [1.9851, -0.0226, 0.839], - [2.3481, -0.0313, 0.8561], - [2.7207, -0.0143, 0.8164], - [3.0702, -0.028, 0.8536], - [4.5998, -0.0006, 0.7694], - [6.1063, -0.0022, 0.7769], - [7.6504, 0.0011, 0.7564], - [9.1863, 0.0003, 0.7626], - [10.7574, 0.0018, 0.7488], - [12.2984, -0.4986, 6.1321] - ], - "opentrons/geb_96_tiprack_10ul/1": [ - [0.8649, 0.0374, 0.8484], - [1.2416, -0.0987, 0.9503], - [1.6053, -0.069, 0.9134], - [1.9851, -0.0226, 0.839], - [2.3481, -0.0313, 0.8561], - [2.7207, -0.0143, 0.8164], - [3.0702, -0.028, 0.8536], - [4.5998, -0.0006, 0.7694], - [6.1063, -0.0022, 0.7769], - [7.6504, 0.0011, 0.7564], - [9.1863, 0.0003, 0.7626], - [10.7574, 0.0018, 0.7488], - [12.2984, -0.4986, 6.1321] - ], - "opentrons/eppendorf_96_tiprack_10ul_eptips/1": [ - [0.8649, 0.0374, 0.8484], - [1.2416, -0.0987, 0.9503], - [1.6053, -0.069, 0.9134], - [1.9851, -0.0226, 0.839], - [2.3481, -0.0313, 0.8561], - [2.7207, -0.0143, 0.8164], - [3.0702, -0.028, 0.8536], - [4.5998, -0.0006, 0.7694], - [6.1063, -0.0022, 0.7769], - [7.6504, 0.0011, 0.7564], - [9.1863, 0.0003, 0.7626], - [10.7574, 0.0018, 0.7488], - [12.2984, -0.4986, 6.1321] - ], - "default": [ - [0.8649, 0.0374, 0.8484], - [1.2416, -0.0987, 0.9503], - [1.6053, -0.069, 0.9134], - [1.9851, -0.0226, 0.839], - [2.3481, -0.0313, 0.8561], - [2.7207, -0.0143, 0.8164], - [3.0702, -0.028, 0.8536], - [4.5998, -0.0006, 0.7694], - [6.1063, -0.0022, 0.7769], - [7.6504, 0.0011, 0.7564], - [9.1863, 0.0003, 0.7626], - [10.7574, 0.0018, 0.7488], - [12.2984, -0.4986, 6.1321] - ] + "default": { + "1": [ + [0.8649, 0.0374, 0.8484], + [1.2416, -0.0987, 0.9503], + [1.6053, -0.069, 0.9134], + [1.9851, -0.0226, 0.839], + [2.3481, -0.0313, 0.8561], + [2.7207, -0.0143, 0.8164], + [3.0702, -0.028, 0.8536], + [4.5998, -0.0006, 0.7694], + [6.1063, -0.0022, 0.7769], + [7.6504, 0.0011, 0.7564], + [9.1863, 0.0003, 0.7626], + [10.7574, 0.0018, 0.7488], + [12.2984, -0.4986, 6.1321] + ] + } }, "dispense": { - "opentrons/opentrons_96_tiprack_10ul/1": [ - [12.74444519, 0.0, 0.8058688085] - ], - "opentrons/opentrons_96_filtertiprack_10ul/1": [ - [12.74444519, 0.0, 0.8058688085] - ], - "opentrons/geb_96_tiprack_10ul/1": [[12.74444519, 0.0, 0.8058688085]], - "opentrons/eppendorf_96_tiprack_10ul_eptips/1": [ - [12.74444519, 0.0, 0.8058688085] - ], - "default": [[12.74444519, 0.0, 0.8058688085]] - }, - "defaultTipOverlapDictionary": { - "opentrons/opentrons_96_tiprack_10ul/1": 3.29, - "opentrons/opentrons_96_filtertiprack_10ul/1": 3.29, - "opentrons/geb_96_tiprack_10ul/1": 6.2, - "opentrons/eppendorf_96_tiprack_10ul_eptips/1": 1.0 + "default": { "1": [[12.74444519, 0.0, 0.8058688085]] } }, "defaultBlowoutVolume": 2.356 } }, + "defaultTipOverlapDictionary": { + "default": 3.29, + "opentrons/opentrons_96_tiprack_10ul/1": 3.29, + "opentrons/opentrons_96_filtertiprack_10ul/1": 3.29, + "opentrons/geb_96_tiprack_10ul/1": 6.2, + "opentrons/eppendorf_96_tiprack_10ul_eptips/1": 1.0 + }, "maxVolume": 10, "minVolume": 1.0, "defaultTipracks": [ diff --git a/shared-data/pipette/definitions/2/liquid/eight_channel/p1000/1_0.json b/shared-data/pipette/definitions/2/liquid/eight_channel/p1000/1_0.json index d823cb96028..b940fdadab2 100644 --- a/shared-data/pipette/definitions/2/liquid/eight_channel/p1000/1_0.json +++ b/shared-data/pipette/definitions/2/liquid/eight_channel/p1000/1_0.json @@ -2,305 +2,365 @@ "$otSharedSchema": "#/pipette/schemas/2/pipetteLiquidPropertiesSchema.json", "supportedTips": { "t50": { - "defaultAspirateFlowRate": 6, - "defaultDispenseFlowRate": 6, - "defaultBlowOutFlowRate": 80, + "defaultAspirateFlowRate": { + "default": 6, + "valuesByApiLevel": { + "2.14": 6 + } + }, + "defaultDispenseFlowRate": { + "default": 6, + "valuesByApiLevel": { + "2.14": 6 + } + }, + "defaultBlowOutFlowRate": { + "default": 80, + "valuesByApiLevel": { + "2.14": 80 + } + }, "defaultTipLength": 57.9, - "defaultTipOverlap": 10.5, "defaultReturnTipHeight": 0.83, "aspirate": { - "default": [ - [0.4148, -1705.1015, 20.5455], - [0.4476, -80.633, 47.2788], - [0.5512, -1.5936, 11.9026], - [0.6027, -18.9998, 21.4972], - [0.6503, -15.8781, 19.6156], - [0.7733, 3.0612, 7.2993], - [0.8391, -5.2227, 13.7056], - [0.9736, 3.0706, 6.7467], - [1.16, -0.374, 10.1005], - [1.3964, 1.3004, 8.1582], - [1.5815, -0.4837, 10.6494], - [1.8306, 1.1464, 8.0714], - [2.0345, 0.0132, 10.1459], - [2.6221, 0.5374, 9.0794], - [2.9655, -1.7582, 15.0986], - [3.5124, 0.2754, 9.0681], - [4.6591, 1.406, 5.097], - [5.367, 0.394, 9.8123], - [6.0839, 0.3365, 10.1205], - [6.8312, 0.3379, 10.1121], - [7.5676, 0.2611, 10.637], - [8.2397, 0.095, 11.8939], - [8.9776, 0.2015, 11.0165], - [10.413, 0.1332, 11.6294], - [11.8539, 0.1074, 11.8979], - [13.3655, 0.1286, 11.6464], - [14.8236, 0.0758, 12.3519], - [16.3203, 0.083, 12.2457], - [17.7915, 0.0581, 12.6515], - [19.2145, 0.0273, 13.1995], - [20.6718, 0.0388, 12.9792], - [22.1333, 0.0357, 13.044], - [25.0761, 0.0332, 13.0977], - [28.0339, 0.029, 13.2035], - [30.967, 0.0201, 13.4538], - [33.8727, 0.013, 13.6737], - [36.8273, 0.0172, 13.5324], - [39.7594, 0.0121, 13.7191], - [42.6721, 0.0083, 13.8687], - [45.5964, 0.0085, 13.8618], - [48.5297, 0.0084, 13.8668], - [51.4512, 0.0064, 13.9651] - ] + "default": { + "1": [ + [0.4148, -1705.1015, 20.5455], + [0.4476, -80.633, 47.2788], + [0.5512, -1.5936, 11.9026], + [0.6027, -18.9998, 21.4972], + [0.6503, -15.8781, 19.6156], + [0.7733, 3.0612, 7.2993], + [0.8391, -5.2227, 13.7056], + [0.9736, 3.0706, 6.7467], + [1.16, -0.374, 10.1005], + [1.3964, 1.3004, 8.1582], + [1.5815, -0.4837, 10.6494], + [1.8306, 1.1464, 8.0714], + [2.0345, 0.0132, 10.1459], + [2.6221, 0.5374, 9.0794], + [2.9655, -1.7582, 15.0986], + [3.5124, 0.2754, 9.0681], + [4.6591, 1.406, 5.097], + [5.367, 0.394, 9.8123], + [6.0839, 0.3365, 10.1205], + [6.8312, 0.3379, 10.1121], + [7.5676, 0.2611, 10.637], + [8.2397, 0.095, 11.8939], + [8.9776, 0.2015, 11.0165], + [10.413, 0.1332, 11.6294], + [11.8539, 0.1074, 11.8979], + [13.3655, 0.1286, 11.6464], + [14.8236, 0.0758, 12.3519], + [16.3203, 0.083, 12.2457], + [17.7915, 0.0581, 12.6515], + [19.2145, 0.0273, 13.1995], + [20.6718, 0.0388, 12.9792], + [22.1333, 0.0357, 13.044], + [25.0761, 0.0332, 13.0977], + [28.0339, 0.029, 13.2035], + [30.967, 0.0201, 13.4538], + [33.8727, 0.013, 13.6737], + [36.8273, 0.0172, 13.5324], + [39.7594, 0.0121, 13.7191], + [42.6721, 0.0083, 13.8687], + [45.5964, 0.0085, 13.8618], + [48.5297, 0.0084, 13.8668], + [51.4512, 0.0064, 13.9651] + ] + } }, "dispense": { - "default": [ - [0.4148, -1705.1015, 20.5455], - [0.4476, -80.633, 47.2788], - [0.5512, -1.5936, 11.9026], - [0.6027, -18.9998, 21.4972], - [0.6503, -15.8781, 19.6156], - [0.7733, 3.0612, 7.2993], - [0.8391, -5.2227, 13.7056], - [0.9736, 3.0706, 6.7467], - [1.16, -0.374, 10.1005], - [1.3964, 1.3004, 8.1582], - [1.5815, -0.4837, 10.6494], - [1.8306, 1.1464, 8.0714], - [2.0345, 0.0132, 10.1459], - [2.6221, 0.5374, 9.0794], - [2.9655, -1.7582, 15.0986], - [3.5124, 0.2754, 9.0681], - [4.6591, 1.406, 5.097], - [5.367, 0.394, 9.8123], - [6.0839, 0.3365, 10.1205], - [6.8312, 0.3379, 10.1121], - [7.5676, 0.2611, 10.637], - [8.2397, 0.095, 11.8939], - [8.9776, 0.2015, 11.0165], - [10.413, 0.1332, 11.6294], - [11.8539, 0.1074, 11.8979], - [13.3655, 0.1286, 11.6464], - [14.8236, 0.0758, 12.3519], - [16.3203, 0.083, 12.2457], - [17.7915, 0.0581, 12.6515], - [19.2145, 0.0273, 13.1995], - [20.6718, 0.0388, 12.9792], - [22.1333, 0.0357, 13.044], - [25.0761, 0.0332, 13.0977], - [28.0339, 0.029, 13.2035], - [30.967, 0.0201, 13.4538], - [33.8727, 0.013, 13.6737], - [36.8273, 0.0172, 13.5324], - [39.7594, 0.0121, 13.7191], - [42.6721, 0.0083, 13.8687], - [45.5964, 0.0085, 13.8618], - [48.5297, 0.0084, 13.8668], - [51.4512, 0.0064, 13.9651] - ] + "default": { + "1": [ + [0.4148, -1705.1015, 20.5455], + [0.4476, -80.633, 47.2788], + [0.5512, -1.5936, 11.9026], + [0.6027, -18.9998, 21.4972], + [0.6503, -15.8781, 19.6156], + [0.7733, 3.0612, 7.2993], + [0.8391, -5.2227, 13.7056], + [0.9736, 3.0706, 6.7467], + [1.16, -0.374, 10.1005], + [1.3964, 1.3004, 8.1582], + [1.5815, -0.4837, 10.6494], + [1.8306, 1.1464, 8.0714], + [2.0345, 0.0132, 10.1459], + [2.6221, 0.5374, 9.0794], + [2.9655, -1.7582, 15.0986], + [3.5124, 0.2754, 9.0681], + [4.6591, 1.406, 5.097], + [5.367, 0.394, 9.8123], + [6.0839, 0.3365, 10.1205], + [6.8312, 0.3379, 10.1121], + [7.5676, 0.2611, 10.637], + [8.2397, 0.095, 11.8939], + [8.9776, 0.2015, 11.0165], + [10.413, 0.1332, 11.6294], + [11.8539, 0.1074, 11.8979], + [13.3655, 0.1286, 11.6464], + [14.8236, 0.0758, 12.3519], + [16.3203, 0.083, 12.2457], + [17.7915, 0.0581, 12.6515], + [19.2145, 0.0273, 13.1995], + [20.6718, 0.0388, 12.9792], + [22.1333, 0.0357, 13.044], + [25.0761, 0.0332, 13.0977], + [28.0339, 0.029, 13.2035], + [30.967, 0.0201, 13.4538], + [33.8727, 0.013, 13.6737], + [36.8273, 0.0172, 13.5324], + [39.7594, 0.0121, 13.7191], + [42.6721, 0.0083, 13.8687], + [45.5964, 0.0085, 13.8618], + [48.5297, 0.0084, 13.8668], + [51.4512, 0.0064, 13.9651] + ] + } }, "defaultBlowoutVolume": -318.086 }, "t200": { - "defaultAspirateFlowRate": 80, - "defaultDispenseFlowRate": 80, - "defaultBlowOutFlowRate": 80, + "defaultAspirateFlowRate": { + "default": 80, + "valuesByApiLevel": { + "2.14": 80 + } + }, + "defaultDispenseFlowRate": { + "default": 80, + "valuesByApiLevel": { + "2.14": 80 + } + }, + "defaultBlowOutFlowRate": { + "default": 80, + "valuesByApiLevel": { + "2.14": 80 + } + }, "defaultTipLength": 58.35, - "defaultTipOverlap": 10.5, "defaultReturnTipHeight": 0.83, "aspirate": { - "default": [ - [0.8314, -2.9322, 24.0741], - [0.8853, -30.0996, 48.7784], - [0.9778, -4.3627, 25.9941], - [0.975, 802.2301, -762.6744], - [1.1272, -4.6837, 24.0666], - [1.2747, -3.91, 23.1945], - [1.5656, -2.8032, 21.7836], - [1.6667, -7.2039, 28.6731], - [2.4403, -0.5147, 17.5244], - [3.0564, -1.6013, 20.1761], - [3.6444, -1.1974, 18.9418], - [4.1189, -1.7877, 21.0928], - [4.6467, -0.8591, 17.2684], - [5.2597, -0.207, 14.2379], - [5.8581, -0.2196, 14.3044], - [6.4772, -0.1025, 13.6183], - [7.8158, 0.0537, 12.6063], - [9.1664, 0.0507, 12.6302], - [10.5064, 0.0285, 12.8339], - [14.8361, 0.0818, 12.273], - [19.3933, 0.0801, 12.2991], - [23.9242, 0.0487, 12.9079], - [28.4922, 0.0379, 13.1666], - [36.145, 0.0277, 13.4572], - [43.7972, 0.0184, 13.7916], - [51.5125, 0.0154, 13.9248], - [59.2467, 0.0121, 14.0931], - [66.9428, 0.0084, 14.3151], - [74.6853, 0.0079, 14.3498], - [82.3722, 0.0052, 14.5512], - [90.1106, 0.0054, 14.5333], - [97.8369, 0.0043, 14.6288], - [105.6153, 0.0046, 14.5983], - [113.3686, 0.0036, 14.7076], - [121.1108, 0.003, 14.7785], - [136.61, 0.0026, 14.826], - [152.0708, 0.0018, 14.9298], - [167.6433, 0.0021, 14.8827], - [183.1011, 0.0012, 15.0438], - [198.5845, 0.0011, 15.0538], - [214.0264, 0.0008, 15.123] - ] + "default": { + "1": [ + [0.8314, -2.9322, 24.0741], + [0.8853, -30.0996, 48.7784], + [0.9778, -4.3627, 25.9941], + [0.975, 802.2301, -762.6744], + [1.1272, -4.6837, 24.0666], + [1.2747, -3.91, 23.1945], + [1.5656, -2.8032, 21.7836], + [1.6667, -7.2039, 28.6731], + [2.4403, -0.5147, 17.5244], + [3.0564, -1.6013, 20.1761], + [3.6444, -1.1974, 18.9418], + [4.1189, -1.7877, 21.0928], + [4.6467, -0.8591, 17.2684], + [5.2597, -0.207, 14.2379], + [5.8581, -0.2196, 14.3044], + [6.4772, -0.1025, 13.6183], + [7.8158, 0.0537, 12.6063], + [9.1664, 0.0507, 12.6302], + [10.5064, 0.0285, 12.8339], + [14.8361, 0.0818, 12.273], + [19.3933, 0.0801, 12.2991], + [23.9242, 0.0487, 12.9079], + [28.4922, 0.0379, 13.1666], + [36.145, 0.0277, 13.4572], + [43.7972, 0.0184, 13.7916], + [51.5125, 0.0154, 13.9248], + [59.2467, 0.0121, 14.0931], + [66.9428, 0.0084, 14.3151], + [74.6853, 0.0079, 14.3498], + [82.3722, 0.0052, 14.5512], + [90.1106, 0.0054, 14.5333], + [97.8369, 0.0043, 14.6288], + [105.6153, 0.0046, 14.5983], + [113.3686, 0.0036, 14.7076], + [121.1108, 0.003, 14.7785], + [136.61, 0.0026, 14.826], + [152.0708, 0.0018, 14.9298], + [167.6433, 0.0021, 14.8827], + [183.1011, 0.0012, 15.0438], + [198.5845, 0.0011, 15.0538], + [214.0264, 0.0008, 15.123] + ] + } }, "dispense": { - "default": [ - [0.8314, -2.9322, 24.0741], - [0.8853, -30.0996, 48.7784], - [0.9778, -4.3627, 25.9941], - [0.975, 802.2301, -762.6744], - [1.1272, -4.6837, 24.0666], - [1.2747, -3.91, 23.1945], - [1.5656, -2.8032, 21.7836], - [1.6667, -7.2039, 28.6731], - [2.4403, -0.5147, 17.5244], - [3.0564, -1.6013, 20.1761], - [3.6444, -1.1974, 18.9418], - [4.1189, -1.7877, 21.0928], - [4.6467, -0.8591, 17.2684], - [5.2597, -0.207, 14.2379], - [5.8581, -0.2196, 14.3044], - [6.4772, -0.1025, 13.6183], - [7.8158, 0.0537, 12.6063], - [9.1664, 0.0507, 12.6302], - [10.5064, 0.0285, 12.8339], - [14.8361, 0.0818, 12.273], - [19.3933, 0.0801, 12.2991], - [23.9242, 0.0487, 12.9079], - [28.4922, 0.0379, 13.1666], - [36.145, 0.0277, 13.4572], - [43.7972, 0.0184, 13.7916], - [51.5125, 0.0154, 13.9248], - [59.2467, 0.0121, 14.0931], - [66.9428, 0.0084, 14.3151], - [74.6853, 0.0079, 14.3498], - [82.3722, 0.0052, 14.5512], - [90.1106, 0.0054, 14.5333], - [97.8369, 0.0043, 14.6288], - [105.6153, 0.0046, 14.5983], - [113.3686, 0.0036, 14.7076], - [121.1108, 0.003, 14.7785], - [136.61, 0.0026, 14.826], - [152.0708, 0.0018, 14.9298], - [167.6433, 0.0021, 14.8827], - [183.1011, 0.0012, 15.0438], - [198.5845, 0.0011, 15.0538], - [214.0264, 0.0008, 15.123] - ] + "default": { + "1": [ + [0.8314, -2.9322, 24.0741], + [0.8853, -30.0996, 48.7784], + [0.9778, -4.3627, 25.9941], + [0.975, 802.2301, -762.6744], + [1.1272, -4.6837, 24.0666], + [1.2747, -3.91, 23.1945], + [1.5656, -2.8032, 21.7836], + [1.6667, -7.2039, 28.6731], + [2.4403, -0.5147, 17.5244], + [3.0564, -1.6013, 20.1761], + [3.6444, -1.1974, 18.9418], + [4.1189, -1.7877, 21.0928], + [4.6467, -0.8591, 17.2684], + [5.2597, -0.207, 14.2379], + [5.8581, -0.2196, 14.3044], + [6.4772, -0.1025, 13.6183], + [7.8158, 0.0537, 12.6063], + [9.1664, 0.0507, 12.6302], + [10.5064, 0.0285, 12.8339], + [14.8361, 0.0818, 12.273], + [19.3933, 0.0801, 12.2991], + [23.9242, 0.0487, 12.9079], + [28.4922, 0.0379, 13.1666], + [36.145, 0.0277, 13.4572], + [43.7972, 0.0184, 13.7916], + [51.5125, 0.0154, 13.9248], + [59.2467, 0.0121, 14.0931], + [66.9428, 0.0084, 14.3151], + [74.6853, 0.0079, 14.3498], + [82.3722, 0.0052, 14.5512], + [90.1106, 0.0054, 14.5333], + [97.8369, 0.0043, 14.6288], + [105.6153, 0.0046, 14.5983], + [113.3686, 0.0036, 14.7076], + [121.1108, 0.003, 14.7785], + [136.61, 0.0026, 14.826], + [152.0708, 0.0018, 14.9298], + [167.6433, 0.0021, 14.8827], + [183.1011, 0.0012, 15.0438], + [198.5845, 0.0011, 15.0538], + [214.0264, 0.0008, 15.123] + ] + } }, "defaultBlowoutVolume": -318.086 }, "t1000": { - "defaultAspirateFlowRate": 160, - "defaultDispenseFlowRate": 160, - "defaultBlowOutFlowRate": 80, + "defaultAspirateFlowRate": { + "default": 160, + "valuesByApiLevel": { + "2.14": 160 + } + }, + "defaultDispenseFlowRate": { + "default": 160, + "valuesByApiLevel": { + "2.14": 160 + } + }, + "defaultBlowOutFlowRate": { + "default": 80, + "valuesByApiLevel": { + "2.14": 80 + } + }, "defaultTipLength": 95.6, - "defaultTipOverlap": 10.5, "defaultReturnTipHeight": 0.83, "aspirate": { - "default": [ - [0.7511, 3.9556, 6.455], - [1.3075, 2.1664, 5.8839], - [1.8737, 1.1513, 7.2111], - [3.177, 0.9374, 7.612], - [4.5368, 0.5531, 8.8328], - [7.3103, 0.3035, 9.9651], - [10.0825, 0.1513, 11.0781], - [12.9776, 0.1293, 11.2991], - [15.9173, 0.0976, 11.7115], - [18.8243, 0.0624, 12.2706], - [21.8529, 0.07, 12.1275], - [24.8068, 0.0418, 12.7442], - [27.7744, 0.0356, 12.8984], - [35.2873, 0.0303, 13.0454], - [42.7989, 0.0202, 13.4038], - [50.4562, 0.0196, 13.4293], - [58.1081, 0.0145, 13.6843], - [65.7267, 0.0104, 13.9252], - [73.2857, 0.0068, 14.1606], - [81.0016, 0.0091, 13.9883], - [88.6617, 0.0064, 14.2052], - [103.9829, 0.0051, 14.3271], - [119.4408, 0.0049, 14.3475], - [134.889, 0.0037, 14.485], - [150.273, 0.0026, 14.6402], - [181.2798, 0.0026, 14.6427], - [212.4724, 0.0022, 14.7002], - [243.577, 0.0015, 14.8558], - [274.7216, 0.0012, 14.9205], - [305.8132, 0.0009, 15.0118], - [368.0697, 0.0007, 15.0668], - [430.2513, 0.0005, 15.1594], - [492.3487, 0.0003, 15.2291], - [554.5713, 0.0003, 15.2367], - [616.6825, 0.0002, 15.2949], - [694.4168, 0.0002, 15.3027], - [772.0327, 0.0001, 15.3494], - [849.617, 0.0001, 15.3717], - [927.2556, 0.0001, 15.3745], - [1004.87, 0.0001, 15.3912], - [1051.4648, 0.0001, 15.391] - ] + "default": { + "1": [ + [0.7511, 3.9556, 6.455], + [1.3075, 2.1664, 5.8839], + [1.8737, 1.1513, 7.2111], + [3.177, 0.9374, 7.612], + [4.5368, 0.5531, 8.8328], + [7.3103, 0.3035, 9.9651], + [10.0825, 0.1513, 11.0781], + [12.9776, 0.1293, 11.2991], + [15.9173, 0.0976, 11.7115], + [18.8243, 0.0624, 12.2706], + [21.8529, 0.07, 12.1275], + [24.8068, 0.0418, 12.7442], + [27.7744, 0.0356, 12.8984], + [35.2873, 0.0303, 13.0454], + [42.7989, 0.0202, 13.4038], + [50.4562, 0.0196, 13.4293], + [58.1081, 0.0145, 13.6843], + [65.7267, 0.0104, 13.9252], + [73.2857, 0.0068, 14.1606], + [81.0016, 0.0091, 13.9883], + [88.6617, 0.0064, 14.2052], + [103.9829, 0.0051, 14.3271], + [119.4408, 0.0049, 14.3475], + [134.889, 0.0037, 14.485], + [150.273, 0.0026, 14.6402], + [181.2798, 0.0026, 14.6427], + [212.4724, 0.0022, 14.7002], + [243.577, 0.0015, 14.8558], + [274.7216, 0.0012, 14.9205], + [305.8132, 0.0009, 15.0118], + [368.0697, 0.0007, 15.0668], + [430.2513, 0.0005, 15.1594], + [492.3487, 0.0003, 15.2291], + [554.5713, 0.0003, 15.2367], + [616.6825, 0.0002, 15.2949], + [694.4168, 0.0002, 15.3027], + [772.0327, 0.0001, 15.3494], + [849.617, 0.0001, 15.3717], + [927.2556, 0.0001, 15.3745], + [1004.87, 0.0001, 15.3912], + [1051.4648, 0.0001, 15.391] + ] + } }, "dispense": { - "default": [ - [0.7511, 3.9556, 6.455], - [1.3075, 2.1664, 5.8839], - [1.8737, 1.1513, 7.2111], - [3.177, 0.9374, 7.612], - [4.5368, 0.5531, 8.8328], - [7.3103, 0.3035, 9.9651], - [10.0825, 0.1513, 11.0781], - [12.9776, 0.1293, 11.2991], - [15.9173, 0.0976, 11.7115], - [18.8243, 0.0624, 12.2706], - [21.8529, 0.07, 12.1275], - [24.8068, 0.0418, 12.7442], - [27.7744, 0.0356, 12.8984], - [35.2873, 0.0303, 13.0454], - [42.7989, 0.0202, 13.4038], - [50.4562, 0.0196, 13.4293], - [58.1081, 0.0145, 13.6843], - [65.7267, 0.0104, 13.9252], - [73.2857, 0.0068, 14.1606], - [81.0016, 0.0091, 13.9883], - [88.6617, 0.0064, 14.2052], - [103.9829, 0.0051, 14.3271], - [119.4408, 0.0049, 14.3475], - [134.889, 0.0037, 14.485], - [150.273, 0.0026, 14.6402], - [181.2798, 0.0026, 14.6427], - [212.4724, 0.0022, 14.7002], - [243.577, 0.0015, 14.8558], - [274.7216, 0.0012, 14.9205], - [305.8132, 0.0009, 15.0118], - [368.0697, 0.0007, 15.0668], - [430.2513, 0.0005, 15.1594], - [492.3487, 0.0003, 15.2291], - [554.5713, 0.0003, 15.2367], - [616.6825, 0.0002, 15.2949], - [694.4168, 0.0002, 15.3027], - [772.0327, 0.0001, 15.3494], - [849.617, 0.0001, 15.3717], - [927.2556, 0.0001, 15.3745], - [1004.87, 0.0001, 15.3912], - [1051.4648, 0.0001, 15.391] - ] + "default": { + "1": [ + [0.7511, 3.9556, 6.455], + [1.3075, 2.1664, 5.8839], + [1.8737, 1.1513, 7.2111], + [3.177, 0.9374, 7.612], + [4.5368, 0.5531, 8.8328], + [7.3103, 0.3035, 9.9651], + [10.0825, 0.1513, 11.0781], + [12.9776, 0.1293, 11.2991], + [15.9173, 0.0976, 11.7115], + [18.8243, 0.0624, 12.2706], + [21.8529, 0.07, 12.1275], + [24.8068, 0.0418, 12.7442], + [27.7744, 0.0356, 12.8984], + [35.2873, 0.0303, 13.0454], + [42.7989, 0.0202, 13.4038], + [50.4562, 0.0196, 13.4293], + [58.1081, 0.0145, 13.6843], + [65.7267, 0.0104, 13.9252], + [73.2857, 0.0068, 14.1606], + [81.0016, 0.0091, 13.9883], + [88.6617, 0.0064, 14.2052], + [103.9829, 0.0051, 14.3271], + [119.4408, 0.0049, 14.3475], + [134.889, 0.0037, 14.485], + [150.273, 0.0026, 14.6402], + [181.2798, 0.0026, 14.6427], + [212.4724, 0.0022, 14.7002], + [243.577, 0.0015, 14.8558], + [274.7216, 0.0012, 14.9205], + [305.8132, 0.0009, 15.0118], + [368.0697, 0.0007, 15.0668], + [430.2513, 0.0005, 15.1594], + [492.3487, 0.0003, 15.2291], + [554.5713, 0.0003, 15.2367], + [616.6825, 0.0002, 15.2949], + [694.4168, 0.0002, 15.3027], + [772.0327, 0.0001, 15.3494], + [849.617, 0.0001, 15.3717], + [927.2556, 0.0001, 15.3745], + [1004.87, 0.0001, 15.3912], + [1051.4648, 0.0001, 15.391] + ] + } }, "defaultBlowoutVolume": -318.086 } }, + "defaultTipOverlapDictionary": { + "default": 10.5, + "opentrons/opentrons_flex_96_tiprack_200ul/1": 10.5, + "opentrons/opentrons_flex_96_tiprack_50ul/1": 10.5, + "opentrons/opentrons_flex_96_tiprack_1000ul/1": 10.5 + }, "maxVolume": 1000, "minVolume": 5, "defaultTipracks": [ diff --git a/shared-data/pipette/definitions/2/liquid/eight_channel/p1000/3_0.json b/shared-data/pipette/definitions/2/liquid/eight_channel/p1000/3_0.json index 71b2bbf3fad..bb73169716c 100644 --- a/shared-data/pipette/definitions/2/liquid/eight_channel/p1000/3_0.json +++ b/shared-data/pipette/definitions/2/liquid/eight_channel/p1000/3_0.json @@ -2,305 +2,365 @@ "$otSharedSchema": "#/pipette/schemas/2/pipetteLiquidPropertiesSchema.json", "supportedTips": { "t50": { - "defaultAspirateFlowRate": 6, - "defaultDispenseFlowRate": 6, - "defaultBlowOutFlowRate": 80, + "defaultAspirateFlowRate": { + "default": 6, + "valuesByApiLevel": { + "2.14": 6 + } + }, + "defaultDispenseFlowRate": { + "default": 6, + "valuesByApiLevel": { + "2.14": 6 + } + }, + "defaultBlowOutFlowRate": { + "default": 80, + "valuesByApiLevel": { + "2.14": 80 + } + }, "defaultTipLength": 57.9, - "defaultTipOverlap": 10.5, "defaultReturnTipHeight": 0.71, "aspirate": { - "default": [ - [0.4148, -1705.1015, 20.5455], - [0.4476, -80.633, 47.2788], - [0.5512, -1.5936, 11.9026], - [0.6027, -18.9998, 21.4972], - [0.6503, -15.8781, 19.6156], - [0.7733, 3.0612, 7.2993], - [0.8391, -5.2227, 13.7056], - [0.9736, 3.0706, 6.7467], - [1.16, -0.374, 10.1005], - [1.3964, 1.3004, 8.1582], - [1.5815, -0.4837, 10.6494], - [1.8306, 1.1464, 8.0714], - [2.0345, 0.0132, 10.1459], - [2.6221, 0.5374, 9.0794], - [2.9655, -1.7582, 15.0986], - [3.5124, 0.2754, 9.0681], - [4.6591, 1.406, 5.097], - [5.367, 0.394, 9.8123], - [6.0839, 0.3365, 10.1205], - [6.8312, 0.3379, 10.1121], - [7.5676, 0.2611, 10.637], - [8.2397, 0.095, 11.8939], - [8.9776, 0.2015, 11.0165], - [10.413, 0.1332, 11.6294], - [11.8539, 0.1074, 11.8979], - [13.3655, 0.1286, 11.6464], - [14.8236, 0.0758, 12.3519], - [16.3203, 0.083, 12.2457], - [17.7915, 0.0581, 12.6515], - [19.2145, 0.0273, 13.1995], - [20.6718, 0.0388, 12.9792], - [22.1333, 0.0357, 13.044], - [25.0761, 0.0332, 13.0977], - [28.0339, 0.029, 13.2035], - [30.967, 0.0201, 13.4538], - [33.8727, 0.013, 13.6737], - [36.8273, 0.0172, 13.5324], - [39.7594, 0.0121, 13.7191], - [42.6721, 0.0083, 13.8687], - [45.5964, 0.0085, 13.8618], - [48.5297, 0.0084, 13.8668], - [51.4512, 0.0064, 13.9651] - ] + "default": { + "1": [ + [0.4148, -1705.1015, 20.5455], + [0.4476, -80.633, 47.2788], + [0.5512, -1.5936, 11.9026], + [0.6027, -18.9998, 21.4972], + [0.6503, -15.8781, 19.6156], + [0.7733, 3.0612, 7.2993], + [0.8391, -5.2227, 13.7056], + [0.9736, 3.0706, 6.7467], + [1.16, -0.374, 10.1005], + [1.3964, 1.3004, 8.1582], + [1.5815, -0.4837, 10.6494], + [1.8306, 1.1464, 8.0714], + [2.0345, 0.0132, 10.1459], + [2.6221, 0.5374, 9.0794], + [2.9655, -1.7582, 15.0986], + [3.5124, 0.2754, 9.0681], + [4.6591, 1.406, 5.097], + [5.367, 0.394, 9.8123], + [6.0839, 0.3365, 10.1205], + [6.8312, 0.3379, 10.1121], + [7.5676, 0.2611, 10.637], + [8.2397, 0.095, 11.8939], + [8.9776, 0.2015, 11.0165], + [10.413, 0.1332, 11.6294], + [11.8539, 0.1074, 11.8979], + [13.3655, 0.1286, 11.6464], + [14.8236, 0.0758, 12.3519], + [16.3203, 0.083, 12.2457], + [17.7915, 0.0581, 12.6515], + [19.2145, 0.0273, 13.1995], + [20.6718, 0.0388, 12.9792], + [22.1333, 0.0357, 13.044], + [25.0761, 0.0332, 13.0977], + [28.0339, 0.029, 13.2035], + [30.967, 0.0201, 13.4538], + [33.8727, 0.013, 13.6737], + [36.8273, 0.0172, 13.5324], + [39.7594, 0.0121, 13.7191], + [42.6721, 0.0083, 13.8687], + [45.5964, 0.0085, 13.8618], + [48.5297, 0.0084, 13.8668], + [51.4512, 0.0064, 13.9651] + ] + } }, "dispense": { - "default": [ - [0.4148, -1705.1015, 20.5455], - [0.4476, -80.633, 47.2788], - [0.5512, -1.5936, 11.9026], - [0.6027, -18.9998, 21.4972], - [0.6503, -15.8781, 19.6156], - [0.7733, 3.0612, 7.2993], - [0.8391, -5.2227, 13.7056], - [0.9736, 3.0706, 6.7467], - [1.16, -0.374, 10.1005], - [1.3964, 1.3004, 8.1582], - [1.5815, -0.4837, 10.6494], - [1.8306, 1.1464, 8.0714], - [2.0345, 0.0132, 10.1459], - [2.6221, 0.5374, 9.0794], - [2.9655, -1.7582, 15.0986], - [3.5124, 0.2754, 9.0681], - [4.6591, 1.406, 5.097], - [5.367, 0.394, 9.8123], - [6.0839, 0.3365, 10.1205], - [6.8312, 0.3379, 10.1121], - [7.5676, 0.2611, 10.637], - [8.2397, 0.095, 11.8939], - [8.9776, 0.2015, 11.0165], - [10.413, 0.1332, 11.6294], - [11.8539, 0.1074, 11.8979], - [13.3655, 0.1286, 11.6464], - [14.8236, 0.0758, 12.3519], - [16.3203, 0.083, 12.2457], - [17.7915, 0.0581, 12.6515], - [19.2145, 0.0273, 13.1995], - [20.6718, 0.0388, 12.9792], - [22.1333, 0.0357, 13.044], - [25.0761, 0.0332, 13.0977], - [28.0339, 0.029, 13.2035], - [30.967, 0.0201, 13.4538], - [33.8727, 0.013, 13.6737], - [36.8273, 0.0172, 13.5324], - [39.7594, 0.0121, 13.7191], - [42.6721, 0.0083, 13.8687], - [45.5964, 0.0085, 13.8618], - [48.5297, 0.0084, 13.8668], - [51.4512, 0.0064, 13.9651] - ] + "default": { + "1": [ + [0.4148, -1705.1015, 20.5455], + [0.4476, -80.633, 47.2788], + [0.5512, -1.5936, 11.9026], + [0.6027, -18.9998, 21.4972], + [0.6503, -15.8781, 19.6156], + [0.7733, 3.0612, 7.2993], + [0.8391, -5.2227, 13.7056], + [0.9736, 3.0706, 6.7467], + [1.16, -0.374, 10.1005], + [1.3964, 1.3004, 8.1582], + [1.5815, -0.4837, 10.6494], + [1.8306, 1.1464, 8.0714], + [2.0345, 0.0132, 10.1459], + [2.6221, 0.5374, 9.0794], + [2.9655, -1.7582, 15.0986], + [3.5124, 0.2754, 9.0681], + [4.6591, 1.406, 5.097], + [5.367, 0.394, 9.8123], + [6.0839, 0.3365, 10.1205], + [6.8312, 0.3379, 10.1121], + [7.5676, 0.2611, 10.637], + [8.2397, 0.095, 11.8939], + [8.9776, 0.2015, 11.0165], + [10.413, 0.1332, 11.6294], + [11.8539, 0.1074, 11.8979], + [13.3655, 0.1286, 11.6464], + [14.8236, 0.0758, 12.3519], + [16.3203, 0.083, 12.2457], + [17.7915, 0.0581, 12.6515], + [19.2145, 0.0273, 13.1995], + [20.6718, 0.0388, 12.9792], + [22.1333, 0.0357, 13.044], + [25.0761, 0.0332, 13.0977], + [28.0339, 0.029, 13.2035], + [30.967, 0.0201, 13.4538], + [33.8727, 0.013, 13.6737], + [36.8273, 0.0172, 13.5324], + [39.7594, 0.0121, 13.7191], + [42.6721, 0.0083, 13.8687], + [45.5964, 0.0085, 13.8618], + [48.5297, 0.0084, 13.8668], + [51.4512, 0.0064, 13.9651] + ] + } }, "defaultBlowoutVolume": 3.2 }, "t200": { - "defaultAspirateFlowRate": 80, - "defaultDispenseFlowRate": 80, - "defaultBlowOutFlowRate": 80, + "defaultAspirateFlowRate": { + "default": 80, + "valuesByApiLevel": { + "2.14": 80 + } + }, + "defaultDispenseFlowRate": { + "default": 80, + "valuesByApiLevel": { + "2.14": 80 + } + }, + "defaultBlowOutFlowRate": { + "default": 80, + "valuesByApiLevel": { + "2.14": 80 + } + }, "defaultTipLength": 58.35, - "defaultTipOverlap": 10.5, "defaultReturnTipHeight": 0.71, "aspirate": { - "default": [ - [0.8314, -2.9322, 24.0741], - [0.8853, -30.0996, 48.7784], - [0.9778, -4.3627, 25.9941], - [0.975, 802.2301, -762.6744], - [1.1272, -4.6837, 24.0666], - [1.2747, -3.91, 23.1945], - [1.5656, -2.8032, 21.7836], - [1.6667, -7.2039, 28.6731], - [2.4403, -0.5147, 17.5244], - [3.0564, -1.6013, 20.1761], - [3.6444, -1.1974, 18.9418], - [4.1189, -1.7877, 21.0928], - [4.6467, -0.8591, 17.2684], - [5.2597, -0.207, 14.2379], - [5.8581, -0.2196, 14.3044], - [6.4772, -0.1025, 13.6183], - [7.8158, 0.0537, 12.6063], - [9.1664, 0.0507, 12.6302], - [10.5064, 0.0285, 12.8339], - [14.8361, 0.0818, 12.273], - [19.3933, 0.0801, 12.2991], - [23.9242, 0.0487, 12.9079], - [28.4922, 0.0379, 13.1666], - [36.145, 0.0277, 13.4572], - [43.7972, 0.0184, 13.7916], - [51.5125, 0.0154, 13.9248], - [59.2467, 0.0121, 14.0931], - [66.9428, 0.0084, 14.3151], - [74.6853, 0.0079, 14.3498], - [82.3722, 0.0052, 14.5512], - [90.1106, 0.0054, 14.5333], - [97.8369, 0.0043, 14.6288], - [105.6153, 0.0046, 14.5983], - [113.3686, 0.0036, 14.7076], - [121.1108, 0.003, 14.7785], - [136.61, 0.0026, 14.826], - [152.0708, 0.0018, 14.9298], - [167.6433, 0.0021, 14.8827], - [183.1011, 0.0012, 15.0438], - [198.5845, 0.0011, 15.0538], - [214.0264, 0.0008, 15.123] - ] + "default": { + "1": [ + [0.8314, -2.9322, 24.0741], + [0.8853, -30.0996, 48.7784], + [0.9778, -4.3627, 25.9941], + [0.975, 802.2301, -762.6744], + [1.1272, -4.6837, 24.0666], + [1.2747, -3.91, 23.1945], + [1.5656, -2.8032, 21.7836], + [1.6667, -7.2039, 28.6731], + [2.4403, -0.5147, 17.5244], + [3.0564, -1.6013, 20.1761], + [3.6444, -1.1974, 18.9418], + [4.1189, -1.7877, 21.0928], + [4.6467, -0.8591, 17.2684], + [5.2597, -0.207, 14.2379], + [5.8581, -0.2196, 14.3044], + [6.4772, -0.1025, 13.6183], + [7.8158, 0.0537, 12.6063], + [9.1664, 0.0507, 12.6302], + [10.5064, 0.0285, 12.8339], + [14.8361, 0.0818, 12.273], + [19.3933, 0.0801, 12.2991], + [23.9242, 0.0487, 12.9079], + [28.4922, 0.0379, 13.1666], + [36.145, 0.0277, 13.4572], + [43.7972, 0.0184, 13.7916], + [51.5125, 0.0154, 13.9248], + [59.2467, 0.0121, 14.0931], + [66.9428, 0.0084, 14.3151], + [74.6853, 0.0079, 14.3498], + [82.3722, 0.0052, 14.5512], + [90.1106, 0.0054, 14.5333], + [97.8369, 0.0043, 14.6288], + [105.6153, 0.0046, 14.5983], + [113.3686, 0.0036, 14.7076], + [121.1108, 0.003, 14.7785], + [136.61, 0.0026, 14.826], + [152.0708, 0.0018, 14.9298], + [167.6433, 0.0021, 14.8827], + [183.1011, 0.0012, 15.0438], + [198.5845, 0.0011, 15.0538], + [214.0264, 0.0008, 15.123] + ] + } }, "dispense": { - "default": [ - [0.8314, -2.9322, 24.0741], - [0.8853, -30.0996, 48.7784], - [0.9778, -4.3627, 25.9941], - [0.975, 802.2301, -762.6744], - [1.1272, -4.6837, 24.0666], - [1.2747, -3.91, 23.1945], - [1.5656, -2.8032, 21.7836], - [1.6667, -7.2039, 28.6731], - [2.4403, -0.5147, 17.5244], - [3.0564, -1.6013, 20.1761], - [3.6444, -1.1974, 18.9418], - [4.1189, -1.7877, 21.0928], - [4.6467, -0.8591, 17.2684], - [5.2597, -0.207, 14.2379], - [5.8581, -0.2196, 14.3044], - [6.4772, -0.1025, 13.6183], - [7.8158, 0.0537, 12.6063], - [9.1664, 0.0507, 12.6302], - [10.5064, 0.0285, 12.8339], - [14.8361, 0.0818, 12.273], - [19.3933, 0.0801, 12.2991], - [23.9242, 0.0487, 12.9079], - [28.4922, 0.0379, 13.1666], - [36.145, 0.0277, 13.4572], - [43.7972, 0.0184, 13.7916], - [51.5125, 0.0154, 13.9248], - [59.2467, 0.0121, 14.0931], - [66.9428, 0.0084, 14.3151], - [74.6853, 0.0079, 14.3498], - [82.3722, 0.0052, 14.5512], - [90.1106, 0.0054, 14.5333], - [97.8369, 0.0043, 14.6288], - [105.6153, 0.0046, 14.5983], - [113.3686, 0.0036, 14.7076], - [121.1108, 0.003, 14.7785], - [136.61, 0.0026, 14.826], - [152.0708, 0.0018, 14.9298], - [167.6433, 0.0021, 14.8827], - [183.1011, 0.0012, 15.0438], - [198.5845, 0.0011, 15.0538], - [214.0264, 0.0008, 15.123] - ] + "default": { + "1": [ + [0.8314, -2.9322, 24.0741], + [0.8853, -30.0996, 48.7784], + [0.9778, -4.3627, 25.9941], + [0.975, 802.2301, -762.6744], + [1.1272, -4.6837, 24.0666], + [1.2747, -3.91, 23.1945], + [1.5656, -2.8032, 21.7836], + [1.6667, -7.2039, 28.6731], + [2.4403, -0.5147, 17.5244], + [3.0564, -1.6013, 20.1761], + [3.6444, -1.1974, 18.9418], + [4.1189, -1.7877, 21.0928], + [4.6467, -0.8591, 17.2684], + [5.2597, -0.207, 14.2379], + [5.8581, -0.2196, 14.3044], + [6.4772, -0.1025, 13.6183], + [7.8158, 0.0537, 12.6063], + [9.1664, 0.0507, 12.6302], + [10.5064, 0.0285, 12.8339], + [14.8361, 0.0818, 12.273], + [19.3933, 0.0801, 12.2991], + [23.9242, 0.0487, 12.9079], + [28.4922, 0.0379, 13.1666], + [36.145, 0.0277, 13.4572], + [43.7972, 0.0184, 13.7916], + [51.5125, 0.0154, 13.9248], + [59.2467, 0.0121, 14.0931], + [66.9428, 0.0084, 14.3151], + [74.6853, 0.0079, 14.3498], + [82.3722, 0.0052, 14.5512], + [90.1106, 0.0054, 14.5333], + [97.8369, 0.0043, 14.6288], + [105.6153, 0.0046, 14.5983], + [113.3686, 0.0036, 14.7076], + [121.1108, 0.003, 14.7785], + [136.61, 0.0026, 14.826], + [152.0708, 0.0018, 14.9298], + [167.6433, 0.0021, 14.8827], + [183.1011, 0.0012, 15.0438], + [198.5845, 0.0011, 15.0538], + [214.0264, 0.0008, 15.123] + ] + } }, "defaultBlowoutVolume": 16 }, "t1000": { - "defaultAspirateFlowRate": 160, - "defaultDispenseFlowRate": 160, - "defaultBlowOutFlowRate": 80, + "defaultAspirateFlowRate": { + "default": 160, + "valuesByApiLevel": { + "2.14": 160 + } + }, + "defaultDispenseFlowRate": { + "default": 160, + "valuesByApiLevel": { + "2.14": 160 + } + }, + "defaultBlowOutFlowRate": { + "default": 80, + "valuesByApiLevel": { + "2.14": 80 + } + }, "defaultTipLength": 95.6, - "defaultTipOverlap": 10.5, "defaultReturnTipHeight": 0.82, "aspirate": { - "default": [ - [0.7511, 3.9556, 6.455], - [1.3075, 2.1664, 5.8839], - [1.8737, 1.1513, 7.2111], - [3.177, 0.9374, 7.612], - [4.5368, 0.5531, 8.8328], - [7.3103, 0.3035, 9.9651], - [10.0825, 0.1513, 11.0781], - [12.9776, 0.1293, 11.2991], - [15.9173, 0.0976, 11.7115], - [18.8243, 0.0624, 12.2706], - [21.8529, 0.07, 12.1275], - [24.8068, 0.0418, 12.7442], - [27.7744, 0.0356, 12.8984], - [35.2873, 0.0303, 13.0454], - [42.7989, 0.0202, 13.4038], - [50.4562, 0.0196, 13.4293], - [58.1081, 0.0145, 13.6843], - [65.7267, 0.0104, 13.9252], - [73.2857, 0.0068, 14.1606], - [81.0016, 0.0091, 13.9883], - [88.6617, 0.0064, 14.2052], - [103.9829, 0.0051, 14.3271], - [119.4408, 0.0049, 14.3475], - [134.889, 0.0037, 14.485], - [150.273, 0.0026, 14.6402], - [181.2798, 0.0026, 14.6427], - [212.4724, 0.0022, 14.7002], - [243.577, 0.0015, 14.8558], - [274.7216, 0.0012, 14.9205], - [305.8132, 0.0009, 15.0118], - [368.0697, 0.0007, 15.0668], - [430.2513, 0.0005, 15.1594], - [492.3487, 0.0003, 15.2291], - [554.5713, 0.0003, 15.2367], - [616.6825, 0.0002, 15.2949], - [694.4168, 0.0002, 15.3027], - [772.0327, 0.0001, 15.3494], - [849.617, 0.0001, 15.3717], - [927.2556, 0.0001, 15.3745], - [1004.87, 0.0001, 15.3912], - [1051.4648, 0.0001, 15.391] - ] + "default": { + "1": [ + [0.7511, 3.9556, 6.455], + [1.3075, 2.1664, 5.8839], + [1.8737, 1.1513, 7.2111], + [3.177, 0.9374, 7.612], + [4.5368, 0.5531, 8.8328], + [7.3103, 0.3035, 9.9651], + [10.0825, 0.1513, 11.0781], + [12.9776, 0.1293, 11.2991], + [15.9173, 0.0976, 11.7115], + [18.8243, 0.0624, 12.2706], + [21.8529, 0.07, 12.1275], + [24.8068, 0.0418, 12.7442], + [27.7744, 0.0356, 12.8984], + [35.2873, 0.0303, 13.0454], + [42.7989, 0.0202, 13.4038], + [50.4562, 0.0196, 13.4293], + [58.1081, 0.0145, 13.6843], + [65.7267, 0.0104, 13.9252], + [73.2857, 0.0068, 14.1606], + [81.0016, 0.0091, 13.9883], + [88.6617, 0.0064, 14.2052], + [103.9829, 0.0051, 14.3271], + [119.4408, 0.0049, 14.3475], + [134.889, 0.0037, 14.485], + [150.273, 0.0026, 14.6402], + [181.2798, 0.0026, 14.6427], + [212.4724, 0.0022, 14.7002], + [243.577, 0.0015, 14.8558], + [274.7216, 0.0012, 14.9205], + [305.8132, 0.0009, 15.0118], + [368.0697, 0.0007, 15.0668], + [430.2513, 0.0005, 15.1594], + [492.3487, 0.0003, 15.2291], + [554.5713, 0.0003, 15.2367], + [616.6825, 0.0002, 15.2949], + [694.4168, 0.0002, 15.3027], + [772.0327, 0.0001, 15.3494], + [849.617, 0.0001, 15.3717], + [927.2556, 0.0001, 15.3745], + [1004.87, 0.0001, 15.3912], + [1051.4648, 0.0001, 15.391] + ] + } }, "dispense": { - "default": [ - [0.7511, 3.9556, 6.455], - [1.3075, 2.1664, 5.8839], - [1.8737, 1.1513, 7.2111], - [3.177, 0.9374, 7.612], - [4.5368, 0.5531, 8.8328], - [7.3103, 0.3035, 9.9651], - [10.0825, 0.1513, 11.0781], - [12.9776, 0.1293, 11.2991], - [15.9173, 0.0976, 11.7115], - [18.8243, 0.0624, 12.2706], - [21.8529, 0.07, 12.1275], - [24.8068, 0.0418, 12.7442], - [27.7744, 0.0356, 12.8984], - [35.2873, 0.0303, 13.0454], - [42.7989, 0.0202, 13.4038], - [50.4562, 0.0196, 13.4293], - [58.1081, 0.0145, 13.6843], - [65.7267, 0.0104, 13.9252], - [73.2857, 0.0068, 14.1606], - [81.0016, 0.0091, 13.9883], - [88.6617, 0.0064, 14.2052], - [103.9829, 0.0051, 14.3271], - [119.4408, 0.0049, 14.3475], - [134.889, 0.0037, 14.485], - [150.273, 0.0026, 14.6402], - [181.2798, 0.0026, 14.6427], - [212.4724, 0.0022, 14.7002], - [243.577, 0.0015, 14.8558], - [274.7216, 0.0012, 14.9205], - [305.8132, 0.0009, 15.0118], - [368.0697, 0.0007, 15.0668], - [430.2513, 0.0005, 15.1594], - [492.3487, 0.0003, 15.2291], - [554.5713, 0.0003, 15.2367], - [616.6825, 0.0002, 15.2949], - [694.4168, 0.0002, 15.3027], - [772.0327, 0.0001, 15.3494], - [849.617, 0.0001, 15.3717], - [927.2556, 0.0001, 15.3745], - [1004.87, 0.0001, 15.3912], - [1051.4648, 0.0001, 15.391] - ] + "default": { + "1": [ + [0.7511, 3.9556, 6.455], + [1.3075, 2.1664, 5.8839], + [1.8737, 1.1513, 7.2111], + [3.177, 0.9374, 7.612], + [4.5368, 0.5531, 8.8328], + [7.3103, 0.3035, 9.9651], + [10.0825, 0.1513, 11.0781], + [12.9776, 0.1293, 11.2991], + [15.9173, 0.0976, 11.7115], + [18.8243, 0.0624, 12.2706], + [21.8529, 0.07, 12.1275], + [24.8068, 0.0418, 12.7442], + [27.7744, 0.0356, 12.8984], + [35.2873, 0.0303, 13.0454], + [42.7989, 0.0202, 13.4038], + [50.4562, 0.0196, 13.4293], + [58.1081, 0.0145, 13.6843], + [65.7267, 0.0104, 13.9252], + [73.2857, 0.0068, 14.1606], + [81.0016, 0.0091, 13.9883], + [88.6617, 0.0064, 14.2052], + [103.9829, 0.0051, 14.3271], + [119.4408, 0.0049, 14.3475], + [134.889, 0.0037, 14.485], + [150.273, 0.0026, 14.6402], + [181.2798, 0.0026, 14.6427], + [212.4724, 0.0022, 14.7002], + [243.577, 0.0015, 14.8558], + [274.7216, 0.0012, 14.9205], + [305.8132, 0.0009, 15.0118], + [368.0697, 0.0007, 15.0668], + [430.2513, 0.0005, 15.1594], + [492.3487, 0.0003, 15.2291], + [554.5713, 0.0003, 15.2367], + [616.6825, 0.0002, 15.2949], + [694.4168, 0.0002, 15.3027], + [772.0327, 0.0001, 15.3494], + [849.617, 0.0001, 15.3717], + [927.2556, 0.0001, 15.3745], + [1004.87, 0.0001, 15.3912], + [1051.4648, 0.0001, 15.391] + ] + } }, "defaultBlowoutVolume": 16 } }, + "defaultTipOverlapDictionary": { + "default": 10.5, + "opentrons/opentrons_flex_96_tiprack_200ul/1": 10.5, + "opentrons/opentrons_flex_96_tiprack_50ul/1": 10.5, + "opentrons/opentrons_flex_96_tiprack_1000ul/1": 10.5 + }, "maxVolume": 1000, "minVolume": 5, "defaultTipracks": [ diff --git a/shared-data/pipette/definitions/2/liquid/eight_channel/p1000/3_3.json b/shared-data/pipette/definitions/2/liquid/eight_channel/p1000/3_3.json index 71b2bbf3fad..bb73169716c 100644 --- a/shared-data/pipette/definitions/2/liquid/eight_channel/p1000/3_3.json +++ b/shared-data/pipette/definitions/2/liquid/eight_channel/p1000/3_3.json @@ -2,305 +2,365 @@ "$otSharedSchema": "#/pipette/schemas/2/pipetteLiquidPropertiesSchema.json", "supportedTips": { "t50": { - "defaultAspirateFlowRate": 6, - "defaultDispenseFlowRate": 6, - "defaultBlowOutFlowRate": 80, + "defaultAspirateFlowRate": { + "default": 6, + "valuesByApiLevel": { + "2.14": 6 + } + }, + "defaultDispenseFlowRate": { + "default": 6, + "valuesByApiLevel": { + "2.14": 6 + } + }, + "defaultBlowOutFlowRate": { + "default": 80, + "valuesByApiLevel": { + "2.14": 80 + } + }, "defaultTipLength": 57.9, - "defaultTipOverlap": 10.5, "defaultReturnTipHeight": 0.71, "aspirate": { - "default": [ - [0.4148, -1705.1015, 20.5455], - [0.4476, -80.633, 47.2788], - [0.5512, -1.5936, 11.9026], - [0.6027, -18.9998, 21.4972], - [0.6503, -15.8781, 19.6156], - [0.7733, 3.0612, 7.2993], - [0.8391, -5.2227, 13.7056], - [0.9736, 3.0706, 6.7467], - [1.16, -0.374, 10.1005], - [1.3964, 1.3004, 8.1582], - [1.5815, -0.4837, 10.6494], - [1.8306, 1.1464, 8.0714], - [2.0345, 0.0132, 10.1459], - [2.6221, 0.5374, 9.0794], - [2.9655, -1.7582, 15.0986], - [3.5124, 0.2754, 9.0681], - [4.6591, 1.406, 5.097], - [5.367, 0.394, 9.8123], - [6.0839, 0.3365, 10.1205], - [6.8312, 0.3379, 10.1121], - [7.5676, 0.2611, 10.637], - [8.2397, 0.095, 11.8939], - [8.9776, 0.2015, 11.0165], - [10.413, 0.1332, 11.6294], - [11.8539, 0.1074, 11.8979], - [13.3655, 0.1286, 11.6464], - [14.8236, 0.0758, 12.3519], - [16.3203, 0.083, 12.2457], - [17.7915, 0.0581, 12.6515], - [19.2145, 0.0273, 13.1995], - [20.6718, 0.0388, 12.9792], - [22.1333, 0.0357, 13.044], - [25.0761, 0.0332, 13.0977], - [28.0339, 0.029, 13.2035], - [30.967, 0.0201, 13.4538], - [33.8727, 0.013, 13.6737], - [36.8273, 0.0172, 13.5324], - [39.7594, 0.0121, 13.7191], - [42.6721, 0.0083, 13.8687], - [45.5964, 0.0085, 13.8618], - [48.5297, 0.0084, 13.8668], - [51.4512, 0.0064, 13.9651] - ] + "default": { + "1": [ + [0.4148, -1705.1015, 20.5455], + [0.4476, -80.633, 47.2788], + [0.5512, -1.5936, 11.9026], + [0.6027, -18.9998, 21.4972], + [0.6503, -15.8781, 19.6156], + [0.7733, 3.0612, 7.2993], + [0.8391, -5.2227, 13.7056], + [0.9736, 3.0706, 6.7467], + [1.16, -0.374, 10.1005], + [1.3964, 1.3004, 8.1582], + [1.5815, -0.4837, 10.6494], + [1.8306, 1.1464, 8.0714], + [2.0345, 0.0132, 10.1459], + [2.6221, 0.5374, 9.0794], + [2.9655, -1.7582, 15.0986], + [3.5124, 0.2754, 9.0681], + [4.6591, 1.406, 5.097], + [5.367, 0.394, 9.8123], + [6.0839, 0.3365, 10.1205], + [6.8312, 0.3379, 10.1121], + [7.5676, 0.2611, 10.637], + [8.2397, 0.095, 11.8939], + [8.9776, 0.2015, 11.0165], + [10.413, 0.1332, 11.6294], + [11.8539, 0.1074, 11.8979], + [13.3655, 0.1286, 11.6464], + [14.8236, 0.0758, 12.3519], + [16.3203, 0.083, 12.2457], + [17.7915, 0.0581, 12.6515], + [19.2145, 0.0273, 13.1995], + [20.6718, 0.0388, 12.9792], + [22.1333, 0.0357, 13.044], + [25.0761, 0.0332, 13.0977], + [28.0339, 0.029, 13.2035], + [30.967, 0.0201, 13.4538], + [33.8727, 0.013, 13.6737], + [36.8273, 0.0172, 13.5324], + [39.7594, 0.0121, 13.7191], + [42.6721, 0.0083, 13.8687], + [45.5964, 0.0085, 13.8618], + [48.5297, 0.0084, 13.8668], + [51.4512, 0.0064, 13.9651] + ] + } }, "dispense": { - "default": [ - [0.4148, -1705.1015, 20.5455], - [0.4476, -80.633, 47.2788], - [0.5512, -1.5936, 11.9026], - [0.6027, -18.9998, 21.4972], - [0.6503, -15.8781, 19.6156], - [0.7733, 3.0612, 7.2993], - [0.8391, -5.2227, 13.7056], - [0.9736, 3.0706, 6.7467], - [1.16, -0.374, 10.1005], - [1.3964, 1.3004, 8.1582], - [1.5815, -0.4837, 10.6494], - [1.8306, 1.1464, 8.0714], - [2.0345, 0.0132, 10.1459], - [2.6221, 0.5374, 9.0794], - [2.9655, -1.7582, 15.0986], - [3.5124, 0.2754, 9.0681], - [4.6591, 1.406, 5.097], - [5.367, 0.394, 9.8123], - [6.0839, 0.3365, 10.1205], - [6.8312, 0.3379, 10.1121], - [7.5676, 0.2611, 10.637], - [8.2397, 0.095, 11.8939], - [8.9776, 0.2015, 11.0165], - [10.413, 0.1332, 11.6294], - [11.8539, 0.1074, 11.8979], - [13.3655, 0.1286, 11.6464], - [14.8236, 0.0758, 12.3519], - [16.3203, 0.083, 12.2457], - [17.7915, 0.0581, 12.6515], - [19.2145, 0.0273, 13.1995], - [20.6718, 0.0388, 12.9792], - [22.1333, 0.0357, 13.044], - [25.0761, 0.0332, 13.0977], - [28.0339, 0.029, 13.2035], - [30.967, 0.0201, 13.4538], - [33.8727, 0.013, 13.6737], - [36.8273, 0.0172, 13.5324], - [39.7594, 0.0121, 13.7191], - [42.6721, 0.0083, 13.8687], - [45.5964, 0.0085, 13.8618], - [48.5297, 0.0084, 13.8668], - [51.4512, 0.0064, 13.9651] - ] + "default": { + "1": [ + [0.4148, -1705.1015, 20.5455], + [0.4476, -80.633, 47.2788], + [0.5512, -1.5936, 11.9026], + [0.6027, -18.9998, 21.4972], + [0.6503, -15.8781, 19.6156], + [0.7733, 3.0612, 7.2993], + [0.8391, -5.2227, 13.7056], + [0.9736, 3.0706, 6.7467], + [1.16, -0.374, 10.1005], + [1.3964, 1.3004, 8.1582], + [1.5815, -0.4837, 10.6494], + [1.8306, 1.1464, 8.0714], + [2.0345, 0.0132, 10.1459], + [2.6221, 0.5374, 9.0794], + [2.9655, -1.7582, 15.0986], + [3.5124, 0.2754, 9.0681], + [4.6591, 1.406, 5.097], + [5.367, 0.394, 9.8123], + [6.0839, 0.3365, 10.1205], + [6.8312, 0.3379, 10.1121], + [7.5676, 0.2611, 10.637], + [8.2397, 0.095, 11.8939], + [8.9776, 0.2015, 11.0165], + [10.413, 0.1332, 11.6294], + [11.8539, 0.1074, 11.8979], + [13.3655, 0.1286, 11.6464], + [14.8236, 0.0758, 12.3519], + [16.3203, 0.083, 12.2457], + [17.7915, 0.0581, 12.6515], + [19.2145, 0.0273, 13.1995], + [20.6718, 0.0388, 12.9792], + [22.1333, 0.0357, 13.044], + [25.0761, 0.0332, 13.0977], + [28.0339, 0.029, 13.2035], + [30.967, 0.0201, 13.4538], + [33.8727, 0.013, 13.6737], + [36.8273, 0.0172, 13.5324], + [39.7594, 0.0121, 13.7191], + [42.6721, 0.0083, 13.8687], + [45.5964, 0.0085, 13.8618], + [48.5297, 0.0084, 13.8668], + [51.4512, 0.0064, 13.9651] + ] + } }, "defaultBlowoutVolume": 3.2 }, "t200": { - "defaultAspirateFlowRate": 80, - "defaultDispenseFlowRate": 80, - "defaultBlowOutFlowRate": 80, + "defaultAspirateFlowRate": { + "default": 80, + "valuesByApiLevel": { + "2.14": 80 + } + }, + "defaultDispenseFlowRate": { + "default": 80, + "valuesByApiLevel": { + "2.14": 80 + } + }, + "defaultBlowOutFlowRate": { + "default": 80, + "valuesByApiLevel": { + "2.14": 80 + } + }, "defaultTipLength": 58.35, - "defaultTipOverlap": 10.5, "defaultReturnTipHeight": 0.71, "aspirate": { - "default": [ - [0.8314, -2.9322, 24.0741], - [0.8853, -30.0996, 48.7784], - [0.9778, -4.3627, 25.9941], - [0.975, 802.2301, -762.6744], - [1.1272, -4.6837, 24.0666], - [1.2747, -3.91, 23.1945], - [1.5656, -2.8032, 21.7836], - [1.6667, -7.2039, 28.6731], - [2.4403, -0.5147, 17.5244], - [3.0564, -1.6013, 20.1761], - [3.6444, -1.1974, 18.9418], - [4.1189, -1.7877, 21.0928], - [4.6467, -0.8591, 17.2684], - [5.2597, -0.207, 14.2379], - [5.8581, -0.2196, 14.3044], - [6.4772, -0.1025, 13.6183], - [7.8158, 0.0537, 12.6063], - [9.1664, 0.0507, 12.6302], - [10.5064, 0.0285, 12.8339], - [14.8361, 0.0818, 12.273], - [19.3933, 0.0801, 12.2991], - [23.9242, 0.0487, 12.9079], - [28.4922, 0.0379, 13.1666], - [36.145, 0.0277, 13.4572], - [43.7972, 0.0184, 13.7916], - [51.5125, 0.0154, 13.9248], - [59.2467, 0.0121, 14.0931], - [66.9428, 0.0084, 14.3151], - [74.6853, 0.0079, 14.3498], - [82.3722, 0.0052, 14.5512], - [90.1106, 0.0054, 14.5333], - [97.8369, 0.0043, 14.6288], - [105.6153, 0.0046, 14.5983], - [113.3686, 0.0036, 14.7076], - [121.1108, 0.003, 14.7785], - [136.61, 0.0026, 14.826], - [152.0708, 0.0018, 14.9298], - [167.6433, 0.0021, 14.8827], - [183.1011, 0.0012, 15.0438], - [198.5845, 0.0011, 15.0538], - [214.0264, 0.0008, 15.123] - ] + "default": { + "1": [ + [0.8314, -2.9322, 24.0741], + [0.8853, -30.0996, 48.7784], + [0.9778, -4.3627, 25.9941], + [0.975, 802.2301, -762.6744], + [1.1272, -4.6837, 24.0666], + [1.2747, -3.91, 23.1945], + [1.5656, -2.8032, 21.7836], + [1.6667, -7.2039, 28.6731], + [2.4403, -0.5147, 17.5244], + [3.0564, -1.6013, 20.1761], + [3.6444, -1.1974, 18.9418], + [4.1189, -1.7877, 21.0928], + [4.6467, -0.8591, 17.2684], + [5.2597, -0.207, 14.2379], + [5.8581, -0.2196, 14.3044], + [6.4772, -0.1025, 13.6183], + [7.8158, 0.0537, 12.6063], + [9.1664, 0.0507, 12.6302], + [10.5064, 0.0285, 12.8339], + [14.8361, 0.0818, 12.273], + [19.3933, 0.0801, 12.2991], + [23.9242, 0.0487, 12.9079], + [28.4922, 0.0379, 13.1666], + [36.145, 0.0277, 13.4572], + [43.7972, 0.0184, 13.7916], + [51.5125, 0.0154, 13.9248], + [59.2467, 0.0121, 14.0931], + [66.9428, 0.0084, 14.3151], + [74.6853, 0.0079, 14.3498], + [82.3722, 0.0052, 14.5512], + [90.1106, 0.0054, 14.5333], + [97.8369, 0.0043, 14.6288], + [105.6153, 0.0046, 14.5983], + [113.3686, 0.0036, 14.7076], + [121.1108, 0.003, 14.7785], + [136.61, 0.0026, 14.826], + [152.0708, 0.0018, 14.9298], + [167.6433, 0.0021, 14.8827], + [183.1011, 0.0012, 15.0438], + [198.5845, 0.0011, 15.0538], + [214.0264, 0.0008, 15.123] + ] + } }, "dispense": { - "default": [ - [0.8314, -2.9322, 24.0741], - [0.8853, -30.0996, 48.7784], - [0.9778, -4.3627, 25.9941], - [0.975, 802.2301, -762.6744], - [1.1272, -4.6837, 24.0666], - [1.2747, -3.91, 23.1945], - [1.5656, -2.8032, 21.7836], - [1.6667, -7.2039, 28.6731], - [2.4403, -0.5147, 17.5244], - [3.0564, -1.6013, 20.1761], - [3.6444, -1.1974, 18.9418], - [4.1189, -1.7877, 21.0928], - [4.6467, -0.8591, 17.2684], - [5.2597, -0.207, 14.2379], - [5.8581, -0.2196, 14.3044], - [6.4772, -0.1025, 13.6183], - [7.8158, 0.0537, 12.6063], - [9.1664, 0.0507, 12.6302], - [10.5064, 0.0285, 12.8339], - [14.8361, 0.0818, 12.273], - [19.3933, 0.0801, 12.2991], - [23.9242, 0.0487, 12.9079], - [28.4922, 0.0379, 13.1666], - [36.145, 0.0277, 13.4572], - [43.7972, 0.0184, 13.7916], - [51.5125, 0.0154, 13.9248], - [59.2467, 0.0121, 14.0931], - [66.9428, 0.0084, 14.3151], - [74.6853, 0.0079, 14.3498], - [82.3722, 0.0052, 14.5512], - [90.1106, 0.0054, 14.5333], - [97.8369, 0.0043, 14.6288], - [105.6153, 0.0046, 14.5983], - [113.3686, 0.0036, 14.7076], - [121.1108, 0.003, 14.7785], - [136.61, 0.0026, 14.826], - [152.0708, 0.0018, 14.9298], - [167.6433, 0.0021, 14.8827], - [183.1011, 0.0012, 15.0438], - [198.5845, 0.0011, 15.0538], - [214.0264, 0.0008, 15.123] - ] + "default": { + "1": [ + [0.8314, -2.9322, 24.0741], + [0.8853, -30.0996, 48.7784], + [0.9778, -4.3627, 25.9941], + [0.975, 802.2301, -762.6744], + [1.1272, -4.6837, 24.0666], + [1.2747, -3.91, 23.1945], + [1.5656, -2.8032, 21.7836], + [1.6667, -7.2039, 28.6731], + [2.4403, -0.5147, 17.5244], + [3.0564, -1.6013, 20.1761], + [3.6444, -1.1974, 18.9418], + [4.1189, -1.7877, 21.0928], + [4.6467, -0.8591, 17.2684], + [5.2597, -0.207, 14.2379], + [5.8581, -0.2196, 14.3044], + [6.4772, -0.1025, 13.6183], + [7.8158, 0.0537, 12.6063], + [9.1664, 0.0507, 12.6302], + [10.5064, 0.0285, 12.8339], + [14.8361, 0.0818, 12.273], + [19.3933, 0.0801, 12.2991], + [23.9242, 0.0487, 12.9079], + [28.4922, 0.0379, 13.1666], + [36.145, 0.0277, 13.4572], + [43.7972, 0.0184, 13.7916], + [51.5125, 0.0154, 13.9248], + [59.2467, 0.0121, 14.0931], + [66.9428, 0.0084, 14.3151], + [74.6853, 0.0079, 14.3498], + [82.3722, 0.0052, 14.5512], + [90.1106, 0.0054, 14.5333], + [97.8369, 0.0043, 14.6288], + [105.6153, 0.0046, 14.5983], + [113.3686, 0.0036, 14.7076], + [121.1108, 0.003, 14.7785], + [136.61, 0.0026, 14.826], + [152.0708, 0.0018, 14.9298], + [167.6433, 0.0021, 14.8827], + [183.1011, 0.0012, 15.0438], + [198.5845, 0.0011, 15.0538], + [214.0264, 0.0008, 15.123] + ] + } }, "defaultBlowoutVolume": 16 }, "t1000": { - "defaultAspirateFlowRate": 160, - "defaultDispenseFlowRate": 160, - "defaultBlowOutFlowRate": 80, + "defaultAspirateFlowRate": { + "default": 160, + "valuesByApiLevel": { + "2.14": 160 + } + }, + "defaultDispenseFlowRate": { + "default": 160, + "valuesByApiLevel": { + "2.14": 160 + } + }, + "defaultBlowOutFlowRate": { + "default": 80, + "valuesByApiLevel": { + "2.14": 80 + } + }, "defaultTipLength": 95.6, - "defaultTipOverlap": 10.5, "defaultReturnTipHeight": 0.82, "aspirate": { - "default": [ - [0.7511, 3.9556, 6.455], - [1.3075, 2.1664, 5.8839], - [1.8737, 1.1513, 7.2111], - [3.177, 0.9374, 7.612], - [4.5368, 0.5531, 8.8328], - [7.3103, 0.3035, 9.9651], - [10.0825, 0.1513, 11.0781], - [12.9776, 0.1293, 11.2991], - [15.9173, 0.0976, 11.7115], - [18.8243, 0.0624, 12.2706], - [21.8529, 0.07, 12.1275], - [24.8068, 0.0418, 12.7442], - [27.7744, 0.0356, 12.8984], - [35.2873, 0.0303, 13.0454], - [42.7989, 0.0202, 13.4038], - [50.4562, 0.0196, 13.4293], - [58.1081, 0.0145, 13.6843], - [65.7267, 0.0104, 13.9252], - [73.2857, 0.0068, 14.1606], - [81.0016, 0.0091, 13.9883], - [88.6617, 0.0064, 14.2052], - [103.9829, 0.0051, 14.3271], - [119.4408, 0.0049, 14.3475], - [134.889, 0.0037, 14.485], - [150.273, 0.0026, 14.6402], - [181.2798, 0.0026, 14.6427], - [212.4724, 0.0022, 14.7002], - [243.577, 0.0015, 14.8558], - [274.7216, 0.0012, 14.9205], - [305.8132, 0.0009, 15.0118], - [368.0697, 0.0007, 15.0668], - [430.2513, 0.0005, 15.1594], - [492.3487, 0.0003, 15.2291], - [554.5713, 0.0003, 15.2367], - [616.6825, 0.0002, 15.2949], - [694.4168, 0.0002, 15.3027], - [772.0327, 0.0001, 15.3494], - [849.617, 0.0001, 15.3717], - [927.2556, 0.0001, 15.3745], - [1004.87, 0.0001, 15.3912], - [1051.4648, 0.0001, 15.391] - ] + "default": { + "1": [ + [0.7511, 3.9556, 6.455], + [1.3075, 2.1664, 5.8839], + [1.8737, 1.1513, 7.2111], + [3.177, 0.9374, 7.612], + [4.5368, 0.5531, 8.8328], + [7.3103, 0.3035, 9.9651], + [10.0825, 0.1513, 11.0781], + [12.9776, 0.1293, 11.2991], + [15.9173, 0.0976, 11.7115], + [18.8243, 0.0624, 12.2706], + [21.8529, 0.07, 12.1275], + [24.8068, 0.0418, 12.7442], + [27.7744, 0.0356, 12.8984], + [35.2873, 0.0303, 13.0454], + [42.7989, 0.0202, 13.4038], + [50.4562, 0.0196, 13.4293], + [58.1081, 0.0145, 13.6843], + [65.7267, 0.0104, 13.9252], + [73.2857, 0.0068, 14.1606], + [81.0016, 0.0091, 13.9883], + [88.6617, 0.0064, 14.2052], + [103.9829, 0.0051, 14.3271], + [119.4408, 0.0049, 14.3475], + [134.889, 0.0037, 14.485], + [150.273, 0.0026, 14.6402], + [181.2798, 0.0026, 14.6427], + [212.4724, 0.0022, 14.7002], + [243.577, 0.0015, 14.8558], + [274.7216, 0.0012, 14.9205], + [305.8132, 0.0009, 15.0118], + [368.0697, 0.0007, 15.0668], + [430.2513, 0.0005, 15.1594], + [492.3487, 0.0003, 15.2291], + [554.5713, 0.0003, 15.2367], + [616.6825, 0.0002, 15.2949], + [694.4168, 0.0002, 15.3027], + [772.0327, 0.0001, 15.3494], + [849.617, 0.0001, 15.3717], + [927.2556, 0.0001, 15.3745], + [1004.87, 0.0001, 15.3912], + [1051.4648, 0.0001, 15.391] + ] + } }, "dispense": { - "default": [ - [0.7511, 3.9556, 6.455], - [1.3075, 2.1664, 5.8839], - [1.8737, 1.1513, 7.2111], - [3.177, 0.9374, 7.612], - [4.5368, 0.5531, 8.8328], - [7.3103, 0.3035, 9.9651], - [10.0825, 0.1513, 11.0781], - [12.9776, 0.1293, 11.2991], - [15.9173, 0.0976, 11.7115], - [18.8243, 0.0624, 12.2706], - [21.8529, 0.07, 12.1275], - [24.8068, 0.0418, 12.7442], - [27.7744, 0.0356, 12.8984], - [35.2873, 0.0303, 13.0454], - [42.7989, 0.0202, 13.4038], - [50.4562, 0.0196, 13.4293], - [58.1081, 0.0145, 13.6843], - [65.7267, 0.0104, 13.9252], - [73.2857, 0.0068, 14.1606], - [81.0016, 0.0091, 13.9883], - [88.6617, 0.0064, 14.2052], - [103.9829, 0.0051, 14.3271], - [119.4408, 0.0049, 14.3475], - [134.889, 0.0037, 14.485], - [150.273, 0.0026, 14.6402], - [181.2798, 0.0026, 14.6427], - [212.4724, 0.0022, 14.7002], - [243.577, 0.0015, 14.8558], - [274.7216, 0.0012, 14.9205], - [305.8132, 0.0009, 15.0118], - [368.0697, 0.0007, 15.0668], - [430.2513, 0.0005, 15.1594], - [492.3487, 0.0003, 15.2291], - [554.5713, 0.0003, 15.2367], - [616.6825, 0.0002, 15.2949], - [694.4168, 0.0002, 15.3027], - [772.0327, 0.0001, 15.3494], - [849.617, 0.0001, 15.3717], - [927.2556, 0.0001, 15.3745], - [1004.87, 0.0001, 15.3912], - [1051.4648, 0.0001, 15.391] - ] + "default": { + "1": [ + [0.7511, 3.9556, 6.455], + [1.3075, 2.1664, 5.8839], + [1.8737, 1.1513, 7.2111], + [3.177, 0.9374, 7.612], + [4.5368, 0.5531, 8.8328], + [7.3103, 0.3035, 9.9651], + [10.0825, 0.1513, 11.0781], + [12.9776, 0.1293, 11.2991], + [15.9173, 0.0976, 11.7115], + [18.8243, 0.0624, 12.2706], + [21.8529, 0.07, 12.1275], + [24.8068, 0.0418, 12.7442], + [27.7744, 0.0356, 12.8984], + [35.2873, 0.0303, 13.0454], + [42.7989, 0.0202, 13.4038], + [50.4562, 0.0196, 13.4293], + [58.1081, 0.0145, 13.6843], + [65.7267, 0.0104, 13.9252], + [73.2857, 0.0068, 14.1606], + [81.0016, 0.0091, 13.9883], + [88.6617, 0.0064, 14.2052], + [103.9829, 0.0051, 14.3271], + [119.4408, 0.0049, 14.3475], + [134.889, 0.0037, 14.485], + [150.273, 0.0026, 14.6402], + [181.2798, 0.0026, 14.6427], + [212.4724, 0.0022, 14.7002], + [243.577, 0.0015, 14.8558], + [274.7216, 0.0012, 14.9205], + [305.8132, 0.0009, 15.0118], + [368.0697, 0.0007, 15.0668], + [430.2513, 0.0005, 15.1594], + [492.3487, 0.0003, 15.2291], + [554.5713, 0.0003, 15.2367], + [616.6825, 0.0002, 15.2949], + [694.4168, 0.0002, 15.3027], + [772.0327, 0.0001, 15.3494], + [849.617, 0.0001, 15.3717], + [927.2556, 0.0001, 15.3745], + [1004.87, 0.0001, 15.3912], + [1051.4648, 0.0001, 15.391] + ] + } }, "defaultBlowoutVolume": 16 } }, + "defaultTipOverlapDictionary": { + "default": 10.5, + "opentrons/opentrons_flex_96_tiprack_200ul/1": 10.5, + "opentrons/opentrons_flex_96_tiprack_50ul/1": 10.5, + "opentrons/opentrons_flex_96_tiprack_1000ul/1": 10.5 + }, "maxVolume": 1000, "minVolume": 5, "defaultTipracks": [ diff --git a/shared-data/pipette/definitions/2/liquid/eight_channel/p1000/3_4.json b/shared-data/pipette/definitions/2/liquid/eight_channel/p1000/3_4.json index 107e3180861..239c0be5882 100644 --- a/shared-data/pipette/definitions/2/liquid/eight_channel/p1000/3_4.json +++ b/shared-data/pipette/definitions/2/liquid/eight_channel/p1000/3_4.json @@ -2,305 +2,365 @@ "$otSharedSchema": "#/pipette/schemas/2/pipetteLiquidPropertiesSchema.json", "supportedTips": { "t50": { - "defaultAspirateFlowRate": 478, - "defaultDispenseFlowRate": 160, - "defaultBlowOutFlowRate": 160, + "defaultAspirateFlowRate": { + "default": 478, + "valuesByApiLevel": { + "2.14": 478 + } + }, + "defaultDispenseFlowRate": { + "default": 160, + "valuesByApiLevel": { + "2.14": 160 + } + }, + "defaultBlowOutFlowRate": { + "default": 160, + "valuesByApiLevel": { + "2.14": 160 + } + }, "defaultTipLength": 57.9, - "defaultTipOverlap": 10.5, "defaultReturnTipHeight": 0.71, "aspirate": { - "default": [ - [0.4148, -1705.1015, 20.5455], - [0.4476, -80.633, 47.2788], - [0.5512, -1.5936, 11.9026], - [0.6027, -18.9998, 21.4972], - [0.6503, -15.8781, 19.6156], - [0.7733, 3.0612, 7.2993], - [0.8391, -5.2227, 13.7056], - [0.9736, 3.0706, 6.7467], - [1.16, -0.374, 10.1005], - [1.3964, 1.3004, 8.1582], - [1.5815, -0.4837, 10.6494], - [1.8306, 1.1464, 8.0714], - [2.0345, 0.0132, 10.1459], - [2.6221, 0.5374, 9.0794], - [2.9655, -1.7582, 15.0986], - [3.5124, 0.2754, 9.0681], - [4.6591, 1.406, 5.097], - [5.367, 0.394, 9.8123], - [6.0839, 0.3365, 10.1205], - [6.8312, 0.3379, 10.1121], - [7.5676, 0.2611, 10.637], - [8.2397, 0.095, 11.8939], - [8.9776, 0.2015, 11.0165], - [10.413, 0.1332, 11.6294], - [11.8539, 0.1074, 11.8979], - [13.3655, 0.1286, 11.6464], - [14.8236, 0.0758, 12.3519], - [16.3203, 0.083, 12.2457], - [17.7915, 0.0581, 12.6515], - [19.2145, 0.0273, 13.1995], - [20.6718, 0.0388, 12.9792], - [22.1333, 0.0357, 13.044], - [25.0761, 0.0332, 13.0977], - [28.0339, 0.029, 13.2035], - [30.967, 0.0201, 13.4538], - [33.8727, 0.013, 13.6737], - [36.8273, 0.0172, 13.5324], - [39.7594, 0.0121, 13.7191], - [42.6721, 0.0083, 13.8687], - [45.5964, 0.0085, 13.8618], - [48.5297, 0.0084, 13.8668], - [51.4512, 0.0064, 13.9651] - ] + "default": { + "1": [ + [0.4148, -1705.1015, 20.5455], + [0.4476, -80.633, 47.2788], + [0.5512, -1.5936, 11.9026], + [0.6027, -18.9998, 21.4972], + [0.6503, -15.8781, 19.6156], + [0.7733, 3.0612, 7.2993], + [0.8391, -5.2227, 13.7056], + [0.9736, 3.0706, 6.7467], + [1.16, -0.374, 10.1005], + [1.3964, 1.3004, 8.1582], + [1.5815, -0.4837, 10.6494], + [1.8306, 1.1464, 8.0714], + [2.0345, 0.0132, 10.1459], + [2.6221, 0.5374, 9.0794], + [2.9655, -1.7582, 15.0986], + [3.5124, 0.2754, 9.0681], + [4.6591, 1.406, 5.097], + [5.367, 0.394, 9.8123], + [6.0839, 0.3365, 10.1205], + [6.8312, 0.3379, 10.1121], + [7.5676, 0.2611, 10.637], + [8.2397, 0.095, 11.8939], + [8.9776, 0.2015, 11.0165], + [10.413, 0.1332, 11.6294], + [11.8539, 0.1074, 11.8979], + [13.3655, 0.1286, 11.6464], + [14.8236, 0.0758, 12.3519], + [16.3203, 0.083, 12.2457], + [17.7915, 0.0581, 12.6515], + [19.2145, 0.0273, 13.1995], + [20.6718, 0.0388, 12.9792], + [22.1333, 0.0357, 13.044], + [25.0761, 0.0332, 13.0977], + [28.0339, 0.029, 13.2035], + [30.967, 0.0201, 13.4538], + [33.8727, 0.013, 13.6737], + [36.8273, 0.0172, 13.5324], + [39.7594, 0.0121, 13.7191], + [42.6721, 0.0083, 13.8687], + [45.5964, 0.0085, 13.8618], + [48.5297, 0.0084, 13.8668], + [51.4512, 0.0064, 13.9651] + ] + } }, "dispense": { - "default": [ - [0.4148, -1705.1015, 20.5455], - [0.4476, -80.633, 47.2788], - [0.5512, -1.5936, 11.9026], - [0.6027, -18.9998, 21.4972], - [0.6503, -15.8781, 19.6156], - [0.7733, 3.0612, 7.2993], - [0.8391, -5.2227, 13.7056], - [0.9736, 3.0706, 6.7467], - [1.16, -0.374, 10.1005], - [1.3964, 1.3004, 8.1582], - [1.5815, -0.4837, 10.6494], - [1.8306, 1.1464, 8.0714], - [2.0345, 0.0132, 10.1459], - [2.6221, 0.5374, 9.0794], - [2.9655, -1.7582, 15.0986], - [3.5124, 0.2754, 9.0681], - [4.6591, 1.406, 5.097], - [5.367, 0.394, 9.8123], - [6.0839, 0.3365, 10.1205], - [6.8312, 0.3379, 10.1121], - [7.5676, 0.2611, 10.637], - [8.2397, 0.095, 11.8939], - [8.9776, 0.2015, 11.0165], - [10.413, 0.1332, 11.6294], - [11.8539, 0.1074, 11.8979], - [13.3655, 0.1286, 11.6464], - [14.8236, 0.0758, 12.3519], - [16.3203, 0.083, 12.2457], - [17.7915, 0.0581, 12.6515], - [19.2145, 0.0273, 13.1995], - [20.6718, 0.0388, 12.9792], - [22.1333, 0.0357, 13.044], - [25.0761, 0.0332, 13.0977], - [28.0339, 0.029, 13.2035], - [30.967, 0.0201, 13.4538], - [33.8727, 0.013, 13.6737], - [36.8273, 0.0172, 13.5324], - [39.7594, 0.0121, 13.7191], - [42.6721, 0.0083, 13.8687], - [45.5964, 0.0085, 13.8618], - [48.5297, 0.0084, 13.8668], - [51.4512, 0.0064, 13.9651] - ] + "default": { + "1": [ + [0.4148, -1705.1015, 20.5455], + [0.4476, -80.633, 47.2788], + [0.5512, -1.5936, 11.9026], + [0.6027, -18.9998, 21.4972], + [0.6503, -15.8781, 19.6156], + [0.7733, 3.0612, 7.2993], + [0.8391, -5.2227, 13.7056], + [0.9736, 3.0706, 6.7467], + [1.16, -0.374, 10.1005], + [1.3964, 1.3004, 8.1582], + [1.5815, -0.4837, 10.6494], + [1.8306, 1.1464, 8.0714], + [2.0345, 0.0132, 10.1459], + [2.6221, 0.5374, 9.0794], + [2.9655, -1.7582, 15.0986], + [3.5124, 0.2754, 9.0681], + [4.6591, 1.406, 5.097], + [5.367, 0.394, 9.8123], + [6.0839, 0.3365, 10.1205], + [6.8312, 0.3379, 10.1121], + [7.5676, 0.2611, 10.637], + [8.2397, 0.095, 11.8939], + [8.9776, 0.2015, 11.0165], + [10.413, 0.1332, 11.6294], + [11.8539, 0.1074, 11.8979], + [13.3655, 0.1286, 11.6464], + [14.8236, 0.0758, 12.3519], + [16.3203, 0.083, 12.2457], + [17.7915, 0.0581, 12.6515], + [19.2145, 0.0273, 13.1995], + [20.6718, 0.0388, 12.9792], + [22.1333, 0.0357, 13.044], + [25.0761, 0.0332, 13.0977], + [28.0339, 0.029, 13.2035], + [30.967, 0.0201, 13.4538], + [33.8727, 0.013, 13.6737], + [36.8273, 0.0172, 13.5324], + [39.7594, 0.0121, 13.7191], + [42.6721, 0.0083, 13.8687], + [45.5964, 0.0085, 13.8618], + [48.5297, 0.0084, 13.8668], + [51.4512, 0.0064, 13.9651] + ] + } }, "defaultBlowoutVolume": 3.2 }, "t200": { - "defaultAspirateFlowRate": 716, - "defaultDispenseFlowRate": 160, - "defaultBlowOutFlowRate": 160, + "defaultAspirateFlowRate": { + "default": 716, + "valuesByApiLevel": { + "2.14": 716 + } + }, + "defaultDispenseFlowRate": { + "default": 160, + "valuesByApiLevel": { + "2.14": 160 + } + }, + "defaultBlowOutFlowRate": { + "default": 160, + "valuesByApiLevel": { + "2.14": 160 + } + }, "defaultTipLength": 58.35, - "defaultTipOverlap": 10.5, "defaultReturnTipHeight": 0.71, "aspirate": { - "default": [ - [0.8314, -2.9322, 24.0741], - [0.8853, -30.0996, 48.7784], - [0.9778, -4.3627, 25.9941], - [0.975, 802.2301, -762.6744], - [1.1272, -4.6837, 24.0666], - [1.2747, -3.91, 23.1945], - [1.5656, -2.8032, 21.7836], - [1.6667, -7.2039, 28.6731], - [2.4403, -0.5147, 17.5244], - [3.0564, -1.6013, 20.1761], - [3.6444, -1.1974, 18.9418], - [4.1189, -1.7877, 21.0928], - [4.6467, -0.8591, 17.2684], - [5.2597, -0.207, 14.2379], - [5.8581, -0.2196, 14.3044], - [6.4772, -0.1025, 13.6183], - [7.8158, 0.0537, 12.6063], - [9.1664, 0.0507, 12.6302], - [10.5064, 0.0285, 12.8339], - [14.8361, 0.0818, 12.273], - [19.3933, 0.0801, 12.2991], - [23.9242, 0.0487, 12.9079], - [28.4922, 0.0379, 13.1666], - [36.145, 0.0277, 13.4572], - [43.7972, 0.0184, 13.7916], - [51.5125, 0.0154, 13.9248], - [59.2467, 0.0121, 14.0931], - [66.9428, 0.0084, 14.3151], - [74.6853, 0.0079, 14.3498], - [82.3722, 0.0052, 14.5512], - [90.1106, 0.0054, 14.5333], - [97.8369, 0.0043, 14.6288], - [105.6153, 0.0046, 14.5983], - [113.3686, 0.0036, 14.7076], - [121.1108, 0.003, 14.7785], - [136.61, 0.0026, 14.826], - [152.0708, 0.0018, 14.9298], - [167.6433, 0.0021, 14.8827], - [183.1011, 0.0012, 15.0438], - [198.5845, 0.0011, 15.0538], - [214.0264, 0.0008, 15.123] - ] + "default": { + "1": [ + [0.8314, -2.9322, 24.0741], + [0.8853, -30.0996, 48.7784], + [0.9778, -4.3627, 25.9941], + [0.975, 802.2301, -762.6744], + [1.1272, -4.6837, 24.0666], + [1.2747, -3.91, 23.1945], + [1.5656, -2.8032, 21.7836], + [1.6667, -7.2039, 28.6731], + [2.4403, -0.5147, 17.5244], + [3.0564, -1.6013, 20.1761], + [3.6444, -1.1974, 18.9418], + [4.1189, -1.7877, 21.0928], + [4.6467, -0.8591, 17.2684], + [5.2597, -0.207, 14.2379], + [5.8581, -0.2196, 14.3044], + [6.4772, -0.1025, 13.6183], + [7.8158, 0.0537, 12.6063], + [9.1664, 0.0507, 12.6302], + [10.5064, 0.0285, 12.8339], + [14.8361, 0.0818, 12.273], + [19.3933, 0.0801, 12.2991], + [23.9242, 0.0487, 12.9079], + [28.4922, 0.0379, 13.1666], + [36.145, 0.0277, 13.4572], + [43.7972, 0.0184, 13.7916], + [51.5125, 0.0154, 13.9248], + [59.2467, 0.0121, 14.0931], + [66.9428, 0.0084, 14.3151], + [74.6853, 0.0079, 14.3498], + [82.3722, 0.0052, 14.5512], + [90.1106, 0.0054, 14.5333], + [97.8369, 0.0043, 14.6288], + [105.6153, 0.0046, 14.5983], + [113.3686, 0.0036, 14.7076], + [121.1108, 0.003, 14.7785], + [136.61, 0.0026, 14.826], + [152.0708, 0.0018, 14.9298], + [167.6433, 0.0021, 14.8827], + [183.1011, 0.0012, 15.0438], + [198.5845, 0.0011, 15.0538], + [214.0264, 0.0008, 15.123] + ] + } }, "dispense": { - "default": [ - [0.8314, -2.9322, 24.0741], - [0.8853, -30.0996, 48.7784], - [0.9778, -4.3627, 25.9941], - [0.975, 802.2301, -762.6744], - [1.1272, -4.6837, 24.0666], - [1.2747, -3.91, 23.1945], - [1.5656, -2.8032, 21.7836], - [1.6667, -7.2039, 28.6731], - [2.4403, -0.5147, 17.5244], - [3.0564, -1.6013, 20.1761], - [3.6444, -1.1974, 18.9418], - [4.1189, -1.7877, 21.0928], - [4.6467, -0.8591, 17.2684], - [5.2597, -0.207, 14.2379], - [5.8581, -0.2196, 14.3044], - [6.4772, -0.1025, 13.6183], - [7.8158, 0.0537, 12.6063], - [9.1664, 0.0507, 12.6302], - [10.5064, 0.0285, 12.8339], - [14.8361, 0.0818, 12.273], - [19.3933, 0.0801, 12.2991], - [23.9242, 0.0487, 12.9079], - [28.4922, 0.0379, 13.1666], - [36.145, 0.0277, 13.4572], - [43.7972, 0.0184, 13.7916], - [51.5125, 0.0154, 13.9248], - [59.2467, 0.0121, 14.0931], - [66.9428, 0.0084, 14.3151], - [74.6853, 0.0079, 14.3498], - [82.3722, 0.0052, 14.5512], - [90.1106, 0.0054, 14.5333], - [97.8369, 0.0043, 14.6288], - [105.6153, 0.0046, 14.5983], - [113.3686, 0.0036, 14.7076], - [121.1108, 0.003, 14.7785], - [136.61, 0.0026, 14.826], - [152.0708, 0.0018, 14.9298], - [167.6433, 0.0021, 14.8827], - [183.1011, 0.0012, 15.0438], - [198.5845, 0.0011, 15.0538], - [214.0264, 0.0008, 15.123] - ] + "default": { + "1": [ + [0.8314, -2.9322, 24.0741], + [0.8853, -30.0996, 48.7784], + [0.9778, -4.3627, 25.9941], + [0.975, 802.2301, -762.6744], + [1.1272, -4.6837, 24.0666], + [1.2747, -3.91, 23.1945], + [1.5656, -2.8032, 21.7836], + [1.6667, -7.2039, 28.6731], + [2.4403, -0.5147, 17.5244], + [3.0564, -1.6013, 20.1761], + [3.6444, -1.1974, 18.9418], + [4.1189, -1.7877, 21.0928], + [4.6467, -0.8591, 17.2684], + [5.2597, -0.207, 14.2379], + [5.8581, -0.2196, 14.3044], + [6.4772, -0.1025, 13.6183], + [7.8158, 0.0537, 12.6063], + [9.1664, 0.0507, 12.6302], + [10.5064, 0.0285, 12.8339], + [14.8361, 0.0818, 12.273], + [19.3933, 0.0801, 12.2991], + [23.9242, 0.0487, 12.9079], + [28.4922, 0.0379, 13.1666], + [36.145, 0.0277, 13.4572], + [43.7972, 0.0184, 13.7916], + [51.5125, 0.0154, 13.9248], + [59.2467, 0.0121, 14.0931], + [66.9428, 0.0084, 14.3151], + [74.6853, 0.0079, 14.3498], + [82.3722, 0.0052, 14.5512], + [90.1106, 0.0054, 14.5333], + [97.8369, 0.0043, 14.6288], + [105.6153, 0.0046, 14.5983], + [113.3686, 0.0036, 14.7076], + [121.1108, 0.003, 14.7785], + [136.61, 0.0026, 14.826], + [152.0708, 0.0018, 14.9298], + [167.6433, 0.0021, 14.8827], + [183.1011, 0.0012, 15.0438], + [198.5845, 0.0011, 15.0538], + [214.0264, 0.0008, 15.123] + ] + } }, "defaultBlowoutVolume": 16 }, "t1000": { - "defaultAspirateFlowRate": 716, - "defaultDispenseFlowRate": 160, - "defaultBlowOutFlowRate": 160, + "defaultAspirateFlowRate": { + "default": 716, + "valuesByApiLevel": { + "2.14": 716 + } + }, + "defaultDispenseFlowRate": { + "default": 160, + "valuesByApiLevel": { + "2.14": 160 + } + }, + "defaultBlowOutFlowRate": { + "default": 160, + "valuesByApiLevel": { + "2.14": 160 + } + }, "defaultTipLength": 95.6, - "defaultTipOverlap": 10.5, "defaultReturnTipHeight": 0.82, "aspirate": { - "default": [ - [0.7511, 3.9556, 6.455], - [1.3075, 2.1664, 5.8839], - [1.8737, 1.1513, 7.2111], - [3.177, 0.9374, 7.612], - [4.5368, 0.5531, 8.8328], - [7.3103, 0.3035, 9.9651], - [10.0825, 0.1513, 11.0781], - [12.9776, 0.1293, 11.2991], - [15.9173, 0.0976, 11.7115], - [18.8243, 0.0624, 12.2706], - [21.8529, 0.07, 12.1275], - [24.8068, 0.0418, 12.7442], - [27.7744, 0.0356, 12.8984], - [35.2873, 0.0303, 13.0454], - [42.7989, 0.0202, 13.4038], - [50.4562, 0.0196, 13.4293], - [58.1081, 0.0145, 13.6843], - [65.7267, 0.0104, 13.9252], - [73.2857, 0.0068, 14.1606], - [81.0016, 0.0091, 13.9883], - [88.6617, 0.0064, 14.2052], - [103.9829, 0.0051, 14.3271], - [119.4408, 0.0049, 14.3475], - [134.889, 0.0037, 14.485], - [150.273, 0.0026, 14.6402], - [181.2798, 0.0026, 14.6427], - [212.4724, 0.0022, 14.7002], - [243.577, 0.0015, 14.8558], - [274.7216, 0.0012, 14.9205], - [305.8132, 0.0009, 15.0118], - [368.0697, 0.0007, 15.0668], - [430.2513, 0.0005, 15.1594], - [492.3487, 0.0003, 15.2291], - [554.5713, 0.0003, 15.2367], - [616.6825, 0.0002, 15.2949], - [694.4168, 0.0002, 15.3027], - [772.0327, 0.0001, 15.3494], - [849.617, 0.0001, 15.3717], - [927.2556, 0.0001, 15.3745], - [1004.87, 0.0001, 15.3912], - [1051.4648, 0.0001, 15.391] - ] + "default": { + "1": [ + [0.7511, 3.9556, 6.455], + [1.3075, 2.1664, 5.8839], + [1.8737, 1.1513, 7.2111], + [3.177, 0.9374, 7.612], + [4.5368, 0.5531, 8.8328], + [7.3103, 0.3035, 9.9651], + [10.0825, 0.1513, 11.0781], + [12.9776, 0.1293, 11.2991], + [15.9173, 0.0976, 11.7115], + [18.8243, 0.0624, 12.2706], + [21.8529, 0.07, 12.1275], + [24.8068, 0.0418, 12.7442], + [27.7744, 0.0356, 12.8984], + [35.2873, 0.0303, 13.0454], + [42.7989, 0.0202, 13.4038], + [50.4562, 0.0196, 13.4293], + [58.1081, 0.0145, 13.6843], + [65.7267, 0.0104, 13.9252], + [73.2857, 0.0068, 14.1606], + [81.0016, 0.0091, 13.9883], + [88.6617, 0.0064, 14.2052], + [103.9829, 0.0051, 14.3271], + [119.4408, 0.0049, 14.3475], + [134.889, 0.0037, 14.485], + [150.273, 0.0026, 14.6402], + [181.2798, 0.0026, 14.6427], + [212.4724, 0.0022, 14.7002], + [243.577, 0.0015, 14.8558], + [274.7216, 0.0012, 14.9205], + [305.8132, 0.0009, 15.0118], + [368.0697, 0.0007, 15.0668], + [430.2513, 0.0005, 15.1594], + [492.3487, 0.0003, 15.2291], + [554.5713, 0.0003, 15.2367], + [616.6825, 0.0002, 15.2949], + [694.4168, 0.0002, 15.3027], + [772.0327, 0.0001, 15.3494], + [849.617, 0.0001, 15.3717], + [927.2556, 0.0001, 15.3745], + [1004.87, 0.0001, 15.3912], + [1051.4648, 0.0001, 15.391] + ] + } }, "dispense": { - "default": [ - [0.7511, 3.9556, 6.455], - [1.3075, 2.1664, 5.8839], - [1.8737, 1.1513, 7.2111], - [3.177, 0.9374, 7.612], - [4.5368, 0.5531, 8.8328], - [7.3103, 0.3035, 9.9651], - [10.0825, 0.1513, 11.0781], - [12.9776, 0.1293, 11.2991], - [15.9173, 0.0976, 11.7115], - [18.8243, 0.0624, 12.2706], - [21.8529, 0.07, 12.1275], - [24.8068, 0.0418, 12.7442], - [27.7744, 0.0356, 12.8984], - [35.2873, 0.0303, 13.0454], - [42.7989, 0.0202, 13.4038], - [50.4562, 0.0196, 13.4293], - [58.1081, 0.0145, 13.6843], - [65.7267, 0.0104, 13.9252], - [73.2857, 0.0068, 14.1606], - [81.0016, 0.0091, 13.9883], - [88.6617, 0.0064, 14.2052], - [103.9829, 0.0051, 14.3271], - [119.4408, 0.0049, 14.3475], - [134.889, 0.0037, 14.485], - [150.273, 0.0026, 14.6402], - [181.2798, 0.0026, 14.6427], - [212.4724, 0.0022, 14.7002], - [243.577, 0.0015, 14.8558], - [274.7216, 0.0012, 14.9205], - [305.8132, 0.0009, 15.0118], - [368.0697, 0.0007, 15.0668], - [430.2513, 0.0005, 15.1594], - [492.3487, 0.0003, 15.2291], - [554.5713, 0.0003, 15.2367], - [616.6825, 0.0002, 15.2949], - [694.4168, 0.0002, 15.3027], - [772.0327, 0.0001, 15.3494], - [849.617, 0.0001, 15.3717], - [927.2556, 0.0001, 15.3745], - [1004.87, 0.0001, 15.3912], - [1051.4648, 0.0001, 15.391] - ] + "default": { + "1": [ + [0.7511, 3.9556, 6.455], + [1.3075, 2.1664, 5.8839], + [1.8737, 1.1513, 7.2111], + [3.177, 0.9374, 7.612], + [4.5368, 0.5531, 8.8328], + [7.3103, 0.3035, 9.9651], + [10.0825, 0.1513, 11.0781], + [12.9776, 0.1293, 11.2991], + [15.9173, 0.0976, 11.7115], + [18.8243, 0.0624, 12.2706], + [21.8529, 0.07, 12.1275], + [24.8068, 0.0418, 12.7442], + [27.7744, 0.0356, 12.8984], + [35.2873, 0.0303, 13.0454], + [42.7989, 0.0202, 13.4038], + [50.4562, 0.0196, 13.4293], + [58.1081, 0.0145, 13.6843], + [65.7267, 0.0104, 13.9252], + [73.2857, 0.0068, 14.1606], + [81.0016, 0.0091, 13.9883], + [88.6617, 0.0064, 14.2052], + [103.9829, 0.0051, 14.3271], + [119.4408, 0.0049, 14.3475], + [134.889, 0.0037, 14.485], + [150.273, 0.0026, 14.6402], + [181.2798, 0.0026, 14.6427], + [212.4724, 0.0022, 14.7002], + [243.577, 0.0015, 14.8558], + [274.7216, 0.0012, 14.9205], + [305.8132, 0.0009, 15.0118], + [368.0697, 0.0007, 15.0668], + [430.2513, 0.0005, 15.1594], + [492.3487, 0.0003, 15.2291], + [554.5713, 0.0003, 15.2367], + [616.6825, 0.0002, 15.2949], + [694.4168, 0.0002, 15.3027], + [772.0327, 0.0001, 15.3494], + [849.617, 0.0001, 15.3717], + [927.2556, 0.0001, 15.3745], + [1004.87, 0.0001, 15.3912], + [1051.4648, 0.0001, 15.391] + ] + } }, "defaultBlowoutVolume": 16 } }, + "defaultTipOverlapDictionary": { + "default": 10.5, + "opentrons/opentrons_flex_96_tiprack_200ul/1": 10.5, + "opentrons/opentrons_flex_96_tiprack_50ul/1": 10.5, + "opentrons/opentrons_flex_96_tiprack_1000ul/1": 10.5 + }, "maxVolume": 1000, "minVolume": 5, "defaultTipracks": [ diff --git a/shared-data/pipette/definitions/2/liquid/eight_channel/p1000/3_5.json b/shared-data/pipette/definitions/2/liquid/eight_channel/p1000/3_5.json new file mode 100644 index 00000000000..675472c7799 --- /dev/null +++ b/shared-data/pipette/definitions/2/liquid/eight_channel/p1000/3_5.json @@ -0,0 +1,372 @@ +{ + "$otSharedSchema": "#/pipette/schemas/2/pipetteLiquidPropertiesSchema.json", + "supportedTips": { + "t50": { + "defaultAspirateFlowRate": { + "default": 478, + "valuesByApiLevel": { + "2.14": 478 + } + }, + "defaultDispenseFlowRate": { + "default": 160, + "valuesByApiLevel": { + "2.14": 160 + } + }, + "defaultBlowOutFlowRate": { + "default": 160, + "valuesByApiLevel": { + "2.14": 160 + } + }, + "defaultTipLength": 57.9, + "defaultReturnTipHeight": 0.71, + "aspirate": { + "default": { + "1": [ + [0.4148, -1705.1015, 20.5455], + [0.4476, -80.633, 47.2788], + [0.5512, -1.5936, 11.9026], + [0.6027, -18.9998, 21.4972], + [0.6503, -15.8781, 19.6156], + [0.7733, 3.0612, 7.2993], + [0.8391, -5.2227, 13.7056], + [0.9736, 3.0706, 6.7467], + [1.16, -0.374, 10.1005], + [1.3964, 1.3004, 8.1582], + [1.5815, -0.4837, 10.6494], + [1.8306, 1.1464, 8.0714], + [2.0345, 0.0132, 10.1459], + [2.6221, 0.5374, 9.0794], + [2.9655, -1.7582, 15.0986], + [3.5124, 0.2754, 9.0681], + [4.6591, 1.406, 5.097], + [5.367, 0.394, 9.8123], + [6.0839, 0.3365, 10.1205], + [6.8312, 0.3379, 10.1121], + [7.5676, 0.2611, 10.637], + [8.2397, 0.095, 11.8939], + [8.9776, 0.2015, 11.0165], + [10.413, 0.1332, 11.6294], + [11.8539, 0.1074, 11.8979], + [13.3655, 0.1286, 11.6464], + [14.8236, 0.0758, 12.3519], + [16.3203, 0.083, 12.2457], + [17.7915, 0.0581, 12.6515], + [19.2145, 0.0273, 13.1995], + [20.6718, 0.0388, 12.9792], + [22.1333, 0.0357, 13.044], + [25.0761, 0.0332, 13.0977], + [28.0339, 0.029, 13.2035], + [30.967, 0.0201, 13.4538], + [33.8727, 0.013, 13.6737], + [36.8273, 0.0172, 13.5324], + [39.7594, 0.0121, 13.7191], + [42.6721, 0.0083, 13.8687], + [45.5964, 0.0085, 13.8618], + [48.5297, 0.0084, 13.8668], + [51.4512, 0.0064, 13.9651] + ] + } + }, + "dispense": { + "default": { + "1": [ + [0.4148, -1705.1015, 20.5455], + [0.4476, -80.633, 47.2788], + [0.5512, -1.5936, 11.9026], + [0.6027, -18.9998, 21.4972], + [0.6503, -15.8781, 19.6156], + [0.7733, 3.0612, 7.2993], + [0.8391, -5.2227, 13.7056], + [0.9736, 3.0706, 6.7467], + [1.16, -0.374, 10.1005], + [1.3964, 1.3004, 8.1582], + [1.5815, -0.4837, 10.6494], + [1.8306, 1.1464, 8.0714], + [2.0345, 0.0132, 10.1459], + [2.6221, 0.5374, 9.0794], + [2.9655, -1.7582, 15.0986], + [3.5124, 0.2754, 9.0681], + [4.6591, 1.406, 5.097], + [5.367, 0.394, 9.8123], + [6.0839, 0.3365, 10.1205], + [6.8312, 0.3379, 10.1121], + [7.5676, 0.2611, 10.637], + [8.2397, 0.095, 11.8939], + [8.9776, 0.2015, 11.0165], + [10.413, 0.1332, 11.6294], + [11.8539, 0.1074, 11.8979], + [13.3655, 0.1286, 11.6464], + [14.8236, 0.0758, 12.3519], + [16.3203, 0.083, 12.2457], + [17.7915, 0.0581, 12.6515], + [19.2145, 0.0273, 13.1995], + [20.6718, 0.0388, 12.9792], + [22.1333, 0.0357, 13.044], + [25.0761, 0.0332, 13.0977], + [28.0339, 0.029, 13.2035], + [30.967, 0.0201, 13.4538], + [33.8727, 0.013, 13.6737], + [36.8273, 0.0172, 13.5324], + [39.7594, 0.0121, 13.7191], + [42.6721, 0.0083, 13.8687], + [45.5964, 0.0085, 13.8618], + [48.5297, 0.0084, 13.8668], + [51.4512, 0.0064, 13.9651] + ] + } + }, + "defaultBlowoutVolume": 3.2 + }, + "t200": { + "defaultAspirateFlowRate": { + "default": 716, + "valuesByApiLevel": { + "2.14": 716 + } + }, + "defaultDispenseFlowRate": { + "default": 160, + "valuesByApiLevel": { + "2.14": 160 + } + }, + "defaultBlowOutFlowRate": { + "default": 160, + "valuesByApiLevel": { + "2.14": 160 + } + }, + "defaultTipLength": 58.35, + "defaultReturnTipHeight": 0.71, + "aspirate": { + "default": { + "1": [ + [0.8314, -2.9322, 24.0741], + [0.8853, -30.0996, 48.7784], + [0.9778, -4.3627, 25.9941], + [0.975, 802.2301, -762.6744], + [1.1272, -4.6837, 24.0666], + [1.2747, -3.91, 23.1945], + [1.5656, -2.8032, 21.7836], + [1.6667, -7.2039, 28.6731], + [2.4403, -0.5147, 17.5244], + [3.0564, -1.6013, 20.1761], + [3.6444, -1.1974, 18.9418], + [4.1189, -1.7877, 21.0928], + [4.6467, -0.8591, 17.2684], + [5.2597, -0.207, 14.2379], + [5.8581, -0.2196, 14.3044], + [6.4772, -0.1025, 13.6183], + [7.8158, 0.0537, 12.6063], + [9.1664, 0.0507, 12.6302], + [10.5064, 0.0285, 12.8339], + [14.8361, 0.0818, 12.273], + [19.3933, 0.0801, 12.2991], + [23.9242, 0.0487, 12.9079], + [28.4922, 0.0379, 13.1666], + [36.145, 0.0277, 13.4572], + [43.7972, 0.0184, 13.7916], + [51.5125, 0.0154, 13.9248], + [59.2467, 0.0121, 14.0931], + [66.9428, 0.0084, 14.3151], + [74.6853, 0.0079, 14.3498], + [82.3722, 0.0052, 14.5512], + [90.1106, 0.0054, 14.5333], + [97.8369, 0.0043, 14.6288], + [105.6153, 0.0046, 14.5983], + [113.3686, 0.0036, 14.7076], + [121.1108, 0.003, 14.7785], + [136.61, 0.0026, 14.826], + [152.0708, 0.0018, 14.9298], + [167.6433, 0.0021, 14.8827], + [183.1011, 0.0012, 15.0438], + [198.5845, 0.0011, 15.0538], + [214.0264, 0.0008, 15.123] + ] + } + }, + "dispense": { + "default": { + "1": [ + [0.8314, -2.9322, 24.0741], + [0.8853, -30.0996, 48.7784], + [0.9778, -4.3627, 25.9941], + [0.975, 802.2301, -762.6744], + [1.1272, -4.6837, 24.0666], + [1.2747, -3.91, 23.1945], + [1.5656, -2.8032, 21.7836], + [1.6667, -7.2039, 28.6731], + [2.4403, -0.5147, 17.5244], + [3.0564, -1.6013, 20.1761], + [3.6444, -1.1974, 18.9418], + [4.1189, -1.7877, 21.0928], + [4.6467, -0.8591, 17.2684], + [5.2597, -0.207, 14.2379], + [5.8581, -0.2196, 14.3044], + [6.4772, -0.1025, 13.6183], + [7.8158, 0.0537, 12.6063], + [9.1664, 0.0507, 12.6302], + [10.5064, 0.0285, 12.8339], + [14.8361, 0.0818, 12.273], + [19.3933, 0.0801, 12.2991], + [23.9242, 0.0487, 12.9079], + [28.4922, 0.0379, 13.1666], + [36.145, 0.0277, 13.4572], + [43.7972, 0.0184, 13.7916], + [51.5125, 0.0154, 13.9248], + [59.2467, 0.0121, 14.0931], + [66.9428, 0.0084, 14.3151], + [74.6853, 0.0079, 14.3498], + [82.3722, 0.0052, 14.5512], + [90.1106, 0.0054, 14.5333], + [97.8369, 0.0043, 14.6288], + [105.6153, 0.0046, 14.5983], + [113.3686, 0.0036, 14.7076], + [121.1108, 0.003, 14.7785], + [136.61, 0.0026, 14.826], + [152.0708, 0.0018, 14.9298], + [167.6433, 0.0021, 14.8827], + [183.1011, 0.0012, 15.0438], + [198.5845, 0.0011, 15.0538], + [214.0264, 0.0008, 15.123] + ] + } + }, + "defaultBlowoutVolume": 16 + }, + "t1000": { + "defaultAspirateFlowRate": { + "default": 716, + "valuesByApiLevel": { + "2.14": 716 + } + }, + "defaultDispenseFlowRate": { + "default": 160, + "valuesByApiLevel": { + "2.14": 160 + } + }, + "defaultBlowOutFlowRate": { + "default": 160, + "valuesByApiLevel": { + "2.14": 160 + } + }, + "defaultTipLength": 95.6, + "defaultReturnTipHeight": 0.82, + "aspirate": { + "default": { + "1": [ + [0.7511, 3.9556, 6.455], + [1.3075, 2.1664, 5.8839], + [1.8737, 1.1513, 7.2111], + [3.177, 0.9374, 7.612], + [4.5368, 0.5531, 8.8328], + [7.3103, 0.3035, 9.9651], + [10.0825, 0.1513, 11.0781], + [12.9776, 0.1293, 11.2991], + [15.9173, 0.0976, 11.7115], + [18.8243, 0.0624, 12.2706], + [21.8529, 0.07, 12.1275], + [24.8068, 0.0418, 12.7442], + [27.7744, 0.0356, 12.8984], + [35.2873, 0.0303, 13.0454], + [42.7989, 0.0202, 13.4038], + [50.4562, 0.0196, 13.4293], + [58.1081, 0.0145, 13.6843], + [65.7267, 0.0104, 13.9252], + [73.2857, 0.0068, 14.1606], + [81.0016, 0.0091, 13.9883], + [88.6617, 0.0064, 14.2052], + [103.9829, 0.0051, 14.3271], + [119.4408, 0.0049, 14.3475], + [134.889, 0.0037, 14.485], + [150.273, 0.0026, 14.6402], + [181.2798, 0.0026, 14.6427], + [212.4724, 0.0022, 14.7002], + [243.577, 0.0015, 14.8558], + [274.7216, 0.0012, 14.9205], + [305.8132, 0.0009, 15.0118], + [368.0697, 0.0007, 15.0668], + [430.2513, 0.0005, 15.1594], + [492.3487, 0.0003, 15.2291], + [554.5713, 0.0003, 15.2367], + [616.6825, 0.0002, 15.2949], + [694.4168, 0.0002, 15.3027], + [772.0327, 0.0001, 15.3494], + [849.617, 0.0001, 15.3717], + [927.2556, 0.0001, 15.3745], + [1004.87, 0.0001, 15.3912], + [1051.4648, 0.0001, 15.391] + ] + } + }, + "dispense": { + "default": { + "1": [ + [0.7511, 3.9556, 6.455], + [1.3075, 2.1664, 5.8839], + [1.8737, 1.1513, 7.2111], + [3.177, 0.9374, 7.612], + [4.5368, 0.5531, 8.8328], + [7.3103, 0.3035, 9.9651], + [10.0825, 0.1513, 11.0781], + [12.9776, 0.1293, 11.2991], + [15.9173, 0.0976, 11.7115], + [18.8243, 0.0624, 12.2706], + [21.8529, 0.07, 12.1275], + [24.8068, 0.0418, 12.7442], + [27.7744, 0.0356, 12.8984], + [35.2873, 0.0303, 13.0454], + [42.7989, 0.0202, 13.4038], + [50.4562, 0.0196, 13.4293], + [58.1081, 0.0145, 13.6843], + [65.7267, 0.0104, 13.9252], + [73.2857, 0.0068, 14.1606], + [81.0016, 0.0091, 13.9883], + [88.6617, 0.0064, 14.2052], + [103.9829, 0.0051, 14.3271], + [119.4408, 0.0049, 14.3475], + [134.889, 0.0037, 14.485], + [150.273, 0.0026, 14.6402], + [181.2798, 0.0026, 14.6427], + [212.4724, 0.0022, 14.7002], + [243.577, 0.0015, 14.8558], + [274.7216, 0.0012, 14.9205], + [305.8132, 0.0009, 15.0118], + [368.0697, 0.0007, 15.0668], + [430.2513, 0.0005, 15.1594], + [492.3487, 0.0003, 15.2291], + [554.5713, 0.0003, 15.2367], + [616.6825, 0.0002, 15.2949], + [694.4168, 0.0002, 15.3027], + [772.0327, 0.0001, 15.3494], + [849.617, 0.0001, 15.3717], + [927.2556, 0.0001, 15.3745], + [1004.87, 0.0001, 15.3912], + [1051.4648, 0.0001, 15.391] + ] + } + }, + "defaultBlowoutVolume": 16 + } + }, + "defaultTipOverlapDictionary": { + "default": 10.5, + "opentrons/opentrons_flex_96_tiprack_200ul/1": 10.5, + "opentrons/opentrons_flex_96_tiprack_50ul/1": 10.5, + "opentrons/opentrons_flex_96_tiprack_1000ul/1": 10.5 + }, + + "maxVolume": 1000, + "minVolume": 5, + "defaultTipracks": [ + "opentrons/opentrons_flex_96_tiprack_1000ul/1", + "opentrons/opentrons_flex_96_tiprack_200ul/1", + "opentrons/opentrons_flex_96_tiprack_50ul/1" + ] +} diff --git a/shared-data/pipette/definitions/2/liquid/eight_channel/p20/2_0.json b/shared-data/pipette/definitions/2/liquid/eight_channel/p20/2_0.json index a9a18091b05..f24cbe3b351 100644 --- a/shared-data/pipette/definitions/2/liquid/eight_channel/p20/2_0.json +++ b/shared-data/pipette/definitions/2/liquid/eight_channel/p20/2_0.json @@ -2,13 +2,58 @@ "$otSharedSchema": "#/pipette/schemas/2/pipetteLiquidPropertiesSchema.json", "supportedTips": { "t20": { - "defaultAspirateFlowRate": 7.6, - "defaultDispenseFlowRate": 7.6, - "defaultBlowOutFlowRate": 7.6, + "defaultAspirateFlowRate": { + "default": 7.6, + "valuesByApiLevel": { + "2.0": 7.6 + } + }, + "defaultDispenseFlowRate": { + "default": 7.6, + "valuesByApiLevel": { + "2.0": 7.6 + } + }, + "defaultBlowOutFlowRate": { + "default": 7.6, + "valuesByApiLevel": { + "2.0": 7.6 + } + }, "defaultTipLength": 31.1, - "defaultTipOverlap": 8.25, - "defaultReturnTipHeight": null, "aspirate": { + "default": { + "1": [ + [0.8425, 0.0933, 0.5892], + [0.9934, 0.1264, 0.4953], + [1.17, 0.1658, 0.4562], + [1.299, -0.005354, 0.6565], + [1.435, 0.02079, 0.6225], + [1.603, 0.09178, 0.5206], + [1.745, 0.02307, 0.6306], + [1.916, 0.07824, 0.5345], + [2.051, -0.004942, 0.6939], + [2.417, 0.01873, 0.6454], + [2.801, 0.0253, 0.6295], + [3.163, 0.00714, 0.6804], + [3.539, 0.01305, 0.6617], + [3.949, 0.02487, 0.6198], + [4.32, 0.005296, 0.6971], + [4.692, 0.004936, 0.6987], + [5.084, 0.01144, 0.6682], + [5.791, -0.003501, 0.7441], + [7.344, 0.00678, 0.6846], + [8.857, 0.00243, 0.7165], + [10.42, 0.003968, 0.7029], + [11.94, 0.001477, 0.7289], + [13.47, 0.001089, 0.7335], + [15.01, 0.00147, 0.7284], + [16.54, 0.0008888, 0.7371], + [18.06, 0.0003974, 0.7452], + [19.62, 0.001391, 0.7273], + [21.14, 0.0003498, 0.7477] + ] + }, "opentrons/opentrons_96_tiprack_20ul/1": [ [0.9201, 0.0987, 0.6425], [1.0713, 0.0817, 0.582], @@ -131,303 +176,141 @@ [19.558, 0.0004, 0.744], [21.057, -0.0001, 0.7548] ], - "default": [ - [0.9201, 0.0987, 0.6425], - [1.0713, 0.0817, 0.582], - [1.2327, 0.0946, 0.5683], - [1.3654, -0.016, 0.7046], - [1.5139, 0.0364, 0.633], - [1.6634, 0.0332, 0.6378], - [1.7955, -0.0191, 0.7249], - [1.951, 0.0399, 0.6189], - [2.103, 0.0277, 0.6427], - [2.4684, 0.0117, 0.6764], - [2.8469, 0.017, 0.6632], - [3.2284, 0.015, 0.6691], - [3.599, 0.0064, 0.6968], - [3.9789, 0.0096, 0.6854], - [4.3576, 0.0075, 0.6938], - [4.7241, 0.0014, 0.7201], - [5.0953, 0.003, 0.7124], - [5.8498, 0.0044, 0.7055], - [7.3776, 0.0043, 0.7062], - [8.8971, 0.0024, 0.72], - [10.3977, 0.0008, 0.7339], - [11.9333, 0.002, 0.7214], - [13.4322, 0.0003, 0.7427], - [14.946, 0.0007, 0.7368], - [16.4788, 0.0011, 0.7304], - [18.0383, 0.0016, 0.722], - [19.558, 0.0004, 0.744], - [21.057, -0.0001, 0.7548] - ] - }, - "defaultTipOverlapDictionary": { - "opentrons/opentrons_96_tiprack_20ul/1": 8.25, - "opentrons/opentrons_96_filtertiprack_20ul/1": 8.25 + "default": { + "1": [ + [0.9201, 0.0987, 0.6425], + [1.0713, 0.0817, 0.582], + [1.2327, 0.0946, 0.5683], + [1.3654, -0.016, 0.7046], + [1.5139, 0.0364, 0.633], + [1.6634, 0.0332, 0.6378], + [1.7955, -0.0191, 0.7249], + [1.951, 0.0399, 0.6189], + [2.103, 0.0277, 0.6427], + [2.4684, 0.0117, 0.6764], + [2.8469, 0.017, 0.6632], + [3.2284, 0.015, 0.6691], + [3.599, 0.0064, 0.6968], + [3.9789, 0.0096, 0.6854], + [4.3576, 0.0075, 0.6938], + [4.7241, 0.0014, 0.7201], + [5.0953, 0.003, 0.7124], + [5.8498, 0.0044, 0.7055], + [7.3776, 0.0043, 0.7062], + [8.8971, 0.0024, 0.72], + [10.3977, 0.0008, 0.7339], + [11.9333, 0.002, 0.7214], + [13.4322, 0.0003, 0.7427], + [14.946, 0.0007, 0.7368], + [16.4788, 0.0011, 0.7304], + [18.0383, 0.0016, 0.722], + [19.558, 0.0004, 0.744], + [21.057, -0.0001, 0.7548] + ] + } }, "defaultBlowoutVolume": 3.534 }, "t10": { - "defaultAspirateFlowRate": 7.6, - "defaultDispenseFlowRate": 7.6, - "defaultBlowOutFlowRate": 7.6, + "defaultAspirateFlowRate": { + "default": 7.6, + "valuesByApiLevel": { + "2.0": 7.6 + } + }, + "defaultDispenseFlowRate": { + "default": 7.6, + "valuesByApiLevel": { + "2.0": 7.6 + } + }, + "defaultBlowOutFlowRate": { + "default": 7.6, + "valuesByApiLevel": { + "2.0": 7.6 + } + }, "defaultTipLength": 31.1, - "defaultTipOverlap": 8.25, - "defaultReturnTipHeight": null, "aspirate": { - "opentrons/opentrons_96_tiprack_10ul/1": [ - [0.9201, 0.0987, 0.6425], - [1.0713, 0.0817, 0.582], - [1.2327, 0.0946, 0.5683], - [1.3654, -0.016, 0.7046], - [1.5139, 0.0364, 0.633], - [1.6634, 0.0332, 0.6378], - [1.7955, -0.0191, 0.7249], - [1.951, 0.0399, 0.6189], - [2.103, 0.0277, 0.6427], - [2.4684, 0.0117, 0.6764], - [2.8469, 0.017, 0.6632], - [3.2284, 0.015, 0.6691], - [3.599, 0.0064, 0.6968], - [3.9789, 0.0096, 0.6854], - [4.3576, 0.0075, 0.6938], - [4.7241, 0.0014, 0.7201], - [5.0953, 0.003, 0.7124], - [5.8498, 0.0044, 0.7055], - [7.3776, 0.0043, 0.7062], - [8.8971, 0.0024, 0.72], - [10.3977, 0.0008, 0.7339], - [11.9333, 0.002, 0.7214], - [13.4322, 0.0003, 0.7427], - [14.946, 0.0007, 0.7368], - [16.4788, 0.0011, 0.7304], - [18.0383, 0.0016, 0.722], - [19.558, 0.0004, 0.744], - [21.057, -0.0001, 0.7548] - ], - "opentrons/opentrons_96_filtertiprack_10ul/1": [ - [0.9201, 0.0987, 0.6425], - [1.0713, 0.0817, 0.582], - [1.2327, 0.0946, 0.5683], - [1.3654, -0.016, 0.7046], - [1.5139, 0.0364, 0.633], - [1.6634, 0.0332, 0.6378], - [1.7955, -0.0191, 0.7249], - [1.951, 0.0399, 0.6189], - [2.103, 0.0277, 0.6427], - [2.4684, 0.0117, 0.6764], - [2.8469, 0.017, 0.6632], - [3.2284, 0.015, 0.6691], - [3.599, 0.0064, 0.6968], - [3.9789, 0.0096, 0.6854], - [4.3576, 0.0075, 0.6938], - [4.7241, 0.0014, 0.7201], - [5.0953, 0.003, 0.7124], - [5.8498, 0.0044, 0.7055], - [7.3776, 0.0043, 0.7062], - [8.8971, 0.0024, 0.72], - [10.3977, 0.0008, 0.7339], - [11.9333, 0.002, 0.7214], - [13.4322, 0.0003, 0.7427], - [14.946, 0.0007, 0.7368], - [16.4788, 0.0011, 0.7304], - [18.0383, 0.0016, 0.722], - [19.558, 0.0004, 0.744], - [21.057, -0.0001, 0.7548] - ], - "opentrons/eppendorf_96_tiprack_10ul_eptips/1": [ - [0.9201, 0.0987, 0.6425], - [1.0713, 0.0817, 0.582], - [1.2327, 0.0946, 0.5683], - [1.3654, -0.016, 0.7046], - [1.5139, 0.0364, 0.633], - [1.6634, 0.0332, 0.6378], - [1.7955, -0.0191, 0.7249], - [1.951, 0.0399, 0.6189], - [2.103, 0.0277, 0.6427], - [2.4684, 0.0117, 0.6764], - [2.8469, 0.017, 0.6632], - [3.2284, 0.015, 0.6691], - [3.599, 0.0064, 0.6968], - [3.9789, 0.0096, 0.6854], - [4.3576, 0.0075, 0.6938], - [4.7241, 0.0014, 0.7201], - [5.0953, 0.003, 0.7124], - [5.8498, 0.0044, 0.7055], - [7.3776, 0.0043, 0.7062], - [8.8971, 0.0024, 0.72], - [10.3977, 0.0008, 0.7339], - [11.9333, 0.002, 0.7214], - [13.4322, 0.0003, 0.7427], - [14.946, 0.0007, 0.7368], - [16.4788, 0.0011, 0.7304], - [18.0383, 0.0016, 0.722], - [19.558, 0.0004, 0.744], - [21.057, -0.0001, 0.7548] - ], - "opentrons/geb_96_tiprack_10ul/1": [ - [0.9201, 0.0987, 0.6425], - [1.0713, 0.0817, 0.582], - [1.2327, 0.0946, 0.5683], - [1.3654, -0.016, 0.7046], - [1.5139, 0.0364, 0.633], - [1.6634, 0.0332, 0.6378], - [1.7955, -0.0191, 0.7249], - [1.951, 0.0399, 0.6189], - [2.103, 0.0277, 0.6427], - [2.4684, 0.0117, 0.6764], - [2.8469, 0.017, 0.6632], - [3.2284, 0.015, 0.6691], - [3.599, 0.0064, 0.6968], - [3.9789, 0.0096, 0.6854], - [4.3576, 0.0075, 0.6938], - [4.7241, 0.0014, 0.7201], - [5.0953, 0.003, 0.7124], - [5.8498, 0.0044, 0.7055], - [7.3776, 0.0043, 0.7062], - [8.8971, 0.0024, 0.72], - [10.3977, 0.0008, 0.7339], - [11.9333, 0.002, 0.7214], - [13.4322, 0.0003, 0.7427], - [14.946, 0.0007, 0.7368], - [16.4788, 0.0011, 0.7304], - [18.0383, 0.0016, 0.722], - [19.558, 0.0004, 0.744], - [21.057, -0.0001, 0.7548] - ] + "default": { + "1": [ + [0.8425, 0.0933, 0.5892], + [0.9934, 0.1264, 0.4953], + [1.17, 0.1658, 0.4562], + [1.299, -0.005354, 0.6565], + [1.435, 0.02079, 0.6225], + [1.603, 0.09178, 0.5206], + [1.745, 0.02307, 0.6306], + [1.916, 0.07824, 0.5345], + [2.051, -0.004942, 0.6939], + [2.417, 0.01873, 0.6454], + [2.801, 0.0253, 0.6295], + [3.163, 0.00714, 0.6804], + [3.539, 0.01305, 0.6617], + [3.949, 0.02487, 0.6198], + [4.32, 0.005296, 0.6971], + [4.692, 0.004936, 0.6987], + [5.084, 0.01144, 0.6682], + [5.791, -0.003501, 0.7441], + [7.344, 0.00678, 0.6846], + [8.857, 0.00243, 0.7165], + [10.42, 0.003968, 0.7029], + [11.94, 0.001477, 0.7289], + [13.47, 0.001089, 0.7335], + [15.01, 0.00147, 0.7284], + [16.54, 0.0008888, 0.7371], + [18.06, 0.0003974, 0.7452], + [19.62, 0.001391, 0.7273], + [21.14, 0.0003498, 0.7477] + ] + } }, "dispense": { - "opentrons/opentrons_96_tiprack_10ul/1": [ - [0.9201, 0.0987, 0.6425], - [1.0713, 0.0817, 0.582], - [1.2327, 0.0946, 0.5683], - [1.3654, -0.016, 0.7046], - [1.5139, 0.0364, 0.633], - [1.6634, 0.0332, 0.6378], - [1.7955, -0.0191, 0.7249], - [1.951, 0.0399, 0.6189], - [2.103, 0.0277, 0.6427], - [2.4684, 0.0117, 0.6764], - [2.8469, 0.017, 0.6632], - [3.2284, 0.015, 0.6691], - [3.599, 0.0064, 0.6968], - [3.9789, 0.0096, 0.6854], - [4.3576, 0.0075, 0.6938], - [4.7241, 0.0014, 0.7201], - [5.0953, 0.003, 0.7124], - [5.8498, 0.0044, 0.7055], - [7.3776, 0.0043, 0.7062], - [8.8971, 0.0024, 0.72], - [10.3977, 0.0008, 0.7339], - [11.9333, 0.002, 0.7214], - [13.4322, 0.0003, 0.7427], - [14.946, 0.0007, 0.7368], - [16.4788, 0.0011, 0.7304], - [18.0383, 0.0016, 0.722], - [19.558, 0.0004, 0.744], - [21.057, -0.0001, 0.7548] - ], - "opentrons/opentrons_96_filtertiprack_10ul/1": [ - [0.9201, 0.0987, 0.6425], - [1.0713, 0.0817, 0.582], - [1.2327, 0.0946, 0.5683], - [1.3654, -0.016, 0.7046], - [1.5139, 0.0364, 0.633], - [1.6634, 0.0332, 0.6378], - [1.7955, -0.0191, 0.7249], - [1.951, 0.0399, 0.6189], - [2.103, 0.0277, 0.6427], - [2.4684, 0.0117, 0.6764], - [2.8469, 0.017, 0.6632], - [3.2284, 0.015, 0.6691], - [3.599, 0.0064, 0.6968], - [3.9789, 0.0096, 0.6854], - [4.3576, 0.0075, 0.6938], - [4.7241, 0.0014, 0.7201], - [5.0953, 0.003, 0.7124], - [5.8498, 0.0044, 0.7055], - [7.3776, 0.0043, 0.7062], - [8.8971, 0.0024, 0.72], - [10.3977, 0.0008, 0.7339], - [11.9333, 0.002, 0.7214], - [13.4322, 0.0003, 0.7427], - [14.946, 0.0007, 0.7368], - [16.4788, 0.0011, 0.7304], - [18.0383, 0.0016, 0.722], - [19.558, 0.0004, 0.744], - [21.057, -0.0001, 0.7548] - ], - "opentrons/eppendorf_96_tiprack_10ul_eptips/1": [ - [0.9201, 0.0987, 0.6425], - [1.0713, 0.0817, 0.582], - [1.2327, 0.0946, 0.5683], - [1.3654, -0.016, 0.7046], - [1.5139, 0.0364, 0.633], - [1.6634, 0.0332, 0.6378], - [1.7955, -0.0191, 0.7249], - [1.951, 0.0399, 0.6189], - [2.103, 0.0277, 0.6427], - [2.4684, 0.0117, 0.6764], - [2.8469, 0.017, 0.6632], - [3.2284, 0.015, 0.6691], - [3.599, 0.0064, 0.6968], - [3.9789, 0.0096, 0.6854], - [4.3576, 0.0075, 0.6938], - [4.7241, 0.0014, 0.7201], - [5.0953, 0.003, 0.7124], - [5.8498, 0.0044, 0.7055], - [7.3776, 0.0043, 0.7062], - [8.8971, 0.0024, 0.72], - [10.3977, 0.0008, 0.7339], - [11.9333, 0.002, 0.7214], - [13.4322, 0.0003, 0.7427], - [14.946, 0.0007, 0.7368], - [16.4788, 0.0011, 0.7304], - [18.0383, 0.0016, 0.722], - [19.558, 0.0004, 0.744], - [21.057, -0.0001, 0.7548] - ], - "opentrons/geb_96_tiprack_10ul/1": [ - [0.9201, 0.0987, 0.6425], - [1.0713, 0.0817, 0.582], - [1.2327, 0.0946, 0.5683], - [1.3654, -0.016, 0.7046], - [1.5139, 0.0364, 0.633], - [1.6634, 0.0332, 0.6378], - [1.7955, -0.0191, 0.7249], - [1.951, 0.0399, 0.6189], - [2.103, 0.0277, 0.6427], - [2.4684, 0.0117, 0.6764], - [2.8469, 0.017, 0.6632], - [3.2284, 0.015, 0.6691], - [3.599, 0.0064, 0.6968], - [3.9789, 0.0096, 0.6854], - [4.3576, 0.0075, 0.6938], - [4.7241, 0.0014, 0.7201], - [5.0953, 0.003, 0.7124], - [5.8498, 0.0044, 0.7055], - [7.3776, 0.0043, 0.7062], - [8.8971, 0.0024, 0.72], - [10.3977, 0.0008, 0.7339], - [11.9333, 0.002, 0.7214], - [13.4322, 0.0003, 0.7427], - [14.946, 0.0007, 0.7368], - [16.4788, 0.0011, 0.7304], - [18.0383, 0.0016, 0.722], - [19.558, 0.0004, 0.744], - [21.057, -0.0001, 0.7548] - ] - }, - "defaultTipOverlapDictionary": { - "opentrons/opentrons_96_tiprack_10ul/1": 8.25, - "opentrons/opentrons_96_filtertiprack_10ul/1": 8.25, - "opentrons/eppendorf_96_tiprack_10ul_eptips/1": 8.4, - "opentrons/geb_96_tiprack_10ul/1": 8.3 + "default": { + "1": [ + [0.9201, 0.0987, 0.6425], + [1.0713, 0.0817, 0.582], + [1.2327, 0.0946, 0.5683], + [1.3654, -0.016, 0.7046], + [1.5139, 0.0364, 0.633], + [1.6634, 0.0332, 0.6378], + [1.7955, -0.0191, 0.7249], + [1.951, 0.0399, 0.6189], + [2.103, 0.0277, 0.6427], + [2.4684, 0.0117, 0.6764], + [2.8469, 0.017, 0.6632], + [3.2284, 0.015, 0.6691], + [3.599, 0.0064, 0.6968], + [3.9789, 0.0096, 0.6854], + [4.3576, 0.0075, 0.6938], + [4.7241, 0.0014, 0.7201], + [5.0953, 0.003, 0.7124], + [5.8498, 0.0044, 0.7055], + [7.3776, 0.0043, 0.7062], + [8.8971, 0.0024, 0.72], + [10.3977, 0.0008, 0.7339], + [11.9333, 0.002, 0.7214], + [13.4322, 0.0003, 0.7427], + [14.946, 0.0007, 0.7368], + [16.4788, 0.0011, 0.7304], + [18.0383, 0.0016, 0.722], + [19.558, 0.0004, 0.744], + [21.057, -0.0001, 0.7548] + ] + } }, "defaultBlowoutVolume": 3.534 } }, + "defaultTipOverlapDictionary": { + "default": 8.25, + "opentrons/opentrons_96_tiprack_20ul/1": 8.25, + "opentrons/opentrons_96_filtertiprack_20ul/1": 8.25, + "opentrons/opentrons_96_tiprack_10ul/1": 8.25, + "opentrons/opentrons_96_filtertiprack_10ul/1": 8.25, + "opentrons/eppendorf_96_tiprack_10ul_eptips/1": 8.4, + "opentrons/geb_96_tiprack_10ul/1": 8.3 + }, "maxVolume": 20, "minVolume": 1.0, "defaultTipracks": [ diff --git a/shared-data/pipette/definitions/2/liquid/eight_channel/p20/2_1.json b/shared-data/pipette/definitions/2/liquid/eight_channel/p20/2_1.json index fcb998756ee..2d1d8e16d34 100644 --- a/shared-data/pipette/definitions/2/liquid/eight_channel/p20/2_1.json +++ b/shared-data/pipette/definitions/2/liquid/eight_channel/p20/2_1.json @@ -2,522 +2,195 @@ "$otSharedSchema": "#/pipette/schemas/2/pipetteLiquidPropertiesSchema.json", "supportedTips": { "t20": { - "defaultAspirateFlowRate": 7.6, - "defaultDispenseFlowRate": 7.6, - "defaultBlowOutFlowRate": 7.6, + "defaultAspirateFlowRate": { + "default": 7.6, + "valuesByApiLevel": { + "2.0": 7.6 + } + }, + "defaultDispenseFlowRate": { + "default": 7.6, + "valuesByApiLevel": { + "2.0": 7.6 + } + }, + "defaultBlowOutFlowRate": { + "default": 7.6, + "valuesByApiLevel": { + "2.0": 7.6 + } + }, "defaultTipLength": 31.1, - "defaultTipOverlap": 8.25, - "defaultReturnTipHeight": null, "aspirate": { - "opentrons/opentrons_96_tiprack_20ul/1": [ - [0.873, -0.0339, 0.6276], - [1.0274, 0.1203, 0.5185], - [1.1795, 0.0863, 0.5535], - [1.3179, 0.0267, 0.6238], - [1.4539, 0.0141, 0.6404], - [1.6193, 0.0836, 0.5394], - [1.7838, 0.0691, 0.5628], - [1.9164, -0.0124, 0.7082], - [2.0417, -0.0307, 0.7433], - [2.4182, 0.0274, 0.6245], - [2.8159, 0.0329, 0.6115], - [3.1854, 0.0105, 0.6743], - [3.5678, 0.0149, 0.6604], - [3.9434, 0.0091, 0.6811], - [4.3254, 0.0102, 0.6766], - [4.7002, 0.0059, 0.6955], - [5.0629, 0.0005, 0.7208], - [5.8469, 0.0097, 0.6743], - [7.3388, 0.002, 0.7191], - [8.877, 0.0038, 0.7059], - [10.4052, 0.0023, 0.7196], - [11.9158, 0.001, 0.7328], - [13.419, 0.0005, 0.7387], - [14.9352, 0.0008, 0.7344], - [16.4603, 0.0009, 0.7327], - [17.9666, 0.0003, 0.7437], - [19.5173, 0.0013, 0.7248], - [21.0316, 0.0003, 0.7447] - ], - "opentrons/opentrons_96_filtertiprack_20ul/1": [ - [0.873, -0.0339, 0.6276], - [1.0274, 0.1203, 0.5185], - [1.1795, 0.0863, 0.5535], - [1.3179, 0.0267, 0.6238], - [1.4539, 0.0141, 0.6404], - [1.6193, 0.0836, 0.5394], - [1.7838, 0.0691, 0.5628], - [1.9164, -0.0124, 0.7082], - [2.0417, -0.0307, 0.7433], - [2.4182, 0.0274, 0.6245], - [2.8159, 0.0329, 0.6115], - [3.1854, 0.0105, 0.6743], - [3.5678, 0.0149, 0.6604], - [3.9434, 0.0091, 0.6811], - [4.3254, 0.0102, 0.6766], - [4.7002, 0.0059, 0.6955], - [5.0629, 0.0005, 0.7208], - [5.8469, 0.0097, 0.6743], - [7.3388, 0.002, 0.7191], - [8.877, 0.0038, 0.7059], - [10.4052, 0.0023, 0.7196], - [11.9158, 0.001, 0.7328], - [13.419, 0.0005, 0.7387], - [14.9352, 0.0008, 0.7344], - [16.4603, 0.0009, 0.7327], - [17.9666, 0.0003, 0.7437], - [19.5173, 0.0013, 0.7248], - [21.0316, 0.0003, 0.7447] - ], - "default": [ - [0.873, -0.0339, 0.6276], - [1.0274, 0.1203, 0.5185], - [1.1795, 0.0863, 0.5535], - [1.3179, 0.0267, 0.6238], - [1.4539, 0.0141, 0.6404], - [1.6193, 0.0836, 0.5394], - [1.7838, 0.0691, 0.5628], - [1.9164, -0.0124, 0.7082], - [2.0417, -0.0307, 0.7433], - [2.4182, 0.0274, 0.6245], - [2.8159, 0.0329, 0.6115], - [3.1854, 0.0105, 0.6743], - [3.5678, 0.0149, 0.6604], - [3.9434, 0.0091, 0.6811], - [4.3254, 0.0102, 0.6766], - [4.7002, 0.0059, 0.6955], - [5.0629, 0.0005, 0.7208], - [5.8469, 0.0097, 0.6743], - [7.3388, 0.002, 0.7191], - [8.877, 0.0038, 0.7059], - [10.4052, 0.0023, 0.7196], - [11.9158, 0.001, 0.7328], - [13.419, 0.0005, 0.7387], - [14.9352, 0.0008, 0.7344], - [16.4603, 0.0009, 0.7327], - [17.9666, 0.0003, 0.7437], - [19.5173, 0.0013, 0.7248], - [21.0316, 0.0003, 0.7447] - ] + "default": { + "1": [ + [0.873, -0.0339, 0.6276], + [1.0274, 0.1203, 0.5185], + [1.1795, 0.0863, 0.5535], + [1.3179, 0.0267, 0.6238], + [1.4539, 0.0141, 0.6404], + [1.6193, 0.0836, 0.5394], + [1.7838, 0.0691, 0.5628], + [1.9164, -0.0124, 0.7082], + [2.0417, -0.0307, 0.7433], + [2.4182, 0.0274, 0.6245], + [2.8159, 0.0329, 0.6115], + [3.1854, 0.0105, 0.6743], + [3.5678, 0.0149, 0.6604], + [3.9434, 0.0091, 0.6811], + [4.3254, 0.0102, 0.6766], + [4.7002, 0.0059, 0.6955], + [5.0629, 0.0005, 0.7208], + [5.8469, 0.0097, 0.6743], + [7.3388, 0.002, 0.7191], + [8.877, 0.0038, 0.7059], + [10.4052, 0.0023, 0.7196], + [11.9158, 0.001, 0.7328], + [13.419, 0.0005, 0.7387], + [14.9352, 0.0008, 0.7344], + [16.4603, 0.0009, 0.7327], + [17.9666, 0.0003, 0.7437], + [19.5173, 0.0013, 0.7248], + [21.0316, 0.0003, 0.7447] + ] + } }, "dispense": { - "opentrons/opentrons_96_tiprack_20ul/1": [ - [0.873, -0.0339, 0.6276], - [1.0274, 0.1203, 0.5185], - [1.1795, 0.0863, 0.5535], - [1.3179, 0.0267, 0.6238], - [1.4539, 0.0141, 0.6404], - [1.6193, 0.0836, 0.5394], - [1.7838, 0.0691, 0.5628], - [1.9164, -0.0124, 0.7082], - [2.0417, -0.0307, 0.7433], - [2.4182, 0.0274, 0.6245], - [2.8159, 0.0329, 0.6115], - [3.1854, 0.0105, 0.6743], - [3.5678, 0.0149, 0.6604], - [3.9434, 0.0091, 0.6811], - [4.3254, 0.0102, 0.6766], - [4.7002, 0.0059, 0.6955], - [5.0629, 0.0005, 0.7208], - [5.8469, 0.0097, 0.6743], - [7.3388, 0.002, 0.7191], - [8.877, 0.0038, 0.7059], - [10.4052, 0.0023, 0.7196], - [11.9158, 0.001, 0.7328], - [13.419, 0.0005, 0.7387], - [14.9352, 0.0008, 0.7344], - [16.4603, 0.0009, 0.7327], - [17.9666, 0.0003, 0.7437], - [19.5173, 0.0013, 0.7248], - [21.0316, 0.0003, 0.7447] - ], - "opentrons/opentrons_96_filtertiprack_20ul/1": [ - [0.873, -0.0339, 0.6276], - [1.0274, 0.1203, 0.5185], - [1.1795, 0.0863, 0.5535], - [1.3179, 0.0267, 0.6238], - [1.4539, 0.0141, 0.6404], - [1.6193, 0.0836, 0.5394], - [1.7838, 0.0691, 0.5628], - [1.9164, -0.0124, 0.7082], - [2.0417, -0.0307, 0.7433], - [2.4182, 0.0274, 0.6245], - [2.8159, 0.0329, 0.6115], - [3.1854, 0.0105, 0.6743], - [3.5678, 0.0149, 0.6604], - [3.9434, 0.0091, 0.6811], - [4.3254, 0.0102, 0.6766], - [4.7002, 0.0059, 0.6955], - [5.0629, 0.0005, 0.7208], - [5.8469, 0.0097, 0.6743], - [7.3388, 0.002, 0.7191], - [8.877, 0.0038, 0.7059], - [10.4052, 0.0023, 0.7196], - [11.9158, 0.001, 0.7328], - [13.419, 0.0005, 0.7387], - [14.9352, 0.0008, 0.7344], - [16.4603, 0.0009, 0.7327], - [17.9666, 0.0003, 0.7437], - [19.5173, 0.0013, 0.7248], - [21.0316, 0.0003, 0.7447] - ], - "default": [ - [0.873, -0.0339, 0.6276], - [1.0274, 0.1203, 0.5185], - [1.1795, 0.0863, 0.5535], - [1.3179, 0.0267, 0.6238], - [1.4539, 0.0141, 0.6404], - [1.6193, 0.0836, 0.5394], - [1.7838, 0.0691, 0.5628], - [1.9164, -0.0124, 0.7082], - [2.0417, -0.0307, 0.7433], - [2.4182, 0.0274, 0.6245], - [2.8159, 0.0329, 0.6115], - [3.1854, 0.0105, 0.6743], - [3.5678, 0.0149, 0.6604], - [3.9434, 0.0091, 0.6811], - [4.3254, 0.0102, 0.6766], - [4.7002, 0.0059, 0.6955], - [5.0629, 0.0005, 0.7208], - [5.8469, 0.0097, 0.6743], - [7.3388, 0.002, 0.7191], - [8.877, 0.0038, 0.7059], - [10.4052, 0.0023, 0.7196], - [11.9158, 0.001, 0.7328], - [13.419, 0.0005, 0.7387], - [14.9352, 0.0008, 0.7344], - [16.4603, 0.0009, 0.7327], - [17.9666, 0.0003, 0.7437], - [19.5173, 0.0013, 0.7248], - [21.0316, 0.0003, 0.7447] - ] - }, - "defaultTipOverlapDictionary": { - "opentrons/opentrons_96_tiprack_20ul/1": 8.25, - "opentrons/opentrons_96_filtertiprack_20ul/1": 8.25 + "default": { + "1": [ + [0.873, -0.0339, 0.6276], + [1.0274, 0.1203, 0.5185], + [1.1795, 0.0863, 0.5535], + [1.3179, 0.0267, 0.6238], + [1.4539, 0.0141, 0.6404], + [1.6193, 0.0836, 0.5394], + [1.7838, 0.0691, 0.5628], + [1.9164, -0.0124, 0.7082], + [2.0417, -0.0307, 0.7433], + [2.4182, 0.0274, 0.6245], + [2.8159, 0.0329, 0.6115], + [3.1854, 0.0105, 0.6743], + [3.5678, 0.0149, 0.6604], + [3.9434, 0.0091, 0.6811], + [4.3254, 0.0102, 0.6766], + [4.7002, 0.0059, 0.6955], + [5.0629, 0.0005, 0.7208], + [5.8469, 0.0097, 0.6743], + [7.3388, 0.002, 0.7191], + [8.877, 0.0038, 0.7059], + [10.4052, 0.0023, 0.7196], + [11.9158, 0.001, 0.7328], + [13.419, 0.0005, 0.7387], + [14.9352, 0.0008, 0.7344], + [16.4603, 0.0009, 0.7327], + [17.9666, 0.0003, 0.7437], + [19.5173, 0.0013, 0.7248], + [21.0316, 0.0003, 0.7447] + ] + } }, "defaultBlowoutVolume": 3.534 }, "t10": { - "defaultAspirateFlowRate": 7.6, - "defaultDispenseFlowRate": 7.6, - "defaultBlowOutFlowRate": 7.6, + "defaultAspirateFlowRate": { + "default": 7.6, + "valuesByApiLevel": { + "2.0": 7.6 + } + }, + "defaultDispenseFlowRate": { + "default": 7.6, + "valuesByApiLevel": { + "2.0": 7.6 + } + }, + "defaultBlowOutFlowRate": { + "default": 7.6, + "valuesByApiLevel": { + "2.0": 7.6 + } + }, "defaultTipLength": 31.1, - "defaultTipOverlap": 8.25, - "defaultReturnTipHeight": null, "aspirate": { - "opentrons/opentrons_96_tiprack_10ul/1": [ - [0.873, -0.0339, 0.6276], - [1.0274, 0.1203, 0.5185], - [1.1795, 0.0863, 0.5535], - [1.3179, 0.0267, 0.6238], - [1.4539, 0.0141, 0.6404], - [1.6193, 0.0836, 0.5394], - [1.7838, 0.0691, 0.5628], - [1.9164, -0.0124, 0.7082], - [2.0417, -0.0307, 0.7433], - [2.4182, 0.0274, 0.6245], - [2.8159, 0.0329, 0.6115], - [3.1854, 0.0105, 0.6743], - [3.5678, 0.0149, 0.6604], - [3.9434, 0.0091, 0.6811], - [4.3254, 0.0102, 0.6766], - [4.7002, 0.0059, 0.6955], - [5.0629, 0.0005, 0.7208], - [5.8469, 0.0097, 0.6743], - [7.3388, 0.002, 0.7191], - [8.877, 0.0038, 0.7059], - [10.4052, 0.0023, 0.7196], - [11.9158, 0.001, 0.7328], - [13.419, 0.0005, 0.7387], - [14.9352, 0.0008, 0.7344], - [16.4603, 0.0009, 0.7327], - [17.9666, 0.0003, 0.7437], - [19.5173, 0.0013, 0.7248], - [21.0316, 0.0003, 0.7447] - ], - "opentrons/opentrons_96_filtertiprack_10ul/1": [ - [0.873, -0.0339, 0.6276], - [1.0274, 0.1203, 0.5185], - [1.1795, 0.0863, 0.5535], - [1.3179, 0.0267, 0.6238], - [1.4539, 0.0141, 0.6404], - [1.6193, 0.0836, 0.5394], - [1.7838, 0.0691, 0.5628], - [1.9164, -0.0124, 0.7082], - [2.0417, -0.0307, 0.7433], - [2.4182, 0.0274, 0.6245], - [2.8159, 0.0329, 0.6115], - [3.1854, 0.0105, 0.6743], - [3.5678, 0.0149, 0.6604], - [3.9434, 0.0091, 0.6811], - [4.3254, 0.0102, 0.6766], - [4.7002, 0.0059, 0.6955], - [5.0629, 0.0005, 0.7208], - [5.8469, 0.0097, 0.6743], - [7.3388, 0.002, 0.7191], - [8.877, 0.0038, 0.7059], - [10.4052, 0.0023, 0.7196], - [11.9158, 0.001, 0.7328], - [13.419, 0.0005, 0.7387], - [14.9352, 0.0008, 0.7344], - [16.4603, 0.0009, 0.7327], - [17.9666, 0.0003, 0.7437], - [19.5173, 0.0013, 0.7248], - [21.0316, 0.0003, 0.7447] - ], - "opentrons/eppendorf_96_tiprack_10ul_eptips/1": [ - [0.873, -0.0339, 0.6276], - [1.0274, 0.1203, 0.5185], - [1.1795, 0.0863, 0.5535], - [1.3179, 0.0267, 0.6238], - [1.4539, 0.0141, 0.6404], - [1.6193, 0.0836, 0.5394], - [1.7838, 0.0691, 0.5628], - [1.9164, -0.0124, 0.7082], - [2.0417, -0.0307, 0.7433], - [2.4182, 0.0274, 0.6245], - [2.8159, 0.0329, 0.6115], - [3.1854, 0.0105, 0.6743], - [3.5678, 0.0149, 0.6604], - [3.9434, 0.0091, 0.6811], - [4.3254, 0.0102, 0.6766], - [4.7002, 0.0059, 0.6955], - [5.0629, 0.0005, 0.7208], - [5.8469, 0.0097, 0.6743], - [7.3388, 0.002, 0.7191], - [8.877, 0.0038, 0.7059], - [10.4052, 0.0023, 0.7196], - [11.9158, 0.001, 0.7328], - [13.419, 0.0005, 0.7387], - [14.9352, 0.0008, 0.7344], - [16.4603, 0.0009, 0.7327], - [17.9666, 0.0003, 0.7437], - [19.5173, 0.0013, 0.7248], - [21.0316, 0.0003, 0.7447] - ], - "opentrons/geb_96_tiprack_10ul/1": [ - [0.873, -0.0339, 0.6276], - [1.0274, 0.1203, 0.5185], - [1.1795, 0.0863, 0.5535], - [1.3179, 0.0267, 0.6238], - [1.4539, 0.0141, 0.6404], - [1.6193, 0.0836, 0.5394], - [1.7838, 0.0691, 0.5628], - [1.9164, -0.0124, 0.7082], - [2.0417, -0.0307, 0.7433], - [2.4182, 0.0274, 0.6245], - [2.8159, 0.0329, 0.6115], - [3.1854, 0.0105, 0.6743], - [3.5678, 0.0149, 0.6604], - [3.9434, 0.0091, 0.6811], - [4.3254, 0.0102, 0.6766], - [4.7002, 0.0059, 0.6955], - [5.0629, 0.0005, 0.7208], - [5.8469, 0.0097, 0.6743], - [7.3388, 0.002, 0.7191], - [8.877, 0.0038, 0.7059], - [10.4052, 0.0023, 0.7196], - [11.9158, 0.001, 0.7328], - [13.419, 0.0005, 0.7387], - [14.9352, 0.0008, 0.7344], - [16.4603, 0.0009, 0.7327], - [17.9666, 0.0003, 0.7437], - [19.5173, 0.0013, 0.7248], - [21.0316, 0.0003, 0.7447] - ], - "default": [ - [0.873, -0.0339, 0.6276], - [1.0274, 0.1203, 0.5185], - [1.1795, 0.0863, 0.5535], - [1.3179, 0.0267, 0.6238], - [1.4539, 0.0141, 0.6404], - [1.6193, 0.0836, 0.5394], - [1.7838, 0.0691, 0.5628], - [1.9164, -0.0124, 0.7082], - [2.0417, -0.0307, 0.7433], - [2.4182, 0.0274, 0.6245], - [2.8159, 0.0329, 0.6115], - [3.1854, 0.0105, 0.6743], - [3.5678, 0.0149, 0.6604], - [3.9434, 0.0091, 0.6811], - [4.3254, 0.0102, 0.6766], - [4.7002, 0.0059, 0.6955], - [5.0629, 0.0005, 0.7208], - [5.8469, 0.0097, 0.6743], - [7.3388, 0.002, 0.7191], - [8.877, 0.0038, 0.7059], - [10.4052, 0.0023, 0.7196], - [11.9158, 0.001, 0.7328], - [13.419, 0.0005, 0.7387], - [14.9352, 0.0008, 0.7344], - [16.4603, 0.0009, 0.7327], - [17.9666, 0.0003, 0.7437], - [19.5173, 0.0013, 0.7248], - [21.0316, 0.0003, 0.7447] - ] + "default": { + "1": [ + [0.873, -0.0339, 0.6276], + [1.0274, 0.1203, 0.5185], + [1.1795, 0.0863, 0.5535], + [1.3179, 0.0267, 0.6238], + [1.4539, 0.0141, 0.6404], + [1.6193, 0.0836, 0.5394], + [1.7838, 0.0691, 0.5628], + [1.9164, -0.0124, 0.7082], + [2.0417, -0.0307, 0.7433], + [2.4182, 0.0274, 0.6245], + [2.8159, 0.0329, 0.6115], + [3.1854, 0.0105, 0.6743], + [3.5678, 0.0149, 0.6604], + [3.9434, 0.0091, 0.6811], + [4.3254, 0.0102, 0.6766], + [4.7002, 0.0059, 0.6955], + [5.0629, 0.0005, 0.7208], + [5.8469, 0.0097, 0.6743], + [7.3388, 0.002, 0.7191], + [8.877, 0.0038, 0.7059], + [10.4052, 0.0023, 0.7196], + [11.9158, 0.001, 0.7328], + [13.419, 0.0005, 0.7387], + [14.9352, 0.0008, 0.7344], + [16.4603, 0.0009, 0.7327], + [17.9666, 0.0003, 0.7437], + [19.5173, 0.0013, 0.7248], + [21.0316, 0.0003, 0.7447] + ] + } }, "dispense": { - "opentrons/opentrons_96_tiprack_10ul/1": [ - [0.873, -0.0339, 0.6276], - [1.0274, 0.1203, 0.5185], - [1.1795, 0.0863, 0.5535], - [1.3179, 0.0267, 0.6238], - [1.4539, 0.0141, 0.6404], - [1.6193, 0.0836, 0.5394], - [1.7838, 0.0691, 0.5628], - [1.9164, -0.0124, 0.7082], - [2.0417, -0.0307, 0.7433], - [2.4182, 0.0274, 0.6245], - [2.8159, 0.0329, 0.6115], - [3.1854, 0.0105, 0.6743], - [3.5678, 0.0149, 0.6604], - [3.9434, 0.0091, 0.6811], - [4.3254, 0.0102, 0.6766], - [4.7002, 0.0059, 0.6955], - [5.0629, 0.0005, 0.7208], - [5.8469, 0.0097, 0.6743], - [7.3388, 0.002, 0.7191], - [8.877, 0.0038, 0.7059], - [10.4052, 0.0023, 0.7196], - [11.9158, 0.001, 0.7328], - [13.419, 0.0005, 0.7387], - [14.9352, 0.0008, 0.7344], - [16.4603, 0.0009, 0.7327], - [17.9666, 0.0003, 0.7437], - [19.5173, 0.0013, 0.7248], - [21.0316, 0.0003, 0.7447] - ], - "opentrons/opentrons_96_filtertiprack_10ul/1": [ - [0.873, -0.0339, 0.6276], - [1.0274, 0.1203, 0.5185], - [1.1795, 0.0863, 0.5535], - [1.3179, 0.0267, 0.6238], - [1.4539, 0.0141, 0.6404], - [1.6193, 0.0836, 0.5394], - [1.7838, 0.0691, 0.5628], - [1.9164, -0.0124, 0.7082], - [2.0417, -0.0307, 0.7433], - [2.4182, 0.0274, 0.6245], - [2.8159, 0.0329, 0.6115], - [3.1854, 0.0105, 0.6743], - [3.5678, 0.0149, 0.6604], - [3.9434, 0.0091, 0.6811], - [4.3254, 0.0102, 0.6766], - [4.7002, 0.0059, 0.6955], - [5.0629, 0.0005, 0.7208], - [5.8469, 0.0097, 0.6743], - [7.3388, 0.002, 0.7191], - [8.877, 0.0038, 0.7059], - [10.4052, 0.0023, 0.7196], - [11.9158, 0.001, 0.7328], - [13.419, 0.0005, 0.7387], - [14.9352, 0.0008, 0.7344], - [16.4603, 0.0009, 0.7327], - [17.9666, 0.0003, 0.7437], - [19.5173, 0.0013, 0.7248], - [21.0316, 0.0003, 0.7447] - ], - "opentrons/eppendorf_96_tiprack_10ul_eptips/1": [ - [0.873, -0.0339, 0.6276], - [1.0274, 0.1203, 0.5185], - [1.1795, 0.0863, 0.5535], - [1.3179, 0.0267, 0.6238], - [1.4539, 0.0141, 0.6404], - [1.6193, 0.0836, 0.5394], - [1.7838, 0.0691, 0.5628], - [1.9164, -0.0124, 0.7082], - [2.0417, -0.0307, 0.7433], - [2.4182, 0.0274, 0.6245], - [2.8159, 0.0329, 0.6115], - [3.1854, 0.0105, 0.6743], - [3.5678, 0.0149, 0.6604], - [3.9434, 0.0091, 0.6811], - [4.3254, 0.0102, 0.6766], - [4.7002, 0.0059, 0.6955], - [5.0629, 0.0005, 0.7208], - [5.8469, 0.0097, 0.6743], - [7.3388, 0.002, 0.7191], - [8.877, 0.0038, 0.7059], - [10.4052, 0.0023, 0.7196], - [11.9158, 0.001, 0.7328], - [13.419, 0.0005, 0.7387], - [14.9352, 0.0008, 0.7344], - [16.4603, 0.0009, 0.7327], - [17.9666, 0.0003, 0.7437], - [19.5173, 0.0013, 0.7248], - [21.0316, 0.0003, 0.7447] - ], - "opentrons/geb_96_tiprack_10ul/1": [ - [0.873, -0.0339, 0.6276], - [1.0274, 0.1203, 0.5185], - [1.1795, 0.0863, 0.5535], - [1.3179, 0.0267, 0.6238], - [1.4539, 0.0141, 0.6404], - [1.6193, 0.0836, 0.5394], - [1.7838, 0.0691, 0.5628], - [1.9164, -0.0124, 0.7082], - [2.0417, -0.0307, 0.7433], - [2.4182, 0.0274, 0.6245], - [2.8159, 0.0329, 0.6115], - [3.1854, 0.0105, 0.6743], - [3.5678, 0.0149, 0.6604], - [3.9434, 0.0091, 0.6811], - [4.3254, 0.0102, 0.6766], - [4.7002, 0.0059, 0.6955], - [5.0629, 0.0005, 0.7208], - [5.8469, 0.0097, 0.6743], - [7.3388, 0.002, 0.7191], - [8.877, 0.0038, 0.7059], - [10.4052, 0.0023, 0.7196], - [11.9158, 0.001, 0.7328], - [13.419, 0.0005, 0.7387], - [14.9352, 0.0008, 0.7344], - [16.4603, 0.0009, 0.7327], - [17.9666, 0.0003, 0.7437], - [19.5173, 0.0013, 0.7248], - [21.0316, 0.0003, 0.7447] - ], - "default": [ - [0.873, -0.0339, 0.6276], - [1.0274, 0.1203, 0.5185], - [1.1795, 0.0863, 0.5535], - [1.3179, 0.0267, 0.6238], - [1.4539, 0.0141, 0.6404], - [1.6193, 0.0836, 0.5394], - [1.7838, 0.0691, 0.5628], - [1.9164, -0.0124, 0.7082], - [2.0417, -0.0307, 0.7433], - [2.4182, 0.0274, 0.6245], - [2.8159, 0.0329, 0.6115], - [3.1854, 0.0105, 0.6743], - [3.5678, 0.0149, 0.6604], - [3.9434, 0.0091, 0.6811], - [4.3254, 0.0102, 0.6766], - [4.7002, 0.0059, 0.6955], - [5.0629, 0.0005, 0.7208], - [5.8469, 0.0097, 0.6743], - [7.3388, 0.002, 0.7191], - [8.877, 0.0038, 0.7059], - [10.4052, 0.0023, 0.7196], - [11.9158, 0.001, 0.7328], - [13.419, 0.0005, 0.7387], - [14.9352, 0.0008, 0.7344], - [16.4603, 0.0009, 0.7327], - [17.9666, 0.0003, 0.7437], - [19.5173, 0.0013, 0.7248], - [21.0316, 0.0003, 0.7447] - ] - }, - "defaultTipOverlapDictionary": { - "opentrons/opentrons_96_tiprack_10ul/1": 8.25, - "opentrons/opentrons_96_filtertiprack_10ul/1": 8.25, - "opentrons/eppendorf_96_tiprack_10ul_eptips/1": 8.4, - "opentrons/geb_96_tiprack_10ul/1": 8.3 + "default": { + "1": [ + [0.873, -0.0339, 0.6276], + [1.0274, 0.1203, 0.5185], + [1.1795, 0.0863, 0.5535], + [1.3179, 0.0267, 0.6238], + [1.4539, 0.0141, 0.6404], + [1.6193, 0.0836, 0.5394], + [1.7838, 0.0691, 0.5628], + [1.9164, -0.0124, 0.7082], + [2.0417, -0.0307, 0.7433], + [2.4182, 0.0274, 0.6245], + [2.8159, 0.0329, 0.6115], + [3.1854, 0.0105, 0.6743], + [3.5678, 0.0149, 0.6604], + [3.9434, 0.0091, 0.6811], + [4.3254, 0.0102, 0.6766], + [4.7002, 0.0059, 0.6955], + [5.0629, 0.0005, 0.7208], + [5.8469, 0.0097, 0.6743], + [7.3388, 0.002, 0.7191], + [8.877, 0.0038, 0.7059], + [10.4052, 0.0023, 0.7196], + [11.9158, 0.001, 0.7328], + [13.419, 0.0005, 0.7387], + [14.9352, 0.0008, 0.7344], + [16.4603, 0.0009, 0.7327], + [17.9666, 0.0003, 0.7437], + [19.5173, 0.0013, 0.7248], + [21.0316, 0.0003, 0.7447] + ] + } }, "defaultBlowoutVolume": 3.534 } }, + "defaultTipOverlapDictionary": { + "default": 8.25, + "opentrons/opentrons_96_tiprack_10ul/1": 8.25, + "opentrons/opentrons_96_filtertiprack_10ul/1": 8.25, + "opentrons/eppendorf_96_tiprack_10ul_eptips/1": 8.4, + "opentrons/geb_96_tiprack_10ul/1": 8.3, + "opentrons/opentrons_96_tiprack_20ul/1": 8.25, + "opentrons/opentrons_96_filtertiprack_20ul/1": 8.25 + }, "maxVolume": 20, "minVolume": 1.0, "defaultTipracks": [ diff --git a/shared-data/pipette/definitions/2/liquid/eight_channel/p300/1_0.json b/shared-data/pipette/definitions/2/liquid/eight_channel/p300/1_0.json index 2e22e604131..34673f4a80a 100644 --- a/shared-data/pipette/definitions/2/liquid/eight_channel/p300/1_0.json +++ b/shared-data/pipette/definitions/2/liquid/eight_channel/p300/1_0.json @@ -2,65 +2,70 @@ "$otSharedSchema": "#/pipette/schemas/2/pipetteLiquidPropertiesSchema.json", "supportedTips": { "t200": { - "defaultAspirateFlowRate": 150.0, - "defaultDispenseFlowRate": 300.0, - "defaultBlowOutFlowRate": 1000.0, + "defaultAspirateFlowRate": { + "default": 150, + "valuesByApiLevel": { "2.0": 150 } + }, + "defaultDispenseFlowRate": { + "default": 300, + "valuesByApiLevel": { "2.0": 300 } + }, + "defaultBlowOutFlowRate": { + "default": 1000, + "valuesByApiLevel": { "2.0": 1000 } + }, "defaultTipLength": 51.7, - "defaultTipOverlap": 7.47, - "defaultReturnTipHeight": null, "aspirate": { - "opentrons/tipone_96_tiprack_200ul/1": [ - [57.25698968, 0.017, 18.132], - [309.2612689, 0.001, 19.03] - ], - "opentrons/opentrons_96_filtertiprack_200ul/1": [ - [57.25698968, 0.017, 18.132], - [309.2612689, 0.001, 19.03] - ], - "default": [ - [57.25698968, 0.017, 18.132], - [309.2612689, 0.001, 19.03] - ] + "default": { + "1": [ + [57.25698968, 0.017, 18.132], + [309.2612689, 0.001, 19.03] + ] + } }, "dispense": { - "opentrons/tipone_96_tiprack_200ul/1": [ - [309.2612689, 0.0, 19.29389273] - ], - "opentrons/opentrons_96_filtertiprack_200ul/1": [ - [309.2612689, 0.0, 19.29389273] - ], - "default": [[309.2612689, 0.0, 19.29389273]] - }, - "defaultTipOverlapDictionary": { - "opentrons/tipone_96_tiprack_200ul/1": 6.1, - "opentrons/opentrons_96_filtertiprack_200ul/1": 7.47 + "default": { + "1": [[309.2612689, 0.0, 19.29389273]] + } }, "defaultBlowoutVolume": 39.27 }, "t300": { - "defaultAspirateFlowRate": 150.0, - "defaultDispenseFlowRate": 300.0, - "defaultBlowOutFlowRate": 1000.0, + "defaultAspirateFlowRate": { + "default": 150, + "valuesByApiLevel": { "2.0": 150 } + }, + "defaultDispenseFlowRate": { + "default": 300, + "valuesByApiLevel": { "2.0": 300 } + }, + "defaultBlowOutFlowRate": { + "default": 1000, + "valuesByApiLevel": { "2.0": 1000 } + }, "defaultTipLength": 51.7, - "defaultTipOverlap": 7.47, - "defaultReturnTipHeight": null, "aspirate": { - "opentrons/opentrons_96_tiprack_300ul/1": [ - [57.25698968, 0.017, 18.132], - [309.2612689, 0.001, 19.03] - ] + "default": { + "1": [ + [57.25698968, 0.017, 18.132], + [309.2612689, 0.001, 19.03] + ] + } }, "dispense": { - "opentrons/opentrons_96_tiprack_300ul/1": [ - [309.2612689, 0.0, 19.29389273] - ] - }, - "defaultTipOverlapDictionary": { - "opentrons/opentrons_96_tiprack_300ul/1": 7.47 + "default": { + "1": [[309.2612689, 0.0, 19.29389273]] + } }, "defaultBlowoutVolume": 39.27 } }, + "defaultTipOverlapDictionary": { + "default": 7.47, + "opentrons/tipone_96_tiprack_200ul/1": 6.1, + "opentrons/opentrons_96_filtertiprack_200ul/1": 7.47, + "opentrons/opentrons_96_tiprack_300ul/1": 7.47 + }, "maxVolume": 300, "minVolume": 30.0, "defaultTipracks": [ diff --git a/shared-data/pipette/definitions/2/liquid/eight_channel/p300/1_3.json b/shared-data/pipette/definitions/2/liquid/eight_channel/p300/1_3.json index e9bd8d2b26e..eccaa851eb2 100644 --- a/shared-data/pipette/definitions/2/liquid/eight_channel/p300/1_3.json +++ b/shared-data/pipette/definitions/2/liquid/eight_channel/p300/1_3.json @@ -2,70 +2,70 @@ "$otSharedSchema": "#/pipette/schemas/2/pipetteLiquidPropertiesSchema.json", "supportedTips": { "t200": { - "defaultAspirateFlowRate": 150.0, - "defaultDispenseFlowRate": 300.0, - "defaultBlowOutFlowRate": 1000.0, + "defaultAspirateFlowRate": { + "default": 150, + "valuesByApiLevel": { "2.0": 150 } + }, + "defaultDispenseFlowRate": { + "default": 300, + "valuesByApiLevel": { "2.0": 300 } + }, + "defaultBlowOutFlowRate": { + "default": 1000, + "valuesByApiLevel": { "2.0": 1000 } + }, "defaultTipLength": 51.7, - "defaultTipOverlap": 7.47, - "defaultReturnTipHeight": null, "aspirate": { - "opentrons/tipone_96_tiprack_200ul/1": [ - [57.25698968, 0.017, 18.132], - [309.2612689, 0.001, 19.03] - ], - "opentrons/opentrons_96_filtertiprack_200ul/1": [ - [57.25698968, 0.017, 18.132], - [309.2612689, 0.001, 19.03] - ], - "default": [ - [57.25698968, 0.017, 18.132], - [309.2612689, 0.001, 19.03] - ] + "default": { + "1": [ + [57.25698968, 0.017, 18.132], + [309.2612689, 0.001, 19.03] + ] + } }, "dispense": { - "opentrons/tipone_96_tiprack_200ul/1": [ - [309.2612689, 0.0, 19.29389273] - ], - "opentrons/opentrons_96_filtertiprack_200ul/1": [ - [309.2612689, 0.0, 19.29389273] - ], - "default": [[309.2612689, 0.0, 19.29389273]] - }, - "defaultTipOverlapDictionary": { - "opentrons/tipone_96_tiprack_200ul/1": 6.1, - "opentrons/opentrons_96_filtertiprack_200ul/1": 7.47 + "default": { + "1": [[309.2612689, 0.0, 19.29389273]] + } }, "defaultBlowoutVolume": 39.27 }, "t300": { - "defaultAspirateFlowRate": 150.0, - "defaultDispenseFlowRate": 300.0, - "defaultBlowOutFlowRate": 1000.0, + "defaultAspirateFlowRate": { + "default": 150, + "valuesByApiLevel": { "2.0": 150 } + }, + "defaultDispenseFlowRate": { + "default": 300, + "valuesByApiLevel": { "2.0": 300 } + }, + "defaultBlowOutFlowRate": { + "default": 1000, + "valuesByApiLevel": { "2.0": 1000 } + }, "defaultTipLength": 51.7, - "defaultTipOverlap": 7.47, - "defaultReturnTipHeight": null, "aspirate": { - "opentrons/opentrons_96_tiprack_300ul/1": [ - [57.25698968, 0.017, 18.132], - [309.2612689, 0.001, 19.03] - ], - "default": [ - [57.25698968, 0.017, 18.132], - [309.2612689, 0.001, 19.03] - ] + "default": { + "1": [ + [57.25698968, 0.017, 18.132], + [309.2612689, 0.001, 19.03] + ] + } }, "dispense": { - "opentrons/opentrons_96_tiprack_300ul/1": [ - [309.2612689, 0.0, 19.29389273] - ], - "default": [[309.2612689, 0.0, 19.29389273]] - }, - "defaultTipOverlapDictionary": { - "opentrons/opentrons_96_tiprack_300ul/1": 7.47 + "default": { + "1": [[309.2612689, 0.0, 19.29389273]] + } }, "defaultBlowoutVolume": 39.27 } }, + "defaultTipOverlapDictionary": { + "default": 7.47, + "opentrons/opentrons_96_tiprack_300ul/1": 7.47, + "opentrons/tipone_96_tiprack_200ul/1": 6.1, + "opentrons/opentrons_96_filtertiprack_200ul/1": 7.47 + }, "maxVolume": 300, "minVolume": 30.0, "defaultTipracks": [ diff --git a/shared-data/pipette/definitions/2/liquid/eight_channel/p300/1_4.json b/shared-data/pipette/definitions/2/liquid/eight_channel/p300/1_4.json index e9bd8d2b26e..34673f4a80a 100644 --- a/shared-data/pipette/definitions/2/liquid/eight_channel/p300/1_4.json +++ b/shared-data/pipette/definitions/2/liquid/eight_channel/p300/1_4.json @@ -2,70 +2,70 @@ "$otSharedSchema": "#/pipette/schemas/2/pipetteLiquidPropertiesSchema.json", "supportedTips": { "t200": { - "defaultAspirateFlowRate": 150.0, - "defaultDispenseFlowRate": 300.0, - "defaultBlowOutFlowRate": 1000.0, + "defaultAspirateFlowRate": { + "default": 150, + "valuesByApiLevel": { "2.0": 150 } + }, + "defaultDispenseFlowRate": { + "default": 300, + "valuesByApiLevel": { "2.0": 300 } + }, + "defaultBlowOutFlowRate": { + "default": 1000, + "valuesByApiLevel": { "2.0": 1000 } + }, "defaultTipLength": 51.7, - "defaultTipOverlap": 7.47, - "defaultReturnTipHeight": null, "aspirate": { - "opentrons/tipone_96_tiprack_200ul/1": [ - [57.25698968, 0.017, 18.132], - [309.2612689, 0.001, 19.03] - ], - "opentrons/opentrons_96_filtertiprack_200ul/1": [ - [57.25698968, 0.017, 18.132], - [309.2612689, 0.001, 19.03] - ], - "default": [ - [57.25698968, 0.017, 18.132], - [309.2612689, 0.001, 19.03] - ] + "default": { + "1": [ + [57.25698968, 0.017, 18.132], + [309.2612689, 0.001, 19.03] + ] + } }, "dispense": { - "opentrons/tipone_96_tiprack_200ul/1": [ - [309.2612689, 0.0, 19.29389273] - ], - "opentrons/opentrons_96_filtertiprack_200ul/1": [ - [309.2612689, 0.0, 19.29389273] - ], - "default": [[309.2612689, 0.0, 19.29389273]] - }, - "defaultTipOverlapDictionary": { - "opentrons/tipone_96_tiprack_200ul/1": 6.1, - "opentrons/opentrons_96_filtertiprack_200ul/1": 7.47 + "default": { + "1": [[309.2612689, 0.0, 19.29389273]] + } }, "defaultBlowoutVolume": 39.27 }, "t300": { - "defaultAspirateFlowRate": 150.0, - "defaultDispenseFlowRate": 300.0, - "defaultBlowOutFlowRate": 1000.0, + "defaultAspirateFlowRate": { + "default": 150, + "valuesByApiLevel": { "2.0": 150 } + }, + "defaultDispenseFlowRate": { + "default": 300, + "valuesByApiLevel": { "2.0": 300 } + }, + "defaultBlowOutFlowRate": { + "default": 1000, + "valuesByApiLevel": { "2.0": 1000 } + }, "defaultTipLength": 51.7, - "defaultTipOverlap": 7.47, - "defaultReturnTipHeight": null, "aspirate": { - "opentrons/opentrons_96_tiprack_300ul/1": [ - [57.25698968, 0.017, 18.132], - [309.2612689, 0.001, 19.03] - ], - "default": [ - [57.25698968, 0.017, 18.132], - [309.2612689, 0.001, 19.03] - ] + "default": { + "1": [ + [57.25698968, 0.017, 18.132], + [309.2612689, 0.001, 19.03] + ] + } }, "dispense": { - "opentrons/opentrons_96_tiprack_300ul/1": [ - [309.2612689, 0.0, 19.29389273] - ], - "default": [[309.2612689, 0.0, 19.29389273]] - }, - "defaultTipOverlapDictionary": { - "opentrons/opentrons_96_tiprack_300ul/1": 7.47 + "default": { + "1": [[309.2612689, 0.0, 19.29389273]] + } }, "defaultBlowoutVolume": 39.27 } }, + "defaultTipOverlapDictionary": { + "default": 7.47, + "opentrons/tipone_96_tiprack_200ul/1": 6.1, + "opentrons/opentrons_96_filtertiprack_200ul/1": 7.47, + "opentrons/opentrons_96_tiprack_300ul/1": 7.47 + }, "maxVolume": 300, "minVolume": 30.0, "defaultTipracks": [ diff --git a/shared-data/pipette/definitions/2/liquid/eight_channel/p300/1_5.json b/shared-data/pipette/definitions/2/liquid/eight_channel/p300/1_5.json index e9bd8d2b26e..eccaa851eb2 100644 --- a/shared-data/pipette/definitions/2/liquid/eight_channel/p300/1_5.json +++ b/shared-data/pipette/definitions/2/liquid/eight_channel/p300/1_5.json @@ -2,70 +2,70 @@ "$otSharedSchema": "#/pipette/schemas/2/pipetteLiquidPropertiesSchema.json", "supportedTips": { "t200": { - "defaultAspirateFlowRate": 150.0, - "defaultDispenseFlowRate": 300.0, - "defaultBlowOutFlowRate": 1000.0, + "defaultAspirateFlowRate": { + "default": 150, + "valuesByApiLevel": { "2.0": 150 } + }, + "defaultDispenseFlowRate": { + "default": 300, + "valuesByApiLevel": { "2.0": 300 } + }, + "defaultBlowOutFlowRate": { + "default": 1000, + "valuesByApiLevel": { "2.0": 1000 } + }, "defaultTipLength": 51.7, - "defaultTipOverlap": 7.47, - "defaultReturnTipHeight": null, "aspirate": { - "opentrons/tipone_96_tiprack_200ul/1": [ - [57.25698968, 0.017, 18.132], - [309.2612689, 0.001, 19.03] - ], - "opentrons/opentrons_96_filtertiprack_200ul/1": [ - [57.25698968, 0.017, 18.132], - [309.2612689, 0.001, 19.03] - ], - "default": [ - [57.25698968, 0.017, 18.132], - [309.2612689, 0.001, 19.03] - ] + "default": { + "1": [ + [57.25698968, 0.017, 18.132], + [309.2612689, 0.001, 19.03] + ] + } }, "dispense": { - "opentrons/tipone_96_tiprack_200ul/1": [ - [309.2612689, 0.0, 19.29389273] - ], - "opentrons/opentrons_96_filtertiprack_200ul/1": [ - [309.2612689, 0.0, 19.29389273] - ], - "default": [[309.2612689, 0.0, 19.29389273]] - }, - "defaultTipOverlapDictionary": { - "opentrons/tipone_96_tiprack_200ul/1": 6.1, - "opentrons/opentrons_96_filtertiprack_200ul/1": 7.47 + "default": { + "1": [[309.2612689, 0.0, 19.29389273]] + } }, "defaultBlowoutVolume": 39.27 }, "t300": { - "defaultAspirateFlowRate": 150.0, - "defaultDispenseFlowRate": 300.0, - "defaultBlowOutFlowRate": 1000.0, + "defaultAspirateFlowRate": { + "default": 150, + "valuesByApiLevel": { "2.0": 150 } + }, + "defaultDispenseFlowRate": { + "default": 300, + "valuesByApiLevel": { "2.0": 300 } + }, + "defaultBlowOutFlowRate": { + "default": 1000, + "valuesByApiLevel": { "2.0": 1000 } + }, "defaultTipLength": 51.7, - "defaultTipOverlap": 7.47, - "defaultReturnTipHeight": null, "aspirate": { - "opentrons/opentrons_96_tiprack_300ul/1": [ - [57.25698968, 0.017, 18.132], - [309.2612689, 0.001, 19.03] - ], - "default": [ - [57.25698968, 0.017, 18.132], - [309.2612689, 0.001, 19.03] - ] + "default": { + "1": [ + [57.25698968, 0.017, 18.132], + [309.2612689, 0.001, 19.03] + ] + } }, "dispense": { - "opentrons/opentrons_96_tiprack_300ul/1": [ - [309.2612689, 0.0, 19.29389273] - ], - "default": [[309.2612689, 0.0, 19.29389273]] - }, - "defaultTipOverlapDictionary": { - "opentrons/opentrons_96_tiprack_300ul/1": 7.47 + "default": { + "1": [[309.2612689, 0.0, 19.29389273]] + } }, "defaultBlowoutVolume": 39.27 } }, + "defaultTipOverlapDictionary": { + "default": 7.47, + "opentrons/opentrons_96_tiprack_300ul/1": 7.47, + "opentrons/tipone_96_tiprack_200ul/1": 6.1, + "opentrons/opentrons_96_filtertiprack_200ul/1": 7.47 + }, "maxVolume": 300, "minVolume": 30.0, "defaultTipracks": [ diff --git a/shared-data/pipette/definitions/2/liquid/eight_channel/p300/2_0.json b/shared-data/pipette/definitions/2/liquid/eight_channel/p300/2_0.json index 7005295bde5..13374cc484e 100644 --- a/shared-data/pipette/definitions/2/liquid/eight_channel/p300/2_0.json +++ b/shared-data/pipette/definitions/2/liquid/eight_channel/p300/2_0.json @@ -2,255 +2,197 @@ "$otSharedSchema": "#/pipette/schemas/2/pipetteLiquidPropertiesSchema.json", "supportedTips": { "t200": { - "defaultAspirateFlowRate": 94.0, - "defaultDispenseFlowRate": 94.0, - "defaultBlowOutFlowRate": 94.0, + "defaultAspirateFlowRate": { + "default": 94, + "valuesByApiLevel": { + "2.0": 94 + } + }, + "defaultDispenseFlowRate": { + "default": 94, + "valuesByApiLevel": { + "2.0": 94 + } + }, + "defaultBlowOutFlowRate": { + "default": 94, + "valuesByApiLevel": { + "2.0": 94 + } + }, "defaultTipLength": 51.0, - "defaultTipOverlap": 8.2, "defaultReturnTipHeight": 0.4, "aspirate": { - "opentrons/opentrons_96_filtertiprack_200ul/1": [ - [15.4931, 0.0268, 8.559], - [17.2964, 0.0227, 8.2555], - [26.4494, 0.0184, 8.3302], - [31.0328, 0.0109, 8.5278], - [35.6206, 0.0084, 8.6052], - [40.1967, 0.006, 8.6914], - [44.7911, 0.0056, 8.7084], - [54.0381, 0.0052, 8.7251], - [63.2183, 0.0027, 8.8601], - [72.5189, 0.0036, 8.8023], - [81.7883, 0.0025, 8.887], - [91.0614, 0.002, 8.924], - [100.335, 0.0016, 8.9566], - [109.6503, 0.0017, 8.9473], - [118.9447, 0.0013, 8.9951], - [128.2742, 0.0014, 8.9858], - [137.5514, 0.0008, 9.0566], - [146.9261, 0.0014, 8.9824], - [156.2103, 0.0006, 9.0886], - [165.6528, 0.0015, 8.9557], - [174.9731, 0.0007, 9.0932], - [184.3156, 0.0007, 9.0842], - [202.9883, 0.0006, 9.1076], - [221.64, 0.0004, 9.1369], - [240.2986, 0.0004, 9.1488], - [258.925, 0.0003, 9.1769], - [277.5545, 0.0002, 9.1849], - [296.3369, 0.0005, 9.123], - [301.0236, 0.0004, 9.1508] - ] + "default": { + "1": [ + [15.4931, 0.0268, 8.559], + [17.2964, 0.0227, 8.2555], + [26.4494, 0.0184, 8.3302], + [31.0328, 0.0109, 8.5278], + [35.6206, 0.0084, 8.6052], + [40.1967, 0.006, 8.6914], + [44.7911, 0.0056, 8.7084], + [54.0381, 0.0052, 8.7251], + [63.2183, 0.0027, 8.8601], + [72.5189, 0.0036, 8.8023], + [81.7883, 0.0025, 8.887], + [91.0614, 0.002, 8.924], + [100.335, 0.0016, 8.9566], + [109.6503, 0.0017, 8.9473], + [118.9447, 0.0013, 8.9951], + [128.2742, 0.0014, 8.9858], + [137.5514, 0.0008, 9.0566], + [146.9261, 0.0014, 8.9824], + [156.2103, 0.0006, 9.0886], + [165.6528, 0.0015, 8.9557], + [174.9731, 0.0007, 9.0932], + [184.3156, 0.0007, 9.0842], + [202.9883, 0.0006, 9.1076], + [221.64, 0.0004, 9.1369], + [240.2986, 0.0004, 9.1488], + [258.925, 0.0003, 9.1769], + [277.5545, 0.0002, 9.1849], + [296.3369, 0.0005, 9.123], + [301.0236, 0.0004, 9.1508] + ] + } }, "dispense": { - "opentrons/opentrons_96_filtertiprack_200ul/1": [ - [15.4931, 0.0268, 8.559], - [17.2964, 0.0227, 8.2555], - [26.4494, 0.0184, 8.3302], - [31.0328, 0.0109, 8.5278], - [35.6206, 0.0084, 8.6052], - [40.1967, 0.006, 8.6914], - [44.7911, 0.0056, 8.7084], - [54.0381, 0.0052, 8.7251], - [63.2183, 0.0027, 8.8601], - [72.5189, 0.0036, 8.8023], - [81.7883, 0.0025, 8.887], - [91.0614, 0.002, 8.924], - [100.335, 0.0016, 8.9566], - [109.6503, 0.0017, 8.9473], - [118.9447, 0.0013, 8.9951], - [128.2742, 0.0014, 8.9858], - [137.5514, 0.0008, 9.0566], - [146.9261, 0.0014, 8.9824], - [156.2103, 0.0006, 9.0886], - [165.6528, 0.0015, 8.9557], - [174.9731, 0.0007, 9.0932], - [184.3156, 0.0007, 9.0842], - [202.9883, 0.0006, 9.1076], - [221.64, 0.0004, 9.1369], - [240.2986, 0.0004, 9.1488], - [258.925, 0.0003, 9.1769], - [277.5545, 0.0002, 9.1849], - [296.3369, 0.0005, 9.123], - [301.0236, 0.0004, 9.1508] - ], - "default": [ - [15.4931, 0.0268, 8.559], - [17.2964, 0.0227, 8.2555], - [26.4494, 0.0184, 8.3302], - [31.0328, 0.0109, 8.5278], - [35.6206, 0.0084, 8.6052], - [40.1967, 0.006, 8.6914], - [44.7911, 0.0056, 8.7084], - [54.0381, 0.0052, 8.7251], - [63.2183, 0.0027, 8.8601], - [72.5189, 0.0036, 8.8023], - [81.7883, 0.0025, 8.887], - [91.0614, 0.002, 8.924], - [100.335, 0.0016, 8.9566], - [109.6503, 0.0017, 8.9473], - [118.9447, 0.0013, 8.9951], - [128.2742, 0.0014, 8.9858], - [137.5514, 0.0008, 9.0566], - [146.9261, 0.0014, 8.9824], - [156.2103, 0.0006, 9.0886], - [165.6528, 0.0015, 8.9557], - [174.9731, 0.0007, 9.0932], - [184.3156, 0.0007, 9.0842], - [202.9883, 0.0006, 9.1076], - [221.64, 0.0004, 9.1369], - [240.2986, 0.0004, 9.1488], - [258.925, 0.0003, 9.1769], - [277.5545, 0.0002, 9.1849], - [296.3369, 0.0005, 9.123], - [301.0236, 0.0004, 9.1508] - ] - }, - "defaultTipOverlapDictionary": { - "opentrons/opentrons_96_filtertiprack_200ul/1": 8.2 + "default": { + "1": [ + [15.4931, 0.0268, 8.559], + [17.2964, 0.0227, 8.2555], + [26.4494, 0.0184, 8.3302], + [31.0328, 0.0109, 8.5278], + [35.6206, 0.0084, 8.6052], + [40.1967, 0.006, 8.6914], + [44.7911, 0.0056, 8.7084], + [54.0381, 0.0052, 8.7251], + [63.2183, 0.0027, 8.8601], + [72.5189, 0.0036, 8.8023], + [81.7883, 0.0025, 8.887], + [91.0614, 0.002, 8.924], + [100.335, 0.0016, 8.9566], + [109.6503, 0.0017, 8.9473], + [118.9447, 0.0013, 8.9951], + [128.2742, 0.0014, 8.9858], + [137.5514, 0.0008, 9.0566], + [146.9261, 0.0014, 8.9824], + [156.2103, 0.0006, 9.0886], + [165.6528, 0.0015, 8.9557], + [174.9731, 0.0007, 9.0932], + [184.3156, 0.0007, 9.0842], + [202.9883, 0.0006, 9.1076], + [221.64, 0.0004, 9.1369], + [240.2986, 0.0004, 9.1488], + [258.925, 0.0003, 9.1769], + [277.5545, 0.0002, 9.1849], + [296.3369, 0.0005, 9.123], + [301.0236, 0.0004, 9.1508] + ] + } }, "defaultBlowoutVolume": 43.295 }, "t300": { - "defaultAspirateFlowRate": 94.0, - "defaultDispenseFlowRate": 94.0, - "defaultBlowOutFlowRate": 94.0, + "defaultAspirateFlowRate": { + "default": 94, + "valuesByApiLevel": { + "2.0": 94 + } + }, + "defaultDispenseFlowRate": { + "default": 94, + "valuesByApiLevel": { + "2.0": 94 + } + }, + "defaultBlowOutFlowRate": { + "default": 94, + "valuesByApiLevel": { + "2.0": 94 + } + }, "defaultTipLength": 51.0, - "defaultTipOverlap": 8.2, "defaultReturnTipHeight": 0.4, "aspirate": { - "opentrons/opentrons_96_tiprack_300ul/1": [ - [15.4931, 0.0268, 8.559], - [17.2964, 0.0227, 8.2555], - [26.4494, 0.0184, 8.3302], - [31.0328, 0.0109, 8.5278], - [35.6206, 0.0084, 8.6052], - [40.1967, 0.006, 8.6914], - [44.7911, 0.0056, 8.7084], - [54.0381, 0.0052, 8.7251], - [63.2183, 0.0027, 8.8601], - [72.5189, 0.0036, 8.8023], - [81.7883, 0.0025, 8.887], - [91.0614, 0.002, 8.924], - [100.335, 0.0016, 8.9566], - [109.6503, 0.0017, 8.9473], - [118.9447, 0.0013, 8.9951], - [128.2742, 0.0014, 8.9858], - [137.5514, 0.0008, 9.0566], - [146.9261, 0.0014, 8.9824], - [156.2103, 0.0006, 9.0886], - [165.6528, 0.0015, 8.9557], - [174.9731, 0.0007, 9.0932], - [184.3156, 0.0007, 9.0842], - [202.9883, 0.0006, 9.1076], - [221.64, 0.0004, 9.1369], - [240.2986, 0.0004, 9.1488], - [258.925, 0.0003, 9.1769], - [277.5545, 0.0002, 9.1849], - [296.3369, 0.0005, 9.123], - [301.0236, 0.0004, 9.1508] - ], - "default": [ - [15.4931, 0.0268, 8.559], - [17.2964, 0.0227, 8.2555], - [26.4494, 0.0184, 8.3302], - [31.0328, 0.0109, 8.5278], - [35.6206, 0.0084, 8.6052], - [40.1967, 0.006, 8.6914], - [44.7911, 0.0056, 8.7084], - [54.0381, 0.0052, 8.7251], - [63.2183, 0.0027, 8.8601], - [72.5189, 0.0036, 8.8023], - [81.7883, 0.0025, 8.887], - [91.0614, 0.002, 8.924], - [100.335, 0.0016, 8.9566], - [109.6503, 0.0017, 8.9473], - [118.9447, 0.0013, 8.9951], - [128.2742, 0.0014, 8.9858], - [137.5514, 0.0008, 9.0566], - [146.9261, 0.0014, 8.9824], - [156.2103, 0.0006, 9.0886], - [165.6528, 0.0015, 8.9557], - [174.9731, 0.0007, 9.0932], - [184.3156, 0.0007, 9.0842], - [202.9883, 0.0006, 9.1076], - [221.64, 0.0004, 9.1369], - [240.2986, 0.0004, 9.1488], - [258.925, 0.0003, 9.1769], - [277.5545, 0.0002, 9.1849], - [296.3369, 0.0005, 9.123], - [301.0236, 0.0004, 9.1508] - ] + "default": { + "1": [ + [15.4931, 0.0268, 8.559], + [17.2964, 0.0227, 8.2555], + [26.4494, 0.0184, 8.3302], + [31.0328, 0.0109, 8.5278], + [35.6206, 0.0084, 8.6052], + [40.1967, 0.006, 8.6914], + [44.7911, 0.0056, 8.7084], + [54.0381, 0.0052, 8.7251], + [63.2183, 0.0027, 8.8601], + [72.5189, 0.0036, 8.8023], + [81.7883, 0.0025, 8.887], + [91.0614, 0.002, 8.924], + [100.335, 0.0016, 8.9566], + [109.6503, 0.0017, 8.9473], + [118.9447, 0.0013, 8.9951], + [128.2742, 0.0014, 8.9858], + [137.5514, 0.0008, 9.0566], + [146.9261, 0.0014, 8.9824], + [156.2103, 0.0006, 9.0886], + [165.6528, 0.0015, 8.9557], + [174.9731, 0.0007, 9.0932], + [184.3156, 0.0007, 9.0842], + [202.9883, 0.0006, 9.1076], + [221.64, 0.0004, 9.1369], + [240.2986, 0.0004, 9.1488], + [258.925, 0.0003, 9.1769], + [277.5545, 0.0002, 9.1849], + [296.3369, 0.0005, 9.123], + [301.0236, 0.0004, 9.1508] + ] + } }, "dispense": { - "opentrons/opentrons_96_tiprack_300ul/1": [ - [15.4931, 0.0268, 8.559], - [17.2964, 0.0227, 8.2555], - [26.4494, 0.0184, 8.3302], - [31.0328, 0.0109, 8.5278], - [35.6206, 0.0084, 8.6052], - [40.1967, 0.006, 8.6914], - [44.7911, 0.0056, 8.7084], - [54.0381, 0.0052, 8.7251], - [63.2183, 0.0027, 8.8601], - [72.5189, 0.0036, 8.8023], - [81.7883, 0.0025, 8.887], - [91.0614, 0.002, 8.924], - [100.335, 0.0016, 8.9566], - [109.6503, 0.0017, 8.9473], - [118.9447, 0.0013, 8.9951], - [128.2742, 0.0014, 8.9858], - [137.5514, 0.0008, 9.0566], - [146.9261, 0.0014, 8.9824], - [156.2103, 0.0006, 9.0886], - [165.6528, 0.0015, 8.9557], - [174.9731, 0.0007, 9.0932], - [184.3156, 0.0007, 9.0842], - [202.9883, 0.0006, 9.1076], - [221.64, 0.0004, 9.1369], - [240.2986, 0.0004, 9.1488], - [258.925, 0.0003, 9.1769], - [277.5545, 0.0002, 9.1849], - [296.3369, 0.0005, 9.123], - [301.0236, 0.0004, 9.1508] - ], - "default": [ - [15.4931, 0.0268, 8.559], - [17.2964, 0.0227, 8.2555], - [26.4494, 0.0184, 8.3302], - [31.0328, 0.0109, 8.5278], - [35.6206, 0.0084, 8.6052], - [40.1967, 0.006, 8.6914], - [44.7911, 0.0056, 8.7084], - [54.0381, 0.0052, 8.7251], - [63.2183, 0.0027, 8.8601], - [72.5189, 0.0036, 8.8023], - [81.7883, 0.0025, 8.887], - [91.0614, 0.002, 8.924], - [100.335, 0.0016, 8.9566], - [109.6503, 0.0017, 8.9473], - [118.9447, 0.0013, 8.9951], - [128.2742, 0.0014, 8.9858], - [137.5514, 0.0008, 9.0566], - [146.9261, 0.0014, 8.9824], - [156.2103, 0.0006, 9.0886], - [165.6528, 0.0015, 8.9557], - [174.9731, 0.0007, 9.0932], - [184.3156, 0.0007, 9.0842], - [202.9883, 0.0006, 9.1076], - [221.64, 0.0004, 9.1369], - [240.2986, 0.0004, 9.1488], - [258.925, 0.0003, 9.1769], - [277.5545, 0.0002, 9.1849], - [296.3369, 0.0005, 9.123], - [301.0236, 0.0004, 9.1508] - ] - }, - "defaultTipOverlapDictionary": { - "opentrons/opentrons_96_tiprack_300ul/1": 8.2 + "default": { + "1": [ + [15.4931, 0.0268, 8.559], + [17.2964, 0.0227, 8.2555], + [26.4494, 0.0184, 8.3302], + [31.0328, 0.0109, 8.5278], + [35.6206, 0.0084, 8.6052], + [40.1967, 0.006, 8.6914], + [44.7911, 0.0056, 8.7084], + [54.0381, 0.0052, 8.7251], + [63.2183, 0.0027, 8.8601], + [72.5189, 0.0036, 8.8023], + [81.7883, 0.0025, 8.887], + [91.0614, 0.002, 8.924], + [100.335, 0.0016, 8.9566], + [109.6503, 0.0017, 8.9473], + [118.9447, 0.0013, 8.9951], + [128.2742, 0.0014, 8.9858], + [137.5514, 0.0008, 9.0566], + [146.9261, 0.0014, 8.9824], + [156.2103, 0.0006, 9.0886], + [165.6528, 0.0015, 8.9557], + [174.9731, 0.0007, 9.0932], + [184.3156, 0.0007, 9.0842], + [202.9883, 0.0006, 9.1076], + [221.64, 0.0004, 9.1369], + [240.2986, 0.0004, 9.1488], + [258.925, 0.0003, 9.1769], + [277.5545, 0.0002, 9.1849], + [296.3369, 0.0005, 9.123], + [301.0236, 0.0004, 9.1508] + ] + } }, "defaultBlowoutVolume": 43.295 } }, + "defaultTipOverlapDictionary": { + "default": 8.2, + "opentrons/opentrons_96_filtertiprack_200ul/1": 8.2, + "opentrons/opentrons_96_tiprack_300ul/1": 8.2 + }, "maxVolume": 300, "minVolume": 20.0, "defaultTipracks": [ diff --git a/shared-data/pipette/definitions/2/liquid/eight_channel/p300/2_1.json b/shared-data/pipette/definitions/2/liquid/eight_channel/p300/2_1.json index 619ed873ecc..7eea925b93f 100644 --- a/shared-data/pipette/definitions/2/liquid/eight_channel/p300/2_1.json +++ b/shared-data/pipette/definitions/2/liquid/eight_channel/p300/2_1.json @@ -2,286 +2,197 @@ "$otSharedSchema": "#/pipette/schemas/2/pipetteLiquidPropertiesSchema.json", "supportedTips": { "t200": { - "defaultAspirateFlowRate": 94.0, - "defaultDispenseFlowRate": 94.0, - "defaultBlowOutFlowRate": 94.0, + "defaultAspirateFlowRate": { + "default": 94, + "valuesByApiLevel": { + "2.0": 94 + } + }, + "defaultDispenseFlowRate": { + "default": 94, + "valuesByApiLevel": { + "2.0": 94 + } + }, + "defaultBlowOutFlowRate": { + "default": 94, + "valuesByApiLevel": { + "2.0": 94 + } + }, "defaultTipLength": 51.0, - "defaultTipOverlap": 8.2, "defaultReturnTipHeight": 0.4, "aspirate": { - "opentrons/opentrons_96_filtertiprack_200ul/1": [ - [15.1131, 0.049, 8.3069], - [16.9572, 0.0447, 7.7203], - [26.1311, 0.0253, 8.0502], - [30.7644, 0.0172, 8.2622], - [35.4169, 0.0138, 8.364], - [39.9942, 0.0073, 8.5961], - [44.6186, 0.0078, 8.5751], - [53.8569, 0.0057, 8.6705], - [63.1219, 0.0045, 8.7363], - [72.3953, 0.0034, 8.7997], - [81.6392, 0.0023, 8.8802], - [90.9025, 0.0021, 8.9015], - [100.1819, 0.0019, 8.9218], - [109.4856, 0.0018, 8.9314], - [118.7745, 0.0014, 8.9741], - [128.135, 0.0017, 8.9334], - [137.43, 0.001, 9.0215], - [146.7356, 0.001, 9.0295], - [156.0722, 0.001, 9.0178], - [165.4444, 0.0011, 9.0036], - [174.7933, 0.0009, 9.0446], - [184.1725, 0.001, 9.0324], - [202.8867, 0.0007, 9.0758], - [221.595, 0.0006, 9.1028], - [240.3436, 0.0006, 9.1048], - [259.0833, 0.0005, 9.1287], - [277.8381, 0.0004, 9.1384], - [296.7631, 0.0007, 9.0766], - [301.4592, 0.0004, 9.1587] - ], - "default": [ - [15.1131, 0.049, 8.3069], - [16.9572, 0.0447, 7.7203], - [26.1311, 0.0253, 8.0502], - [30.7644, 0.0172, 8.2622], - [35.4169, 0.0138, 8.364], - [39.9942, 0.0073, 8.5961], - [44.6186, 0.0078, 8.5751], - [53.8569, 0.0057, 8.6705], - [63.1219, 0.0045, 8.7363], - [72.3953, 0.0034, 8.7997], - [81.6392, 0.0023, 8.8802], - [90.9025, 0.0021, 8.9015], - [100.1819, 0.0019, 8.9218], - [109.4856, 0.0018, 8.9314], - [118.7745, 0.0014, 8.9741], - [128.135, 0.0017, 8.9334], - [137.43, 0.001, 9.0215], - [146.7356, 0.001, 9.0295], - [156.0722, 0.001, 9.0178], - [165.4444, 0.0011, 9.0036], - [174.7933, 0.0009, 9.0446], - [184.1725, 0.001, 9.0324], - [202.8867, 0.0007, 9.0758], - [221.595, 0.0006, 9.1028], - [240.3436, 0.0006, 9.1048], - [259.0833, 0.0005, 9.1287], - [277.8381, 0.0004, 9.1384], - [296.7631, 0.0007, 9.0766], - [301.4592, 0.0004, 9.1587] - ] + "default": { + "1": [ + [15.1131, 0.049, 8.3069], + [16.9572, 0.0447, 7.7203], + [26.1311, 0.0253, 8.0502], + [30.7644, 0.0172, 8.2622], + [35.4169, 0.0138, 8.364], + [39.9942, 0.0073, 8.5961], + [44.6186, 0.0078, 8.5751], + [53.8569, 0.0057, 8.6705], + [63.1219, 0.0045, 8.7363], + [72.3953, 0.0034, 8.7997], + [81.6392, 0.0023, 8.8802], + [90.9025, 0.0021, 8.9015], + [100.1819, 0.0019, 8.9218], + [109.4856, 0.0018, 8.9314], + [118.7745, 0.0014, 8.9741], + [128.135, 0.0017, 8.9334], + [137.43, 0.001, 9.0215], + [146.7356, 0.001, 9.0295], + [156.0722, 0.001, 9.0178], + [165.4444, 0.0011, 9.0036], + [174.7933, 0.0009, 9.0446], + [184.1725, 0.001, 9.0324], + [202.8867, 0.0007, 9.0758], + [221.595, 0.0006, 9.1028], + [240.3436, 0.0006, 9.1048], + [259.0833, 0.0005, 9.1287], + [277.8381, 0.0004, 9.1384], + [296.7631, 0.0007, 9.0766], + [301.4592, 0.0004, 9.1587] + ] + } }, "dispense": { - "opentrons/opentrons_96_filtertiprack_200ul/1": [ - [15.1131, 0.049, 8.3069], - [16.9572, 0.0447, 7.7203], - [26.1311, 0.0253, 8.0502], - [30.7644, 0.0172, 8.2622], - [35.4169, 0.0138, 8.364], - [39.9942, 0.0073, 8.5961], - [44.6186, 0.0078, 8.5751], - [53.8569, 0.0057, 8.6705], - [63.1219, 0.0045, 8.7363], - [72.3953, 0.0034, 8.7997], - [81.6392, 0.0023, 8.8802], - [90.9025, 0.0021, 8.9015], - [100.1819, 0.0019, 8.9218], - [109.4856, 0.0018, 8.9314], - [118.7745, 0.0014, 8.9741], - [128.135, 0.0017, 8.9334], - [137.43, 0.001, 9.0215], - [146.7356, 0.001, 9.0295], - [156.0722, 0.001, 9.0178], - [165.4444, 0.0011, 9.0036], - [174.7933, 0.0009, 9.0446], - [184.1725, 0.001, 9.0324], - [202.8867, 0.0007, 9.0758], - [221.595, 0.0006, 9.1028], - [240.3436, 0.0006, 9.1048], - [259.0833, 0.0005, 9.1287], - [277.8381, 0.0004, 9.1384], - [296.7631, 0.0007, 9.0766], - [301.4592, 0.0004, 9.1587] - ], - "default": [ - [15.1131, 0.049, 8.3069], - [16.9572, 0.0447, 7.7203], - [26.1311, 0.0253, 8.0502], - [30.7644, 0.0172, 8.2622], - [35.4169, 0.0138, 8.364], - [39.9942, 0.0073, 8.5961], - [44.6186, 0.0078, 8.5751], - [53.8569, 0.0057, 8.6705], - [63.1219, 0.0045, 8.7363], - [72.3953, 0.0034, 8.7997], - [81.6392, 0.0023, 8.8802], - [90.9025, 0.0021, 8.9015], - [100.1819, 0.0019, 8.9218], - [109.4856, 0.0018, 8.9314], - [118.7745, 0.0014, 8.9741], - [128.135, 0.0017, 8.9334], - [137.43, 0.001, 9.0215], - [146.7356, 0.001, 9.0295], - [156.0722, 0.001, 9.0178], - [165.4444, 0.0011, 9.0036], - [174.7933, 0.0009, 9.0446], - [184.1725, 0.001, 9.0324], - [202.8867, 0.0007, 9.0758], - [221.595, 0.0006, 9.1028], - [240.3436, 0.0006, 9.1048], - [259.0833, 0.0005, 9.1287], - [277.8381, 0.0004, 9.1384], - [296.7631, 0.0007, 9.0766], - [301.4592, 0.0004, 9.1587] - ] - }, - "defaultTipOverlapDictionary": { - "opentrons/opentrons_96_filtertiprack_200ul/1": 8.2 + "default": { + "1": [ + [15.1131, 0.049, 8.3069], + [16.9572, 0.0447, 7.7203], + [26.1311, 0.0253, 8.0502], + [30.7644, 0.0172, 8.2622], + [35.4169, 0.0138, 8.364], + [39.9942, 0.0073, 8.5961], + [44.6186, 0.0078, 8.5751], + [53.8569, 0.0057, 8.6705], + [63.1219, 0.0045, 8.7363], + [72.3953, 0.0034, 8.7997], + [81.6392, 0.0023, 8.8802], + [90.9025, 0.0021, 8.9015], + [100.1819, 0.0019, 8.9218], + [109.4856, 0.0018, 8.9314], + [118.7745, 0.0014, 8.9741], + [128.135, 0.0017, 8.9334], + [137.43, 0.001, 9.0215], + [146.7356, 0.001, 9.0295], + [156.0722, 0.001, 9.0178], + [165.4444, 0.0011, 9.0036], + [174.7933, 0.0009, 9.0446], + [184.1725, 0.001, 9.0324], + [202.8867, 0.0007, 9.0758], + [221.595, 0.0006, 9.1028], + [240.3436, 0.0006, 9.1048], + [259.0833, 0.0005, 9.1287], + [277.8381, 0.0004, 9.1384], + [296.7631, 0.0007, 9.0766], + [301.4592, 0.0004, 9.1587] + ] + } }, "defaultBlowoutVolume": 43.295 }, "t300": { - "defaultAspirateFlowRate": 94.0, - "defaultDispenseFlowRate": 94.0, - "defaultBlowOutFlowRate": 94.0, + "defaultAspirateFlowRate": { + "default": 94, + "valuesByApiLevel": { + "2.0": 94 + } + }, + "defaultDispenseFlowRate": { + "default": 94, + "valuesByApiLevel": { + "2.0": 94 + } + }, + "defaultBlowOutFlowRate": { + "default": 94, + "valuesByApiLevel": { + "2.0": 94 + } + }, "defaultTipLength": 51.0, - "defaultTipOverlap": 8.2, "defaultReturnTipHeight": 0.4, "aspirate": { - "opentrons/opentrons_96_tiprack_300ul/1": [ - [15.1131, 0.049, 8.3069], - [16.9572, 0.0447, 7.7203], - [26.1311, 0.0253, 8.0502], - [30.7644, 0.0172, 8.2622], - [35.4169, 0.0138, 8.364], - [39.9942, 0.0073, 8.5961], - [44.6186, 0.0078, 8.5751], - [53.8569, 0.0057, 8.6705], - [63.1219, 0.0045, 8.7363], - [72.3953, 0.0034, 8.7997], - [81.6392, 0.0023, 8.8802], - [90.9025, 0.0021, 8.9015], - [100.1819, 0.0019, 8.9218], - [109.4856, 0.0018, 8.9314], - [118.7745, 0.0014, 8.9741], - [128.135, 0.0017, 8.9334], - [137.43, 0.001, 9.0215], - [146.7356, 0.001, 9.0295], - [156.0722, 0.001, 9.0178], - [165.4444, 0.0011, 9.0036], - [174.7933, 0.0009, 9.0446], - [184.1725, 0.001, 9.0324], - [202.8867, 0.0007, 9.0758], - [221.595, 0.0006, 9.1028], - [240.3436, 0.0006, 9.1048], - [259.0833, 0.0005, 9.1287], - [277.8381, 0.0004, 9.1384], - [296.7631, 0.0007, 9.0766], - [301.4592, 0.0004, 9.1587] - ], - "default": [ - [15.1131, 0.049, 8.3069], - [16.9572, 0.0447, 7.7203], - [26.1311, 0.0253, 8.0502], - [30.7644, 0.0172, 8.2622], - [35.4169, 0.0138, 8.364], - [39.9942, 0.0073, 8.5961], - [44.6186, 0.0078, 8.5751], - [53.8569, 0.0057, 8.6705], - [63.1219, 0.0045, 8.7363], - [72.3953, 0.0034, 8.7997], - [81.6392, 0.0023, 8.8802], - [90.9025, 0.0021, 8.9015], - [100.1819, 0.0019, 8.9218], - [109.4856, 0.0018, 8.9314], - [118.7745, 0.0014, 8.9741], - [128.135, 0.0017, 8.9334], - [137.43, 0.001, 9.0215], - [146.7356, 0.001, 9.0295], - [156.0722, 0.001, 9.0178], - [165.4444, 0.0011, 9.0036], - [174.7933, 0.0009, 9.0446], - [184.1725, 0.001, 9.0324], - [202.8867, 0.0007, 9.0758], - [221.595, 0.0006, 9.1028], - [240.3436, 0.0006, 9.1048], - [259.0833, 0.0005, 9.1287], - [277.8381, 0.0004, 9.1384], - [296.7631, 0.0007, 9.0766], - [301.4592, 0.0004, 9.1587] - ] + "default": { + "1": [ + [15.1131, 0.049, 8.3069], + [16.9572, 0.0447, 7.7203], + [26.1311, 0.0253, 8.0502], + [30.7644, 0.0172, 8.2622], + [35.4169, 0.0138, 8.364], + [39.9942, 0.0073, 8.5961], + [44.6186, 0.0078, 8.5751], + [53.8569, 0.0057, 8.6705], + [63.1219, 0.0045, 8.7363], + [72.3953, 0.0034, 8.7997], + [81.6392, 0.0023, 8.8802], + [90.9025, 0.0021, 8.9015], + [100.1819, 0.0019, 8.9218], + [109.4856, 0.0018, 8.9314], + [118.7745, 0.0014, 8.9741], + [128.135, 0.0017, 8.9334], + [137.43, 0.001, 9.0215], + [146.7356, 0.001, 9.0295], + [156.0722, 0.001, 9.0178], + [165.4444, 0.0011, 9.0036], + [174.7933, 0.0009, 9.0446], + [184.1725, 0.001, 9.0324], + [202.8867, 0.0007, 9.0758], + [221.595, 0.0006, 9.1028], + [240.3436, 0.0006, 9.1048], + [259.0833, 0.0005, 9.1287], + [277.8381, 0.0004, 9.1384], + [296.7631, 0.0007, 9.0766], + [301.4592, 0.0004, 9.1587] + ] + } }, "dispense": { - "opentrons/opentrons_96_tiprack_300ul/1": [ - [15.1131, 0.049, 8.3069], - [16.9572, 0.0447, 7.7203], - [26.1311, 0.0253, 8.0502], - [30.7644, 0.0172, 8.2622], - [35.4169, 0.0138, 8.364], - [39.9942, 0.0073, 8.5961], - [44.6186, 0.0078, 8.5751], - [53.8569, 0.0057, 8.6705], - [63.1219, 0.0045, 8.7363], - [72.3953, 0.0034, 8.7997], - [81.6392, 0.0023, 8.8802], - [90.9025, 0.0021, 8.9015], - [100.1819, 0.0019, 8.9218], - [109.4856, 0.0018, 8.9314], - [118.7745, 0.0014, 8.9741], - [128.135, 0.0017, 8.9334], - [137.43, 0.001, 9.0215], - [146.7356, 0.001, 9.0295], - [156.0722, 0.001, 9.0178], - [165.4444, 0.0011, 9.0036], - [174.7933, 0.0009, 9.0446], - [184.1725, 0.001, 9.0324], - [202.8867, 0.0007, 9.0758], - [221.595, 0.0006, 9.1028], - [240.3436, 0.0006, 9.1048], - [259.0833, 0.0005, 9.1287], - [277.8381, 0.0004, 9.1384], - [296.7631, 0.0007, 9.0766], - [301.4592, 0.0004, 9.1587] - ], - "default": [ - [15.1131, 0.049, 8.3069], - [16.9572, 0.0447, 7.7203], - [26.1311, 0.0253, 8.0502], - [30.7644, 0.0172, 8.2622], - [35.4169, 0.0138, 8.364], - [39.9942, 0.0073, 8.5961], - [44.6186, 0.0078, 8.5751], - [53.8569, 0.0057, 8.6705], - [63.1219, 0.0045, 8.7363], - [72.3953, 0.0034, 8.7997], - [81.6392, 0.0023, 8.8802], - [90.9025, 0.0021, 8.9015], - [100.1819, 0.0019, 8.9218], - [109.4856, 0.0018, 8.9314], - [118.7745, 0.0014, 8.9741], - [128.135, 0.0017, 8.9334], - [137.43, 0.001, 9.0215], - [146.7356, 0.001, 9.0295], - [156.0722, 0.001, 9.0178], - [165.4444, 0.0011, 9.0036], - [174.7933, 0.0009, 9.0446], - [184.1725, 0.001, 9.0324], - [202.8867, 0.0007, 9.0758], - [221.595, 0.0006, 9.1028], - [240.3436, 0.0006, 9.1048], - [259.0833, 0.0005, 9.1287], - [277.8381, 0.0004, 9.1384], - [296.7631, 0.0007, 9.0766], - [301.4592, 0.0004, 9.1587] - ] - }, - "defaultTipOverlapDictionary": { - "opentrons/opentrons_96_tiprack_300ul/1": 8.2 + "default": { + "1": [ + [15.1131, 0.049, 8.3069], + [16.9572, 0.0447, 7.7203], + [26.1311, 0.0253, 8.0502], + [30.7644, 0.0172, 8.2622], + [35.4169, 0.0138, 8.364], + [39.9942, 0.0073, 8.5961], + [44.6186, 0.0078, 8.5751], + [53.8569, 0.0057, 8.6705], + [63.1219, 0.0045, 8.7363], + [72.3953, 0.0034, 8.7997], + [81.6392, 0.0023, 8.8802], + [90.9025, 0.0021, 8.9015], + [100.1819, 0.0019, 8.9218], + [109.4856, 0.0018, 8.9314], + [118.7745, 0.0014, 8.9741], + [128.135, 0.0017, 8.9334], + [137.43, 0.001, 9.0215], + [146.7356, 0.001, 9.0295], + [156.0722, 0.001, 9.0178], + [165.4444, 0.0011, 9.0036], + [174.7933, 0.0009, 9.0446], + [184.1725, 0.001, 9.0324], + [202.8867, 0.0007, 9.0758], + [221.595, 0.0006, 9.1028], + [240.3436, 0.0006, 9.1048], + [259.0833, 0.0005, 9.1287], + [277.8381, 0.0004, 9.1384], + [296.7631, 0.0007, 9.0766], + [301.4592, 0.0004, 9.1587] + ] + } }, "defaultBlowoutVolume": 43.295 } }, + "defaultTipOverlapDictionary": { + "default": 8.2, + "opentrons/opentrons_96_tiprack_300ul/1": 8.2, + "opentrons/opentrons_96_filtertiprack_200ul/1": 8.2 + }, "maxVolume": 300, "minVolume": 20.0, "defaultTipracks": [ diff --git a/shared-data/pipette/definitions/2/liquid/eight_channel/p50/1_0.json b/shared-data/pipette/definitions/2/liquid/eight_channel/p50/1_0.json index 1bdfc242c20..87fe840de4e 100644 --- a/shared-data/pipette/definitions/2/liquid/eight_channel/p50/1_0.json +++ b/shared-data/pipette/definitions/2/liquid/eight_channel/p50/1_0.json @@ -2,66 +2,86 @@ "$otSharedSchema": "#/pipette/schemas/2/pipetteLiquidPropertiesSchema.json", "supportedTips": { "t200": { - "defaultAspirateFlowRate": 25.0, - "defaultDispenseFlowRate": 50.0, - "defaultBlowOutFlowRate": 1000.0, + "defaultAspirateFlowRate": { + "default": 25, + "valuesByApiLevel": { "2.0": 25 } + }, + "defaultDispenseFlowRate": { + "default": 50, + "valuesByApiLevel": { "2.0": 50 } + }, + "defaultBlowOutFlowRate": { + "default": 1000, + "valuesByApiLevel": { "2.0": 1000 } + }, "defaultTipLength": 51.7, - "defaultTipOverlap": 7.47, - "defaultReturnTipHeight": null, "aspirate": { - "opentrons/tipone_96_tiprack_200ul/1": [ - [12.29687531, -0.0049, 3.134703694], - [50.0, -0.0002, 3.077116024] - ], - "opentrons/opentrons_96_filtertiprack_200ul/1": [ - [12.29687531, -0.0049, 3.134703694], - [50.0, -0.0002, 3.077116024] - ], - "default": [ - [12.29687531, -0.0049, 3.134703694], - [50.0, -0.0002, 3.077116024] - ] + "default": { + "1": [ + [12.29687531, -0.0049, 3.134703694], + [50.0, -0.0002, 3.077116024] + ], + "2": [ + [5.5768667, 0.076142366, 2.363797525], + [7.0999333, 0.0338396036, 2.599714392], + [11.5943825, 0.0130432679, 2.747366988], + [17.6461325, 0.007010609879, 2.817311933], + [50, 0.002620115513, 2.894787178] + ] + } }, "dispense": { - "opentrons/tipone_96_tiprack_200ul/1": [[50.0, 0.0, 3.06368702]], - "opentrons/opentrons_96_filtertiprack_200ul/1": [ - [50.0, 0.0, 3.06368702] - ], - "default": [[50.0, 0.0, 3.06368702]] - }, - "defaultTipOverlapDictionary": { - "opentrons/tipone_96_tiprack_200ul/1": 6.1, - "opentrons/opentrons_96_filtertiprack_200ul/1": 7.47 + "default": { + "1": [[50.0, 0.0, 3.06368702]], + "2": [[50, 0, 3.06368702]] + } }, "defaultBlowoutVolume": 4.712 }, "t300": { - "defaultAspirateFlowRate": 25.0, - "defaultDispenseFlowRate": 50.0, - "defaultBlowOutFlowRate": 1000.0, + "defaultAspirateFlowRate": { + "default": 25, + "valuesByApiLevel": { "2.0": 25 } + }, + "defaultDispenseFlowRate": { + "default": 50, + "valuesByApiLevel": { "2.0": 50 } + }, + "defaultBlowOutFlowRate": { + "default": 1000, + "valuesByApiLevel": { "2.0": 1000 } + }, "defaultTipLength": 51.7, - "defaultTipOverlap": 7.47, - "defaultReturnTipHeight": null, "aspirate": { - "opentrons/opentrons_96_tiprack_300ul/1": [ - [12.29687531, -0.0049, 3.134703694], - [50.0, -0.0002, 3.077116024] - ], - "default": [ - [12.29687531, -0.0049, 3.134703694], - [50.0, -0.0002, 3.077116024] - ] + "default": { + "1": [ + [12.29687531, -0.0049, 3.134703694], + [50.0, -0.0002, 3.077116024] + ], + "2": [ + [5.5768667, 0.076142366, 2.363797525], + [7.0999333, 0.0338396036, 2.599714392], + [11.5943825, 0.0130432679, 2.747366988], + [17.6461325, 0.007010609879, 2.817311933], + [50, 0.002620115513, 2.894787178] + ] + } }, "dispense": { - "opentrons/opentrons_96_tiprack_300ul/1": [[50.0, 0.0, 3.06368702]], - "default": [[50.0, 0.0, 3.06368702]] - }, - "defaultTipOverlapDictionary": { - "opentrons/opentrons_96_tiprack_300ul/1": 7.47 + "default": { + "1": [[50.0, 0.0, 3.06368702]], + "2": [[50, 0, 3.06368702]] + } }, "defaultBlowoutVolume": 4.712 } }, + "defaultTipOverlapDictionary": { + "default": 7.47, + "opentrons/tipone_96_tiprack_200ul/1": 6.1, + "opentrons/opentrons_96_filtertiprack_200ul/1": 7.47, + "opentrons/opentrons_96_tiprack_300ul/1": 7.47 + }, "maxVolume": 50, "minVolume": 5.0, "defaultTipracks": [ diff --git a/shared-data/pipette/definitions/2/liquid/eight_channel/p50/1_3.json b/shared-data/pipette/definitions/2/liquid/eight_channel/p50/1_3.json index 20d0b9e05fd..87fe840de4e 100644 --- a/shared-data/pipette/definitions/2/liquid/eight_channel/p50/1_3.json +++ b/shared-data/pipette/definitions/2/liquid/eight_channel/p50/1_3.json @@ -2,61 +2,86 @@ "$otSharedSchema": "#/pipette/schemas/2/pipetteLiquidPropertiesSchema.json", "supportedTips": { "t200": { - "defaultAspirateFlowRate": 25.0, - "defaultDispenseFlowRate": 50.0, - "defaultBlowOutFlowRate": 1000.0, + "defaultAspirateFlowRate": { + "default": 25, + "valuesByApiLevel": { "2.0": 25 } + }, + "defaultDispenseFlowRate": { + "default": 50, + "valuesByApiLevel": { "2.0": 50 } + }, + "defaultBlowOutFlowRate": { + "default": 1000, + "valuesByApiLevel": { "2.0": 1000 } + }, "defaultTipLength": 51.7, - "defaultTipOverlap": 7.47, - "defaultReturnTipHeight": null, "aspirate": { - "opentrons/tipone_96_tiprack_200ul/1": [ - [12.29687531, -0.0049, 3.134703694], - [50.0, -0.0002, 3.077116024] - ], - "opentrons/opentrons_96_filtertiprack_200ul/1": [ - [12.29687531, -0.0049, 3.134703694], - [50.0, -0.0002, 3.077116024] - ], - "default": [ - [12.29687531, -0.0049, 3.134703694], - [50.0, -0.0002, 3.077116024] - ] + "default": { + "1": [ + [12.29687531, -0.0049, 3.134703694], + [50.0, -0.0002, 3.077116024] + ], + "2": [ + [5.5768667, 0.076142366, 2.363797525], + [7.0999333, 0.0338396036, 2.599714392], + [11.5943825, 0.0130432679, 2.747366988], + [17.6461325, 0.007010609879, 2.817311933], + [50, 0.002620115513, 2.894787178] + ] + } }, "dispense": { - "opentrons/tipone_96_tiprack_200ul/1": [[50.0, 0.0, 3.06368702]], - "opentrons/opentrons_96_filtertiprack_200ul/1": [ - [50.0, 0.0, 3.06368702] - ], - "default": [[50.0, 0.0, 3.06368702]] - }, - "defaultTipOverlapDictionary": { - "opentrons/tipone_96_tiprack_200ul/1": 6.1, - "opentrons/opentrons_96_filtertiprack_200ul/1": 7.47 + "default": { + "1": [[50.0, 0.0, 3.06368702]], + "2": [[50, 0, 3.06368702]] + } }, "defaultBlowoutVolume": 4.712 }, "t300": { - "defaultAspirateFlowRate": 25.0, - "defaultDispenseFlowRate": 50.0, - "defaultBlowOutFlowRate": 1000.0, + "defaultAspirateFlowRate": { + "default": 25, + "valuesByApiLevel": { "2.0": 25 } + }, + "defaultDispenseFlowRate": { + "default": 50, + "valuesByApiLevel": { "2.0": 50 } + }, + "defaultBlowOutFlowRate": { + "default": 1000, + "valuesByApiLevel": { "2.0": 1000 } + }, "defaultTipLength": 51.7, - "defaultTipOverlap": 7.47, - "defaultReturnTipHeight": null, "aspirate": { - "opentrons/opentrons_96_tiprack_300ul/1": [ - [12.29687531, -0.0049, 3.134703694], - [50.0, -0.0002, 3.077116024] - ] + "default": { + "1": [ + [12.29687531, -0.0049, 3.134703694], + [50.0, -0.0002, 3.077116024] + ], + "2": [ + [5.5768667, 0.076142366, 2.363797525], + [7.0999333, 0.0338396036, 2.599714392], + [11.5943825, 0.0130432679, 2.747366988], + [17.6461325, 0.007010609879, 2.817311933], + [50, 0.002620115513, 2.894787178] + ] + } }, "dispense": { - "opentrons/opentrons_96_tiprack_300ul/1": [[50.0, 0.0, 3.06368702]] - }, - "defaultTipOverlapDictionary": { - "opentrons/opentrons_96_tiprack_300ul/1": 7.47 + "default": { + "1": [[50.0, 0.0, 3.06368702]], + "2": [[50, 0, 3.06368702]] + } }, "defaultBlowoutVolume": 4.712 } }, + "defaultTipOverlapDictionary": { + "default": 7.47, + "opentrons/tipone_96_tiprack_200ul/1": 6.1, + "opentrons/opentrons_96_filtertiprack_200ul/1": 7.47, + "opentrons/opentrons_96_tiprack_300ul/1": 7.47 + }, "maxVolume": 50, "minVolume": 5.0, "defaultTipracks": [ diff --git a/shared-data/pipette/definitions/2/liquid/eight_channel/p50/1_4.json b/shared-data/pipette/definitions/2/liquid/eight_channel/p50/1_4.json index a0c7f041e0d..561eda019d0 100644 --- a/shared-data/pipette/definitions/2/liquid/eight_channel/p50/1_4.json +++ b/shared-data/pipette/definitions/2/liquid/eight_channel/p50/1_4.json @@ -2,62 +2,86 @@ "$otSharedSchema": "#/pipette/schemas/2/pipetteLiquidPropertiesSchema.json", "supportedTips": { "t200": { - "defaultAspirateFlowRate": 25.0, - "defaultDispenseFlowRate": 50.0, - "defaultBlowOutFlowRate": 1000.0, + "defaultAspirateFlowRate": { + "default": 25, + "valuesByApiLevel": { "2.0": 25 } + }, + "defaultDispenseFlowRate": { + "default": 50, + "valuesByApiLevel": { "2.0": 50 } + }, + "defaultBlowOutFlowRate": { + "default": 1000, + "valuesByApiLevel": { "2.0": 1000 } + }, "defaultTipLength": 51.7, - "defaultTipOverlap": 7.47, - "defaultReturnTipHeight": null, "aspirate": { - "opentrons/tipone_96_tiprack_200ul/1": [ - [12.29687531, -0.0049, 3.134703694], - [50.0, -0.0002, 3.077116024] - ], - "opentrons/opentrons_96_filtertiprack_200ul/1": [ - [12.29687531, -0.0049, 3.134703694], - [50.0, -0.0002, 3.077116024] - ] + "default": { + "1": [ + [12.29687531, -0.0049, 3.134703694], + [50, -0.0002, 3.077116024] + ], + "2": [ + [5.5768667, 0.076142366, 2.363797525], + [7.0999333, 0.0338396036, 2.599714392], + [11.5943825, 0.0130432679, 2.747366988], + [17.6461325, 0.007010609879, 2.817311933], + [50, 0.002620115513, 2.894787178] + ] + } }, "dispense": { - "opentrons/tipone_96_tiprack_200ul/1": [[50.0, 0.0, 3.06368702]], - "opentrons/opentrons_96_filtertiprack_200ul/1": [ - [50.0, 0.0, 3.06368702] - ], - "default": [[50.0, 0.0, 3.06368702]] - }, - "defaultTipOverlapDictionary": { - "opentrons/tipone_96_tiprack_200ul/1": 6.1, - "opentrons/opentrons_96_filtertiprack_200ul/1": 7.47 + "default": { + "1": [[50.0, 0.0, 3.06368702]], + "2": [[50, 0, 3.06368702]] + } }, "defaultBlowoutVolume": 4.712 }, "t300": { - "defaultAspirateFlowRate": 25.0, - "defaultDispenseFlowRate": 50.0, - "defaultBlowOutFlowRate": 1000.0, + "defaultAspirateFlowRate": { + "default": 25, + "valuesByApiLevel": { "2.0": 25 } + }, + "defaultDispenseFlowRate": { + "default": 50, + "valuesByApiLevel": { "2.0": 50 } + }, + "defaultBlowOutFlowRate": { + "default": 1000, + "valuesByApiLevel": { "2.0": 1000 } + }, "defaultTipLength": 51.7, - "defaultTipOverlap": 7.47, - "defaultReturnTipHeight": null, "aspirate": { - "opentrons/opentrons_96_tiprack_300ul/1": [ - [12.29687531, -0.0049, 3.134703694], - [50.0, -0.0002, 3.077116024] - ], - "default": [ - [12.29687531, -0.0049, 3.134703694], - [50.0, -0.0002, 3.077116024] - ] + "default": { + "1": [ + [12.29687531, -0.0049, 3.134703694], + [50, -0.0002, 3.077116024] + ], + "2": [ + [5.5768667, 0.076142366, 2.363797525], + [7.0999333, 0.0338396036, 2.599714392], + [11.5943825, 0.0130432679, 2.747366988], + [17.6461325, 0.007010609879, 2.817311933], + [50, 0.002620115513, 2.894787178] + ] + } }, "dispense": { - "opentrons/opentrons_96_tiprack_300ul/1": [[50.0, 0.0, 3.06368702]], - "default": [[50.0, 0.0, 3.06368702]] - }, - "defaultTipOverlapDictionary": { - "opentrons/opentrons_96_tiprack_300ul/1": 7.47 + "default": { + "1": [[50.0, 0.0, 3.06368702]], + "2": [[50, 0, 3.06368702]] + } }, "defaultBlowoutVolume": 4.712 } }, + "defaultTipOverlapDictionary": { + "default": 7.47, + "opentrons/tipone_96_tiprack_200ul/1": 6.1, + "opentrons/opentrons_96_filtertiprack_200ul/1": 7.47, + "opentrons/opentrons_96_tiprack_300ul/1": 7.47 + }, "maxVolume": 50, "minVolume": 5.0, "defaultTipracks": [ diff --git a/shared-data/pipette/definitions/2/liquid/eight_channel/p50/1_5.json b/shared-data/pipette/definitions/2/liquid/eight_channel/p50/1_5.json index 0953e19424b..8dec0c063ce 100644 --- a/shared-data/pipette/definitions/2/liquid/eight_channel/p50/1_5.json +++ b/shared-data/pipette/definitions/2/liquid/eight_channel/p50/1_5.json @@ -2,81 +2,76 @@ "$otSharedSchema": "#/pipette/schemas/2/pipetteLiquidPropertiesSchema.json", "supportedTips": { "t200": { - "defaultAspirateFlowRate": 25.0, - "defaultDispenseFlowRate": 50.0, - "defaultBlowOutFlowRate": 1000.0, + "defaultAspirateFlowRate": { + "default": 25, + "valuesByApiLevel": { "2.0": 25 } + }, + "defaultDispenseFlowRate": { + "default": 50, + "valuesByApiLevel": { "2.0": 50 } + }, + "defaultBlowOutFlowRate": { + "default": 1000, + "valuesByApiLevel": { "2.0": 1000 } + }, "defaultTipLength": 51.7, - "defaultTipOverlap": 7.47, - "defaultReturnTipHeight": null, "aspirate": { - "opentrons/tipone_96_tiprack_200ul/1": [ - [6.190392157, -0.01092438778, 3.1628], - [7.639705882, -0.02712575255, 3.2631], - [10.69666667, 0.0001007939816, 3.0551], - [24.49343137, 0.0003978066956, 3.0519], - [50.0, -1.501363238e-5, 3.062] - ], - "opentrons/opentrons_96_filtertiprack_200ul/1": [ - [6.190392157, -0.01092438778, 3.1628], - [7.639705882, -0.02712575255, 3.2631], - [10.69666667, 0.0001007939816, 3.0551], - [24.49343137, 0.0003978066956, 3.0519], - [50.0, -1.501363238e-5, 3.062] - ], - "default": [ - [6.190392157, -0.01092438778, 3.1628], - [7.639705882, -0.02712575255, 3.2631], - [10.69666667, 0.0001007939816, 3.0551], - [24.49343137, 0.0003978066956, 3.0519], - [50.0, -1.501363238e-5, 3.062] - ] + "default": { + "1": [ + [6.190392157, -0.01092438778, 3.1628], + [7.639705882, -0.02712575255, 3.2631], + [10.69666667, 0.0001007939816, 3.0551], + [24.49343137, 0.0003978066956, 3.0519], + [50.0, -1.501363238e-5, 3.062] + ] + } }, "dispense": { - "opentrons/tipone_96_tiprack_200ul/1": [[50.0, 0.0, 3.06368702]], - "opentrons/opentrons_96_filtertiprack_200ul/1": [ - [50.0, 0.0, 3.06368702] - ], - "default": [[50.0, 0.0, 3.06368702]] - }, - "defaultTipOverlapDictionary": { - "opentrons/tipone_96_tiprack_200ul/1": 6.1, - "opentrons/opentrons_96_filtertiprack_200ul/1": 7.47 + "default": { + "1": [[50.0, 0.0, 3.06368702]] + } }, "defaultBlowoutVolume": 4.712 }, "t300": { - "defaultAspirateFlowRate": 25.0, - "defaultDispenseFlowRate": 50.0, - "defaultBlowOutFlowRate": 1000.0, + "defaultAspirateFlowRate": { + "default": 25, + "valuesByApiLevel": { "2.0": 25 } + }, + "defaultDispenseFlowRate": { + "default": 50, + "valuesByApiLevel": { "2.0": 50 } + }, + "defaultBlowOutFlowRate": { + "default": 1000, + "valuesByApiLevel": { "2.0": 1000 } + }, "defaultTipLength": 51.7, - "defaultTipOverlap": 7.47, - "defaultReturnTipHeight": null, "aspirate": { - "opentrons/opentrons_96_tiprack_300ul/1": [ - [6.190392157, -0.01092438778, 3.1628], - [7.639705882, -0.02712575255, 3.2631], - [10.69666667, 0.0001007939816, 3.0551], - [24.49343137, 0.0003978066956, 3.0519], - [50.0, -1.501363238e-5, 3.062] - ], - "default": [ - [6.190392157, -0.01092438778, 3.1628], - [7.639705882, -0.02712575255, 3.2631], - [10.69666667, 0.0001007939816, 3.0551], - [24.49343137, 0.0003978066956, 3.0519], - [50.0, -1.501363238e-5, 3.062] - ] + "default": { + "1": [ + [6.190392157, -0.01092438778, 3.1628], + [7.639705882, -0.02712575255, 3.2631], + [10.69666667, 0.0001007939816, 3.0551], + [24.49343137, 0.0003978066956, 3.0519], + [50.0, -1.501363238e-5, 3.062] + ] + } }, "dispense": { - "opentrons/opentrons_96_tiprack_300ul/1": [[50.0, 0.0, 3.06368702]], - "default": [[50.0, 0.0, 3.06368702]] - }, - "defaultTipOverlapDictionary": { - "opentrons/opentrons_96_tiprack_300ul/1": 7.47 + "default": { + "1": [[50.0, 0.0, 3.06368702]] + } }, "defaultBlowoutVolume": 4.712 } }, + "defaultTipOverlapDictionary": { + "default": 7.47, + "opentrons/tipone_96_tiprack_200ul/1": 6.1, + "opentrons/opentrons_96_filtertiprack_200ul/1": 7.47, + "opentrons/opentrons_96_tiprack_300ul/1": 7.47 + }, "maxVolume": 50, "minVolume": 5.0, "defaultTipracks": [ diff --git a/shared-data/pipette/definitions/2/liquid/eight_channel/p50/3_0.json b/shared-data/pipette/definitions/2/liquid/eight_channel/p50/3_0.json index e524d458788..1e1bccface9 100644 --- a/shared-data/pipette/definitions/2/liquid/eight_channel/p50/3_0.json +++ b/shared-data/pipette/definitions/2/liquid/eight_channel/p50/3_0.json @@ -2,79 +2,95 @@ "$otSharedSchema": "#/pipette/schemas/2/pipetteLiquidPropertiesSchema.json", "supportedTips": { "t50": { - "defaultAspirateFlowRate": 8, - "defaultDispenseFlowRate": 8, - "defaultBlowOutFlowRate": 4, + "defaultAspirateFlowRate": { + "default": 8, + "valuesByApiLevel": { "2.14": 8 } + }, + "defaultDispenseFlowRate": { + "default": 8, + "valuesByApiLevel": { "2.14": 8 } + }, + "defaultBlowOutFlowRate": { + "default": 4, + "valuesByApiLevel": { "2.14": 4 } + }, "defaultTipLength": 57.9, - "defaultTipOverlap": 10.5, "defaultReturnTipHeight": 0.71, "aspirate": { - "default": [ - [0.6464, 0.4817, 0.0427], - [1.0889, 0.2539, 0.1591], - [1.5136, 0.1624, 0.2587], - [1.9108, 0.1042, 0.3467], - [2.2941, 0.0719, 0.4085], - [2.9978, 0.037, 0.4886], - [3.7731, 0.0378, 0.4863], - [4.7575, 0.0516, 0.4342], - [5.5024, 0.011, 0.6275], - [6.2686, 0.0114, 0.6253], - [7.005, 0.0054, 0.6625], - [8.5207, 0.0063, 0.6563], - [10.0034, 0.003, 0.6844], - [11.5075, 0.0031, 0.6833], - [13.0327, 0.0032, 0.6829], - [14.5356, 0.0018, 0.7003], - [17.5447, 0.0014, 0.7063], - [20.5576, 0.0011, 0.7126], - [23.5624, 0.0007, 0.7197], - [26.5785, 0.0007, 0.721], - [29.593, 0.0005, 0.7248], - [32.6109, 0.0004, 0.7268], - [35.6384, 0.0004, 0.727], - [38.6439, 0.0002, 0.7343], - [41.6815, 0.0004, 0.7284], - [44.6895, 0.0002, 0.7372], - [47.6926, 0.0001, 0.7393], - [51.4567, 0.0001, 0.7382] - ] + "default": { + "1": [ + [0.6464, 0.4817, 0.0427], + [1.0889, 0.2539, 0.1591], + [1.5136, 0.1624, 0.2587], + [1.9108, 0.1042, 0.3467], + [2.2941, 0.0719, 0.4085], + [2.9978, 0.037, 0.4886], + [3.7731, 0.0378, 0.4863], + [4.7575, 0.0516, 0.4342], + [5.5024, 0.011, 0.6275], + [6.2686, 0.0114, 0.6253], + [7.005, 0.0054, 0.6625], + [8.5207, 0.0063, 0.6563], + [10.0034, 0.003, 0.6844], + [11.5075, 0.0031, 0.6833], + [13.0327, 0.0032, 0.6829], + [14.5356, 0.0018, 0.7003], + [17.5447, 0.0014, 0.7063], + [20.5576, 0.0011, 0.7126], + [23.5624, 0.0007, 0.7197], + [26.5785, 0.0007, 0.721], + [29.593, 0.0005, 0.7248], + [32.6109, 0.0004, 0.7268], + [35.6384, 0.0004, 0.727], + [38.6439, 0.0002, 0.7343], + [41.6815, 0.0004, 0.7284], + [44.6895, 0.0002, 0.7372], + [47.6926, 0.0001, 0.7393], + [51.4567, 0.0001, 0.7382] + ] + } }, "dispense": { - "default": [ - [0.6464, 0.4817, 0.0427], - [1.0889, 0.2539, 0.1591], - [1.5136, 0.1624, 0.2587], - [1.9108, 0.1042, 0.3467], - [2.2941, 0.0719, 0.4085], - [2.9978, 0.037, 0.4886], - [3.7731, 0.0378, 0.4863], - [4.7575, 0.0516, 0.4342], - [5.5024, 0.011, 0.6275], - [6.2686, 0.0114, 0.6253], - [7.005, 0.0054, 0.6625], - [8.5207, 0.0063, 0.6563], - [10.0034, 0.003, 0.6844], - [11.5075, 0.0031, 0.6833], - [13.0327, 0.0032, 0.6829], - [14.5356, 0.0018, 0.7003], - [17.5447, 0.0014, 0.7063], - [20.5576, 0.0011, 0.7126], - [23.5624, 0.0007, 0.7197], - [26.5785, 0.0007, 0.721], - [29.593, 0.0005, 0.7248], - [32.6109, 0.0004, 0.7268], - [35.6384, 0.0004, 0.727], - [38.6439, 0.0002, 0.7343], - [41.6815, 0.0004, 0.7284], - [44.6895, 0.0002, 0.7372], - [47.6926, 0.0001, 0.7393], - [51.4567, 0.0001, 0.7382] - ] + "default": { + "1": [ + [0.6464, 0.4817, 0.0427], + [1.0889, 0.2539, 0.1591], + [1.5136, 0.1624, 0.2587], + [1.9108, 0.1042, 0.3467], + [2.2941, 0.0719, 0.4085], + [2.9978, 0.037, 0.4886], + [3.7731, 0.0378, 0.4863], + [4.7575, 0.0516, 0.4342], + [5.5024, 0.011, 0.6275], + [6.2686, 0.0114, 0.6253], + [7.005, 0.0054, 0.6625], + [8.5207, 0.0063, 0.6563], + [10.0034, 0.003, 0.6844], + [11.5075, 0.0031, 0.6833], + [13.0327, 0.0032, 0.6829], + [14.5356, 0.0018, 0.7003], + [17.5447, 0.0014, 0.7063], + [20.5576, 0.0011, 0.7126], + [23.5624, 0.0007, 0.7197], + [26.5785, 0.0007, 0.721], + [29.593, 0.0005, 0.7248], + [32.6109, 0.0004, 0.7268], + [35.6384, 0.0004, 0.727], + [38.6439, 0.0002, 0.7343], + [41.6815, 0.0004, 0.7284], + [44.6895, 0.0002, 0.7372], + [47.6926, 0.0001, 0.7393], + [51.4567, 0.0001, 0.7382] + ] + } }, "defaultBlowoutVolume": 1.5 } }, + "defaultTipOverlapDictionary": { + "default": 10.5, + "opentrons/opentrons_flex_96_tiprack_50ul/1": 10.5 + }, "maxVolume": 50, "minVolume": 0.5, "defaultTipracks": ["opentrons/opentrons_flex_96_tiprack_50ul/1"] diff --git a/shared-data/pipette/definitions/2/liquid/eight_channel/p50/3_3.json b/shared-data/pipette/definitions/2/liquid/eight_channel/p50/3_3.json index e524d458788..1e1bccface9 100644 --- a/shared-data/pipette/definitions/2/liquid/eight_channel/p50/3_3.json +++ b/shared-data/pipette/definitions/2/liquid/eight_channel/p50/3_3.json @@ -2,79 +2,95 @@ "$otSharedSchema": "#/pipette/schemas/2/pipetteLiquidPropertiesSchema.json", "supportedTips": { "t50": { - "defaultAspirateFlowRate": 8, - "defaultDispenseFlowRate": 8, - "defaultBlowOutFlowRate": 4, + "defaultAspirateFlowRate": { + "default": 8, + "valuesByApiLevel": { "2.14": 8 } + }, + "defaultDispenseFlowRate": { + "default": 8, + "valuesByApiLevel": { "2.14": 8 } + }, + "defaultBlowOutFlowRate": { + "default": 4, + "valuesByApiLevel": { "2.14": 4 } + }, "defaultTipLength": 57.9, - "defaultTipOverlap": 10.5, "defaultReturnTipHeight": 0.71, "aspirate": { - "default": [ - [0.6464, 0.4817, 0.0427], - [1.0889, 0.2539, 0.1591], - [1.5136, 0.1624, 0.2587], - [1.9108, 0.1042, 0.3467], - [2.2941, 0.0719, 0.4085], - [2.9978, 0.037, 0.4886], - [3.7731, 0.0378, 0.4863], - [4.7575, 0.0516, 0.4342], - [5.5024, 0.011, 0.6275], - [6.2686, 0.0114, 0.6253], - [7.005, 0.0054, 0.6625], - [8.5207, 0.0063, 0.6563], - [10.0034, 0.003, 0.6844], - [11.5075, 0.0031, 0.6833], - [13.0327, 0.0032, 0.6829], - [14.5356, 0.0018, 0.7003], - [17.5447, 0.0014, 0.7063], - [20.5576, 0.0011, 0.7126], - [23.5624, 0.0007, 0.7197], - [26.5785, 0.0007, 0.721], - [29.593, 0.0005, 0.7248], - [32.6109, 0.0004, 0.7268], - [35.6384, 0.0004, 0.727], - [38.6439, 0.0002, 0.7343], - [41.6815, 0.0004, 0.7284], - [44.6895, 0.0002, 0.7372], - [47.6926, 0.0001, 0.7393], - [51.4567, 0.0001, 0.7382] - ] + "default": { + "1": [ + [0.6464, 0.4817, 0.0427], + [1.0889, 0.2539, 0.1591], + [1.5136, 0.1624, 0.2587], + [1.9108, 0.1042, 0.3467], + [2.2941, 0.0719, 0.4085], + [2.9978, 0.037, 0.4886], + [3.7731, 0.0378, 0.4863], + [4.7575, 0.0516, 0.4342], + [5.5024, 0.011, 0.6275], + [6.2686, 0.0114, 0.6253], + [7.005, 0.0054, 0.6625], + [8.5207, 0.0063, 0.6563], + [10.0034, 0.003, 0.6844], + [11.5075, 0.0031, 0.6833], + [13.0327, 0.0032, 0.6829], + [14.5356, 0.0018, 0.7003], + [17.5447, 0.0014, 0.7063], + [20.5576, 0.0011, 0.7126], + [23.5624, 0.0007, 0.7197], + [26.5785, 0.0007, 0.721], + [29.593, 0.0005, 0.7248], + [32.6109, 0.0004, 0.7268], + [35.6384, 0.0004, 0.727], + [38.6439, 0.0002, 0.7343], + [41.6815, 0.0004, 0.7284], + [44.6895, 0.0002, 0.7372], + [47.6926, 0.0001, 0.7393], + [51.4567, 0.0001, 0.7382] + ] + } }, "dispense": { - "default": [ - [0.6464, 0.4817, 0.0427], - [1.0889, 0.2539, 0.1591], - [1.5136, 0.1624, 0.2587], - [1.9108, 0.1042, 0.3467], - [2.2941, 0.0719, 0.4085], - [2.9978, 0.037, 0.4886], - [3.7731, 0.0378, 0.4863], - [4.7575, 0.0516, 0.4342], - [5.5024, 0.011, 0.6275], - [6.2686, 0.0114, 0.6253], - [7.005, 0.0054, 0.6625], - [8.5207, 0.0063, 0.6563], - [10.0034, 0.003, 0.6844], - [11.5075, 0.0031, 0.6833], - [13.0327, 0.0032, 0.6829], - [14.5356, 0.0018, 0.7003], - [17.5447, 0.0014, 0.7063], - [20.5576, 0.0011, 0.7126], - [23.5624, 0.0007, 0.7197], - [26.5785, 0.0007, 0.721], - [29.593, 0.0005, 0.7248], - [32.6109, 0.0004, 0.7268], - [35.6384, 0.0004, 0.727], - [38.6439, 0.0002, 0.7343], - [41.6815, 0.0004, 0.7284], - [44.6895, 0.0002, 0.7372], - [47.6926, 0.0001, 0.7393], - [51.4567, 0.0001, 0.7382] - ] + "default": { + "1": [ + [0.6464, 0.4817, 0.0427], + [1.0889, 0.2539, 0.1591], + [1.5136, 0.1624, 0.2587], + [1.9108, 0.1042, 0.3467], + [2.2941, 0.0719, 0.4085], + [2.9978, 0.037, 0.4886], + [3.7731, 0.0378, 0.4863], + [4.7575, 0.0516, 0.4342], + [5.5024, 0.011, 0.6275], + [6.2686, 0.0114, 0.6253], + [7.005, 0.0054, 0.6625], + [8.5207, 0.0063, 0.6563], + [10.0034, 0.003, 0.6844], + [11.5075, 0.0031, 0.6833], + [13.0327, 0.0032, 0.6829], + [14.5356, 0.0018, 0.7003], + [17.5447, 0.0014, 0.7063], + [20.5576, 0.0011, 0.7126], + [23.5624, 0.0007, 0.7197], + [26.5785, 0.0007, 0.721], + [29.593, 0.0005, 0.7248], + [32.6109, 0.0004, 0.7268], + [35.6384, 0.0004, 0.727], + [38.6439, 0.0002, 0.7343], + [41.6815, 0.0004, 0.7284], + [44.6895, 0.0002, 0.7372], + [47.6926, 0.0001, 0.7393], + [51.4567, 0.0001, 0.7382] + ] + } }, "defaultBlowoutVolume": 1.5 } }, + "defaultTipOverlapDictionary": { + "default": 10.5, + "opentrons/opentrons_flex_96_tiprack_50ul/1": 10.5 + }, "maxVolume": 50, "minVolume": 0.5, "defaultTipracks": ["opentrons/opentrons_flex_96_tiprack_50ul/1"] diff --git a/shared-data/pipette/definitions/2/liquid/eight_channel/p50/3_4.json b/shared-data/pipette/definitions/2/liquid/eight_channel/p50/3_4.json index a7562c5cbe7..5672590879e 100644 --- a/shared-data/pipette/definitions/2/liquid/eight_channel/p50/3_4.json +++ b/shared-data/pipette/definitions/2/liquid/eight_channel/p50/3_4.json @@ -2,79 +2,95 @@ "$otSharedSchema": "#/pipette/schemas/2/pipetteLiquidPropertiesSchema.json", "supportedTips": { "t50": { - "defaultAspirateFlowRate": 35, - "defaultDispenseFlowRate": 57, - "defaultBlowOutFlowRate": 57, + "defaultAspirateFlowRate": { + "default": 35, + "valuesByApiLevel": { "2.14": 35 } + }, + "defaultDispenseFlowRate": { + "default": 57, + "valuesByApiLevel": { "2.14": 57 } + }, + "defaultBlowOutFlowRate": { + "default": 57, + "valuesByApiLevel": { "2.14": 57 } + }, "defaultTipLength": 57.9, - "defaultTipOverlap": 10.5, "defaultReturnTipHeight": 0.71, "aspirate": { - "default": [ - [0.6464, 0.4817, 0.0427], - [1.0889, 0.2539, 0.1591], - [1.5136, 0.1624, 0.2587], - [1.9108, 0.1042, 0.3467], - [2.2941, 0.0719, 0.4085], - [2.9978, 0.037, 0.4886], - [3.7731, 0.0378, 0.4863], - [4.7575, 0.0516, 0.4342], - [5.5024, 0.011, 0.6275], - [6.2686, 0.0114, 0.6253], - [7.005, 0.0054, 0.6625], - [8.5207, 0.0063, 0.6563], - [10.0034, 0.003, 0.6844], - [11.5075, 0.0031, 0.6833], - [13.0327, 0.0032, 0.6829], - [14.5356, 0.0018, 0.7003], - [17.5447, 0.0014, 0.7063], - [20.5576, 0.0011, 0.7126], - [23.5624, 0.0007, 0.7197], - [26.5785, 0.0007, 0.721], - [29.593, 0.0005, 0.7248], - [32.6109, 0.0004, 0.7268], - [35.6384, 0.0004, 0.727], - [38.6439, 0.0002, 0.7343], - [41.6815, 0.0004, 0.7284], - [44.6895, 0.0002, 0.7372], - [47.6926, 0.0001, 0.7393], - [51.4567, 0.0001, 0.7382] - ] + "default": { + "1": [ + [0.6464, 0.4817, 0.0427], + [1.0889, 0.2539, 0.1591], + [1.5136, 0.1624, 0.2587], + [1.9108, 0.1042, 0.3467], + [2.2941, 0.0719, 0.4085], + [2.9978, 0.037, 0.4886], + [3.7731, 0.0378, 0.4863], + [4.7575, 0.0516, 0.4342], + [5.5024, 0.011, 0.6275], + [6.2686, 0.0114, 0.6253], + [7.005, 0.0054, 0.6625], + [8.5207, 0.0063, 0.6563], + [10.0034, 0.003, 0.6844], + [11.5075, 0.0031, 0.6833], + [13.0327, 0.0032, 0.6829], + [14.5356, 0.0018, 0.7003], + [17.5447, 0.0014, 0.7063], + [20.5576, 0.0011, 0.7126], + [23.5624, 0.0007, 0.7197], + [26.5785, 0.0007, 0.721], + [29.593, 0.0005, 0.7248], + [32.6109, 0.0004, 0.7268], + [35.6384, 0.0004, 0.727], + [38.6439, 0.0002, 0.7343], + [41.6815, 0.0004, 0.7284], + [44.6895, 0.0002, 0.7372], + [47.6926, 0.0001, 0.7393], + [51.4567, 0.0001, 0.7382] + ] + } }, "dispense": { - "default": [ - [0.6464, 0.4817, 0.0427], - [1.0889, 0.2539, 0.1591], - [1.5136, 0.1624, 0.2587], - [1.9108, 0.1042, 0.3467], - [2.2941, 0.0719, 0.4085], - [2.9978, 0.037, 0.4886], - [3.7731, 0.0378, 0.4863], - [4.7575, 0.0516, 0.4342], - [5.5024, 0.011, 0.6275], - [6.2686, 0.0114, 0.6253], - [7.005, 0.0054, 0.6625], - [8.5207, 0.0063, 0.6563], - [10.0034, 0.003, 0.6844], - [11.5075, 0.0031, 0.6833], - [13.0327, 0.0032, 0.6829], - [14.5356, 0.0018, 0.7003], - [17.5447, 0.0014, 0.7063], - [20.5576, 0.0011, 0.7126], - [23.5624, 0.0007, 0.7197], - [26.5785, 0.0007, 0.721], - [29.593, 0.0005, 0.7248], - [32.6109, 0.0004, 0.7268], - [35.6384, 0.0004, 0.727], - [38.6439, 0.0002, 0.7343], - [41.6815, 0.0004, 0.7284], - [44.6895, 0.0002, 0.7372], - [47.6926, 0.0001, 0.7393], - [51.4567, 0.0001, 0.7382] - ] + "default": { + "1": [ + [0.6464, 0.4817, 0.0427], + [1.0889, 0.2539, 0.1591], + [1.5136, 0.1624, 0.2587], + [1.9108, 0.1042, 0.3467], + [2.2941, 0.0719, 0.4085], + [2.9978, 0.037, 0.4886], + [3.7731, 0.0378, 0.4863], + [4.7575, 0.0516, 0.4342], + [5.5024, 0.011, 0.6275], + [6.2686, 0.0114, 0.6253], + [7.005, 0.0054, 0.6625], + [8.5207, 0.0063, 0.6563], + [10.0034, 0.003, 0.6844], + [11.5075, 0.0031, 0.6833], + [13.0327, 0.0032, 0.6829], + [14.5356, 0.0018, 0.7003], + [17.5447, 0.0014, 0.7063], + [20.5576, 0.0011, 0.7126], + [23.5624, 0.0007, 0.7197], + [26.5785, 0.0007, 0.721], + [29.593, 0.0005, 0.7248], + [32.6109, 0.0004, 0.7268], + [35.6384, 0.0004, 0.727], + [38.6439, 0.0002, 0.7343], + [41.6815, 0.0004, 0.7284], + [44.6895, 0.0002, 0.7372], + [47.6926, 0.0001, 0.7393], + [51.4567, 0.0001, 0.7382] + ] + } }, "defaultBlowoutVolume": 1.5 } }, + "defaultTipOverlapDictionary": { + "default": 10.5, + "opentrons/opentrons_flex_96_tiprack_50ul/1": 10.5 + }, "maxVolume": 50, "minVolume": 0.5, "defaultTipracks": ["opentrons/opentrons_flex_96_tiprack_50ul/1"] diff --git a/shared-data/pipette/definitions/2/liquid/eight_channel/p50/3_5.json b/shared-data/pipette/definitions/2/liquid/eight_channel/p50/3_5.json new file mode 100644 index 00000000000..5672590879e --- /dev/null +++ b/shared-data/pipette/definitions/2/liquid/eight_channel/p50/3_5.json @@ -0,0 +1,97 @@ +{ + "$otSharedSchema": "#/pipette/schemas/2/pipetteLiquidPropertiesSchema.json", + "supportedTips": { + "t50": { + "defaultAspirateFlowRate": { + "default": 35, + "valuesByApiLevel": { "2.14": 35 } + }, + "defaultDispenseFlowRate": { + "default": 57, + "valuesByApiLevel": { "2.14": 57 } + }, + "defaultBlowOutFlowRate": { + "default": 57, + "valuesByApiLevel": { "2.14": 57 } + }, + "defaultTipLength": 57.9, + "defaultReturnTipHeight": 0.71, + "aspirate": { + "default": { + "1": [ + [0.6464, 0.4817, 0.0427], + [1.0889, 0.2539, 0.1591], + [1.5136, 0.1624, 0.2587], + [1.9108, 0.1042, 0.3467], + [2.2941, 0.0719, 0.4085], + [2.9978, 0.037, 0.4886], + [3.7731, 0.0378, 0.4863], + [4.7575, 0.0516, 0.4342], + [5.5024, 0.011, 0.6275], + [6.2686, 0.0114, 0.6253], + [7.005, 0.0054, 0.6625], + [8.5207, 0.0063, 0.6563], + [10.0034, 0.003, 0.6844], + [11.5075, 0.0031, 0.6833], + [13.0327, 0.0032, 0.6829], + [14.5356, 0.0018, 0.7003], + [17.5447, 0.0014, 0.7063], + [20.5576, 0.0011, 0.7126], + [23.5624, 0.0007, 0.7197], + [26.5785, 0.0007, 0.721], + [29.593, 0.0005, 0.7248], + [32.6109, 0.0004, 0.7268], + [35.6384, 0.0004, 0.727], + [38.6439, 0.0002, 0.7343], + [41.6815, 0.0004, 0.7284], + [44.6895, 0.0002, 0.7372], + [47.6926, 0.0001, 0.7393], + [51.4567, 0.0001, 0.7382] + ] + } + }, + "dispense": { + "default": { + "1": [ + [0.6464, 0.4817, 0.0427], + [1.0889, 0.2539, 0.1591], + [1.5136, 0.1624, 0.2587], + [1.9108, 0.1042, 0.3467], + [2.2941, 0.0719, 0.4085], + [2.9978, 0.037, 0.4886], + [3.7731, 0.0378, 0.4863], + [4.7575, 0.0516, 0.4342], + [5.5024, 0.011, 0.6275], + [6.2686, 0.0114, 0.6253], + [7.005, 0.0054, 0.6625], + [8.5207, 0.0063, 0.6563], + [10.0034, 0.003, 0.6844], + [11.5075, 0.0031, 0.6833], + [13.0327, 0.0032, 0.6829], + [14.5356, 0.0018, 0.7003], + [17.5447, 0.0014, 0.7063], + [20.5576, 0.0011, 0.7126], + [23.5624, 0.0007, 0.7197], + [26.5785, 0.0007, 0.721], + [29.593, 0.0005, 0.7248], + [32.6109, 0.0004, 0.7268], + [35.6384, 0.0004, 0.727], + [38.6439, 0.0002, 0.7343], + [41.6815, 0.0004, 0.7284], + [44.6895, 0.0002, 0.7372], + [47.6926, 0.0001, 0.7393], + [51.4567, 0.0001, 0.7382] + ] + } + }, + "defaultBlowoutVolume": 1.5 + } + }, + "defaultTipOverlapDictionary": { + "default": 10.5, + "opentrons/opentrons_flex_96_tiprack_50ul/1": 10.5 + }, + "maxVolume": 50, + "minVolume": 0.5, + "defaultTipracks": ["opentrons/opentrons_flex_96_tiprack_50ul/1"] +} diff --git a/shared-data/pipette/definitions/2/liquid/ninety_six_channel/p1000/1_0.json b/shared-data/pipette/definitions/2/liquid/ninety_six_channel/p1000/1_0.json index c9059c84ab1..45870070b5f 100644 --- a/shared-data/pipette/definitions/2/liquid/ninety_six_channel/p1000/1_0.json +++ b/shared-data/pipette/definitions/2/liquid/ninety_six_channel/p1000/1_0.json @@ -2,305 +2,365 @@ "$otSharedSchema": "#/pipette/schemas/2/pipetteLiquidPropertiesSchema.json", "supportedTips": { "t50": { - "defaultAspirateFlowRate": 6, - "defaultDispenseFlowRate": 6, - "defaultBlowOutFlowRate": 80, + "defaultAspirateFlowRate": { + "default": 6, + "valuesByApiLevel": { + "2.14": 6 + } + }, + "defaultDispenseFlowRate": { + "default": 6, + "valuesByApiLevel": { + "2.14": 6 + } + }, + "defaultBlowOutFlowRate": { + "default": 80, + "valuesByApiLevel": { + "2.14": 80 + } + }, "defaultTipLength": 57.9, - "defaultTipOverlap": 10.5, "defaultReturnTipHeight": 0.2, "aspirate": { - "default": [ - [0.4148, -1705.1015, 20.5455], - [0.4476, -80.633, 47.2788], - [0.5512, -1.5936, 11.9026], - [0.6027, -18.9998, 21.4972], - [0.6503, -15.8781, 19.6156], - [0.7733, 3.0612, 7.2993], - [0.8391, -5.2227, 13.7056], - [0.9736, 3.0706, 6.7467], - [1.16, -0.374, 10.1005], - [1.3964, 1.3004, 8.1582], - [1.5815, -0.4837, 10.6494], - [1.8306, 1.1464, 8.0714], - [2.0345, 0.0132, 10.1459], - [2.6221, 0.5374, 9.0794], - [2.9655, -1.7582, 15.0986], - [3.5124, 0.2754, 9.0681], - [4.6591, 1.406, 5.097], - [5.367, 0.394, 9.8123], - [6.0839, 0.3365, 10.1205], - [6.8312, 0.3379, 10.1121], - [7.5676, 0.2611, 10.637], - [8.2397, 0.095, 11.8939], - [8.9776, 0.2015, 11.0165], - [10.413, 0.1332, 11.6294], - [11.8539, 0.1074, 11.8979], - [13.3655, 0.1286, 11.6464], - [14.8236, 0.0758, 12.3519], - [16.3203, 0.083, 12.2457], - [17.7915, 0.0581, 12.6515], - [19.2145, 0.0273, 13.1995], - [20.6718, 0.0388, 12.9792], - [22.1333, 0.0357, 13.044], - [25.0761, 0.0332, 13.0977], - [28.0339, 0.029, 13.2035], - [30.967, 0.0201, 13.4538], - [33.8727, 0.013, 13.6737], - [36.8273, 0.0172, 13.5324], - [39.7594, 0.0121, 13.7191], - [42.6721, 0.0083, 13.8687], - [45.5964, 0.0085, 13.8618], - [48.5297, 0.0084, 13.8668], - [51.4512, 0.0064, 13.9651] - ] + "default": { + "1": [ + [0.4148, -1705.1015, 20.5455], + [0.4476, -80.633, 47.2788], + [0.5512, -1.5936, 11.9026], + [0.6027, -18.9998, 21.4972], + [0.6503, -15.8781, 19.6156], + [0.7733, 3.0612, 7.2993], + [0.8391, -5.2227, 13.7056], + [0.9736, 3.0706, 6.7467], + [1.16, -0.374, 10.1005], + [1.3964, 1.3004, 8.1582], + [1.5815, -0.4837, 10.6494], + [1.8306, 1.1464, 8.0714], + [2.0345, 0.0132, 10.1459], + [2.6221, 0.5374, 9.0794], + [2.9655, -1.7582, 15.0986], + [3.5124, 0.2754, 9.0681], + [4.6591, 1.406, 5.097], + [5.367, 0.394, 9.8123], + [6.0839, 0.3365, 10.1205], + [6.8312, 0.3379, 10.1121], + [7.5676, 0.2611, 10.637], + [8.2397, 0.095, 11.8939], + [8.9776, 0.2015, 11.0165], + [10.413, 0.1332, 11.6294], + [11.8539, 0.1074, 11.8979], + [13.3655, 0.1286, 11.6464], + [14.8236, 0.0758, 12.3519], + [16.3203, 0.083, 12.2457], + [17.7915, 0.0581, 12.6515], + [19.2145, 0.0273, 13.1995], + [20.6718, 0.0388, 12.9792], + [22.1333, 0.0357, 13.044], + [25.0761, 0.0332, 13.0977], + [28.0339, 0.029, 13.2035], + [30.967, 0.0201, 13.4538], + [33.8727, 0.013, 13.6737], + [36.8273, 0.0172, 13.5324], + [39.7594, 0.0121, 13.7191], + [42.6721, 0.0083, 13.8687], + [45.5964, 0.0085, 13.8618], + [48.5297, 0.0084, 13.8668], + [51.4512, 0.0064, 13.9651] + ] + } }, "dispense": { - "default": [ - [0.4148, -1705.1015, 20.5455], - [0.4476, -80.633, 47.2788], - [0.5512, -1.5936, 11.9026], - [0.6027, -18.9998, 21.4972], - [0.6503, -15.8781, 19.6156], - [0.7733, 3.0612, 7.2993], - [0.8391, -5.2227, 13.7056], - [0.9736, 3.0706, 6.7467], - [1.16, -0.374, 10.1005], - [1.3964, 1.3004, 8.1582], - [1.5815, -0.4837, 10.6494], - [1.8306, 1.1464, 8.0714], - [2.0345, 0.0132, 10.1459], - [2.6221, 0.5374, 9.0794], - [2.9655, -1.7582, 15.0986], - [3.5124, 0.2754, 9.0681], - [4.6591, 1.406, 5.097], - [5.367, 0.394, 9.8123], - [6.0839, 0.3365, 10.1205], - [6.8312, 0.3379, 10.1121], - [7.5676, 0.2611, 10.637], - [8.2397, 0.095, 11.8939], - [8.9776, 0.2015, 11.0165], - [10.413, 0.1332, 11.6294], - [11.8539, 0.1074, 11.8979], - [13.3655, 0.1286, 11.6464], - [14.8236, 0.0758, 12.3519], - [16.3203, 0.083, 12.2457], - [17.7915, 0.0581, 12.6515], - [19.2145, 0.0273, 13.1995], - [20.6718, 0.0388, 12.9792], - [22.1333, 0.0357, 13.044], - [25.0761, 0.0332, 13.0977], - [28.0339, 0.029, 13.2035], - [30.967, 0.0201, 13.4538], - [33.8727, 0.013, 13.6737], - [36.8273, 0.0172, 13.5324], - [39.7594, 0.0121, 13.7191], - [42.6721, 0.0083, 13.8687], - [45.5964, 0.0085, 13.8618], - [48.5297, 0.0084, 13.8668], - [51.4512, 0.0064, 13.9651] - ] + "default": { + "1": [ + [0.4148, -1705.1015, 20.5455], + [0.4476, -80.633, 47.2788], + [0.5512, -1.5936, 11.9026], + [0.6027, -18.9998, 21.4972], + [0.6503, -15.8781, 19.6156], + [0.7733, 3.0612, 7.2993], + [0.8391, -5.2227, 13.7056], + [0.9736, 3.0706, 6.7467], + [1.16, -0.374, 10.1005], + [1.3964, 1.3004, 8.1582], + [1.5815, -0.4837, 10.6494], + [1.8306, 1.1464, 8.0714], + [2.0345, 0.0132, 10.1459], + [2.6221, 0.5374, 9.0794], + [2.9655, -1.7582, 15.0986], + [3.5124, 0.2754, 9.0681], + [4.6591, 1.406, 5.097], + [5.367, 0.394, 9.8123], + [6.0839, 0.3365, 10.1205], + [6.8312, 0.3379, 10.1121], + [7.5676, 0.2611, 10.637], + [8.2397, 0.095, 11.8939], + [8.9776, 0.2015, 11.0165], + [10.413, 0.1332, 11.6294], + [11.8539, 0.1074, 11.8979], + [13.3655, 0.1286, 11.6464], + [14.8236, 0.0758, 12.3519], + [16.3203, 0.083, 12.2457], + [17.7915, 0.0581, 12.6515], + [19.2145, 0.0273, 13.1995], + [20.6718, 0.0388, 12.9792], + [22.1333, 0.0357, 13.044], + [25.0761, 0.0332, 13.0977], + [28.0339, 0.029, 13.2035], + [30.967, 0.0201, 13.4538], + [33.8727, 0.013, 13.6737], + [36.8273, 0.0172, 13.5324], + [39.7594, 0.0121, 13.7191], + [42.6721, 0.0083, 13.8687], + [45.5964, 0.0085, 13.8618], + [48.5297, 0.0084, 13.8668], + [51.4512, 0.0064, 13.9651] + ] + } }, "defaultBlowoutVolume": -318.086 }, "t200": { - "defaultAspirateFlowRate": 80, - "defaultDispenseFlowRate": 80, - "defaultBlowOutFlowRate": 80, + "defaultAspirateFlowRate": { + "default": 80, + "valuesByApiLevel": { + "2.14": 80 + } + }, + "defaultDispenseFlowRate": { + "default": 80, + "valuesByApiLevel": { + "2.14": 80 + } + }, + "defaultBlowOutFlowRate": { + "default": 80, + "valuesByApiLevel": { + "2.14": 80 + } + }, "defaultTipLength": 58.35, - "defaultTipOverlap": 10.5, "defaultReturnTipHeight": 0.2, "aspirate": { - "default": [ - [0.8314, -2.9322, 24.0741], - [0.8853, -30.0996, 48.7784], - [0.9778, -4.3627, 25.9941], - [0.975, 802.2301, -762.6744], - [1.1272, -4.6837, 24.0666], - [1.2747, -3.91, 23.1945], - [1.5656, -2.8032, 21.7836], - [1.6667, -7.2039, 28.6731], - [2.4403, -0.5147, 17.5244], - [3.0564, -1.6013, 20.1761], - [3.6444, -1.1974, 18.9418], - [4.1189, -1.7877, 21.0928], - [4.6467, -0.8591, 17.2684], - [5.2597, -0.207, 14.2379], - [5.8581, -0.2196, 14.3044], - [6.4772, -0.1025, 13.6183], - [7.8158, 0.0537, 12.6063], - [9.1664, 0.0507, 12.6302], - [10.5064, 0.0285, 12.8339], - [14.8361, 0.0818, 12.273], - [19.3933, 0.0801, 12.2991], - [23.9242, 0.0487, 12.9079], - [28.4922, 0.0379, 13.1666], - [36.145, 0.0277, 13.4572], - [43.7972, 0.0184, 13.7916], - [51.5125, 0.0154, 13.9248], - [59.2467, 0.0121, 14.0931], - [66.9428, 0.0084, 14.3151], - [74.6853, 0.0079, 14.3498], - [82.3722, 0.0052, 14.5512], - [90.1106, 0.0054, 14.5333], - [97.8369, 0.0043, 14.6288], - [105.6153, 0.0046, 14.5983], - [113.3686, 0.0036, 14.7076], - [121.1108, 0.003, 14.7785], - [136.61, 0.0026, 14.826], - [152.0708, 0.0018, 14.9298], - [167.6433, 0.0021, 14.8827], - [183.1011, 0.0012, 15.0438], - [198.5845, 0.0011, 15.0538], - [214.0264, 0.0008, 15.123] - ] + "default": { + "1": [ + [0.8314, -2.9322, 24.0741], + [0.8853, -30.0996, 48.7784], + [0.9778, -4.3627, 25.9941], + [0.975, 802.2301, -762.6744], + [1.1272, -4.6837, 24.0666], + [1.2747, -3.91, 23.1945], + [1.5656, -2.8032, 21.7836], + [1.6667, -7.2039, 28.6731], + [2.4403, -0.5147, 17.5244], + [3.0564, -1.6013, 20.1761], + [3.6444, -1.1974, 18.9418], + [4.1189, -1.7877, 21.0928], + [4.6467, -0.8591, 17.2684], + [5.2597, -0.207, 14.2379], + [5.8581, -0.2196, 14.3044], + [6.4772, -0.1025, 13.6183], + [7.8158, 0.0537, 12.6063], + [9.1664, 0.0507, 12.6302], + [10.5064, 0.0285, 12.8339], + [14.8361, 0.0818, 12.273], + [19.3933, 0.0801, 12.2991], + [23.9242, 0.0487, 12.9079], + [28.4922, 0.0379, 13.1666], + [36.145, 0.0277, 13.4572], + [43.7972, 0.0184, 13.7916], + [51.5125, 0.0154, 13.9248], + [59.2467, 0.0121, 14.0931], + [66.9428, 0.0084, 14.3151], + [74.6853, 0.0079, 14.3498], + [82.3722, 0.0052, 14.5512], + [90.1106, 0.0054, 14.5333], + [97.8369, 0.0043, 14.6288], + [105.6153, 0.0046, 14.5983], + [113.3686, 0.0036, 14.7076], + [121.1108, 0.003, 14.7785], + [136.61, 0.0026, 14.826], + [152.0708, 0.0018, 14.9298], + [167.6433, 0.0021, 14.8827], + [183.1011, 0.0012, 15.0438], + [198.5845, 0.0011, 15.0538], + [214.0264, 0.0008, 15.123] + ] + } }, "dispense": { - "default": [ - [0.8314, -2.9322, 24.0741], - [0.8853, -30.0996, 48.7784], - [0.9778, -4.3627, 25.9941], - [0.975, 802.2301, -762.6744], - [1.1272, -4.6837, 24.0666], - [1.2747, -3.91, 23.1945], - [1.5656, -2.8032, 21.7836], - [1.6667, -7.2039, 28.6731], - [2.4403, -0.5147, 17.5244], - [3.0564, -1.6013, 20.1761], - [3.6444, -1.1974, 18.9418], - [4.1189, -1.7877, 21.0928], - [4.6467, -0.8591, 17.2684], - [5.2597, -0.207, 14.2379], - [5.8581, -0.2196, 14.3044], - [6.4772, -0.1025, 13.6183], - [7.8158, 0.0537, 12.6063], - [9.1664, 0.0507, 12.6302], - [10.5064, 0.0285, 12.8339], - [14.8361, 0.0818, 12.273], - [19.3933, 0.0801, 12.2991], - [23.9242, 0.0487, 12.9079], - [28.4922, 0.0379, 13.1666], - [36.145, 0.0277, 13.4572], - [43.7972, 0.0184, 13.7916], - [51.5125, 0.0154, 13.9248], - [59.2467, 0.0121, 14.0931], - [66.9428, 0.0084, 14.3151], - [74.6853, 0.0079, 14.3498], - [82.3722, 0.0052, 14.5512], - [90.1106, 0.0054, 14.5333], - [97.8369, 0.0043, 14.6288], - [105.6153, 0.0046, 14.5983], - [113.3686, 0.0036, 14.7076], - [121.1108, 0.003, 14.7785], - [136.61, 0.0026, 14.826], - [152.0708, 0.0018, 14.9298], - [167.6433, 0.0021, 14.8827], - [183.1011, 0.0012, 15.0438], - [198.5845, 0.0011, 15.0538], - [214.0264, 0.0008, 15.123] - ] + "default": { + "1": [ + [0.8314, -2.9322, 24.0741], + [0.8853, -30.0996, 48.7784], + [0.9778, -4.3627, 25.9941], + [0.975, 802.2301, -762.6744], + [1.1272, -4.6837, 24.0666], + [1.2747, -3.91, 23.1945], + [1.5656, -2.8032, 21.7836], + [1.6667, -7.2039, 28.6731], + [2.4403, -0.5147, 17.5244], + [3.0564, -1.6013, 20.1761], + [3.6444, -1.1974, 18.9418], + [4.1189, -1.7877, 21.0928], + [4.6467, -0.8591, 17.2684], + [5.2597, -0.207, 14.2379], + [5.8581, -0.2196, 14.3044], + [6.4772, -0.1025, 13.6183], + [7.8158, 0.0537, 12.6063], + [9.1664, 0.0507, 12.6302], + [10.5064, 0.0285, 12.8339], + [14.8361, 0.0818, 12.273], + [19.3933, 0.0801, 12.2991], + [23.9242, 0.0487, 12.9079], + [28.4922, 0.0379, 13.1666], + [36.145, 0.0277, 13.4572], + [43.7972, 0.0184, 13.7916], + [51.5125, 0.0154, 13.9248], + [59.2467, 0.0121, 14.0931], + [66.9428, 0.0084, 14.3151], + [74.6853, 0.0079, 14.3498], + [82.3722, 0.0052, 14.5512], + [90.1106, 0.0054, 14.5333], + [97.8369, 0.0043, 14.6288], + [105.6153, 0.0046, 14.5983], + [113.3686, 0.0036, 14.7076], + [121.1108, 0.003, 14.7785], + [136.61, 0.0026, 14.826], + [152.0708, 0.0018, 14.9298], + [167.6433, 0.0021, 14.8827], + [183.1011, 0.0012, 15.0438], + [198.5845, 0.0011, 15.0538], + [214.0264, 0.0008, 15.123] + ] + } }, "defaultBlowoutVolume": -318.086 }, "t1000": { - "defaultAspirateFlowRate": 160, - "defaultDispenseFlowRate": 160, - "defaultBlowOutFlowRate": 80, + "defaultAspirateFlowRate": { + "default": 160, + "valuesByApiLevel": { + "2.14": 160 + } + }, + "defaultDispenseFlowRate": { + "default": 160, + "valuesByApiLevel": { + "2.14": 160 + } + }, + "defaultBlowOutFlowRate": { + "default": 80, + "valuesByApiLevel": { + "2.14": 80 + } + }, "defaultTipLength": 95.6, - "defaultTipOverlap": 10.5, "defaultReturnTipHeight": 0.2, "aspirate": { - "default": [ - [0.7511, 3.9556, 6.455], - [1.3075, 2.1664, 5.8839], - [1.8737, 1.1513, 7.2111], - [3.177, 0.9374, 7.612], - [4.5368, 0.5531, 8.8328], - [7.3103, 0.3035, 9.9651], - [10.0825, 0.1513, 11.0781], - [12.9776, 0.1293, 11.2991], - [15.9173, 0.0976, 11.7115], - [18.8243, 0.0624, 12.2706], - [21.8529, 0.07, 12.1275], - [24.8068, 0.0418, 12.7442], - [27.7744, 0.0356, 12.8984], - [35.2873, 0.0303, 13.0454], - [42.7989, 0.0202, 13.4038], - [50.4562, 0.0196, 13.4293], - [58.1081, 0.0145, 13.6843], - [65.7267, 0.0104, 13.9252], - [73.2857, 0.0068, 14.1606], - [81.0016, 0.0091, 13.9883], - [88.6617, 0.0064, 14.2052], - [103.9829, 0.0051, 14.3271], - [119.4408, 0.0049, 14.3475], - [134.889, 0.0037, 14.485], - [150.273, 0.0026, 14.6402], - [181.2798, 0.0026, 14.6427], - [212.4724, 0.0022, 14.7002], - [243.577, 0.0015, 14.8558], - [274.7216, 0.0012, 14.9205], - [305.8132, 0.0009, 15.0118], - [368.0697, 0.0007, 15.0668], - [430.2513, 0.0005, 15.1594], - [492.3487, 0.0003, 15.2291], - [554.5713, 0.0003, 15.2367], - [616.6825, 0.0002, 15.2949], - [694.4168, 0.0002, 15.3027], - [772.0327, 0.0001, 15.3494], - [849.617, 0.0001, 15.3717], - [927.2556, 0.0001, 15.3745], - [1004.87, 0.0001, 15.3912], - [1051.4648, 0.0001, 15.391] - ] + "default": { + "1": [ + [0.7511, 3.9556, 6.455], + [1.3075, 2.1664, 5.8839], + [1.8737, 1.1513, 7.2111], + [3.177, 0.9374, 7.612], + [4.5368, 0.5531, 8.8328], + [7.3103, 0.3035, 9.9651], + [10.0825, 0.1513, 11.0781], + [12.9776, 0.1293, 11.2991], + [15.9173, 0.0976, 11.7115], + [18.8243, 0.0624, 12.2706], + [21.8529, 0.07, 12.1275], + [24.8068, 0.0418, 12.7442], + [27.7744, 0.0356, 12.8984], + [35.2873, 0.0303, 13.0454], + [42.7989, 0.0202, 13.4038], + [50.4562, 0.0196, 13.4293], + [58.1081, 0.0145, 13.6843], + [65.7267, 0.0104, 13.9252], + [73.2857, 0.0068, 14.1606], + [81.0016, 0.0091, 13.9883], + [88.6617, 0.0064, 14.2052], + [103.9829, 0.0051, 14.3271], + [119.4408, 0.0049, 14.3475], + [134.889, 0.0037, 14.485], + [150.273, 0.0026, 14.6402], + [181.2798, 0.0026, 14.6427], + [212.4724, 0.0022, 14.7002], + [243.577, 0.0015, 14.8558], + [274.7216, 0.0012, 14.9205], + [305.8132, 0.0009, 15.0118], + [368.0697, 0.0007, 15.0668], + [430.2513, 0.0005, 15.1594], + [492.3487, 0.0003, 15.2291], + [554.5713, 0.0003, 15.2367], + [616.6825, 0.0002, 15.2949], + [694.4168, 0.0002, 15.3027], + [772.0327, 0.0001, 15.3494], + [849.617, 0.0001, 15.3717], + [927.2556, 0.0001, 15.3745], + [1004.87, 0.0001, 15.3912], + [1051.4648, 0.0001, 15.391] + ] + } }, "dispense": { - "default": [ - [0.7511, 3.9556, 6.455], - [1.3075, 2.1664, 5.8839], - [1.8737, 1.1513, 7.2111], - [3.177, 0.9374, 7.612], - [4.5368, 0.5531, 8.8328], - [7.3103, 0.3035, 9.9651], - [10.0825, 0.1513, 11.0781], - [12.9776, 0.1293, 11.2991], - [15.9173, 0.0976, 11.7115], - [18.8243, 0.0624, 12.2706], - [21.8529, 0.07, 12.1275], - [24.8068, 0.0418, 12.7442], - [27.7744, 0.0356, 12.8984], - [35.2873, 0.0303, 13.0454], - [42.7989, 0.0202, 13.4038], - [50.4562, 0.0196, 13.4293], - [58.1081, 0.0145, 13.6843], - [65.7267, 0.0104, 13.9252], - [73.2857, 0.0068, 14.1606], - [81.0016, 0.0091, 13.9883], - [88.6617, 0.0064, 14.2052], - [103.9829, 0.0051, 14.3271], - [119.4408, 0.0049, 14.3475], - [134.889, 0.0037, 14.485], - [150.273, 0.0026, 14.6402], - [181.2798, 0.0026, 14.6427], - [212.4724, 0.0022, 14.7002], - [243.577, 0.0015, 14.8558], - [274.7216, 0.0012, 14.9205], - [305.8132, 0.0009, 15.0118], - [368.0697, 0.0007, 15.0668], - [430.2513, 0.0005, 15.1594], - [492.3487, 0.0003, 15.2291], - [554.5713, 0.0003, 15.2367], - [616.6825, 0.0002, 15.2949], - [694.4168, 0.0002, 15.3027], - [772.0327, 0.0001, 15.3494], - [849.617, 0.0001, 15.3717], - [927.2556, 0.0001, 15.3745], - [1004.87, 0.0001, 15.3912], - [1051.4648, 0.0001, 15.391] - ] + "default": { + "1": [ + [0.7511, 3.9556, 6.455], + [1.3075, 2.1664, 5.8839], + [1.8737, 1.1513, 7.2111], + [3.177, 0.9374, 7.612], + [4.5368, 0.5531, 8.8328], + [7.3103, 0.3035, 9.9651], + [10.0825, 0.1513, 11.0781], + [12.9776, 0.1293, 11.2991], + [15.9173, 0.0976, 11.7115], + [18.8243, 0.0624, 12.2706], + [21.8529, 0.07, 12.1275], + [24.8068, 0.0418, 12.7442], + [27.7744, 0.0356, 12.8984], + [35.2873, 0.0303, 13.0454], + [42.7989, 0.0202, 13.4038], + [50.4562, 0.0196, 13.4293], + [58.1081, 0.0145, 13.6843], + [65.7267, 0.0104, 13.9252], + [73.2857, 0.0068, 14.1606], + [81.0016, 0.0091, 13.9883], + [88.6617, 0.0064, 14.2052], + [103.9829, 0.0051, 14.3271], + [119.4408, 0.0049, 14.3475], + [134.889, 0.0037, 14.485], + [150.273, 0.0026, 14.6402], + [181.2798, 0.0026, 14.6427], + [212.4724, 0.0022, 14.7002], + [243.577, 0.0015, 14.8558], + [274.7216, 0.0012, 14.9205], + [305.8132, 0.0009, 15.0118], + [368.0697, 0.0007, 15.0668], + [430.2513, 0.0005, 15.1594], + [492.3487, 0.0003, 15.2291], + [554.5713, 0.0003, 15.2367], + [616.6825, 0.0002, 15.2949], + [694.4168, 0.0002, 15.3027], + [772.0327, 0.0001, 15.3494], + [849.617, 0.0001, 15.3717], + [927.2556, 0.0001, 15.3745], + [1004.87, 0.0001, 15.3912], + [1051.4648, 0.0001, 15.391] + ] + } }, "defaultBlowoutVolume": -318.086 } }, + "defaultTipOverlapDictionary": { + "default": 10.5, + "opentrons/opentrons_flex_96_tiprack_50ul/1": 10.5, + "opentrons/opentrons_flex_96_tiprack_1000ul/1": 10.5, + "opentrons/opentrons_flex_96_tiprack_200ul/1": 10.5 + }, "maxVolume": 1000, "minVolume": 1, "defaultTipracks": [ diff --git a/shared-data/pipette/definitions/2/liquid/ninety_six_channel/p1000/3_0.json b/shared-data/pipette/definitions/2/liquid/ninety_six_channel/p1000/3_0.json index 14477b24375..297569c16e5 100644 --- a/shared-data/pipette/definitions/2/liquid/ninety_six_channel/p1000/3_0.json +++ b/shared-data/pipette/definitions/2/liquid/ninety_six_channel/p1000/3_0.json @@ -2,305 +2,365 @@ "$otSharedSchema": "#/pipette/schemas/2/pipetteLiquidPropertiesSchema.json", "supportedTips": { "t50": { - "defaultAspirateFlowRate": 6, - "defaultDispenseFlowRate": 6, - "defaultBlowOutFlowRate": 80, + "defaultAspirateFlowRate": { + "default": 6, + "valuesByApiLevel": { + "2.14": 6 + } + }, + "defaultDispenseFlowRate": { + "default": 6, + "valuesByApiLevel": { + "2.14": 6 + } + }, + "defaultBlowOutFlowRate": { + "default": 80, + "valuesByApiLevel": { + "2.14": 80 + } + }, "defaultTipLength": 57.9, - "defaultTipOverlap": 10.5, "defaultReturnTipHeight": 0.2, "aspirate": { - "default": [ - [0.4148, -1705.1015, 20.5455], - [0.4476, -80.633, 47.2788], - [0.5512, -1.5936, 11.9026], - [0.6027, -18.9998, 21.4972], - [0.6503, -15.8781, 19.6156], - [0.7733, 3.0612, 7.2993], - [0.8391, -5.2227, 13.7056], - [0.9736, 3.0706, 6.7467], - [1.16, -0.374, 10.1005], - [1.3964, 1.3004, 8.1582], - [1.5815, -0.4837, 10.6494], - [1.8306, 1.1464, 8.0714], - [2.0345, 0.0132, 10.1459], - [2.6221, 0.5374, 9.0794], - [2.9655, -1.7582, 15.0986], - [3.5124, 0.2754, 9.0681], - [4.6591, 1.406, 5.097], - [5.367, 0.394, 9.8123], - [6.0839, 0.3365, 10.1205], - [6.8312, 0.3379, 10.1121], - [7.5676, 0.2611, 10.637], - [8.2397, 0.095, 11.8939], - [8.9776, 0.2015, 11.0165], - [10.413, 0.1332, 11.6294], - [11.8539, 0.1074, 11.8979], - [13.3655, 0.1286, 11.6464], - [14.8236, 0.0758, 12.3519], - [16.3203, 0.083, 12.2457], - [17.7915, 0.0581, 12.6515], - [19.2145, 0.0273, 13.1995], - [20.6718, 0.0388, 12.9792], - [22.1333, 0.0357, 13.044], - [25.0761, 0.0332, 13.0977], - [28.0339, 0.029, 13.2035], - [30.967, 0.0201, 13.4538], - [33.8727, 0.013, 13.6737], - [36.8273, 0.0172, 13.5324], - [39.7594, 0.0121, 13.7191], - [42.6721, 0.0083, 13.8687], - [45.5964, 0.0085, 13.8618], - [48.5297, 0.0084, 13.8668], - [51.4512, 0.0064, 13.9651] - ] + "default": { + "1": [ + [0.4148, -1705.1015, 20.5455], + [0.4476, -80.633, 47.2788], + [0.5512, -1.5936, 11.9026], + [0.6027, -18.9998, 21.4972], + [0.6503, -15.8781, 19.6156], + [0.7733, 3.0612, 7.2993], + [0.8391, -5.2227, 13.7056], + [0.9736, 3.0706, 6.7467], + [1.16, -0.374, 10.1005], + [1.3964, 1.3004, 8.1582], + [1.5815, -0.4837, 10.6494], + [1.8306, 1.1464, 8.0714], + [2.0345, 0.0132, 10.1459], + [2.6221, 0.5374, 9.0794], + [2.9655, -1.7582, 15.0986], + [3.5124, 0.2754, 9.0681], + [4.6591, 1.406, 5.097], + [5.367, 0.394, 9.8123], + [6.0839, 0.3365, 10.1205], + [6.8312, 0.3379, 10.1121], + [7.5676, 0.2611, 10.637], + [8.2397, 0.095, 11.8939], + [8.9776, 0.2015, 11.0165], + [10.413, 0.1332, 11.6294], + [11.8539, 0.1074, 11.8979], + [13.3655, 0.1286, 11.6464], + [14.8236, 0.0758, 12.3519], + [16.3203, 0.083, 12.2457], + [17.7915, 0.0581, 12.6515], + [19.2145, 0.0273, 13.1995], + [20.6718, 0.0388, 12.9792], + [22.1333, 0.0357, 13.044], + [25.0761, 0.0332, 13.0977], + [28.0339, 0.029, 13.2035], + [30.967, 0.0201, 13.4538], + [33.8727, 0.013, 13.6737], + [36.8273, 0.0172, 13.5324], + [39.7594, 0.0121, 13.7191], + [42.6721, 0.0083, 13.8687], + [45.5964, 0.0085, 13.8618], + [48.5297, 0.0084, 13.8668], + [51.4512, 0.0064, 13.9651] + ] + } }, "dispense": { - "default": [ - [0.4148, -1705.1015, 20.5455], - [0.4476, -80.633, 47.2788], - [0.5512, -1.5936, 11.9026], - [0.6027, -18.9998, 21.4972], - [0.6503, -15.8781, 19.6156], - [0.7733, 3.0612, 7.2993], - [0.8391, -5.2227, 13.7056], - [0.9736, 3.0706, 6.7467], - [1.16, -0.374, 10.1005], - [1.3964, 1.3004, 8.1582], - [1.5815, -0.4837, 10.6494], - [1.8306, 1.1464, 8.0714], - [2.0345, 0.0132, 10.1459], - [2.6221, 0.5374, 9.0794], - [2.9655, -1.7582, 15.0986], - [3.5124, 0.2754, 9.0681], - [4.6591, 1.406, 5.097], - [5.367, 0.394, 9.8123], - [6.0839, 0.3365, 10.1205], - [6.8312, 0.3379, 10.1121], - [7.5676, 0.2611, 10.637], - [8.2397, 0.095, 11.8939], - [8.9776, 0.2015, 11.0165], - [10.413, 0.1332, 11.6294], - [11.8539, 0.1074, 11.8979], - [13.3655, 0.1286, 11.6464], - [14.8236, 0.0758, 12.3519], - [16.3203, 0.083, 12.2457], - [17.7915, 0.0581, 12.6515], - [19.2145, 0.0273, 13.1995], - [20.6718, 0.0388, 12.9792], - [22.1333, 0.0357, 13.044], - [25.0761, 0.0332, 13.0977], - [28.0339, 0.029, 13.2035], - [30.967, 0.0201, 13.4538], - [33.8727, 0.013, 13.6737], - [36.8273, 0.0172, 13.5324], - [39.7594, 0.0121, 13.7191], - [42.6721, 0.0083, 13.8687], - [45.5964, 0.0085, 13.8618], - [48.5297, 0.0084, 13.8668], - [51.4512, 0.0064, 13.9651] - ] + "default": { + "1": [ + [0.4148, -1705.1015, 20.5455], + [0.4476, -80.633, 47.2788], + [0.5512, -1.5936, 11.9026], + [0.6027, -18.9998, 21.4972], + [0.6503, -15.8781, 19.6156], + [0.7733, 3.0612, 7.2993], + [0.8391, -5.2227, 13.7056], + [0.9736, 3.0706, 6.7467], + [1.16, -0.374, 10.1005], + [1.3964, 1.3004, 8.1582], + [1.5815, -0.4837, 10.6494], + [1.8306, 1.1464, 8.0714], + [2.0345, 0.0132, 10.1459], + [2.6221, 0.5374, 9.0794], + [2.9655, -1.7582, 15.0986], + [3.5124, 0.2754, 9.0681], + [4.6591, 1.406, 5.097], + [5.367, 0.394, 9.8123], + [6.0839, 0.3365, 10.1205], + [6.8312, 0.3379, 10.1121], + [7.5676, 0.2611, 10.637], + [8.2397, 0.095, 11.8939], + [8.9776, 0.2015, 11.0165], + [10.413, 0.1332, 11.6294], + [11.8539, 0.1074, 11.8979], + [13.3655, 0.1286, 11.6464], + [14.8236, 0.0758, 12.3519], + [16.3203, 0.083, 12.2457], + [17.7915, 0.0581, 12.6515], + [19.2145, 0.0273, 13.1995], + [20.6718, 0.0388, 12.9792], + [22.1333, 0.0357, 13.044], + [25.0761, 0.0332, 13.0977], + [28.0339, 0.029, 13.2035], + [30.967, 0.0201, 13.4538], + [33.8727, 0.013, 13.6737], + [36.8273, 0.0172, 13.5324], + [39.7594, 0.0121, 13.7191], + [42.6721, 0.0083, 13.8687], + [45.5964, 0.0085, 13.8618], + [48.5297, 0.0084, 13.8668], + [51.4512, 0.0064, 13.9651] + ] + } }, "defaultBlowoutVolume": 3.2 }, "t200": { - "defaultAspirateFlowRate": 80, - "defaultDispenseFlowRate": 80, - "defaultBlowOutFlowRate": 80, + "defaultAspirateFlowRate": { + "default": 80, + "valuesByApiLevel": { + "2.14": 80 + } + }, + "defaultDispenseFlowRate": { + "default": 80, + "valuesByApiLevel": { + "2.14": 80 + } + }, + "defaultBlowOutFlowRate": { + "default": 80, + "valuesByApiLevel": { + "2.14": 80 + } + }, "defaultTipLength": 58.35, - "defaultTipOverlap": 10.5, "defaultReturnTipHeight": 0.2, "aspirate": { - "default": [ - [0.8314, -2.9322, 24.0741], - [0.8853, -30.0996, 48.7784], - [0.9778, -4.3627, 25.9941], - [0.975, 802.2301, -762.6744], - [1.1272, -4.6837, 24.0666], - [1.2747, -3.91, 23.1945], - [1.5656, -2.8032, 21.7836], - [1.6667, -7.2039, 28.6731], - [2.4403, -0.5147, 17.5244], - [3.0564, -1.6013, 20.1761], - [3.6444, -1.1974, 18.9418], - [4.1189, -1.7877, 21.0928], - [4.6467, -0.8591, 17.2684], - [5.2597, -0.207, 14.2379], - [5.8581, -0.2196, 14.3044], - [6.4772, -0.1025, 13.6183], - [7.8158, 0.0537, 12.6063], - [9.1664, 0.0507, 12.6302], - [10.5064, 0.0285, 12.8339], - [14.8361, 0.0818, 12.273], - [19.3933, 0.0801, 12.2991], - [23.9242, 0.0487, 12.9079], - [28.4922, 0.0379, 13.1666], - [36.145, 0.0277, 13.4572], - [43.7972, 0.0184, 13.7916], - [51.5125, 0.0154, 13.9248], - [59.2467, 0.0121, 14.0931], - [66.9428, 0.0084, 14.3151], - [74.6853, 0.0079, 14.3498], - [82.3722, 0.0052, 14.5512], - [90.1106, 0.0054, 14.5333], - [97.8369, 0.0043, 14.6288], - [105.6153, 0.0046, 14.5983], - [113.3686, 0.0036, 14.7076], - [121.1108, 0.003, 14.7785], - [136.61, 0.0026, 14.826], - [152.0708, 0.0018, 14.9298], - [167.6433, 0.0021, 14.8827], - [183.1011, 0.0012, 15.0438], - [198.5845, 0.0011, 15.0538], - [214.0264, 0.0008, 15.123] - ] + "default": { + "1": [ + [0.8314, -2.9322, 24.0741], + [0.8853, -30.0996, 48.7784], + [0.9778, -4.3627, 25.9941], + [0.975, 802.2301, -762.6744], + [1.1272, -4.6837, 24.0666], + [1.2747, -3.91, 23.1945], + [1.5656, -2.8032, 21.7836], + [1.6667, -7.2039, 28.6731], + [2.4403, -0.5147, 17.5244], + [3.0564, -1.6013, 20.1761], + [3.6444, -1.1974, 18.9418], + [4.1189, -1.7877, 21.0928], + [4.6467, -0.8591, 17.2684], + [5.2597, -0.207, 14.2379], + [5.8581, -0.2196, 14.3044], + [6.4772, -0.1025, 13.6183], + [7.8158, 0.0537, 12.6063], + [9.1664, 0.0507, 12.6302], + [10.5064, 0.0285, 12.8339], + [14.8361, 0.0818, 12.273], + [19.3933, 0.0801, 12.2991], + [23.9242, 0.0487, 12.9079], + [28.4922, 0.0379, 13.1666], + [36.145, 0.0277, 13.4572], + [43.7972, 0.0184, 13.7916], + [51.5125, 0.0154, 13.9248], + [59.2467, 0.0121, 14.0931], + [66.9428, 0.0084, 14.3151], + [74.6853, 0.0079, 14.3498], + [82.3722, 0.0052, 14.5512], + [90.1106, 0.0054, 14.5333], + [97.8369, 0.0043, 14.6288], + [105.6153, 0.0046, 14.5983], + [113.3686, 0.0036, 14.7076], + [121.1108, 0.003, 14.7785], + [136.61, 0.0026, 14.826], + [152.0708, 0.0018, 14.9298], + [167.6433, 0.0021, 14.8827], + [183.1011, 0.0012, 15.0438], + [198.5845, 0.0011, 15.0538], + [214.0264, 0.0008, 15.123] + ] + } }, "dispense": { - "default": [ - [0.8314, -2.9322, 24.0741], - [0.8853, -30.0996, 48.7784], - [0.9778, -4.3627, 25.9941], - [0.975, 802.2301, -762.6744], - [1.1272, -4.6837, 24.0666], - [1.2747, -3.91, 23.1945], - [1.5656, -2.8032, 21.7836], - [1.6667, -7.2039, 28.6731], - [2.4403, -0.5147, 17.5244], - [3.0564, -1.6013, 20.1761], - [3.6444, -1.1974, 18.9418], - [4.1189, -1.7877, 21.0928], - [4.6467, -0.8591, 17.2684], - [5.2597, -0.207, 14.2379], - [5.8581, -0.2196, 14.3044], - [6.4772, -0.1025, 13.6183], - [7.8158, 0.0537, 12.6063], - [9.1664, 0.0507, 12.6302], - [10.5064, 0.0285, 12.8339], - [14.8361, 0.0818, 12.273], - [19.3933, 0.0801, 12.2991], - [23.9242, 0.0487, 12.9079], - [28.4922, 0.0379, 13.1666], - [36.145, 0.0277, 13.4572], - [43.7972, 0.0184, 13.7916], - [51.5125, 0.0154, 13.9248], - [59.2467, 0.0121, 14.0931], - [66.9428, 0.0084, 14.3151], - [74.6853, 0.0079, 14.3498], - [82.3722, 0.0052, 14.5512], - [90.1106, 0.0054, 14.5333], - [97.8369, 0.0043, 14.6288], - [105.6153, 0.0046, 14.5983], - [113.3686, 0.0036, 14.7076], - [121.1108, 0.003, 14.7785], - [136.61, 0.0026, 14.826], - [152.0708, 0.0018, 14.9298], - [167.6433, 0.0021, 14.8827], - [183.1011, 0.0012, 15.0438], - [198.5845, 0.0011, 15.0538], - [214.0264, 0.0008, 15.123] - ] + "default": { + "1": [ + [0.8314, -2.9322, 24.0741], + [0.8853, -30.0996, 48.7784], + [0.9778, -4.3627, 25.9941], + [0.975, 802.2301, -762.6744], + [1.1272, -4.6837, 24.0666], + [1.2747, -3.91, 23.1945], + [1.5656, -2.8032, 21.7836], + [1.6667, -7.2039, 28.6731], + [2.4403, -0.5147, 17.5244], + [3.0564, -1.6013, 20.1761], + [3.6444, -1.1974, 18.9418], + [4.1189, -1.7877, 21.0928], + [4.6467, -0.8591, 17.2684], + [5.2597, -0.207, 14.2379], + [5.8581, -0.2196, 14.3044], + [6.4772, -0.1025, 13.6183], + [7.8158, 0.0537, 12.6063], + [9.1664, 0.0507, 12.6302], + [10.5064, 0.0285, 12.8339], + [14.8361, 0.0818, 12.273], + [19.3933, 0.0801, 12.2991], + [23.9242, 0.0487, 12.9079], + [28.4922, 0.0379, 13.1666], + [36.145, 0.0277, 13.4572], + [43.7972, 0.0184, 13.7916], + [51.5125, 0.0154, 13.9248], + [59.2467, 0.0121, 14.0931], + [66.9428, 0.0084, 14.3151], + [74.6853, 0.0079, 14.3498], + [82.3722, 0.0052, 14.5512], + [90.1106, 0.0054, 14.5333], + [97.8369, 0.0043, 14.6288], + [105.6153, 0.0046, 14.5983], + [113.3686, 0.0036, 14.7076], + [121.1108, 0.003, 14.7785], + [136.61, 0.0026, 14.826], + [152.0708, 0.0018, 14.9298], + [167.6433, 0.0021, 14.8827], + [183.1011, 0.0012, 15.0438], + [198.5845, 0.0011, 15.0538], + [214.0264, 0.0008, 15.123] + ] + } }, "defaultBlowoutVolume": 16 }, "t1000": { - "defaultAspirateFlowRate": 160, - "defaultDispenseFlowRate": 160, - "defaultBlowOutFlowRate": 80, + "defaultAspirateFlowRate": { + "default": 160, + "valuesByApiLevel": { + "2.14": 160 + } + }, + "defaultDispenseFlowRate": { + "default": 160, + "valuesByApiLevel": { + "2.14": 160 + } + }, + "defaultBlowOutFlowRate": { + "default": 80, + "valuesByApiLevel": { + "2.14": 80 + } + }, "defaultTipLength": 95.6, - "defaultTipOverlap": 10.5, "defaultReturnTipHeight": 0.2, "aspirate": { - "default": [ - [0.7511, 3.9556, 6.455], - [1.3075, 2.1664, 5.8839], - [1.8737, 1.1513, 7.2111], - [3.177, 0.9374, 7.612], - [4.5368, 0.5531, 8.8328], - [7.3103, 0.3035, 9.9651], - [10.0825, 0.1513, 11.0781], - [12.9776, 0.1293, 11.2991], - [15.9173, 0.0976, 11.7115], - [18.8243, 0.0624, 12.2706], - [21.8529, 0.07, 12.1275], - [24.8068, 0.0418, 12.7442], - [27.7744, 0.0356, 12.8984], - [35.2873, 0.0303, 13.0454], - [42.7989, 0.0202, 13.4038], - [50.4562, 0.0196, 13.4293], - [58.1081, 0.0145, 13.6843], - [65.7267, 0.0104, 13.9252], - [73.2857, 0.0068, 14.1606], - [81.0016, 0.0091, 13.9883], - [88.6617, 0.0064, 14.2052], - [103.9829, 0.0051, 14.3271], - [119.4408, 0.0049, 14.3475], - [134.889, 0.0037, 14.485], - [150.273, 0.0026, 14.6402], - [181.2798, 0.0026, 14.6427], - [212.4724, 0.0022, 14.7002], - [243.577, 0.0015, 14.8558], - [274.7216, 0.0012, 14.9205], - [305.8132, 0.0009, 15.0118], - [368.0697, 0.0007, 15.0668], - [430.2513, 0.0005, 15.1594], - [492.3487, 0.0003, 15.2291], - [554.5713, 0.0003, 15.2367], - [616.6825, 0.0002, 15.2949], - [694.4168, 0.0002, 15.3027], - [772.0327, 0.0001, 15.3494], - [849.617, 0.0001, 15.3717], - [927.2556, 0.0001, 15.3745], - [1004.87, 0.0001, 15.3912], - [1051.4648, 0.0001, 15.391] - ] + "default": { + "1": [ + [0.7511, 3.9556, 6.455], + [1.3075, 2.1664, 5.8839], + [1.8737, 1.1513, 7.2111], + [3.177, 0.9374, 7.612], + [4.5368, 0.5531, 8.8328], + [7.3103, 0.3035, 9.9651], + [10.0825, 0.1513, 11.0781], + [12.9776, 0.1293, 11.2991], + [15.9173, 0.0976, 11.7115], + [18.8243, 0.0624, 12.2706], + [21.8529, 0.07, 12.1275], + [24.8068, 0.0418, 12.7442], + [27.7744, 0.0356, 12.8984], + [35.2873, 0.0303, 13.0454], + [42.7989, 0.0202, 13.4038], + [50.4562, 0.0196, 13.4293], + [58.1081, 0.0145, 13.6843], + [65.7267, 0.0104, 13.9252], + [73.2857, 0.0068, 14.1606], + [81.0016, 0.0091, 13.9883], + [88.6617, 0.0064, 14.2052], + [103.9829, 0.0051, 14.3271], + [119.4408, 0.0049, 14.3475], + [134.889, 0.0037, 14.485], + [150.273, 0.0026, 14.6402], + [181.2798, 0.0026, 14.6427], + [212.4724, 0.0022, 14.7002], + [243.577, 0.0015, 14.8558], + [274.7216, 0.0012, 14.9205], + [305.8132, 0.0009, 15.0118], + [368.0697, 0.0007, 15.0668], + [430.2513, 0.0005, 15.1594], + [492.3487, 0.0003, 15.2291], + [554.5713, 0.0003, 15.2367], + [616.6825, 0.0002, 15.2949], + [694.4168, 0.0002, 15.3027], + [772.0327, 0.0001, 15.3494], + [849.617, 0.0001, 15.3717], + [927.2556, 0.0001, 15.3745], + [1004.87, 0.0001, 15.3912], + [1051.4648, 0.0001, 15.391] + ] + } }, "dispense": { - "default": [ - [0.7511, 3.9556, 6.455], - [1.3075, 2.1664, 5.8839], - [1.8737, 1.1513, 7.2111], - [3.177, 0.9374, 7.612], - [4.5368, 0.5531, 8.8328], - [7.3103, 0.3035, 9.9651], - [10.0825, 0.1513, 11.0781], - [12.9776, 0.1293, 11.2991], - [15.9173, 0.0976, 11.7115], - [18.8243, 0.0624, 12.2706], - [21.8529, 0.07, 12.1275], - [24.8068, 0.0418, 12.7442], - [27.7744, 0.0356, 12.8984], - [35.2873, 0.0303, 13.0454], - [42.7989, 0.0202, 13.4038], - [50.4562, 0.0196, 13.4293], - [58.1081, 0.0145, 13.6843], - [65.7267, 0.0104, 13.9252], - [73.2857, 0.0068, 14.1606], - [81.0016, 0.0091, 13.9883], - [88.6617, 0.0064, 14.2052], - [103.9829, 0.0051, 14.3271], - [119.4408, 0.0049, 14.3475], - [134.889, 0.0037, 14.485], - [150.273, 0.0026, 14.6402], - [181.2798, 0.0026, 14.6427], - [212.4724, 0.0022, 14.7002], - [243.577, 0.0015, 14.8558], - [274.7216, 0.0012, 14.9205], - [305.8132, 0.0009, 15.0118], - [368.0697, 0.0007, 15.0668], - [430.2513, 0.0005, 15.1594], - [492.3487, 0.0003, 15.2291], - [554.5713, 0.0003, 15.2367], - [616.6825, 0.0002, 15.2949], - [694.4168, 0.0002, 15.3027], - [772.0327, 0.0001, 15.3494], - [849.617, 0.0001, 15.3717], - [927.2556, 0.0001, 15.3745], - [1004.87, 0.0001, 15.3912], - [1051.4648, 0.0001, 15.391] - ] + "default": { + "1": [ + [0.7511, 3.9556, 6.455], + [1.3075, 2.1664, 5.8839], + [1.8737, 1.1513, 7.2111], + [3.177, 0.9374, 7.612], + [4.5368, 0.5531, 8.8328], + [7.3103, 0.3035, 9.9651], + [10.0825, 0.1513, 11.0781], + [12.9776, 0.1293, 11.2991], + [15.9173, 0.0976, 11.7115], + [18.8243, 0.0624, 12.2706], + [21.8529, 0.07, 12.1275], + [24.8068, 0.0418, 12.7442], + [27.7744, 0.0356, 12.8984], + [35.2873, 0.0303, 13.0454], + [42.7989, 0.0202, 13.4038], + [50.4562, 0.0196, 13.4293], + [58.1081, 0.0145, 13.6843], + [65.7267, 0.0104, 13.9252], + [73.2857, 0.0068, 14.1606], + [81.0016, 0.0091, 13.9883], + [88.6617, 0.0064, 14.2052], + [103.9829, 0.0051, 14.3271], + [119.4408, 0.0049, 14.3475], + [134.889, 0.0037, 14.485], + [150.273, 0.0026, 14.6402], + [181.2798, 0.0026, 14.6427], + [212.4724, 0.0022, 14.7002], + [243.577, 0.0015, 14.8558], + [274.7216, 0.0012, 14.9205], + [305.8132, 0.0009, 15.0118], + [368.0697, 0.0007, 15.0668], + [430.2513, 0.0005, 15.1594], + [492.3487, 0.0003, 15.2291], + [554.5713, 0.0003, 15.2367], + [616.6825, 0.0002, 15.2949], + [694.4168, 0.0002, 15.3027], + [772.0327, 0.0001, 15.3494], + [849.617, 0.0001, 15.3717], + [927.2556, 0.0001, 15.3745], + [1004.87, 0.0001, 15.3912], + [1051.4648, 0.0001, 15.391] + ] + } }, "defaultBlowoutVolume": 16 } }, + "defaultTipOverlapDictionary": { + "default": 10.5, + "opentrons/opentrons_flex_96_tiprack_50ul/1": 10.5, + "opentrons/opentrons_flex_96_tiprack_1000ul/1": 10.5, + "opentrons/opentrons_flex_96_tiprack_200ul/1": 10.5 + }, "maxVolume": 1000, "minVolume": 1, "defaultTipracks": [ diff --git a/shared-data/pipette/definitions/2/liquid/ninety_six_channel/p1000/3_3.json b/shared-data/pipette/definitions/2/liquid/ninety_six_channel/p1000/3_3.json index 14477b24375..297569c16e5 100644 --- a/shared-data/pipette/definitions/2/liquid/ninety_six_channel/p1000/3_3.json +++ b/shared-data/pipette/definitions/2/liquid/ninety_six_channel/p1000/3_3.json @@ -2,305 +2,365 @@ "$otSharedSchema": "#/pipette/schemas/2/pipetteLiquidPropertiesSchema.json", "supportedTips": { "t50": { - "defaultAspirateFlowRate": 6, - "defaultDispenseFlowRate": 6, - "defaultBlowOutFlowRate": 80, + "defaultAspirateFlowRate": { + "default": 6, + "valuesByApiLevel": { + "2.14": 6 + } + }, + "defaultDispenseFlowRate": { + "default": 6, + "valuesByApiLevel": { + "2.14": 6 + } + }, + "defaultBlowOutFlowRate": { + "default": 80, + "valuesByApiLevel": { + "2.14": 80 + } + }, "defaultTipLength": 57.9, - "defaultTipOverlap": 10.5, "defaultReturnTipHeight": 0.2, "aspirate": { - "default": [ - [0.4148, -1705.1015, 20.5455], - [0.4476, -80.633, 47.2788], - [0.5512, -1.5936, 11.9026], - [0.6027, -18.9998, 21.4972], - [0.6503, -15.8781, 19.6156], - [0.7733, 3.0612, 7.2993], - [0.8391, -5.2227, 13.7056], - [0.9736, 3.0706, 6.7467], - [1.16, -0.374, 10.1005], - [1.3964, 1.3004, 8.1582], - [1.5815, -0.4837, 10.6494], - [1.8306, 1.1464, 8.0714], - [2.0345, 0.0132, 10.1459], - [2.6221, 0.5374, 9.0794], - [2.9655, -1.7582, 15.0986], - [3.5124, 0.2754, 9.0681], - [4.6591, 1.406, 5.097], - [5.367, 0.394, 9.8123], - [6.0839, 0.3365, 10.1205], - [6.8312, 0.3379, 10.1121], - [7.5676, 0.2611, 10.637], - [8.2397, 0.095, 11.8939], - [8.9776, 0.2015, 11.0165], - [10.413, 0.1332, 11.6294], - [11.8539, 0.1074, 11.8979], - [13.3655, 0.1286, 11.6464], - [14.8236, 0.0758, 12.3519], - [16.3203, 0.083, 12.2457], - [17.7915, 0.0581, 12.6515], - [19.2145, 0.0273, 13.1995], - [20.6718, 0.0388, 12.9792], - [22.1333, 0.0357, 13.044], - [25.0761, 0.0332, 13.0977], - [28.0339, 0.029, 13.2035], - [30.967, 0.0201, 13.4538], - [33.8727, 0.013, 13.6737], - [36.8273, 0.0172, 13.5324], - [39.7594, 0.0121, 13.7191], - [42.6721, 0.0083, 13.8687], - [45.5964, 0.0085, 13.8618], - [48.5297, 0.0084, 13.8668], - [51.4512, 0.0064, 13.9651] - ] + "default": { + "1": [ + [0.4148, -1705.1015, 20.5455], + [0.4476, -80.633, 47.2788], + [0.5512, -1.5936, 11.9026], + [0.6027, -18.9998, 21.4972], + [0.6503, -15.8781, 19.6156], + [0.7733, 3.0612, 7.2993], + [0.8391, -5.2227, 13.7056], + [0.9736, 3.0706, 6.7467], + [1.16, -0.374, 10.1005], + [1.3964, 1.3004, 8.1582], + [1.5815, -0.4837, 10.6494], + [1.8306, 1.1464, 8.0714], + [2.0345, 0.0132, 10.1459], + [2.6221, 0.5374, 9.0794], + [2.9655, -1.7582, 15.0986], + [3.5124, 0.2754, 9.0681], + [4.6591, 1.406, 5.097], + [5.367, 0.394, 9.8123], + [6.0839, 0.3365, 10.1205], + [6.8312, 0.3379, 10.1121], + [7.5676, 0.2611, 10.637], + [8.2397, 0.095, 11.8939], + [8.9776, 0.2015, 11.0165], + [10.413, 0.1332, 11.6294], + [11.8539, 0.1074, 11.8979], + [13.3655, 0.1286, 11.6464], + [14.8236, 0.0758, 12.3519], + [16.3203, 0.083, 12.2457], + [17.7915, 0.0581, 12.6515], + [19.2145, 0.0273, 13.1995], + [20.6718, 0.0388, 12.9792], + [22.1333, 0.0357, 13.044], + [25.0761, 0.0332, 13.0977], + [28.0339, 0.029, 13.2035], + [30.967, 0.0201, 13.4538], + [33.8727, 0.013, 13.6737], + [36.8273, 0.0172, 13.5324], + [39.7594, 0.0121, 13.7191], + [42.6721, 0.0083, 13.8687], + [45.5964, 0.0085, 13.8618], + [48.5297, 0.0084, 13.8668], + [51.4512, 0.0064, 13.9651] + ] + } }, "dispense": { - "default": [ - [0.4148, -1705.1015, 20.5455], - [0.4476, -80.633, 47.2788], - [0.5512, -1.5936, 11.9026], - [0.6027, -18.9998, 21.4972], - [0.6503, -15.8781, 19.6156], - [0.7733, 3.0612, 7.2993], - [0.8391, -5.2227, 13.7056], - [0.9736, 3.0706, 6.7467], - [1.16, -0.374, 10.1005], - [1.3964, 1.3004, 8.1582], - [1.5815, -0.4837, 10.6494], - [1.8306, 1.1464, 8.0714], - [2.0345, 0.0132, 10.1459], - [2.6221, 0.5374, 9.0794], - [2.9655, -1.7582, 15.0986], - [3.5124, 0.2754, 9.0681], - [4.6591, 1.406, 5.097], - [5.367, 0.394, 9.8123], - [6.0839, 0.3365, 10.1205], - [6.8312, 0.3379, 10.1121], - [7.5676, 0.2611, 10.637], - [8.2397, 0.095, 11.8939], - [8.9776, 0.2015, 11.0165], - [10.413, 0.1332, 11.6294], - [11.8539, 0.1074, 11.8979], - [13.3655, 0.1286, 11.6464], - [14.8236, 0.0758, 12.3519], - [16.3203, 0.083, 12.2457], - [17.7915, 0.0581, 12.6515], - [19.2145, 0.0273, 13.1995], - [20.6718, 0.0388, 12.9792], - [22.1333, 0.0357, 13.044], - [25.0761, 0.0332, 13.0977], - [28.0339, 0.029, 13.2035], - [30.967, 0.0201, 13.4538], - [33.8727, 0.013, 13.6737], - [36.8273, 0.0172, 13.5324], - [39.7594, 0.0121, 13.7191], - [42.6721, 0.0083, 13.8687], - [45.5964, 0.0085, 13.8618], - [48.5297, 0.0084, 13.8668], - [51.4512, 0.0064, 13.9651] - ] + "default": { + "1": [ + [0.4148, -1705.1015, 20.5455], + [0.4476, -80.633, 47.2788], + [0.5512, -1.5936, 11.9026], + [0.6027, -18.9998, 21.4972], + [0.6503, -15.8781, 19.6156], + [0.7733, 3.0612, 7.2993], + [0.8391, -5.2227, 13.7056], + [0.9736, 3.0706, 6.7467], + [1.16, -0.374, 10.1005], + [1.3964, 1.3004, 8.1582], + [1.5815, -0.4837, 10.6494], + [1.8306, 1.1464, 8.0714], + [2.0345, 0.0132, 10.1459], + [2.6221, 0.5374, 9.0794], + [2.9655, -1.7582, 15.0986], + [3.5124, 0.2754, 9.0681], + [4.6591, 1.406, 5.097], + [5.367, 0.394, 9.8123], + [6.0839, 0.3365, 10.1205], + [6.8312, 0.3379, 10.1121], + [7.5676, 0.2611, 10.637], + [8.2397, 0.095, 11.8939], + [8.9776, 0.2015, 11.0165], + [10.413, 0.1332, 11.6294], + [11.8539, 0.1074, 11.8979], + [13.3655, 0.1286, 11.6464], + [14.8236, 0.0758, 12.3519], + [16.3203, 0.083, 12.2457], + [17.7915, 0.0581, 12.6515], + [19.2145, 0.0273, 13.1995], + [20.6718, 0.0388, 12.9792], + [22.1333, 0.0357, 13.044], + [25.0761, 0.0332, 13.0977], + [28.0339, 0.029, 13.2035], + [30.967, 0.0201, 13.4538], + [33.8727, 0.013, 13.6737], + [36.8273, 0.0172, 13.5324], + [39.7594, 0.0121, 13.7191], + [42.6721, 0.0083, 13.8687], + [45.5964, 0.0085, 13.8618], + [48.5297, 0.0084, 13.8668], + [51.4512, 0.0064, 13.9651] + ] + } }, "defaultBlowoutVolume": 3.2 }, "t200": { - "defaultAspirateFlowRate": 80, - "defaultDispenseFlowRate": 80, - "defaultBlowOutFlowRate": 80, + "defaultAspirateFlowRate": { + "default": 80, + "valuesByApiLevel": { + "2.14": 80 + } + }, + "defaultDispenseFlowRate": { + "default": 80, + "valuesByApiLevel": { + "2.14": 80 + } + }, + "defaultBlowOutFlowRate": { + "default": 80, + "valuesByApiLevel": { + "2.14": 80 + } + }, "defaultTipLength": 58.35, - "defaultTipOverlap": 10.5, "defaultReturnTipHeight": 0.2, "aspirate": { - "default": [ - [0.8314, -2.9322, 24.0741], - [0.8853, -30.0996, 48.7784], - [0.9778, -4.3627, 25.9941], - [0.975, 802.2301, -762.6744], - [1.1272, -4.6837, 24.0666], - [1.2747, -3.91, 23.1945], - [1.5656, -2.8032, 21.7836], - [1.6667, -7.2039, 28.6731], - [2.4403, -0.5147, 17.5244], - [3.0564, -1.6013, 20.1761], - [3.6444, -1.1974, 18.9418], - [4.1189, -1.7877, 21.0928], - [4.6467, -0.8591, 17.2684], - [5.2597, -0.207, 14.2379], - [5.8581, -0.2196, 14.3044], - [6.4772, -0.1025, 13.6183], - [7.8158, 0.0537, 12.6063], - [9.1664, 0.0507, 12.6302], - [10.5064, 0.0285, 12.8339], - [14.8361, 0.0818, 12.273], - [19.3933, 0.0801, 12.2991], - [23.9242, 0.0487, 12.9079], - [28.4922, 0.0379, 13.1666], - [36.145, 0.0277, 13.4572], - [43.7972, 0.0184, 13.7916], - [51.5125, 0.0154, 13.9248], - [59.2467, 0.0121, 14.0931], - [66.9428, 0.0084, 14.3151], - [74.6853, 0.0079, 14.3498], - [82.3722, 0.0052, 14.5512], - [90.1106, 0.0054, 14.5333], - [97.8369, 0.0043, 14.6288], - [105.6153, 0.0046, 14.5983], - [113.3686, 0.0036, 14.7076], - [121.1108, 0.003, 14.7785], - [136.61, 0.0026, 14.826], - [152.0708, 0.0018, 14.9298], - [167.6433, 0.0021, 14.8827], - [183.1011, 0.0012, 15.0438], - [198.5845, 0.0011, 15.0538], - [214.0264, 0.0008, 15.123] - ] + "default": { + "1": [ + [0.8314, -2.9322, 24.0741], + [0.8853, -30.0996, 48.7784], + [0.9778, -4.3627, 25.9941], + [0.975, 802.2301, -762.6744], + [1.1272, -4.6837, 24.0666], + [1.2747, -3.91, 23.1945], + [1.5656, -2.8032, 21.7836], + [1.6667, -7.2039, 28.6731], + [2.4403, -0.5147, 17.5244], + [3.0564, -1.6013, 20.1761], + [3.6444, -1.1974, 18.9418], + [4.1189, -1.7877, 21.0928], + [4.6467, -0.8591, 17.2684], + [5.2597, -0.207, 14.2379], + [5.8581, -0.2196, 14.3044], + [6.4772, -0.1025, 13.6183], + [7.8158, 0.0537, 12.6063], + [9.1664, 0.0507, 12.6302], + [10.5064, 0.0285, 12.8339], + [14.8361, 0.0818, 12.273], + [19.3933, 0.0801, 12.2991], + [23.9242, 0.0487, 12.9079], + [28.4922, 0.0379, 13.1666], + [36.145, 0.0277, 13.4572], + [43.7972, 0.0184, 13.7916], + [51.5125, 0.0154, 13.9248], + [59.2467, 0.0121, 14.0931], + [66.9428, 0.0084, 14.3151], + [74.6853, 0.0079, 14.3498], + [82.3722, 0.0052, 14.5512], + [90.1106, 0.0054, 14.5333], + [97.8369, 0.0043, 14.6288], + [105.6153, 0.0046, 14.5983], + [113.3686, 0.0036, 14.7076], + [121.1108, 0.003, 14.7785], + [136.61, 0.0026, 14.826], + [152.0708, 0.0018, 14.9298], + [167.6433, 0.0021, 14.8827], + [183.1011, 0.0012, 15.0438], + [198.5845, 0.0011, 15.0538], + [214.0264, 0.0008, 15.123] + ] + } }, "dispense": { - "default": [ - [0.8314, -2.9322, 24.0741], - [0.8853, -30.0996, 48.7784], - [0.9778, -4.3627, 25.9941], - [0.975, 802.2301, -762.6744], - [1.1272, -4.6837, 24.0666], - [1.2747, -3.91, 23.1945], - [1.5656, -2.8032, 21.7836], - [1.6667, -7.2039, 28.6731], - [2.4403, -0.5147, 17.5244], - [3.0564, -1.6013, 20.1761], - [3.6444, -1.1974, 18.9418], - [4.1189, -1.7877, 21.0928], - [4.6467, -0.8591, 17.2684], - [5.2597, -0.207, 14.2379], - [5.8581, -0.2196, 14.3044], - [6.4772, -0.1025, 13.6183], - [7.8158, 0.0537, 12.6063], - [9.1664, 0.0507, 12.6302], - [10.5064, 0.0285, 12.8339], - [14.8361, 0.0818, 12.273], - [19.3933, 0.0801, 12.2991], - [23.9242, 0.0487, 12.9079], - [28.4922, 0.0379, 13.1666], - [36.145, 0.0277, 13.4572], - [43.7972, 0.0184, 13.7916], - [51.5125, 0.0154, 13.9248], - [59.2467, 0.0121, 14.0931], - [66.9428, 0.0084, 14.3151], - [74.6853, 0.0079, 14.3498], - [82.3722, 0.0052, 14.5512], - [90.1106, 0.0054, 14.5333], - [97.8369, 0.0043, 14.6288], - [105.6153, 0.0046, 14.5983], - [113.3686, 0.0036, 14.7076], - [121.1108, 0.003, 14.7785], - [136.61, 0.0026, 14.826], - [152.0708, 0.0018, 14.9298], - [167.6433, 0.0021, 14.8827], - [183.1011, 0.0012, 15.0438], - [198.5845, 0.0011, 15.0538], - [214.0264, 0.0008, 15.123] - ] + "default": { + "1": [ + [0.8314, -2.9322, 24.0741], + [0.8853, -30.0996, 48.7784], + [0.9778, -4.3627, 25.9941], + [0.975, 802.2301, -762.6744], + [1.1272, -4.6837, 24.0666], + [1.2747, -3.91, 23.1945], + [1.5656, -2.8032, 21.7836], + [1.6667, -7.2039, 28.6731], + [2.4403, -0.5147, 17.5244], + [3.0564, -1.6013, 20.1761], + [3.6444, -1.1974, 18.9418], + [4.1189, -1.7877, 21.0928], + [4.6467, -0.8591, 17.2684], + [5.2597, -0.207, 14.2379], + [5.8581, -0.2196, 14.3044], + [6.4772, -0.1025, 13.6183], + [7.8158, 0.0537, 12.6063], + [9.1664, 0.0507, 12.6302], + [10.5064, 0.0285, 12.8339], + [14.8361, 0.0818, 12.273], + [19.3933, 0.0801, 12.2991], + [23.9242, 0.0487, 12.9079], + [28.4922, 0.0379, 13.1666], + [36.145, 0.0277, 13.4572], + [43.7972, 0.0184, 13.7916], + [51.5125, 0.0154, 13.9248], + [59.2467, 0.0121, 14.0931], + [66.9428, 0.0084, 14.3151], + [74.6853, 0.0079, 14.3498], + [82.3722, 0.0052, 14.5512], + [90.1106, 0.0054, 14.5333], + [97.8369, 0.0043, 14.6288], + [105.6153, 0.0046, 14.5983], + [113.3686, 0.0036, 14.7076], + [121.1108, 0.003, 14.7785], + [136.61, 0.0026, 14.826], + [152.0708, 0.0018, 14.9298], + [167.6433, 0.0021, 14.8827], + [183.1011, 0.0012, 15.0438], + [198.5845, 0.0011, 15.0538], + [214.0264, 0.0008, 15.123] + ] + } }, "defaultBlowoutVolume": 16 }, "t1000": { - "defaultAspirateFlowRate": 160, - "defaultDispenseFlowRate": 160, - "defaultBlowOutFlowRate": 80, + "defaultAspirateFlowRate": { + "default": 160, + "valuesByApiLevel": { + "2.14": 160 + } + }, + "defaultDispenseFlowRate": { + "default": 160, + "valuesByApiLevel": { + "2.14": 160 + } + }, + "defaultBlowOutFlowRate": { + "default": 80, + "valuesByApiLevel": { + "2.14": 80 + } + }, "defaultTipLength": 95.6, - "defaultTipOverlap": 10.5, "defaultReturnTipHeight": 0.2, "aspirate": { - "default": [ - [0.7511, 3.9556, 6.455], - [1.3075, 2.1664, 5.8839], - [1.8737, 1.1513, 7.2111], - [3.177, 0.9374, 7.612], - [4.5368, 0.5531, 8.8328], - [7.3103, 0.3035, 9.9651], - [10.0825, 0.1513, 11.0781], - [12.9776, 0.1293, 11.2991], - [15.9173, 0.0976, 11.7115], - [18.8243, 0.0624, 12.2706], - [21.8529, 0.07, 12.1275], - [24.8068, 0.0418, 12.7442], - [27.7744, 0.0356, 12.8984], - [35.2873, 0.0303, 13.0454], - [42.7989, 0.0202, 13.4038], - [50.4562, 0.0196, 13.4293], - [58.1081, 0.0145, 13.6843], - [65.7267, 0.0104, 13.9252], - [73.2857, 0.0068, 14.1606], - [81.0016, 0.0091, 13.9883], - [88.6617, 0.0064, 14.2052], - [103.9829, 0.0051, 14.3271], - [119.4408, 0.0049, 14.3475], - [134.889, 0.0037, 14.485], - [150.273, 0.0026, 14.6402], - [181.2798, 0.0026, 14.6427], - [212.4724, 0.0022, 14.7002], - [243.577, 0.0015, 14.8558], - [274.7216, 0.0012, 14.9205], - [305.8132, 0.0009, 15.0118], - [368.0697, 0.0007, 15.0668], - [430.2513, 0.0005, 15.1594], - [492.3487, 0.0003, 15.2291], - [554.5713, 0.0003, 15.2367], - [616.6825, 0.0002, 15.2949], - [694.4168, 0.0002, 15.3027], - [772.0327, 0.0001, 15.3494], - [849.617, 0.0001, 15.3717], - [927.2556, 0.0001, 15.3745], - [1004.87, 0.0001, 15.3912], - [1051.4648, 0.0001, 15.391] - ] + "default": { + "1": [ + [0.7511, 3.9556, 6.455], + [1.3075, 2.1664, 5.8839], + [1.8737, 1.1513, 7.2111], + [3.177, 0.9374, 7.612], + [4.5368, 0.5531, 8.8328], + [7.3103, 0.3035, 9.9651], + [10.0825, 0.1513, 11.0781], + [12.9776, 0.1293, 11.2991], + [15.9173, 0.0976, 11.7115], + [18.8243, 0.0624, 12.2706], + [21.8529, 0.07, 12.1275], + [24.8068, 0.0418, 12.7442], + [27.7744, 0.0356, 12.8984], + [35.2873, 0.0303, 13.0454], + [42.7989, 0.0202, 13.4038], + [50.4562, 0.0196, 13.4293], + [58.1081, 0.0145, 13.6843], + [65.7267, 0.0104, 13.9252], + [73.2857, 0.0068, 14.1606], + [81.0016, 0.0091, 13.9883], + [88.6617, 0.0064, 14.2052], + [103.9829, 0.0051, 14.3271], + [119.4408, 0.0049, 14.3475], + [134.889, 0.0037, 14.485], + [150.273, 0.0026, 14.6402], + [181.2798, 0.0026, 14.6427], + [212.4724, 0.0022, 14.7002], + [243.577, 0.0015, 14.8558], + [274.7216, 0.0012, 14.9205], + [305.8132, 0.0009, 15.0118], + [368.0697, 0.0007, 15.0668], + [430.2513, 0.0005, 15.1594], + [492.3487, 0.0003, 15.2291], + [554.5713, 0.0003, 15.2367], + [616.6825, 0.0002, 15.2949], + [694.4168, 0.0002, 15.3027], + [772.0327, 0.0001, 15.3494], + [849.617, 0.0001, 15.3717], + [927.2556, 0.0001, 15.3745], + [1004.87, 0.0001, 15.3912], + [1051.4648, 0.0001, 15.391] + ] + } }, "dispense": { - "default": [ - [0.7511, 3.9556, 6.455], - [1.3075, 2.1664, 5.8839], - [1.8737, 1.1513, 7.2111], - [3.177, 0.9374, 7.612], - [4.5368, 0.5531, 8.8328], - [7.3103, 0.3035, 9.9651], - [10.0825, 0.1513, 11.0781], - [12.9776, 0.1293, 11.2991], - [15.9173, 0.0976, 11.7115], - [18.8243, 0.0624, 12.2706], - [21.8529, 0.07, 12.1275], - [24.8068, 0.0418, 12.7442], - [27.7744, 0.0356, 12.8984], - [35.2873, 0.0303, 13.0454], - [42.7989, 0.0202, 13.4038], - [50.4562, 0.0196, 13.4293], - [58.1081, 0.0145, 13.6843], - [65.7267, 0.0104, 13.9252], - [73.2857, 0.0068, 14.1606], - [81.0016, 0.0091, 13.9883], - [88.6617, 0.0064, 14.2052], - [103.9829, 0.0051, 14.3271], - [119.4408, 0.0049, 14.3475], - [134.889, 0.0037, 14.485], - [150.273, 0.0026, 14.6402], - [181.2798, 0.0026, 14.6427], - [212.4724, 0.0022, 14.7002], - [243.577, 0.0015, 14.8558], - [274.7216, 0.0012, 14.9205], - [305.8132, 0.0009, 15.0118], - [368.0697, 0.0007, 15.0668], - [430.2513, 0.0005, 15.1594], - [492.3487, 0.0003, 15.2291], - [554.5713, 0.0003, 15.2367], - [616.6825, 0.0002, 15.2949], - [694.4168, 0.0002, 15.3027], - [772.0327, 0.0001, 15.3494], - [849.617, 0.0001, 15.3717], - [927.2556, 0.0001, 15.3745], - [1004.87, 0.0001, 15.3912], - [1051.4648, 0.0001, 15.391] - ] + "default": { + "1": [ + [0.7511, 3.9556, 6.455], + [1.3075, 2.1664, 5.8839], + [1.8737, 1.1513, 7.2111], + [3.177, 0.9374, 7.612], + [4.5368, 0.5531, 8.8328], + [7.3103, 0.3035, 9.9651], + [10.0825, 0.1513, 11.0781], + [12.9776, 0.1293, 11.2991], + [15.9173, 0.0976, 11.7115], + [18.8243, 0.0624, 12.2706], + [21.8529, 0.07, 12.1275], + [24.8068, 0.0418, 12.7442], + [27.7744, 0.0356, 12.8984], + [35.2873, 0.0303, 13.0454], + [42.7989, 0.0202, 13.4038], + [50.4562, 0.0196, 13.4293], + [58.1081, 0.0145, 13.6843], + [65.7267, 0.0104, 13.9252], + [73.2857, 0.0068, 14.1606], + [81.0016, 0.0091, 13.9883], + [88.6617, 0.0064, 14.2052], + [103.9829, 0.0051, 14.3271], + [119.4408, 0.0049, 14.3475], + [134.889, 0.0037, 14.485], + [150.273, 0.0026, 14.6402], + [181.2798, 0.0026, 14.6427], + [212.4724, 0.0022, 14.7002], + [243.577, 0.0015, 14.8558], + [274.7216, 0.0012, 14.9205], + [305.8132, 0.0009, 15.0118], + [368.0697, 0.0007, 15.0668], + [430.2513, 0.0005, 15.1594], + [492.3487, 0.0003, 15.2291], + [554.5713, 0.0003, 15.2367], + [616.6825, 0.0002, 15.2949], + [694.4168, 0.0002, 15.3027], + [772.0327, 0.0001, 15.3494], + [849.617, 0.0001, 15.3717], + [927.2556, 0.0001, 15.3745], + [1004.87, 0.0001, 15.3912], + [1051.4648, 0.0001, 15.391] + ] + } }, "defaultBlowoutVolume": 16 } }, + "defaultTipOverlapDictionary": { + "default": 10.5, + "opentrons/opentrons_flex_96_tiprack_50ul/1": 10.5, + "opentrons/opentrons_flex_96_tiprack_1000ul/1": 10.5, + "opentrons/opentrons_flex_96_tiprack_200ul/1": 10.5 + }, "maxVolume": 1000, "minVolume": 1, "defaultTipracks": [ diff --git a/shared-data/pipette/definitions/2/liquid/ninety_six_channel/p1000/3_4.json b/shared-data/pipette/definitions/2/liquid/ninety_six_channel/p1000/3_4.json index 4604123e8a2..e9c0e9d3707 100644 --- a/shared-data/pipette/definitions/2/liquid/ninety_six_channel/p1000/3_4.json +++ b/shared-data/pipette/definitions/2/liquid/ninety_six_channel/p1000/3_4.json @@ -2,305 +2,365 @@ "$otSharedSchema": "#/pipette/schemas/2/pipetteLiquidPropertiesSchema.json", "supportedTips": { "t50": { - "defaultAspirateFlowRate": 6, - "defaultDispenseFlowRate": 6, - "defaultBlowOutFlowRate": 80, + "defaultAspirateFlowRate": { + "default": 6, + "valuesByApiLevel": { + "2.14": 6 + } + }, + "defaultDispenseFlowRate": { + "default": 6, + "valuesByApiLevel": { + "2.14": 6 + } + }, + "defaultBlowOutFlowRate": { + "default": 80, + "valuesByApiLevel": { + "2.14": 80 + } + }, "defaultTipLength": 57.9, - "defaultTipOverlap": 10.5, "defaultReturnTipHeight": 0.2, "defaultBlowoutVolume": 3.2, "aspirate": { - "default": [ - [0.4148, -1705.1015, 20.5455], - [0.4476, -80.633, 47.2788], - [0.5512, -1.5936, 11.9026], - [0.6027, -18.9998, 21.4972], - [0.6503, -15.8781, 19.6156], - [0.7733, 3.0612, 7.2993], - [0.8391, -5.2227, 13.7056], - [0.9736, 3.0706, 6.7467], - [1.16, -0.374, 10.1005], - [1.3964, 1.3004, 8.1582], - [1.5815, -0.4837, 10.6494], - [1.8306, 1.1464, 8.0714], - [2.0345, 0.0132, 10.1459], - [2.6221, 0.5374, 9.0794], - [2.9655, -1.7582, 15.0986], - [3.5124, 0.2754, 9.0681], - [4.6591, 1.406, 5.097], - [5.367, 0.394, 9.8123], - [6.0839, 0.3365, 10.1205], - [6.8312, 0.3379, 10.1121], - [7.5676, 0.2611, 10.637], - [8.2397, 0.095, 11.8939], - [8.9776, 0.2015, 11.0165], - [10.413, 0.1332, 11.6294], - [11.8539, 0.1074, 11.8979], - [13.3655, 0.1286, 11.6464], - [14.8236, 0.0758, 12.3519], - [16.3203, 0.083, 12.2457], - [17.7915, 0.0581, 12.6515], - [19.2145, 0.0273, 13.1995], - [20.6718, 0.0388, 12.9792], - [22.1333, 0.0357, 13.044], - [25.0761, 0.0332, 13.0977], - [28.0339, 0.029, 13.2035], - [30.967, 0.0201, 13.4538], - [33.8727, 0.013, 13.6737], - [36.8273, 0.0172, 13.5324], - [39.7594, 0.0121, 13.7191], - [42.6721, 0.0083, 13.8687], - [45.5964, 0.0085, 13.8618], - [48.5297, 0.0084, 13.8668], - [51.4512, 0.0064, 13.9651] - ] + "default": { + "1": [ + [0.4148, -1705.1015, 20.5455], + [0.4476, -80.633, 47.2788], + [0.5512, -1.5936, 11.9026], + [0.6027, -18.9998, 21.4972], + [0.6503, -15.8781, 19.6156], + [0.7733, 3.0612, 7.2993], + [0.8391, -5.2227, 13.7056], + [0.9736, 3.0706, 6.7467], + [1.16, -0.374, 10.1005], + [1.3964, 1.3004, 8.1582], + [1.5815, -0.4837, 10.6494], + [1.8306, 1.1464, 8.0714], + [2.0345, 0.0132, 10.1459], + [2.6221, 0.5374, 9.0794], + [2.9655, -1.7582, 15.0986], + [3.5124, 0.2754, 9.0681], + [4.6591, 1.406, 5.097], + [5.367, 0.394, 9.8123], + [6.0839, 0.3365, 10.1205], + [6.8312, 0.3379, 10.1121], + [7.5676, 0.2611, 10.637], + [8.2397, 0.095, 11.8939], + [8.9776, 0.2015, 11.0165], + [10.413, 0.1332, 11.6294], + [11.8539, 0.1074, 11.8979], + [13.3655, 0.1286, 11.6464], + [14.8236, 0.0758, 12.3519], + [16.3203, 0.083, 12.2457], + [17.7915, 0.0581, 12.6515], + [19.2145, 0.0273, 13.1995], + [20.6718, 0.0388, 12.9792], + [22.1333, 0.0357, 13.044], + [25.0761, 0.0332, 13.0977], + [28.0339, 0.029, 13.2035], + [30.967, 0.0201, 13.4538], + [33.8727, 0.013, 13.6737], + [36.8273, 0.0172, 13.5324], + [39.7594, 0.0121, 13.7191], + [42.6721, 0.0083, 13.8687], + [45.5964, 0.0085, 13.8618], + [48.5297, 0.0084, 13.8668], + [51.4512, 0.0064, 13.9651] + ] + } }, "dispense": { - "default": [ - [0.4148, -1705.1015, 20.5455], - [0.4476, -80.633, 47.2788], - [0.5512, -1.5936, 11.9026], - [0.6027, -18.9998, 21.4972], - [0.6503, -15.8781, 19.6156], - [0.7733, 3.0612, 7.2993], - [0.8391, -5.2227, 13.7056], - [0.9736, 3.0706, 6.7467], - [1.16, -0.374, 10.1005], - [1.3964, 1.3004, 8.1582], - [1.5815, -0.4837, 10.6494], - [1.8306, 1.1464, 8.0714], - [2.0345, 0.0132, 10.1459], - [2.6221, 0.5374, 9.0794], - [2.9655, -1.7582, 15.0986], - [3.5124, 0.2754, 9.0681], - [4.6591, 1.406, 5.097], - [5.367, 0.394, 9.8123], - [6.0839, 0.3365, 10.1205], - [6.8312, 0.3379, 10.1121], - [7.5676, 0.2611, 10.637], - [8.2397, 0.095, 11.8939], - [8.9776, 0.2015, 11.0165], - [10.413, 0.1332, 11.6294], - [11.8539, 0.1074, 11.8979], - [13.3655, 0.1286, 11.6464], - [14.8236, 0.0758, 12.3519], - [16.3203, 0.083, 12.2457], - [17.7915, 0.0581, 12.6515], - [19.2145, 0.0273, 13.1995], - [20.6718, 0.0388, 12.9792], - [22.1333, 0.0357, 13.044], - [25.0761, 0.0332, 13.0977], - [28.0339, 0.029, 13.2035], - [30.967, 0.0201, 13.4538], - [33.8727, 0.013, 13.6737], - [36.8273, 0.0172, 13.5324], - [39.7594, 0.0121, 13.7191], - [42.6721, 0.0083, 13.8687], - [45.5964, 0.0085, 13.8618], - [48.5297, 0.0084, 13.8668], - [51.4512, 0.0064, 13.9651] - ] + "default": { + "1": [ + [0.4148, -1705.1015, 20.5455], + [0.4476, -80.633, 47.2788], + [0.5512, -1.5936, 11.9026], + [0.6027, -18.9998, 21.4972], + [0.6503, -15.8781, 19.6156], + [0.7733, 3.0612, 7.2993], + [0.8391, -5.2227, 13.7056], + [0.9736, 3.0706, 6.7467], + [1.16, -0.374, 10.1005], + [1.3964, 1.3004, 8.1582], + [1.5815, -0.4837, 10.6494], + [1.8306, 1.1464, 8.0714], + [2.0345, 0.0132, 10.1459], + [2.6221, 0.5374, 9.0794], + [2.9655, -1.7582, 15.0986], + [3.5124, 0.2754, 9.0681], + [4.6591, 1.406, 5.097], + [5.367, 0.394, 9.8123], + [6.0839, 0.3365, 10.1205], + [6.8312, 0.3379, 10.1121], + [7.5676, 0.2611, 10.637], + [8.2397, 0.095, 11.8939], + [8.9776, 0.2015, 11.0165], + [10.413, 0.1332, 11.6294], + [11.8539, 0.1074, 11.8979], + [13.3655, 0.1286, 11.6464], + [14.8236, 0.0758, 12.3519], + [16.3203, 0.083, 12.2457], + [17.7915, 0.0581, 12.6515], + [19.2145, 0.0273, 13.1995], + [20.6718, 0.0388, 12.9792], + [22.1333, 0.0357, 13.044], + [25.0761, 0.0332, 13.0977], + [28.0339, 0.029, 13.2035], + [30.967, 0.0201, 13.4538], + [33.8727, 0.013, 13.6737], + [36.8273, 0.0172, 13.5324], + [39.7594, 0.0121, 13.7191], + [42.6721, 0.0083, 13.8687], + [45.5964, 0.0085, 13.8618], + [48.5297, 0.0084, 13.8668], + [51.4512, 0.0064, 13.9651] + ] + } } }, "t200": { - "defaultAspirateFlowRate": 80, - "defaultDispenseFlowRate": 80, - "defaultBlowOutFlowRate": 80, + "defaultAspirateFlowRate": { + "default": 80, + "valuesByApiLevel": { + "2.14": 80 + } + }, + "defaultDispenseFlowRate": { + "default": 80, + "valuesByApiLevel": { + "2.14": 80 + } + }, + "defaultBlowOutFlowRate": { + "default": 80, + "valuesByApiLevel": { + "2.14": 80 + } + }, "defaultTipLength": 58.35, - "defaultTipOverlap": 10.5, "defaultReturnTipHeight": 0.2, "defaultBlowoutVolume": 3.2, "aspirate": { - "default": [ - [0.8314, -2.9322, 24.0741], - [0.8853, -30.0996, 48.7784], - [0.9778, -4.3627, 25.9941], - [0.975, 802.2301, -762.6744], - [1.1272, -4.6837, 24.0666], - [1.2747, -3.91, 23.1945], - [1.5656, -2.8032, 21.7836], - [1.6667, -7.2039, 28.6731], - [2.4403, -0.5147, 17.5244], - [3.0564, -1.6013, 20.1761], - [3.6444, -1.1974, 18.9418], - [4.1189, -1.7877, 21.0928], - [4.6467, -0.8591, 17.2684], - [5.2597, -0.207, 14.2379], - [5.8581, -0.2196, 14.3044], - [6.4772, -0.1025, 13.6183], - [7.8158, 0.0537, 12.6063], - [9.1664, 0.0507, 12.6302], - [10.5064, 0.0285, 12.8339], - [14.8361, 0.0818, 12.273], - [19.3933, 0.0801, 12.2991], - [23.9242, 0.0487, 12.9079], - [28.4922, 0.0379, 13.1666], - [36.145, 0.0277, 13.4572], - [43.7972, 0.0184, 13.7916], - [51.5125, 0.0154, 13.9248], - [59.2467, 0.0121, 14.0931], - [66.9428, 0.0084, 14.3151], - [74.6853, 0.0079, 14.3498], - [82.3722, 0.0052, 14.5512], - [90.1106, 0.0054, 14.5333], - [97.8369, 0.0043, 14.6288], - [105.6153, 0.0046, 14.5983], - [113.3686, 0.0036, 14.7076], - [121.1108, 0.003, 14.7785], - [136.61, 0.0026, 14.826], - [152.0708, 0.0018, 14.9298], - [167.6433, 0.0021, 14.8827], - [183.1011, 0.0012, 15.0438], - [198.5845, 0.0011, 15.0538], - [214.0264, 0.0008, 15.123] - ] + "default": { + "1": [ + [0.8314, -2.9322, 24.0741], + [0.8853, -30.0996, 48.7784], + [0.9778, -4.3627, 25.9941], + [0.975, 802.2301, -762.6744], + [1.1272, -4.6837, 24.0666], + [1.2747, -3.91, 23.1945], + [1.5656, -2.8032, 21.7836], + [1.6667, -7.2039, 28.6731], + [2.4403, -0.5147, 17.5244], + [3.0564, -1.6013, 20.1761], + [3.6444, -1.1974, 18.9418], + [4.1189, -1.7877, 21.0928], + [4.6467, -0.8591, 17.2684], + [5.2597, -0.207, 14.2379], + [5.8581, -0.2196, 14.3044], + [6.4772, -0.1025, 13.6183], + [7.8158, 0.0537, 12.6063], + [9.1664, 0.0507, 12.6302], + [10.5064, 0.0285, 12.8339], + [14.8361, 0.0818, 12.273], + [19.3933, 0.0801, 12.2991], + [23.9242, 0.0487, 12.9079], + [28.4922, 0.0379, 13.1666], + [36.145, 0.0277, 13.4572], + [43.7972, 0.0184, 13.7916], + [51.5125, 0.0154, 13.9248], + [59.2467, 0.0121, 14.0931], + [66.9428, 0.0084, 14.3151], + [74.6853, 0.0079, 14.3498], + [82.3722, 0.0052, 14.5512], + [90.1106, 0.0054, 14.5333], + [97.8369, 0.0043, 14.6288], + [105.6153, 0.0046, 14.5983], + [113.3686, 0.0036, 14.7076], + [121.1108, 0.003, 14.7785], + [136.61, 0.0026, 14.826], + [152.0708, 0.0018, 14.9298], + [167.6433, 0.0021, 14.8827], + [183.1011, 0.0012, 15.0438], + [198.5845, 0.0011, 15.0538], + [214.0264, 0.0008, 15.123] + ] + } }, "dispense": { - "default": [ - [0.8314, -2.9322, 24.0741], - [0.8853, -30.0996, 48.7784], - [0.9778, -4.3627, 25.9941], - [0.975, 802.2301, -762.6744], - [1.1272, -4.6837, 24.0666], - [1.2747, -3.91, 23.1945], - [1.5656, -2.8032, 21.7836], - [1.6667, -7.2039, 28.6731], - [2.4403, -0.5147, 17.5244], - [3.0564, -1.6013, 20.1761], - [3.6444, -1.1974, 18.9418], - [4.1189, -1.7877, 21.0928], - [4.6467, -0.8591, 17.2684], - [5.2597, -0.207, 14.2379], - [5.8581, -0.2196, 14.3044], - [6.4772, -0.1025, 13.6183], - [7.8158, 0.0537, 12.6063], - [9.1664, 0.0507, 12.6302], - [10.5064, 0.0285, 12.8339], - [14.8361, 0.0818, 12.273], - [19.3933, 0.0801, 12.2991], - [23.9242, 0.0487, 12.9079], - [28.4922, 0.0379, 13.1666], - [36.145, 0.0277, 13.4572], - [43.7972, 0.0184, 13.7916], - [51.5125, 0.0154, 13.9248], - [59.2467, 0.0121, 14.0931], - [66.9428, 0.0084, 14.3151], - [74.6853, 0.0079, 14.3498], - [82.3722, 0.0052, 14.5512], - [90.1106, 0.0054, 14.5333], - [97.8369, 0.0043, 14.6288], - [105.6153, 0.0046, 14.5983], - [113.3686, 0.0036, 14.7076], - [121.1108, 0.003, 14.7785], - [136.61, 0.0026, 14.826], - [152.0708, 0.0018, 14.9298], - [167.6433, 0.0021, 14.8827], - [183.1011, 0.0012, 15.0438], - [198.5845, 0.0011, 15.0538], - [214.0264, 0.0008, 15.123] - ] + "default": { + "1": [ + [0.8314, -2.9322, 24.0741], + [0.8853, -30.0996, 48.7784], + [0.9778, -4.3627, 25.9941], + [0.975, 802.2301, -762.6744], + [1.1272, -4.6837, 24.0666], + [1.2747, -3.91, 23.1945], + [1.5656, -2.8032, 21.7836], + [1.6667, -7.2039, 28.6731], + [2.4403, -0.5147, 17.5244], + [3.0564, -1.6013, 20.1761], + [3.6444, -1.1974, 18.9418], + [4.1189, -1.7877, 21.0928], + [4.6467, -0.8591, 17.2684], + [5.2597, -0.207, 14.2379], + [5.8581, -0.2196, 14.3044], + [6.4772, -0.1025, 13.6183], + [7.8158, 0.0537, 12.6063], + [9.1664, 0.0507, 12.6302], + [10.5064, 0.0285, 12.8339], + [14.8361, 0.0818, 12.273], + [19.3933, 0.0801, 12.2991], + [23.9242, 0.0487, 12.9079], + [28.4922, 0.0379, 13.1666], + [36.145, 0.0277, 13.4572], + [43.7972, 0.0184, 13.7916], + [51.5125, 0.0154, 13.9248], + [59.2467, 0.0121, 14.0931], + [66.9428, 0.0084, 14.3151], + [74.6853, 0.0079, 14.3498], + [82.3722, 0.0052, 14.5512], + [90.1106, 0.0054, 14.5333], + [97.8369, 0.0043, 14.6288], + [105.6153, 0.0046, 14.5983], + [113.3686, 0.0036, 14.7076], + [121.1108, 0.003, 14.7785], + [136.61, 0.0026, 14.826], + [152.0708, 0.0018, 14.9298], + [167.6433, 0.0021, 14.8827], + [183.1011, 0.0012, 15.0438], + [198.5845, 0.0011, 15.0538], + [214.0264, 0.0008, 15.123] + ] + } } }, "t1000": { - "defaultAspirateFlowRate": 160, - "defaultDispenseFlowRate": 160, - "defaultBlowOutFlowRate": 80, + "defaultAspirateFlowRate": { + "default": 160, + "valuesByApiLevel": { + "2.14": 160 + } + }, + "defaultDispenseFlowRate": { + "default": 160, + "valuesByApiLevel": { + "2.14": 160 + } + }, + "defaultBlowOutFlowRate": { + "default": 80, + "valuesByApiLevel": { + "2.14": 80 + } + }, "defaultTipLength": 95.6, - "defaultTipOverlap": 10.5, "defaultReturnTipHeight": 0.2, "defaultBlowoutVolume": 3.2, "aspirate": { - "default": [ - [0.7511, 3.9556, 6.455], - [1.3075, 2.1664, 5.8839], - [1.8737, 1.1513, 7.2111], - [3.177, 0.9374, 7.612], - [4.5368, 0.5531, 8.8328], - [7.3103, 0.3035, 9.9651], - [10.0825, 0.1513, 11.0781], - [12.9776, 0.1293, 11.2991], - [15.9173, 0.0976, 11.7115], - [18.8243, 0.0624, 12.2706], - [21.8529, 0.07, 12.1275], - [24.8068, 0.0418, 12.7442], - [27.7744, 0.0356, 12.8984], - [35.2873, 0.0303, 13.0454], - [42.7989, 0.0202, 13.4038], - [50.4562, 0.0196, 13.4293], - [58.1081, 0.0145, 13.6843], - [65.7267, 0.0104, 13.9252], - [73.2857, 0.0068, 14.1606], - [81.0016, 0.0091, 13.9883], - [88.6617, 0.0064, 14.2052], - [103.9829, 0.0051, 14.3271], - [119.4408, 0.0049, 14.3475], - [134.889, 0.0037, 14.485], - [150.273, 0.0026, 14.6402], - [181.2798, 0.0026, 14.6427], - [212.4724, 0.0022, 14.7002], - [243.577, 0.0015, 14.8558], - [274.7216, 0.0012, 14.9205], - [305.8132, 0.0009, 15.0118], - [368.0697, 0.0007, 15.0668], - [430.2513, 0.0005, 15.1594], - [492.3487, 0.0003, 15.2291], - [554.5713, 0.0003, 15.2367], - [616.6825, 0.0002, 15.2949], - [694.4168, 0.0002, 15.3027], - [772.0327, 0.0001, 15.3494], - [849.617, 0.0001, 15.3717], - [927.2556, 0.0001, 15.3745], - [1004.87, 0.0001, 15.3912], - [1051.4648, 0.0001, 15.391] - ] + "default": { + "1": [ + [0.7511, 3.9556, 6.455], + [1.3075, 2.1664, 5.8839], + [1.8737, 1.1513, 7.2111], + [3.177, 0.9374, 7.612], + [4.5368, 0.5531, 8.8328], + [7.3103, 0.3035, 9.9651], + [10.0825, 0.1513, 11.0781], + [12.9776, 0.1293, 11.2991], + [15.9173, 0.0976, 11.7115], + [18.8243, 0.0624, 12.2706], + [21.8529, 0.07, 12.1275], + [24.8068, 0.0418, 12.7442], + [27.7744, 0.0356, 12.8984], + [35.2873, 0.0303, 13.0454], + [42.7989, 0.0202, 13.4038], + [50.4562, 0.0196, 13.4293], + [58.1081, 0.0145, 13.6843], + [65.7267, 0.0104, 13.9252], + [73.2857, 0.0068, 14.1606], + [81.0016, 0.0091, 13.9883], + [88.6617, 0.0064, 14.2052], + [103.9829, 0.0051, 14.3271], + [119.4408, 0.0049, 14.3475], + [134.889, 0.0037, 14.485], + [150.273, 0.0026, 14.6402], + [181.2798, 0.0026, 14.6427], + [212.4724, 0.0022, 14.7002], + [243.577, 0.0015, 14.8558], + [274.7216, 0.0012, 14.9205], + [305.8132, 0.0009, 15.0118], + [368.0697, 0.0007, 15.0668], + [430.2513, 0.0005, 15.1594], + [492.3487, 0.0003, 15.2291], + [554.5713, 0.0003, 15.2367], + [616.6825, 0.0002, 15.2949], + [694.4168, 0.0002, 15.3027], + [772.0327, 0.0001, 15.3494], + [849.617, 0.0001, 15.3717], + [927.2556, 0.0001, 15.3745], + [1004.87, 0.0001, 15.3912], + [1051.4648, 0.0001, 15.391] + ] + } }, "dispense": { - "default": [ - [0.7511, 3.9556, 6.455], - [1.3075, 2.1664, 5.8839], - [1.8737, 1.1513, 7.2111], - [3.177, 0.9374, 7.612], - [4.5368, 0.5531, 8.8328], - [7.3103, 0.3035, 9.9651], - [10.0825, 0.1513, 11.0781], - [12.9776, 0.1293, 11.2991], - [15.9173, 0.0976, 11.7115], - [18.8243, 0.0624, 12.2706], - [21.8529, 0.07, 12.1275], - [24.8068, 0.0418, 12.7442], - [27.7744, 0.0356, 12.8984], - [35.2873, 0.0303, 13.0454], - [42.7989, 0.0202, 13.4038], - [50.4562, 0.0196, 13.4293], - [58.1081, 0.0145, 13.6843], - [65.7267, 0.0104, 13.9252], - [73.2857, 0.0068, 14.1606], - [81.0016, 0.0091, 13.9883], - [88.6617, 0.0064, 14.2052], - [103.9829, 0.0051, 14.3271], - [119.4408, 0.0049, 14.3475], - [134.889, 0.0037, 14.485], - [150.273, 0.0026, 14.6402], - [181.2798, 0.0026, 14.6427], - [212.4724, 0.0022, 14.7002], - [243.577, 0.0015, 14.8558], - [274.7216, 0.0012, 14.9205], - [305.8132, 0.0009, 15.0118], - [368.0697, 0.0007, 15.0668], - [430.2513, 0.0005, 15.1594], - [492.3487, 0.0003, 15.2291], - [554.5713, 0.0003, 15.2367], - [616.6825, 0.0002, 15.2949], - [694.4168, 0.0002, 15.3027], - [772.0327, 0.0001, 15.3494], - [849.617, 0.0001, 15.3717], - [927.2556, 0.0001, 15.3745], - [1004.87, 0.0001, 15.3912], - [1051.4648, 0.0001, 15.391] - ] + "default": { + "1": [ + [0.7511, 3.9556, 6.455], + [1.3075, 2.1664, 5.8839], + [1.8737, 1.1513, 7.2111], + [3.177, 0.9374, 7.612], + [4.5368, 0.5531, 8.8328], + [7.3103, 0.3035, 9.9651], + [10.0825, 0.1513, 11.0781], + [12.9776, 0.1293, 11.2991], + [15.9173, 0.0976, 11.7115], + [18.8243, 0.0624, 12.2706], + [21.8529, 0.07, 12.1275], + [24.8068, 0.0418, 12.7442], + [27.7744, 0.0356, 12.8984], + [35.2873, 0.0303, 13.0454], + [42.7989, 0.0202, 13.4038], + [50.4562, 0.0196, 13.4293], + [58.1081, 0.0145, 13.6843], + [65.7267, 0.0104, 13.9252], + [73.2857, 0.0068, 14.1606], + [81.0016, 0.0091, 13.9883], + [88.6617, 0.0064, 14.2052], + [103.9829, 0.0051, 14.3271], + [119.4408, 0.0049, 14.3475], + [134.889, 0.0037, 14.485], + [150.273, 0.0026, 14.6402], + [181.2798, 0.0026, 14.6427], + [212.4724, 0.0022, 14.7002], + [243.577, 0.0015, 14.8558], + [274.7216, 0.0012, 14.9205], + [305.8132, 0.0009, 15.0118], + [368.0697, 0.0007, 15.0668], + [430.2513, 0.0005, 15.1594], + [492.3487, 0.0003, 15.2291], + [554.5713, 0.0003, 15.2367], + [616.6825, 0.0002, 15.2949], + [694.4168, 0.0002, 15.3027], + [772.0327, 0.0001, 15.3494], + [849.617, 0.0001, 15.3717], + [927.2556, 0.0001, 15.3745], + [1004.87, 0.0001, 15.3912], + [1051.4648, 0.0001, 15.391] + ] + } } } }, + "defaultTipOverlapDictionary": { + "default": 10.5, + "opentrons/opentrons_flex_96_tiprack_50ul/1": 10.5, + "opentrons/opentrons_flex_96_tiprack_1000ul/1": 10.5, + "opentrons/opentrons_flex_96_tiprack_200ul/1": 10.5 + }, "maxVolume": 1000, "minVolume": 1, "defaultTipracks": [ diff --git a/shared-data/pipette/definitions/2/liquid/ninety_six_channel/p1000/3_5.json b/shared-data/pipette/definitions/2/liquid/ninety_six_channel/p1000/3_5.json new file mode 100644 index 00000000000..e9c0e9d3707 --- /dev/null +++ b/shared-data/pipette/definitions/2/liquid/ninety_six_channel/p1000/3_5.json @@ -0,0 +1,371 @@ +{ + "$otSharedSchema": "#/pipette/schemas/2/pipetteLiquidPropertiesSchema.json", + "supportedTips": { + "t50": { + "defaultAspirateFlowRate": { + "default": 6, + "valuesByApiLevel": { + "2.14": 6 + } + }, + "defaultDispenseFlowRate": { + "default": 6, + "valuesByApiLevel": { + "2.14": 6 + } + }, + "defaultBlowOutFlowRate": { + "default": 80, + "valuesByApiLevel": { + "2.14": 80 + } + }, + "defaultTipLength": 57.9, + "defaultReturnTipHeight": 0.2, + "defaultBlowoutVolume": 3.2, + "aspirate": { + "default": { + "1": [ + [0.4148, -1705.1015, 20.5455], + [0.4476, -80.633, 47.2788], + [0.5512, -1.5936, 11.9026], + [0.6027, -18.9998, 21.4972], + [0.6503, -15.8781, 19.6156], + [0.7733, 3.0612, 7.2993], + [0.8391, -5.2227, 13.7056], + [0.9736, 3.0706, 6.7467], + [1.16, -0.374, 10.1005], + [1.3964, 1.3004, 8.1582], + [1.5815, -0.4837, 10.6494], + [1.8306, 1.1464, 8.0714], + [2.0345, 0.0132, 10.1459], + [2.6221, 0.5374, 9.0794], + [2.9655, -1.7582, 15.0986], + [3.5124, 0.2754, 9.0681], + [4.6591, 1.406, 5.097], + [5.367, 0.394, 9.8123], + [6.0839, 0.3365, 10.1205], + [6.8312, 0.3379, 10.1121], + [7.5676, 0.2611, 10.637], + [8.2397, 0.095, 11.8939], + [8.9776, 0.2015, 11.0165], + [10.413, 0.1332, 11.6294], + [11.8539, 0.1074, 11.8979], + [13.3655, 0.1286, 11.6464], + [14.8236, 0.0758, 12.3519], + [16.3203, 0.083, 12.2457], + [17.7915, 0.0581, 12.6515], + [19.2145, 0.0273, 13.1995], + [20.6718, 0.0388, 12.9792], + [22.1333, 0.0357, 13.044], + [25.0761, 0.0332, 13.0977], + [28.0339, 0.029, 13.2035], + [30.967, 0.0201, 13.4538], + [33.8727, 0.013, 13.6737], + [36.8273, 0.0172, 13.5324], + [39.7594, 0.0121, 13.7191], + [42.6721, 0.0083, 13.8687], + [45.5964, 0.0085, 13.8618], + [48.5297, 0.0084, 13.8668], + [51.4512, 0.0064, 13.9651] + ] + } + }, + "dispense": { + "default": { + "1": [ + [0.4148, -1705.1015, 20.5455], + [0.4476, -80.633, 47.2788], + [0.5512, -1.5936, 11.9026], + [0.6027, -18.9998, 21.4972], + [0.6503, -15.8781, 19.6156], + [0.7733, 3.0612, 7.2993], + [0.8391, -5.2227, 13.7056], + [0.9736, 3.0706, 6.7467], + [1.16, -0.374, 10.1005], + [1.3964, 1.3004, 8.1582], + [1.5815, -0.4837, 10.6494], + [1.8306, 1.1464, 8.0714], + [2.0345, 0.0132, 10.1459], + [2.6221, 0.5374, 9.0794], + [2.9655, -1.7582, 15.0986], + [3.5124, 0.2754, 9.0681], + [4.6591, 1.406, 5.097], + [5.367, 0.394, 9.8123], + [6.0839, 0.3365, 10.1205], + [6.8312, 0.3379, 10.1121], + [7.5676, 0.2611, 10.637], + [8.2397, 0.095, 11.8939], + [8.9776, 0.2015, 11.0165], + [10.413, 0.1332, 11.6294], + [11.8539, 0.1074, 11.8979], + [13.3655, 0.1286, 11.6464], + [14.8236, 0.0758, 12.3519], + [16.3203, 0.083, 12.2457], + [17.7915, 0.0581, 12.6515], + [19.2145, 0.0273, 13.1995], + [20.6718, 0.0388, 12.9792], + [22.1333, 0.0357, 13.044], + [25.0761, 0.0332, 13.0977], + [28.0339, 0.029, 13.2035], + [30.967, 0.0201, 13.4538], + [33.8727, 0.013, 13.6737], + [36.8273, 0.0172, 13.5324], + [39.7594, 0.0121, 13.7191], + [42.6721, 0.0083, 13.8687], + [45.5964, 0.0085, 13.8618], + [48.5297, 0.0084, 13.8668], + [51.4512, 0.0064, 13.9651] + ] + } + } + }, + "t200": { + "defaultAspirateFlowRate": { + "default": 80, + "valuesByApiLevel": { + "2.14": 80 + } + }, + "defaultDispenseFlowRate": { + "default": 80, + "valuesByApiLevel": { + "2.14": 80 + } + }, + "defaultBlowOutFlowRate": { + "default": 80, + "valuesByApiLevel": { + "2.14": 80 + } + }, + "defaultTipLength": 58.35, + "defaultReturnTipHeight": 0.2, + "defaultBlowoutVolume": 3.2, + "aspirate": { + "default": { + "1": [ + [0.8314, -2.9322, 24.0741], + [0.8853, -30.0996, 48.7784], + [0.9778, -4.3627, 25.9941], + [0.975, 802.2301, -762.6744], + [1.1272, -4.6837, 24.0666], + [1.2747, -3.91, 23.1945], + [1.5656, -2.8032, 21.7836], + [1.6667, -7.2039, 28.6731], + [2.4403, -0.5147, 17.5244], + [3.0564, -1.6013, 20.1761], + [3.6444, -1.1974, 18.9418], + [4.1189, -1.7877, 21.0928], + [4.6467, -0.8591, 17.2684], + [5.2597, -0.207, 14.2379], + [5.8581, -0.2196, 14.3044], + [6.4772, -0.1025, 13.6183], + [7.8158, 0.0537, 12.6063], + [9.1664, 0.0507, 12.6302], + [10.5064, 0.0285, 12.8339], + [14.8361, 0.0818, 12.273], + [19.3933, 0.0801, 12.2991], + [23.9242, 0.0487, 12.9079], + [28.4922, 0.0379, 13.1666], + [36.145, 0.0277, 13.4572], + [43.7972, 0.0184, 13.7916], + [51.5125, 0.0154, 13.9248], + [59.2467, 0.0121, 14.0931], + [66.9428, 0.0084, 14.3151], + [74.6853, 0.0079, 14.3498], + [82.3722, 0.0052, 14.5512], + [90.1106, 0.0054, 14.5333], + [97.8369, 0.0043, 14.6288], + [105.6153, 0.0046, 14.5983], + [113.3686, 0.0036, 14.7076], + [121.1108, 0.003, 14.7785], + [136.61, 0.0026, 14.826], + [152.0708, 0.0018, 14.9298], + [167.6433, 0.0021, 14.8827], + [183.1011, 0.0012, 15.0438], + [198.5845, 0.0011, 15.0538], + [214.0264, 0.0008, 15.123] + ] + } + }, + "dispense": { + "default": { + "1": [ + [0.8314, -2.9322, 24.0741], + [0.8853, -30.0996, 48.7784], + [0.9778, -4.3627, 25.9941], + [0.975, 802.2301, -762.6744], + [1.1272, -4.6837, 24.0666], + [1.2747, -3.91, 23.1945], + [1.5656, -2.8032, 21.7836], + [1.6667, -7.2039, 28.6731], + [2.4403, -0.5147, 17.5244], + [3.0564, -1.6013, 20.1761], + [3.6444, -1.1974, 18.9418], + [4.1189, -1.7877, 21.0928], + [4.6467, -0.8591, 17.2684], + [5.2597, -0.207, 14.2379], + [5.8581, -0.2196, 14.3044], + [6.4772, -0.1025, 13.6183], + [7.8158, 0.0537, 12.6063], + [9.1664, 0.0507, 12.6302], + [10.5064, 0.0285, 12.8339], + [14.8361, 0.0818, 12.273], + [19.3933, 0.0801, 12.2991], + [23.9242, 0.0487, 12.9079], + [28.4922, 0.0379, 13.1666], + [36.145, 0.0277, 13.4572], + [43.7972, 0.0184, 13.7916], + [51.5125, 0.0154, 13.9248], + [59.2467, 0.0121, 14.0931], + [66.9428, 0.0084, 14.3151], + [74.6853, 0.0079, 14.3498], + [82.3722, 0.0052, 14.5512], + [90.1106, 0.0054, 14.5333], + [97.8369, 0.0043, 14.6288], + [105.6153, 0.0046, 14.5983], + [113.3686, 0.0036, 14.7076], + [121.1108, 0.003, 14.7785], + [136.61, 0.0026, 14.826], + [152.0708, 0.0018, 14.9298], + [167.6433, 0.0021, 14.8827], + [183.1011, 0.0012, 15.0438], + [198.5845, 0.0011, 15.0538], + [214.0264, 0.0008, 15.123] + ] + } + } + }, + "t1000": { + "defaultAspirateFlowRate": { + "default": 160, + "valuesByApiLevel": { + "2.14": 160 + } + }, + "defaultDispenseFlowRate": { + "default": 160, + "valuesByApiLevel": { + "2.14": 160 + } + }, + "defaultBlowOutFlowRate": { + "default": 80, + "valuesByApiLevel": { + "2.14": 80 + } + }, + "defaultTipLength": 95.6, + "defaultReturnTipHeight": 0.2, + "defaultBlowoutVolume": 3.2, + "aspirate": { + "default": { + "1": [ + [0.7511, 3.9556, 6.455], + [1.3075, 2.1664, 5.8839], + [1.8737, 1.1513, 7.2111], + [3.177, 0.9374, 7.612], + [4.5368, 0.5531, 8.8328], + [7.3103, 0.3035, 9.9651], + [10.0825, 0.1513, 11.0781], + [12.9776, 0.1293, 11.2991], + [15.9173, 0.0976, 11.7115], + [18.8243, 0.0624, 12.2706], + [21.8529, 0.07, 12.1275], + [24.8068, 0.0418, 12.7442], + [27.7744, 0.0356, 12.8984], + [35.2873, 0.0303, 13.0454], + [42.7989, 0.0202, 13.4038], + [50.4562, 0.0196, 13.4293], + [58.1081, 0.0145, 13.6843], + [65.7267, 0.0104, 13.9252], + [73.2857, 0.0068, 14.1606], + [81.0016, 0.0091, 13.9883], + [88.6617, 0.0064, 14.2052], + [103.9829, 0.0051, 14.3271], + [119.4408, 0.0049, 14.3475], + [134.889, 0.0037, 14.485], + [150.273, 0.0026, 14.6402], + [181.2798, 0.0026, 14.6427], + [212.4724, 0.0022, 14.7002], + [243.577, 0.0015, 14.8558], + [274.7216, 0.0012, 14.9205], + [305.8132, 0.0009, 15.0118], + [368.0697, 0.0007, 15.0668], + [430.2513, 0.0005, 15.1594], + [492.3487, 0.0003, 15.2291], + [554.5713, 0.0003, 15.2367], + [616.6825, 0.0002, 15.2949], + [694.4168, 0.0002, 15.3027], + [772.0327, 0.0001, 15.3494], + [849.617, 0.0001, 15.3717], + [927.2556, 0.0001, 15.3745], + [1004.87, 0.0001, 15.3912], + [1051.4648, 0.0001, 15.391] + ] + } + }, + "dispense": { + "default": { + "1": [ + [0.7511, 3.9556, 6.455], + [1.3075, 2.1664, 5.8839], + [1.8737, 1.1513, 7.2111], + [3.177, 0.9374, 7.612], + [4.5368, 0.5531, 8.8328], + [7.3103, 0.3035, 9.9651], + [10.0825, 0.1513, 11.0781], + [12.9776, 0.1293, 11.2991], + [15.9173, 0.0976, 11.7115], + [18.8243, 0.0624, 12.2706], + [21.8529, 0.07, 12.1275], + [24.8068, 0.0418, 12.7442], + [27.7744, 0.0356, 12.8984], + [35.2873, 0.0303, 13.0454], + [42.7989, 0.0202, 13.4038], + [50.4562, 0.0196, 13.4293], + [58.1081, 0.0145, 13.6843], + [65.7267, 0.0104, 13.9252], + [73.2857, 0.0068, 14.1606], + [81.0016, 0.0091, 13.9883], + [88.6617, 0.0064, 14.2052], + [103.9829, 0.0051, 14.3271], + [119.4408, 0.0049, 14.3475], + [134.889, 0.0037, 14.485], + [150.273, 0.0026, 14.6402], + [181.2798, 0.0026, 14.6427], + [212.4724, 0.0022, 14.7002], + [243.577, 0.0015, 14.8558], + [274.7216, 0.0012, 14.9205], + [305.8132, 0.0009, 15.0118], + [368.0697, 0.0007, 15.0668], + [430.2513, 0.0005, 15.1594], + [492.3487, 0.0003, 15.2291], + [554.5713, 0.0003, 15.2367], + [616.6825, 0.0002, 15.2949], + [694.4168, 0.0002, 15.3027], + [772.0327, 0.0001, 15.3494], + [849.617, 0.0001, 15.3717], + [927.2556, 0.0001, 15.3745], + [1004.87, 0.0001, 15.3912], + [1051.4648, 0.0001, 15.391] + ] + } + } + } + }, + "defaultTipOverlapDictionary": { + "default": 10.5, + "opentrons/opentrons_flex_96_tiprack_50ul/1": 10.5, + "opentrons/opentrons_flex_96_tiprack_1000ul/1": 10.5, + "opentrons/opentrons_flex_96_tiprack_200ul/1": 10.5 + }, + "maxVolume": 1000, + "minVolume": 1, + "defaultTipracks": [ + "opentrons/opentrons_flex_96_tiprack_1000ul/1", + "opentrons/opentrons_flex_96_tiprack_200ul/1", + "opentrons/opentrons_flex_96_tiprack_50ul/1" + ] +} diff --git a/shared-data/pipette/definitions/2/liquid/single_channel/p10/1_0.json b/shared-data/pipette/definitions/2/liquid/single_channel/p10/1_0.json index d7c823ed622..50e489c8de8 100644 --- a/shared-data/pipette/definitions/2/liquid/single_channel/p10/1_0.json +++ b/shared-data/pipette/definitions/2/liquid/single_channel/p10/1_0.json @@ -2,69 +2,55 @@ "$otSharedSchema": "#/pipette/schemas/2/pipetteLiquidPropertiesSchema.json", "supportedTips": { "t10": { - "defaultAspirateFlowRate": 5.0, - "defaultDispenseFlowRate": 10.0, - "defaultBlowOutFlowRate": 1000.0, + "defaultAspirateFlowRate": { + "default": 5, + "valuesByApiLevel": { "2.0": 5 } + }, + "defaultDispenseFlowRate": { + "default": 10, + "valuesByApiLevel": { "2.0": 10 } + }, + "defaultBlowOutFlowRate": { + "default": 1000, + "valuesByApiLevel": { "2.0": 1000 } + }, "defaultTipLength": 33.0, - "defaultTipOverlap": 3.29, - "defaultReturnTipHeight": null, "aspirate": { - "opentrons/opentrons_96_tiprack_10ul/1": [ - [1.8263, -0.0958, 1.088], - [2.5222, -0.104, 1.1031], - [3.2354, -0.0447, 0.9536], - [3.9984, -0.012, 0.8477], - [12.5135, -0.0021, 0.8079] - ], - "opentrons/opentrons_96_filtertiprack_10ul/1": [ - [1.8263, -0.0958, 1.088], - [2.5222, -0.104, 1.1031], - [3.2354, -0.0447, 0.9536], - [3.9984, -0.012, 0.8477], - [12.5135, -0.0021, 0.8079] - ], - "opentrons/geb_96_tiprack_10ul/1": [ - [1.8263, -0.0958, 1.088], - [2.5222, -0.104, 1.1031], - [3.2354, -0.0447, 0.9536], - [3.9984, -0.012, 0.8477], - [12.5135, -0.0021, 0.8079] - ], - "opentrons/eppendorf_96_tiprack_10ul_eptips/1": [ - [1.8263, -0.0958, 1.088], - [2.5222, -0.104, 1.1031], - [3.2354, -0.0447, 0.9536], - [3.9984, -0.012, 0.8477], - [12.5135, -0.0021, 0.8079] - ], - "default": [ - [1.8263, -0.0958, 1.088], - [2.5222, -0.104, 1.1031], - [3.2354, -0.0447, 0.9536], - [3.9984, -0.012, 0.8477], - [12.5135, -0.0021, 0.8079] - ] + "default": { + "1": [ + [1.8263, -0.0958, 1.088], + [2.5222, -0.104, 1.1031], + [3.2354, -0.0447, 0.9536], + [3.9984, -0.012, 0.8477], + [12.5135, -0.0021, 0.8079] + ], + "2": [ + [1.438649211, 0.01931415115, 0.691538317], + [1.836824579, 0.03868955123, 0.6636639129], + [2.960052684, 0.00470371018, 0.7260899411], + [4.487508789, 0.005175245625, 0.7246941713], + [10.59661421, 0.001470408978, 0.7413196584] + ] + } }, "dispense": { - "opentrons/opentrons_96_tiprack_10ul/1": [[12.5135, 0.0, 0.7945]], - "opentrons/opentrons_96_filtertiprack_10ul/1": [[12.5135, 0.0, 0.7945]], - "opentrons/geb_96_tiprack_10ul/1": [[12.5135, 0.0, 0.7945]], - "opentrons/eppendorf_96_tiprack_10ul_eptips/1": [ - [12.5135, 0.0, 0.7945] - ], - "default": [[12.5135, 0.0, 0.7945]] - }, - "defaultTipOverlapDictionary": { - "opentrons/opentrons_96_tiprack_10ul/1": 3.29, - "opentrons/opentrons_96_filtertiprack_10ul/1": 3.29, - "opentrons/geb_96_tiprack_10ul/1": 6.2, - "opentrons/eppendorf_96_tiprack_10ul_eptips/1": 1.0 + "default": { + "1": [[12.5135, 0.0, 0.7945]], + "2": [[12.5135, 0, 0.7945]] + } }, "defaultBlowoutVolume": 2.356 } }, "maxVolume": 10, "minVolume": 1.0, + "defaultTipOverlapDictionary": { + "default": 3.29, + "opentrons/opentrons_96_tiprack_10ul/1": 3.29, + "opentrons/opentrons_96_filtertiprack_10ul/1": 3.29, + "opentrons/geb_96_tiprack_10ul/1": 6.2, + "opentrons/eppendorf_96_tiprack_10ul_eptips/1": 1.0 + }, "defaultTipracks": [ "opentrons/opentrons_96_tiprack_10ul/1", "opentrons/opentrons_96_filtertiprack_10ul/1", diff --git a/shared-data/pipette/definitions/2/liquid/single_channel/p10/1_3.json b/shared-data/pipette/definitions/2/liquid/single_channel/p10/1_3.json index d7c823ed622..81d69757d94 100644 --- a/shared-data/pipette/definitions/2/liquid/single_channel/p10/1_3.json +++ b/shared-data/pipette/definitions/2/liquid/single_channel/p10/1_3.json @@ -2,67 +2,53 @@ "$otSharedSchema": "#/pipette/schemas/2/pipetteLiquidPropertiesSchema.json", "supportedTips": { "t10": { - "defaultAspirateFlowRate": 5.0, - "defaultDispenseFlowRate": 10.0, - "defaultBlowOutFlowRate": 1000.0, + "defaultAspirateFlowRate": { + "default": 5, + "valuesByApiLevel": { "2.0": 5 } + }, + "defaultDispenseFlowRate": { + "default": 10, + "valuesByApiLevel": { "2.0": 10 } + }, + "defaultBlowOutFlowRate": { + "default": 1000, + "valuesByApiLevel": { "2.0": 1000 } + }, "defaultTipLength": 33.0, - "defaultTipOverlap": 3.29, - "defaultReturnTipHeight": null, "aspirate": { - "opentrons/opentrons_96_tiprack_10ul/1": [ - [1.8263, -0.0958, 1.088], - [2.5222, -0.104, 1.1031], - [3.2354, -0.0447, 0.9536], - [3.9984, -0.012, 0.8477], - [12.5135, -0.0021, 0.8079] - ], - "opentrons/opentrons_96_filtertiprack_10ul/1": [ - [1.8263, -0.0958, 1.088], - [2.5222, -0.104, 1.1031], - [3.2354, -0.0447, 0.9536], - [3.9984, -0.012, 0.8477], - [12.5135, -0.0021, 0.8079] - ], - "opentrons/geb_96_tiprack_10ul/1": [ - [1.8263, -0.0958, 1.088], - [2.5222, -0.104, 1.1031], - [3.2354, -0.0447, 0.9536], - [3.9984, -0.012, 0.8477], - [12.5135, -0.0021, 0.8079] - ], - "opentrons/eppendorf_96_tiprack_10ul_eptips/1": [ - [1.8263, -0.0958, 1.088], - [2.5222, -0.104, 1.1031], - [3.2354, -0.0447, 0.9536], - [3.9984, -0.012, 0.8477], - [12.5135, -0.0021, 0.8079] - ], - "default": [ - [1.8263, -0.0958, 1.088], - [2.5222, -0.104, 1.1031], - [3.2354, -0.0447, 0.9536], - [3.9984, -0.012, 0.8477], - [12.5135, -0.0021, 0.8079] - ] + "default": { + "1": [ + [1.8263, -0.0958, 1.088], + [2.5222, -0.104, 1.1031], + [3.2354, -0.0447, 0.9536], + [3.9984, -0.012, 0.8477], + [12.5135, -0.0021, 0.8079] + ], + "2": [ + [1.438649211, 0.01931415115, 0.691538317], + [1.836824579, 0.03868955123, 0.6636639129], + [2.960052684, 0.00470371018, 0.7260899411], + [4.487508789, 0.005175245625, 0.7246941713], + [10.59661421, 0.001470408978, 0.7413196584] + ] + } }, "dispense": { - "opentrons/opentrons_96_tiprack_10ul/1": [[12.5135, 0.0, 0.7945]], - "opentrons/opentrons_96_filtertiprack_10ul/1": [[12.5135, 0.0, 0.7945]], - "opentrons/geb_96_tiprack_10ul/1": [[12.5135, 0.0, 0.7945]], - "opentrons/eppendorf_96_tiprack_10ul_eptips/1": [ - [12.5135, 0.0, 0.7945] - ], - "default": [[12.5135, 0.0, 0.7945]] - }, - "defaultTipOverlapDictionary": { - "opentrons/opentrons_96_tiprack_10ul/1": 3.29, - "opentrons/opentrons_96_filtertiprack_10ul/1": 3.29, - "opentrons/geb_96_tiprack_10ul/1": 6.2, - "opentrons/eppendorf_96_tiprack_10ul_eptips/1": 1.0 + "default": { + "1": [[12.5135, 0.0, 0.7945]], + "2": [[12.5135, 0, 0.7945]] + } }, "defaultBlowoutVolume": 2.356 } }, + "defaultTipOverlapDictionary": { + "default": 3.29, + "opentrons/opentrons_96_tiprack_10ul/1": 3.29, + "opentrons/opentrons_96_filtertiprack_10ul/1": 3.29, + "opentrons/geb_96_tiprack_10ul/1": 6.2, + "opentrons/eppendorf_96_tiprack_10ul_eptips/1": 1.0 + }, "maxVolume": 10, "minVolume": 1.0, "defaultTipracks": [ diff --git a/shared-data/pipette/definitions/2/liquid/single_channel/p10/1_4.json b/shared-data/pipette/definitions/2/liquid/single_channel/p10/1_4.json index dac23a507ed..ae135bbb601 100644 --- a/shared-data/pipette/definitions/2/liquid/single_channel/p10/1_4.json +++ b/shared-data/pipette/definitions/2/liquid/single_channel/p10/1_4.json @@ -2,64 +2,53 @@ "$otSharedSchema": "#/pipette/schemas/2/pipetteLiquidPropertiesSchema.json", "supportedTips": { "t10": { - "defaultAspirateFlowRate": 5.0, - "defaultDispenseFlowRate": 10.0, - "defaultBlowOutFlowRate": 1000.0, + "defaultAspirateFlowRate": { + "default": 5, + "valuesByApiLevel": { "2.0": 5 } + }, + "defaultDispenseFlowRate": { + "default": 10, + "valuesByApiLevel": { "2.0": 10 } + }, + "defaultBlowOutFlowRate": { + "default": 1000, + "valuesByApiLevel": { "2.0": 1000 } + }, "defaultTipLength": 33.0, - "defaultTipOverlap": 3.29, - "defaultReturnTipHeight": null, "aspirate": { - "opentrons/opentrons_96_tiprack_10ul/1": [ - [1.8263, -0.0958, 1.088], - [2.5222, -0.104, 1.1031], - [3.2354, -0.0447, 0.9536], - [3.9984, -0.012, 0.8477], - [12.5135, -0.0021, 0.8079] - ], - "opentrons/opentrons_96_filtertiprack_10ul/1": [ - [1.8263, -0.0958, 1.088], - [2.5222, -0.104, 1.1031], - [3.2354, -0.0447, 0.9536], - [3.9984, -0.012, 0.8477], - [12.5135, -0.0021, 0.8079] - ], - "opentrons/geb_96_tiprack_10ul/1": [ - [1.8263, -0.0958, 1.088], - [2.5222, -0.104, 1.1031], - [3.2354, -0.0447, 0.9536], - [3.9984, -0.012, 0.8477], - [12.5135, -0.0021, 0.8079] - ], - "opentrons/eppendorf_96_tiprack_10ul_eptips/1": [ - [1.8263, -0.0958, 1.088], - [2.5222, -0.104, 1.1031], - [3.2354, -0.0447, 0.9536], - [3.9984, -0.012, 0.8477], - [12.5135, -0.0021, 0.8079] - ], - "default": [ - [1.8263, -0.0958, 1.088], - [2.5222, -0.104, 1.1031], - [3.2354, -0.0447, 0.9536], - [3.9984, -0.012, 0.8477], - [12.5135, -0.0021, 0.8079] - ] + "default": { + "1": [ + [1.8263, -0.0958, 1.088], + [2.5222, -0.104, 1.1031], + [3.2354, -0.0447, 0.9536], + [3.9984, -0.012, 0.8477], + [12.5135, -0.0021, 0.8079] + ], + "2": [ + [1.438649211, 0.01931415115, 0.691538317], + [1.836824579, 0.03868955123, 0.6636639129], + [2.960052684, 0.00470371018, 0.7260899411], + [4.487508789, 0.005175245625, 0.7246941713], + [10.59661421, 0.001470408978, 0.7413196584] + ] + } }, "dispense": { - "opentrons/opentrons_96_tiprack_10ul/1": [[12.5135, 0.0, 0.7945]], - "opentrons/opentrons_96_filtertiprack_10ul/1": [[12.5135, 0.0, 0.7945]], - "opentrons/geb_96_tiprack_10ul/1": [[12.5135, 0.0, 0.7945]], - "opentrons/eppendorf_96_tiprack_10ul_eptips/1": [[12.5135, 0.0, 0.7945]] - }, - "defaultTipOverlapDictionary": { - "opentrons/opentrons_96_tiprack_10ul/1": 3.29, - "opentrons/opentrons_96_filtertiprack_10ul/1": 3.29, - "opentrons/geb_96_tiprack_10ul/1": 6.2, - "opentrons/eppendorf_96_tiprack_10ul_eptips/1": 1.0 + "default": { + "1": [[12.5135, 0, 0.7945]], + "2": [[12.5135, 0, 0.7945]] + } }, "defaultBlowoutVolume": 2.356 } }, + "defaultTipOverlapDictionary": { + "default": 3.29, + "opentrons/opentrons_96_tiprack_10ul/1": 3.29, + "opentrons/opentrons_96_filtertiprack_10ul/1": 3.29, + "opentrons/geb_96_tiprack_10ul/1": 6.2, + "opentrons/eppendorf_96_tiprack_10ul_eptips/1": 1.0 + }, "maxVolume": 10, "minVolume": 1.0, "defaultTipracks": [ diff --git a/shared-data/pipette/definitions/2/liquid/single_channel/p10/1_5.json b/shared-data/pipette/definitions/2/liquid/single_channel/p10/1_5.json index e241a0291f7..e2bdebf2be0 100644 --- a/shared-data/pipette/definitions/2/liquid/single_channel/p10/1_5.json +++ b/shared-data/pipette/definitions/2/liquid/single_channel/p10/1_5.json @@ -2,59 +2,37 @@ "$otSharedSchema": "#/pipette/schemas/2/pipetteLiquidPropertiesSchema.json", "supportedTips": { "t10": { - "defaultAspirateFlowRate": 5.0, - "defaultDispenseFlowRate": 10.0, - "defaultBlowOutFlowRate": 1000.0, + "defaultAspirateFlowRate": { + "default": 5, + "valuesByApiLevel": { "2.0": 5 } + }, + "defaultDispenseFlowRate": { + "default": 10, + "valuesByApiLevel": { "2.0": 10 } + }, + "defaultBlowOutFlowRate": { + "default": 1000, + "valuesByApiLevel": { "2.0": 1000 } + }, "defaultTipLength": 33.0, - "defaultTipOverlap": 3.29, - "defaultReturnTipHeight": null, "aspirate": { - "opentrons/opentrons_96_tiprack_10ul/1": [ - [1.553425807, -0.03427618068, 0.83], - [1.934976526, -0.007134812859, 0.7878], - [2.689843897, -0.007238069768, 0.788], - [6.161165493, 0.0004663523509, 0.7673], - [10.7963169, 0.0002200157553, 0.7688] - ], - "opentrons/opentrons_96_filtertiprack_10ul/1": [ - [1.553425807, -0.03427618068, 0.83], - [1.934976526, -0.007134812859, 0.7878], - [2.689843897, -0.007238069768, 0.788], - [6.161165493, 0.0004663523509, 0.7673], - [10.7963169, 0.0002200157553, 0.7688] - ], - "opentrons/geb_96_tiprack_10ul/1": [ - [1.553425807, -0.03427618068, 0.83], - [1.934976526, -0.007134812859, 0.7878], - [2.689843897, -0.007238069768, 0.788], - [6.161165493, 0.0004663523509, 0.7673], - [10.7963169, 0.0002200157553, 0.7688] - ], - "opentrons/eppendorf_96_tiprack_10ul_eptips/1": [ - [1.553425807, -0.03427618068, 0.83], - [1.934976526, -0.007134812859, 0.7878], - [2.689843897, -0.007238069768, 0.788], - [6.161165493, 0.0004663523509, 0.7673], - [10.7963169, 0.0002200157553, 0.7688] - ], - "default": [ - [1.553425807, -0.03427618068, 0.83], - [1.934976526, -0.007134812859, 0.7878], - [2.689843897, -0.007238069768, 0.788], - [6.161165493, 0.0004663523509, 0.7673], - [10.7963169, 0.0002200157553, 0.7688] - ] + "default": { + "1": [ + [1.553425807, -0.03427618068, 0.83], + [1.934976526, -0.007134812859, 0.7878], + [2.689843897, -0.007238069768, 0.788], + [6.161165493, 0.0004663523509, 0.7673], + [10.7963169, 0.0002200157553, 0.7688] + ] + } }, "dispense": { - "opentrons/opentrons_96_tiprack_10ul/1": [[12.5135, 0.0, 0.7945]], - "opentrons/opentrons_96_filtertiprack_10ul/1": [[12.5135, 0.0, 0.7945]], - "opentrons/geb_96_tiprack_10ul/1": [[12.5135, 0.0, 0.7945]], - "opentrons/eppendorf_96_tiprack_10ul_eptips/1": [ - [12.5135, 0.0, 0.7945] - ], - "default": [[12.5135, 0.0, 0.7945]] + "default": { + "1": [[12.5135, 0.0, 0.7945]] + } }, "defaultTipOverlapDictionary": { + "default": 3.29, "opentrons/opentrons_96_tiprack_10ul/1": 3.29, "opentrons/opentrons_96_filtertiprack_10ul/1": 3.29, "opentrons/geb_96_tiprack_10ul/1": 6.2, @@ -63,6 +41,13 @@ "defaultBlowoutVolume": 2.356 } }, + "defaultTipOverlapDictionary": { + "default": 3.29, + "opentrons/opentrons_96_tiprack_10ul/1": 3.29, + "opentrons/opentrons_96_filtertiprack_10ul/1": 3.29, + "opentrons/geb_96_tiprack_10ul/1": 6.2, + "opentrons/eppendorf_96_tiprack_10ul_eptips/1": 1.0 + }, "maxVolume": 10, "minVolume": 1.0, "defaultTipracks": [ diff --git a/shared-data/pipette/definitions/2/liquid/single_channel/p1000/1_0.json b/shared-data/pipette/definitions/2/liquid/single_channel/p1000/1_0.json index 25f481723bc..234f72f14c9 100644 --- a/shared-data/pipette/definitions/2/liquid/single_channel/p1000/1_0.json +++ b/shared-data/pipette/definitions/2/liquid/single_channel/p1000/1_0.json @@ -2,74 +2,44 @@ "$otSharedSchema": "#/pipette/schemas/2/pipetteLiquidPropertiesSchema.json", "supportedTips": { "t1000": { - "defaultAspirateFlowRate": 500.0, - "defaultDispenseFlowRate": 1000.0, - "defaultBlowOutFlowRate": 1000.0, + "defaultAspirateFlowRate": { + "default": 500, + "valuesByApiLevel": { "2.0": 500 } + }, + "defaultDispenseFlowRate": { + "default": 1000, + "valuesByApiLevel": { "2.0": 1000 } + }, + "defaultBlowOutFlowRate": { + "default": 1000, + "valuesByApiLevel": { "2.0": 1000 } + }, "defaultTipLength": 76.7, - "defaultTipOverlap": 7.95, - "defaultReturnTipHeight": null, "aspirate": { - "opentrons/opentrons_96_tiprack_1000ul/1": [ - [148.9157, 0.0213, 56.3986], - [210.8237, 0.0108, 57.9568], - [241.2405, 0.0025, 59.717], - [365.2719, 0.0046, 59.2043], - [614.4871, 0.0023, 60.0431], - [1000.0, 0.001, 60.8209] - ], - "opentrons/opentrons_96_filtertiprack_1000ul/1": [ - [148.9157, 0.0213, 56.3986], - [210.8237, 0.0108, 57.9568], - [241.2405, 0.0025, 59.717], - [365.2719, 0.0046, 59.2043], - [614.4871, 0.0023, 60.0431], - [1000.0, 0.001, 60.8209] - ], - "opentrons/geb_96_tiprack_1000ul/1": [ - [148.9157, 0.0213, 56.3986], - [210.8237, 0.0108, 57.9568], - [241.2405, 0.0025, 59.717], - [365.2719, 0.0046, 59.2043], - [614.4871, 0.0023, 60.0431], - [1000.0, 0.001, 60.8209] - ], - "opentrons/eppendorf_96_tiprack_1000ul_eptips/1": [ - [148.9157, 0.0213, 56.3986], - [210.8237, 0.0108, 57.9568], - [241.2405, 0.0025, 59.717], - [365.2719, 0.0046, 59.2043], - [614.4871, 0.0023, 60.0431], - [1000.0, 0.001, 60.8209] - ], - "default": [ - [148.9157, 0.0213, 56.3986], - [210.8237, 0.0108, 57.9568], - [241.2405, 0.0025, 59.717], - [365.2719, 0.0046, 59.2043], - [614.4871, 0.0023, 60.0431], - [1000.0, 0.001, 60.8209] - ] + "default": { + "1": [ + [148.9157, 0.0213, 56.3986], + [210.8237, 0.0108, 57.9568], + [241.2405, 0.0025, 59.717], + [365.2719, 0.0046, 59.2043], + [614.4871, 0.0023, 60.0431], + [1000.0, 0.001, 60.8209] + ] + } }, "dispense": { - "opentrons/opentrons_96_tiprack_1000ul/1": [[1000.0, 0.0, 61.3275]], - "opentrons/opentrons_96_filtertiprack_1000ul/1": [ - [1000.0, 0.0, 61.3275] - ], - "opentrons/geb_96_tiprack_1000ul/1": [[1000.0, 0.0, 61.3275]], - "opentrons/eppendorf_96_tiprack_1000ul_eptips/1": [ - [1000.0, 0.0, 61.3275] - ], - "default": [[1000.0, 0.0, 61.3275]] - }, - "defaultTipOverlapDictionary": { - "opentrons/opentrons_96_tiprack_1000ul/1": 7.95, - "opentrons/opentrons_96_filtertiprack_1000ul/1": 7.95, - "opentrons/geb_96_tiprack_1000ul/1": 11.2, - "opentrons/eppendorf_96_tiprack_1000ul_eptips/1": 0.0 + "default": { "1": [[1000.0, 0.0, 61.3275]] } }, "defaultBlowoutVolume": 127.235 } }, + "defaultTipOverlapDictionary": { + "default": 7.95, + "opentrons/opentrons_96_tiprack_1000ul/1": 7.95, + "opentrons/opentrons_96_filtertiprack_1000ul/1": 7.95, + "opentrons/geb_96_tiprack_1000ul/1": 11.2, + "opentrons/eppendorf_96_tiprack_1000ul_eptips/1": 0.0 + }, "maxVolume": 1000, "minVolume": 100.0, "defaultTipracks": [ diff --git a/shared-data/pipette/definitions/2/liquid/single_channel/p1000/1_3.json b/shared-data/pipette/definitions/2/liquid/single_channel/p1000/1_3.json index 25f481723bc..33074474dff 100644 --- a/shared-data/pipette/definitions/2/liquid/single_channel/p1000/1_3.json +++ b/shared-data/pipette/definitions/2/liquid/single_channel/p1000/1_3.json @@ -2,74 +2,46 @@ "$otSharedSchema": "#/pipette/schemas/2/pipetteLiquidPropertiesSchema.json", "supportedTips": { "t1000": { - "defaultAspirateFlowRate": 500.0, - "defaultDispenseFlowRate": 1000.0, - "defaultBlowOutFlowRate": 1000.0, + "defaultAspirateFlowRate": { + "default": 500, + "valuesByApiLevel": { "2.0": 500 } + }, + "defaultDispenseFlowRate": { + "default": 1000, + "valuesByApiLevel": { "2.0": 1000 } + }, + "defaultBlowOutFlowRate": { + "default": 1000, + "valuesByApiLevel": { "2.0": 1000 } + }, "defaultTipLength": 76.7, - "defaultTipOverlap": 7.95, - "defaultReturnTipHeight": null, "aspirate": { - "opentrons/opentrons_96_tiprack_1000ul/1": [ - [148.9157, 0.0213, 56.3986], - [210.8237, 0.0108, 57.9568], - [241.2405, 0.0025, 59.717], - [365.2719, 0.0046, 59.2043], - [614.4871, 0.0023, 60.0431], - [1000.0, 0.001, 60.8209] - ], - "opentrons/opentrons_96_filtertiprack_1000ul/1": [ - [148.9157, 0.0213, 56.3986], - [210.8237, 0.0108, 57.9568], - [241.2405, 0.0025, 59.717], - [365.2719, 0.0046, 59.2043], - [614.4871, 0.0023, 60.0431], - [1000.0, 0.001, 60.8209] - ], - "opentrons/geb_96_tiprack_1000ul/1": [ - [148.9157, 0.0213, 56.3986], - [210.8237, 0.0108, 57.9568], - [241.2405, 0.0025, 59.717], - [365.2719, 0.0046, 59.2043], - [614.4871, 0.0023, 60.0431], - [1000.0, 0.001, 60.8209] - ], - "opentrons/eppendorf_96_tiprack_1000ul_eptips/1": [ - [148.9157, 0.0213, 56.3986], - [210.8237, 0.0108, 57.9568], - [241.2405, 0.0025, 59.717], - [365.2719, 0.0046, 59.2043], - [614.4871, 0.0023, 60.0431], - [1000.0, 0.001, 60.8209] - ], - "default": [ - [148.9157, 0.0213, 56.3986], - [210.8237, 0.0108, 57.9568], - [241.2405, 0.0025, 59.717], - [365.2719, 0.0046, 59.2043], - [614.4871, 0.0023, 60.0431], - [1000.0, 0.001, 60.8209] - ] + "default": { + "1": [ + [148.9157, 0.0213, 56.3986], + [210.8237, 0.0108, 57.9568], + [241.2405, 0.0025, 59.717], + [365.2719, 0.0046, 59.2043], + [614.4871, 0.0023, 60.0431], + [1000.0, 0.001, 60.8209] + ] + } }, "dispense": { - "opentrons/opentrons_96_tiprack_1000ul/1": [[1000.0, 0.0, 61.3275]], - "opentrons/opentrons_96_filtertiprack_1000ul/1": [ - [1000.0, 0.0, 61.3275] - ], - "opentrons/geb_96_tiprack_1000ul/1": [[1000.0, 0.0, 61.3275]], - "opentrons/eppendorf_96_tiprack_1000ul_eptips/1": [ - [1000.0, 0.0, 61.3275] - ], - "default": [[1000.0, 0.0, 61.3275]] - }, - "defaultTipOverlapDictionary": { - "opentrons/opentrons_96_tiprack_1000ul/1": 7.95, - "opentrons/opentrons_96_filtertiprack_1000ul/1": 7.95, - "opentrons/geb_96_tiprack_1000ul/1": 11.2, - "opentrons/eppendorf_96_tiprack_1000ul_eptips/1": 0.0 + "default": { + "1": [[1000.0, 0.0, 61.3275]] + } }, "defaultBlowoutVolume": 127.235 } }, + "defaultTipOverlapDictionary": { + "default": 7.95, + "opentrons/opentrons_96_tiprack_1000ul/1": 7.95, + "opentrons/opentrons_96_filtertiprack_1000ul/1": 7.95, + "opentrons/geb_96_tiprack_1000ul/1": 11.2, + "opentrons/eppendorf_96_tiprack_1000ul_eptips/1": 0.0 + }, "maxVolume": 1000, "minVolume": 100.0, "defaultTipracks": [ diff --git a/shared-data/pipette/definitions/2/liquid/single_channel/p1000/1_4.json b/shared-data/pipette/definitions/2/liquid/single_channel/p1000/1_4.json index 25f481723bc..33074474dff 100644 --- a/shared-data/pipette/definitions/2/liquid/single_channel/p1000/1_4.json +++ b/shared-data/pipette/definitions/2/liquid/single_channel/p1000/1_4.json @@ -2,74 +2,46 @@ "$otSharedSchema": "#/pipette/schemas/2/pipetteLiquidPropertiesSchema.json", "supportedTips": { "t1000": { - "defaultAspirateFlowRate": 500.0, - "defaultDispenseFlowRate": 1000.0, - "defaultBlowOutFlowRate": 1000.0, + "defaultAspirateFlowRate": { + "default": 500, + "valuesByApiLevel": { "2.0": 500 } + }, + "defaultDispenseFlowRate": { + "default": 1000, + "valuesByApiLevel": { "2.0": 1000 } + }, + "defaultBlowOutFlowRate": { + "default": 1000, + "valuesByApiLevel": { "2.0": 1000 } + }, "defaultTipLength": 76.7, - "defaultTipOverlap": 7.95, - "defaultReturnTipHeight": null, "aspirate": { - "opentrons/opentrons_96_tiprack_1000ul/1": [ - [148.9157, 0.0213, 56.3986], - [210.8237, 0.0108, 57.9568], - [241.2405, 0.0025, 59.717], - [365.2719, 0.0046, 59.2043], - [614.4871, 0.0023, 60.0431], - [1000.0, 0.001, 60.8209] - ], - "opentrons/opentrons_96_filtertiprack_1000ul/1": [ - [148.9157, 0.0213, 56.3986], - [210.8237, 0.0108, 57.9568], - [241.2405, 0.0025, 59.717], - [365.2719, 0.0046, 59.2043], - [614.4871, 0.0023, 60.0431], - [1000.0, 0.001, 60.8209] - ], - "opentrons/geb_96_tiprack_1000ul/1": [ - [148.9157, 0.0213, 56.3986], - [210.8237, 0.0108, 57.9568], - [241.2405, 0.0025, 59.717], - [365.2719, 0.0046, 59.2043], - [614.4871, 0.0023, 60.0431], - [1000.0, 0.001, 60.8209] - ], - "opentrons/eppendorf_96_tiprack_1000ul_eptips/1": [ - [148.9157, 0.0213, 56.3986], - [210.8237, 0.0108, 57.9568], - [241.2405, 0.0025, 59.717], - [365.2719, 0.0046, 59.2043], - [614.4871, 0.0023, 60.0431], - [1000.0, 0.001, 60.8209] - ], - "default": [ - [148.9157, 0.0213, 56.3986], - [210.8237, 0.0108, 57.9568], - [241.2405, 0.0025, 59.717], - [365.2719, 0.0046, 59.2043], - [614.4871, 0.0023, 60.0431], - [1000.0, 0.001, 60.8209] - ] + "default": { + "1": [ + [148.9157, 0.0213, 56.3986], + [210.8237, 0.0108, 57.9568], + [241.2405, 0.0025, 59.717], + [365.2719, 0.0046, 59.2043], + [614.4871, 0.0023, 60.0431], + [1000.0, 0.001, 60.8209] + ] + } }, "dispense": { - "opentrons/opentrons_96_tiprack_1000ul/1": [[1000.0, 0.0, 61.3275]], - "opentrons/opentrons_96_filtertiprack_1000ul/1": [ - [1000.0, 0.0, 61.3275] - ], - "opentrons/geb_96_tiprack_1000ul/1": [[1000.0, 0.0, 61.3275]], - "opentrons/eppendorf_96_tiprack_1000ul_eptips/1": [ - [1000.0, 0.0, 61.3275] - ], - "default": [[1000.0, 0.0, 61.3275]] - }, - "defaultTipOverlapDictionary": { - "opentrons/opentrons_96_tiprack_1000ul/1": 7.95, - "opentrons/opentrons_96_filtertiprack_1000ul/1": 7.95, - "opentrons/geb_96_tiprack_1000ul/1": 11.2, - "opentrons/eppendorf_96_tiprack_1000ul_eptips/1": 0.0 + "default": { + "1": [[1000.0, 0.0, 61.3275]] + } }, "defaultBlowoutVolume": 127.235 } }, + "defaultTipOverlapDictionary": { + "default": 7.95, + "opentrons/opentrons_96_tiprack_1000ul/1": 7.95, + "opentrons/opentrons_96_filtertiprack_1000ul/1": 7.95, + "opentrons/geb_96_tiprack_1000ul/1": 11.2, + "opentrons/eppendorf_96_tiprack_1000ul_eptips/1": 0.0 + }, "maxVolume": 1000, "minVolume": 100.0, "defaultTipracks": [ diff --git a/shared-data/pipette/definitions/2/liquid/single_channel/p1000/1_5.json b/shared-data/pipette/definitions/2/liquid/single_channel/p1000/1_5.json index 25f481723bc..234f72f14c9 100644 --- a/shared-data/pipette/definitions/2/liquid/single_channel/p1000/1_5.json +++ b/shared-data/pipette/definitions/2/liquid/single_channel/p1000/1_5.json @@ -2,74 +2,44 @@ "$otSharedSchema": "#/pipette/schemas/2/pipetteLiquidPropertiesSchema.json", "supportedTips": { "t1000": { - "defaultAspirateFlowRate": 500.0, - "defaultDispenseFlowRate": 1000.0, - "defaultBlowOutFlowRate": 1000.0, + "defaultAspirateFlowRate": { + "default": 500, + "valuesByApiLevel": { "2.0": 500 } + }, + "defaultDispenseFlowRate": { + "default": 1000, + "valuesByApiLevel": { "2.0": 1000 } + }, + "defaultBlowOutFlowRate": { + "default": 1000, + "valuesByApiLevel": { "2.0": 1000 } + }, "defaultTipLength": 76.7, - "defaultTipOverlap": 7.95, - "defaultReturnTipHeight": null, "aspirate": { - "opentrons/opentrons_96_tiprack_1000ul/1": [ - [148.9157, 0.0213, 56.3986], - [210.8237, 0.0108, 57.9568], - [241.2405, 0.0025, 59.717], - [365.2719, 0.0046, 59.2043], - [614.4871, 0.0023, 60.0431], - [1000.0, 0.001, 60.8209] - ], - "opentrons/opentrons_96_filtertiprack_1000ul/1": [ - [148.9157, 0.0213, 56.3986], - [210.8237, 0.0108, 57.9568], - [241.2405, 0.0025, 59.717], - [365.2719, 0.0046, 59.2043], - [614.4871, 0.0023, 60.0431], - [1000.0, 0.001, 60.8209] - ], - "opentrons/geb_96_tiprack_1000ul/1": [ - [148.9157, 0.0213, 56.3986], - [210.8237, 0.0108, 57.9568], - [241.2405, 0.0025, 59.717], - [365.2719, 0.0046, 59.2043], - [614.4871, 0.0023, 60.0431], - [1000.0, 0.001, 60.8209] - ], - "opentrons/eppendorf_96_tiprack_1000ul_eptips/1": [ - [148.9157, 0.0213, 56.3986], - [210.8237, 0.0108, 57.9568], - [241.2405, 0.0025, 59.717], - [365.2719, 0.0046, 59.2043], - [614.4871, 0.0023, 60.0431], - [1000.0, 0.001, 60.8209] - ], - "default": [ - [148.9157, 0.0213, 56.3986], - [210.8237, 0.0108, 57.9568], - [241.2405, 0.0025, 59.717], - [365.2719, 0.0046, 59.2043], - [614.4871, 0.0023, 60.0431], - [1000.0, 0.001, 60.8209] - ] + "default": { + "1": [ + [148.9157, 0.0213, 56.3986], + [210.8237, 0.0108, 57.9568], + [241.2405, 0.0025, 59.717], + [365.2719, 0.0046, 59.2043], + [614.4871, 0.0023, 60.0431], + [1000.0, 0.001, 60.8209] + ] + } }, "dispense": { - "opentrons/opentrons_96_tiprack_1000ul/1": [[1000.0, 0.0, 61.3275]], - "opentrons/opentrons_96_filtertiprack_1000ul/1": [ - [1000.0, 0.0, 61.3275] - ], - "opentrons/geb_96_tiprack_1000ul/1": [[1000.0, 0.0, 61.3275]], - "opentrons/eppendorf_96_tiprack_1000ul_eptips/1": [ - [1000.0, 0.0, 61.3275] - ], - "default": [[1000.0, 0.0, 61.3275]] - }, - "defaultTipOverlapDictionary": { - "opentrons/opentrons_96_tiprack_1000ul/1": 7.95, - "opentrons/opentrons_96_filtertiprack_1000ul/1": 7.95, - "opentrons/geb_96_tiprack_1000ul/1": 11.2, - "opentrons/eppendorf_96_tiprack_1000ul_eptips/1": 0.0 + "default": { "1": [[1000.0, 0.0, 61.3275]] } }, "defaultBlowoutVolume": 127.235 } }, + "defaultTipOverlapDictionary": { + "default": 7.95, + "opentrons/opentrons_96_tiprack_1000ul/1": 7.95, + "opentrons/opentrons_96_filtertiprack_1000ul/1": 7.95, + "opentrons/geb_96_tiprack_1000ul/1": 11.2, + "opentrons/eppendorf_96_tiprack_1000ul_eptips/1": 0.0 + }, "maxVolume": 1000, "minVolume": 100.0, "defaultTipracks": [ diff --git a/shared-data/pipette/definitions/2/liquid/single_channel/p1000/2_0.json b/shared-data/pipette/definitions/2/liquid/single_channel/p1000/2_0.json index 36735045779..df91fb61891 100644 --- a/shared-data/pipette/definitions/2/liquid/single_channel/p1000/2_0.json +++ b/shared-data/pipette/definitions/2/liquid/single_channel/p1000/2_0.json @@ -2,272 +2,108 @@ "$otSharedSchema": "#/pipette/schemas/2/pipetteLiquidPropertiesSchema.json", "supportedTips": { "t1000": { - "defaultAspirateFlowRate": 137.35, - "defaultDispenseFlowRate": 137.35, - "defaultBlowOutFlowRate": 137.35, + "defaultAspirateFlowRate": { + "default": 274.7, + "valuesByApiLevel": { + "2.0": 137.35, + "2.6": 274.7 + } + }, + "defaultDispenseFlowRate": { + "default": 274.7, + "valuesByApiLevel": { + "2.0": 137.35, + "2.6": 274.7 + } + }, + "defaultBlowOutFlowRate": { + "default": 274.7, + "valuesByApiLevel": { + "2.0": 137.35, + "2.6": 274.7 + } + }, "defaultTipLength": 78.3, - "defaultTipOverlap": 9.7, "defaultReturnTipHeight": 0.83, "aspirate": { - "opentrons/opentrons_96_tiprack_1000ul/1": [ - [83.6, 0.01502, 25.62], - [90.39, 0.0152, 24.45], - [104.1, 0.01386, 24.57], - [117.7, 0.00991, 24.98], - [131.3, 0.007542, 25.26], - [158.6, 0.006723, 25.37], - [186.1, 0.005602, 25.55], - [199.9, 0.005013, 25.66], - [213.6, 0.002767, 26.11], - [241.2, 0.003594, 25.93], - [268.6, 0.002371, 26.22], - [323.5, 0.001687, 26.41], - [378.3, 0.001273, 26.54], - [433.3, 0.001039, 26.63], - [460.8, 0.0007889, 26.74], - [488.1, 0.0004039, 26.92], - [515.5, 0.0005667, 26.84], - [542.9, 0.0005983, 26.82], - [570.4, 0.0006121, 26.81], - [597.7, 0.0002485, 27.02], - [625.4, 0.0008384, 26.67], - [652.5, -0.0001662, 27.3], - [707.4, 0.0003177, 26.98], - [762.4, 0.000383, 26.94], - [817.1, 0.0001665, 27.1], - [872.1, 0.000301, 26.99], - [927.0, 0.0002205, 27.06], - [981.8, 0.0001571, 27.12], - [1010.0, 0.0003381, 26.94] - ], - "opentrons/opentrons_96_filtertiprack_1000ul/1": [ - [83.6, 0.01502, 25.62], - [90.39, 0.0152, 24.45], - [104.1, 0.01386, 24.57], - [117.7, 0.00991, 24.98], - [131.3, 0.007542, 25.26], - [158.6, 0.006723, 25.37], - [186.1, 0.005602, 25.55], - [199.9, 0.005013, 25.66], - [213.6, 0.002767, 26.11], - [241.2, 0.003594, 25.93], - [268.6, 0.002371, 26.22], - [323.5, 0.001687, 26.41], - [378.3, 0.001273, 26.54], - [433.3, 0.001039, 26.63], - [460.8, 0.0007889, 26.74], - [488.1, 0.0004039, 26.92], - [515.5, 0.0005667, 26.84], - [542.9, 0.0005983, 26.82], - [570.4, 0.0006121, 26.81], - [597.7, 0.0002485, 27.02], - [625.4, 0.0008384, 26.67], - [652.5, -0.0001662, 27.3], - [707.4, 0.0003177, 26.98], - [762.4, 0.000383, 26.94], - [817.1, 0.0001665, 27.1], - [872.1, 0.000301, 26.99], - [927.0, 0.0002205, 27.06], - [981.8, 0.0001571, 27.12], - [1010.0, 0.0003381, 26.94] - ], - "opentrons/geb_96_tiprack_1000ul/1": [ - [83.6, 0.01502, 25.62], - [90.39, 0.0152, 24.45], - [104.1, 0.01386, 24.57], - [117.7, 0.00991, 24.98], - [131.3, 0.007542, 25.26], - [158.6, 0.006723, 25.37], - [186.1, 0.005602, 25.55], - [199.9, 0.005013, 25.66], - [213.6, 0.002767, 26.11], - [241.2, 0.003594, 25.93], - [268.6, 0.002371, 26.22], - [323.5, 0.001687, 26.41], - [378.3, 0.001273, 26.54], - [433.3, 0.001039, 26.63], - [460.8, 0.0007889, 26.74], - [488.1, 0.0004039, 26.92], - [515.5, 0.0005667, 26.84], - [542.9, 0.0005983, 26.82], - [570.4, 0.0006121, 26.81], - [597.7, 0.0002485, 27.02], - [625.4, 0.0008384, 26.67], - [652.5, -0.0001662, 27.3], - [707.4, 0.0003177, 26.98], - [762.4, 0.000383, 26.94], - [817.1, 0.0001665, 27.1], - [872.1, 0.000301, 26.99], - [927.0, 0.0002205, 27.06], - [981.8, 0.0001571, 27.12], - [1010.0, 0.0003381, 26.94] - ], - "default": [ - [83.6, 0.01502, 25.62], - [90.39, 0.0152, 24.45], - [104.1, 0.01386, 24.57], - [117.7, 0.00991, 24.98], - [131.3, 0.007542, 25.26], - [158.6, 0.006723, 25.37], - [186.1, 0.005602, 25.55], - [199.9, 0.005013, 25.66], - [213.6, 0.002767, 26.11], - [241.2, 0.003594, 25.93], - [268.6, 0.002371, 26.22], - [323.5, 0.001687, 26.41], - [378.3, 0.001273, 26.54], - [433.3, 0.001039, 26.63], - [460.8, 0.0007889, 26.74], - [488.1, 0.0004039, 26.92], - [515.5, 0.0005667, 26.84], - [542.9, 0.0005983, 26.82], - [570.4, 0.0006121, 26.81], - [597.7, 0.0002485, 27.02], - [625.4, 0.0008384, 26.67], - [652.5, -0.0001662, 27.3], - [707.4, 0.0003177, 26.98], - [762.4, 0.000383, 26.94], - [817.1, 0.0001665, 27.1], - [872.1, 0.000301, 26.99], - [927.0, 0.0002205, 27.06], - [981.8, 0.0001571, 27.12], - [1010.0, 0.0003381, 26.94] - ] + "default": { + "1": [ + [83.6, 0.01502, 25.62], + [90.39, 0.0152, 24.45], + [104.1, 0.01386, 24.57], + [117.7, 0.00991, 24.98], + [131.3, 0.007542, 25.26], + [158.6, 0.006723, 25.37], + [186.1, 0.005602, 25.55], + [199.9, 0.005013, 25.66], + [213.6, 0.002767, 26.11], + [241.2, 0.003594, 25.93], + [268.6, 0.002371, 26.22], + [323.5, 0.001687, 26.41], + [378.3, 0.001273, 26.54], + [433.3, 0.001039, 26.63], + [460.8, 0.0007889, 26.74], + [488.1, 0.0004039, 26.92], + [515.5, 0.0005667, 26.84], + [542.9, 0.0005983, 26.82], + [570.4, 0.0006121, 26.81], + [597.7, 0.0002485, 27.02], + [625.4, 0.0008384, 26.67], + [652.5, -0.0001662, 27.3], + [707.4, 0.0003177, 26.98], + [762.4, 0.000383, 26.94], + [817.1, 0.0001665, 27.1], + [872.1, 0.000301, 26.99], + [927.0, 0.0002205, 27.06], + [981.8, 0.0001571, 27.12], + [1010.0, 0.0003381, 26.94] + ] + } }, "dispense": { - "opentrons/opentrons_96_tiprack_1000ul/1": [ - [83.6, 0.01502, 25.62], - [90.39, 0.0152, 24.45], - [104.1, 0.01386, 24.57], - [117.7, 0.00991, 24.98], - [131.3, 0.007542, 25.26], - [158.6, 0.006723, 25.37], - [186.1, 0.005602, 25.55], - [199.9, 0.005013, 25.66], - [213.6, 0.002767, 26.11], - [241.2, 0.003594, 25.93], - [268.6, 0.002371, 26.22], - [323.5, 0.001687, 26.41], - [378.3, 0.001273, 26.54], - [433.3, 0.001039, 26.63], - [460.8, 0.0007889, 26.74], - [488.1, 0.0004039, 26.92], - [515.5, 0.0005667, 26.84], - [542.9, 0.0005983, 26.82], - [570.4, 0.0006121, 26.81], - [597.7, 0.0002485, 27.02], - [625.4, 0.0008384, 26.67], - [652.5, -0.0001662, 27.3], - [707.4, 0.0003177, 26.98], - [762.4, 0.000383, 26.94], - [817.1, 0.0001665, 27.1], - [872.1, 0.000301, 26.99], - [927.0, 0.0002205, 27.06], - [981.8, 0.0001571, 27.12], - [1010.0, 0.0003381, 26.94] - ], - "opentrons/opentrons_96_filtertiprack_1000ul/1": [ - [83.6, 0.01502, 25.62], - [90.39, 0.0152, 24.45], - [104.1, 0.01386, 24.57], - [117.7, 0.00991, 24.98], - [131.3, 0.007542, 25.26], - [158.6, 0.006723, 25.37], - [186.1, 0.005602, 25.55], - [199.9, 0.005013, 25.66], - [213.6, 0.002767, 26.11], - [241.2, 0.003594, 25.93], - [268.6, 0.002371, 26.22], - [323.5, 0.001687, 26.41], - [378.3, 0.001273, 26.54], - [433.3, 0.001039, 26.63], - [460.8, 0.0007889, 26.74], - [488.1, 0.0004039, 26.92], - [515.5, 0.0005667, 26.84], - [542.9, 0.0005983, 26.82], - [570.4, 0.0006121, 26.81], - [597.7, 0.0002485, 27.02], - [625.4, 0.0008384, 26.67], - [652.5, -0.0001662, 27.3], - [707.4, 0.0003177, 26.98], - [762.4, 0.000383, 26.94], - [817.1, 0.0001665, 27.1], - [872.1, 0.000301, 26.99], - [927.0, 0.0002205, 27.06], - [981.8, 0.0001571, 27.12], - [1010.0, 0.0003381, 26.94] - ], - "opentrons/geb_96_tiprack_1000ul/1": [ - [83.6, 0.01502, 25.62], - [90.39, 0.0152, 24.45], - [104.1, 0.01386, 24.57], - [117.7, 0.00991, 24.98], - [131.3, 0.007542, 25.26], - [158.6, 0.006723, 25.37], - [186.1, 0.005602, 25.55], - [199.9, 0.005013, 25.66], - [213.6, 0.002767, 26.11], - [241.2, 0.003594, 25.93], - [268.6, 0.002371, 26.22], - [323.5, 0.001687, 26.41], - [378.3, 0.001273, 26.54], - [433.3, 0.001039, 26.63], - [460.8, 0.0007889, 26.74], - [488.1, 0.0004039, 26.92], - [515.5, 0.0005667, 26.84], - [542.9, 0.0005983, 26.82], - [570.4, 0.0006121, 26.81], - [597.7, 0.0002485, 27.02], - [625.4, 0.0008384, 26.67], - [652.5, -0.0001662, 27.3], - [707.4, 0.0003177, 26.98], - [762.4, 0.000383, 26.94], - [817.1, 0.0001665, 27.1], - [872.1, 0.000301, 26.99], - [927.0, 0.0002205, 27.06], - [981.8, 0.0001571, 27.12], - [1010.0, 0.0003381, 26.94] - ], - "default": [ - [83.6, 0.01502, 25.62], - [90.39, 0.0152, 24.45], - [104.1, 0.01386, 24.57], - [117.7, 0.00991, 24.98], - [131.3, 0.007542, 25.26], - [158.6, 0.006723, 25.37], - [186.1, 0.005602, 25.55], - [199.9, 0.005013, 25.66], - [213.6, 0.002767, 26.11], - [241.2, 0.003594, 25.93], - [268.6, 0.002371, 26.22], - [323.5, 0.001687, 26.41], - [378.3, 0.001273, 26.54], - [433.3, 0.001039, 26.63], - [460.8, 0.0007889, 26.74], - [488.1, 0.0004039, 26.92], - [515.5, 0.0005667, 26.84], - [542.9, 0.0005983, 26.82], - [570.4, 0.0006121, 26.81], - [597.7, 0.0002485, 27.02], - [625.4, 0.0008384, 26.67], - [652.5, -0.0001662, 27.3], - [707.4, 0.0003177, 26.98], - [762.4, 0.000383, 26.94], - [817.1, 0.0001665, 27.1], - [872.1, 0.000301, 26.99], - [927.0, 0.0002205, 27.06], - [981.8, 0.0001571, 27.12], - [1010.0, 0.0003381, 26.94] - ] - }, - "defaultTipOverlapDictionary": { - "opentrons/opentrons_96_tiprack_1000ul/1": 11.5, - "opentrons/opentrons_96_filtertiprack_1000ul/1": 11.5, - "opentrons/geb_96_tiprack_1000ul/1": 9.5 + "default": { + "1": [ + [83.6, 0.01502, 25.62], + [90.39, 0.0152, 24.45], + [104.1, 0.01386, 24.57], + [117.7, 0.00991, 24.98], + [131.3, 0.007542, 25.26], + [158.6, 0.006723, 25.37], + [186.1, 0.005602, 25.55], + [199.9, 0.005013, 25.66], + [213.6, 0.002767, 26.11], + [241.2, 0.003594, 25.93], + [268.6, 0.002371, 26.22], + [323.5, 0.001687, 26.41], + [378.3, 0.001273, 26.54], + [433.3, 0.001039, 26.63], + [460.8, 0.0007889, 26.74], + [488.1, 0.0004039, 26.92], + [515.5, 0.0005667, 26.84], + [542.9, 0.0005983, 26.82], + [570.4, 0.0006121, 26.81], + [597.7, 0.0002485, 27.02], + [625.4, 0.0008384, 26.67], + [652.5, -0.0001662, 27.3], + [707.4, 0.0003177, 26.98], + [762.4, 0.000383, 26.94], + [817.1, 0.0001665, 27.1], + [872.1, 0.000301, 26.99], + [927.0, 0.0002205, 27.06], + [981.8, 0.0001571, 27.12], + [1010.0, 0.0003381, 26.94] + ] + } }, "defaultBlowoutVolume": 127.235 } }, + "defaultTipOverlapDictionary": { + "default": 9.7, + "opentrons/opentrons_96_tiprack_1000ul/1": 11.5, + "opentrons/opentrons_96_filtertiprack_1000ul/1": 11.5, + "opentrons/geb_96_tiprack_1000ul/1": 9.5 + }, "maxVolume": 1000, "minVolume": 100.0, "defaultTipracks": [ diff --git a/shared-data/pipette/definitions/2/liquid/single_channel/p1000/2_1.json b/shared-data/pipette/definitions/2/liquid/single_channel/p1000/2_1.json index fbfb97cc16a..b6b0494e42b 100644 --- a/shared-data/pipette/definitions/2/liquid/single_channel/p1000/2_1.json +++ b/shared-data/pipette/definitions/2/liquid/single_channel/p1000/2_1.json @@ -2,280 +2,110 @@ "$otSharedSchema": "#/pipette/schemas/2/pipetteLiquidPropertiesSchema.json", "supportedTips": { "t1000": { - "defaultAspirateFlowRate": 137.35, - "defaultDispenseFlowRate": 137.35, - "defaultBlowOutFlowRate": 137.35, + "defaultAspirateFlowRate": { + "default": 274.7, + "valuesByApiLevel": { + "2.0": 137.35, + "2.6": 274.7 + } + }, + "defaultDispenseFlowRate": { + "default": 274.7, + "valuesByApiLevel": { + "2.0": 137.35, + "2.6": 274.7 + } + }, + "defaultBlowOutFlowRate": { + "default": 274.7, + "valuesByApiLevel": { + "2.0": 137.35, + "2.6": 274.7 + } + }, "defaultTipLength": 78.3, - "defaultTipOverlap": 9.7, "defaultReturnTipHeight": 0.83, "aspirate": { - "opentrons/opentrons_96_tiprack_1000ul/1": [ - [83.6125, 0.0158, 25.6199], - [90.4833, 0.0183, 24.2002], - [104.1964, 0.0143, 24.5544], - [117.7531, 0.0087, 25.1402], - [131.3828, 0.008, 25.2238], - [158.8108, 0.007, 25.3573], - [186.1861, 0.0047, 25.717], - [199.8483, 0.0035, 25.938], - [213.7914, 0.0056, 25.5359], - [241.1658, 0.0026, 26.1594], - [268.9339, 0.0035, 25.9521], - [324.0678, 0.002, 26.3458], - [379.1867, 0.0014, 26.5405], - [406.6172, 0.0008, 26.7661], - [434.4039, 0.0015, 26.4869], - [461.8772, 0.0007, 26.8497], - [489.4708, 0.0009, 26.7746], - [516.9619, 0.0006, 26.9133], - [544.6047, 0.0008, 26.8025], - [572.0717, 0.0004, 27.0067], - [599.6383, 0.0005, 26.9348], - [627.2047, 0.0005, 26.963], - [654.7669, 0.0004, 26.9925], - [709.8303, 0.0003, 27.0535], - [764.8439, 0.0003, 27.1116], - [819.8756, 0.0002, 27.1306], - [874.8864, 0.0002, 27.165], - [929.8528, 0.0001, 27.2124], - [984.8253, 0.0001, 27.2484], - [1012.2269, 0.0, 27.3121] - ], - "opentrons/opentrons_96_filtertiprack_1000ul/1": [ - [83.6125, 0.0158, 25.6199], - [90.4833, 0.0183, 24.2002], - [104.1964, 0.0143, 24.5544], - [117.7531, 0.0087, 25.1402], - [131.3828, 0.008, 25.2238], - [158.8108, 0.007, 25.3573], - [186.1861, 0.0047, 25.717], - [199.8483, 0.0035, 25.938], - [213.7914, 0.0056, 25.5359], - [241.1658, 0.0026, 26.1594], - [268.9339, 0.0035, 25.9521], - [324.0678, 0.002, 26.3458], - [379.1867, 0.0014, 26.5405], - [406.6172, 0.0008, 26.7661], - [434.4039, 0.0015, 26.4869], - [461.8772, 0.0007, 26.8497], - [489.4708, 0.0009, 26.7746], - [516.9619, 0.0006, 26.9133], - [544.6047, 0.0008, 26.8025], - [572.0717, 0.0004, 27.0067], - [599.6383, 0.0005, 26.9348], - [627.2047, 0.0005, 26.963], - [654.7669, 0.0004, 26.9925], - [709.8303, 0.0003, 27.0535], - [764.8439, 0.0003, 27.1116], - [819.8756, 0.0002, 27.1306], - [874.8864, 0.0002, 27.165], - [929.8528, 0.0001, 27.2124], - [984.8253, 0.0001, 27.2484], - [1012.2269, 0.0, 27.3121] - ], - "opentrons/geb_96_tiprack_1000ul/1": [ - [83.6125, 0.0158, 25.6199], - [90.4833, 0.0183, 24.2002], - [104.1964, 0.0143, 24.5544], - [117.7531, 0.0087, 25.1402], - [131.3828, 0.008, 25.2238], - [158.8108, 0.007, 25.3573], - [186.1861, 0.0047, 25.717], - [199.8483, 0.0035, 25.938], - [213.7914, 0.0056, 25.5359], - [241.1658, 0.0026, 26.1594], - [268.9339, 0.0035, 25.9521], - [324.0678, 0.002, 26.3458], - [379.1867, 0.0014, 26.5405], - [406.6172, 0.0008, 26.7661], - [434.4039, 0.0015, 26.4869], - [461.8772, 0.0007, 26.8497], - [489.4708, 0.0009, 26.7746], - [516.9619, 0.0006, 26.9133], - [544.6047, 0.0008, 26.8025], - [572.0717, 0.0004, 27.0067], - [599.6383, 0.0005, 26.9348], - [627.2047, 0.0005, 26.963], - [654.7669, 0.0004, 26.9925], - [709.8303, 0.0003, 27.0535], - [764.8439, 0.0003, 27.1116], - [819.8756, 0.0002, 27.1306], - [874.8864, 0.0002, 27.165], - [929.8528, 0.0001, 27.2124], - [984.8253, 0.0001, 27.2484], - [1012.2269, 0.0, 27.3121] - ], - "default": [ - [83.6125, 0.0158, 25.6199], - [90.4833, 0.0183, 24.2002], - [104.1964, 0.0143, 24.5544], - [117.7531, 0.0087, 25.1402], - [131.3828, 0.008, 25.2238], - [158.8108, 0.007, 25.3573], - [186.1861, 0.0047, 25.717], - [199.8483, 0.0035, 25.938], - [213.7914, 0.0056, 25.5359], - [241.1658, 0.0026, 26.1594], - [268.9339, 0.0035, 25.9521], - [324.0678, 0.002, 26.3458], - [379.1867, 0.0014, 26.5405], - [406.6172, 0.0008, 26.7661], - [434.4039, 0.0015, 26.4869], - [461.8772, 0.0007, 26.8497], - [489.4708, 0.0009, 26.7746], - [516.9619, 0.0006, 26.9133], - [544.6047, 0.0008, 26.8025], - [572.0717, 0.0004, 27.0067], - [599.6383, 0.0005, 26.9348], - [627.2047, 0.0005, 26.963], - [654.7669, 0.0004, 26.9925], - [709.8303, 0.0003, 27.0535], - [764.8439, 0.0003, 27.1116], - [819.8756, 0.0002, 27.1306], - [874.8864, 0.0002, 27.165], - [929.8528, 0.0001, 27.2124], - [984.8253, 0.0001, 27.2484], - [1012.2269, 0.0, 27.3121] - ] + "default": { + "1": [ + [83.6125, 0.0158, 25.6199], + [90.4833, 0.0183, 24.2002], + [104.1964, 0.0143, 24.5544], + [117.7531, 0.0087, 25.1402], + [131.3828, 0.008, 25.2238], + [158.8108, 0.007, 25.3573], + [186.1861, 0.0047, 25.717], + [199.8483, 0.0035, 25.938], + [213.7914, 0.0056, 25.5359], + [241.1658, 0.0026, 26.1594], + [268.9339, 0.0035, 25.9521], + [324.0678, 0.002, 26.3458], + [379.1867, 0.0014, 26.5405], + [406.6172, 0.0008, 26.7661], + [434.4039, 0.0015, 26.4869], + [461.8772, 0.0007, 26.8497], + [489.4708, 0.0009, 26.7746], + [516.9619, 0.0006, 26.9133], + [544.6047, 0.0008, 26.8025], + [572.0717, 0.0004, 27.0067], + [599.6383, 0.0005, 26.9348], + [627.2047, 0.0005, 26.963], + [654.7669, 0.0004, 26.9925], + [709.8303, 0.0003, 27.0535], + [764.8439, 0.0003, 27.1116], + [819.8756, 0.0002, 27.1306], + [874.8864, 0.0002, 27.165], + [929.8528, 0.0001, 27.2124], + [984.8253, 0.0001, 27.2484], + [1012.2269, 0.0, 27.3121] + ] + } }, "dispense": { - "opentrons/opentrons_96_tiprack_1000ul/1": [ - [83.6125, 0.0158, 25.6199], - [90.4833, 0.0183, 24.2002], - [104.1964, 0.0143, 24.5544], - [117.7531, 0.0087, 25.1402], - [131.3828, 0.008, 25.2238], - [158.8108, 0.007, 25.3573], - [186.1861, 0.0047, 25.717], - [199.8483, 0.0035, 25.938], - [213.7914, 0.0056, 25.5359], - [241.1658, 0.0026, 26.1594], - [268.9339, 0.0035, 25.9521], - [324.0678, 0.002, 26.3458], - [379.1867, 0.0014, 26.5405], - [406.6172, 0.0008, 26.7661], - [434.4039, 0.0015, 26.4869], - [461.8772, 0.0007, 26.8497], - [489.4708, 0.0009, 26.7746], - [516.9619, 0.0006, 26.9133], - [544.6047, 0.0008, 26.8025], - [572.0717, 0.0004, 27.0067], - [599.6383, 0.0005, 26.9348], - [627.2047, 0.0005, 26.963], - [654.7669, 0.0004, 26.9925], - [709.8303, 0.0003, 27.0535], - [764.8439, 0.0003, 27.1116], - [819.8756, 0.0002, 27.1306], - [874.8864, 0.0002, 27.165], - [929.8528, 0.0001, 27.2124], - [984.8253, 0.0001, 27.2484], - [1012.2269, 0.0, 27.3121] - ], - "opentrons/opentrons_96_filtertiprack_1000ul/1": [ - [83.6125, 0.0158, 25.6199], - [90.4833, 0.0183, 24.2002], - [104.1964, 0.0143, 24.5544], - [117.7531, 0.0087, 25.1402], - [131.3828, 0.008, 25.2238], - [158.8108, 0.007, 25.3573], - [186.1861, 0.0047, 25.717], - [199.8483, 0.0035, 25.938], - [213.7914, 0.0056, 25.5359], - [241.1658, 0.0026, 26.1594], - [268.9339, 0.0035, 25.9521], - [324.0678, 0.002, 26.3458], - [379.1867, 0.0014, 26.5405], - [406.6172, 0.0008, 26.7661], - [434.4039, 0.0015, 26.4869], - [461.8772, 0.0007, 26.8497], - [489.4708, 0.0009, 26.7746], - [516.9619, 0.0006, 26.9133], - [544.6047, 0.0008, 26.8025], - [572.0717, 0.0004, 27.0067], - [599.6383, 0.0005, 26.9348], - [627.2047, 0.0005, 26.963], - [654.7669, 0.0004, 26.9925], - [709.8303, 0.0003, 27.0535], - [764.8439, 0.0003, 27.1116], - [819.8756, 0.0002, 27.1306], - [874.8864, 0.0002, 27.165], - [929.8528, 0.0001, 27.2124], - [984.8253, 0.0001, 27.2484], - [1012.2269, 0.0, 27.3121] - ], - "opentrons/geb_96_tiprack_1000ul/1": [ - [83.6125, 0.0158, 25.6199], - [90.4833, 0.0183, 24.2002], - [104.1964, 0.0143, 24.5544], - [117.7531, 0.0087, 25.1402], - [131.3828, 0.008, 25.2238], - [158.8108, 0.007, 25.3573], - [186.1861, 0.0047, 25.717], - [199.8483, 0.0035, 25.938], - [213.7914, 0.0056, 25.5359], - [241.1658, 0.0026, 26.1594], - [268.9339, 0.0035, 25.9521], - [324.0678, 0.002, 26.3458], - [379.1867, 0.0014, 26.5405], - [406.6172, 0.0008, 26.7661], - [434.4039, 0.0015, 26.4869], - [461.8772, 0.0007, 26.8497], - [489.4708, 0.0009, 26.7746], - [516.9619, 0.0006, 26.9133], - [544.6047, 0.0008, 26.8025], - [572.0717, 0.0004, 27.0067], - [599.6383, 0.0005, 26.9348], - [627.2047, 0.0005, 26.963], - [654.7669, 0.0004, 26.9925], - [709.8303, 0.0003, 27.0535], - [764.8439, 0.0003, 27.1116], - [819.8756, 0.0002, 27.1306], - [874.8864, 0.0002, 27.165], - [929.8528, 0.0001, 27.2124], - [984.8253, 0.0001, 27.2484], - [1012.2269, 0.0, 27.3121] - ], - "default": [ - [83.6125, 0.0158, 25.6199], - [90.4833, 0.0183, 24.2002], - [104.1964, 0.0143, 24.5544], - [117.7531, 0.0087, 25.1402], - [131.3828, 0.008, 25.2238], - [158.8108, 0.007, 25.3573], - [186.1861, 0.0047, 25.717], - [199.8483, 0.0035, 25.938], - [213.7914, 0.0056, 25.5359], - [241.1658, 0.0026, 26.1594], - [268.9339, 0.0035, 25.9521], - [324.0678, 0.002, 26.3458], - [379.1867, 0.0014, 26.5405], - [406.6172, 0.0008, 26.7661], - [434.4039, 0.0015, 26.4869], - [461.8772, 0.0007, 26.8497], - [489.4708, 0.0009, 26.7746], - [516.9619, 0.0006, 26.9133], - [544.6047, 0.0008, 26.8025], - [572.0717, 0.0004, 27.0067], - [599.6383, 0.0005, 26.9348], - [627.2047, 0.0005, 26.963], - [654.7669, 0.0004, 26.9925], - [709.8303, 0.0003, 27.0535], - [764.8439, 0.0003, 27.1116], - [819.8756, 0.0002, 27.1306], - [874.8864, 0.0002, 27.165], - [929.8528, 0.0001, 27.2124], - [984.8253, 0.0001, 27.2484], - [1012.2269, 0.0, 27.3121] - ] - }, - "defaultTipOverlapDictionary": { - "opentrons/opentrons_96_tiprack_1000ul/1": 11.5, - "opentrons/opentrons_96_filtertiprack_1000ul/1": 11.5, - "opentrons/geb_96_tiprack_1000ul/1": 9.5 + "default": { + "1": [ + [83.6125, 0.0158, 25.6199], + [90.4833, 0.0183, 24.2002], + [104.1964, 0.0143, 24.5544], + [117.7531, 0.0087, 25.1402], + [131.3828, 0.008, 25.2238], + [158.8108, 0.007, 25.3573], + [186.1861, 0.0047, 25.717], + [199.8483, 0.0035, 25.938], + [213.7914, 0.0056, 25.5359], + [241.1658, 0.0026, 26.1594], + [268.9339, 0.0035, 25.9521], + [324.0678, 0.002, 26.3458], + [379.1867, 0.0014, 26.5405], + [406.6172, 0.0008, 26.7661], + [434.4039, 0.0015, 26.4869], + [461.8772, 0.0007, 26.8497], + [489.4708, 0.0009, 26.7746], + [516.9619, 0.0006, 26.9133], + [544.6047, 0.0008, 26.8025], + [572.0717, 0.0004, 27.0067], + [599.6383, 0.0005, 26.9348], + [627.2047, 0.0005, 26.963], + [654.7669, 0.0004, 26.9925], + [709.8303, 0.0003, 27.0535], + [764.8439, 0.0003, 27.1116], + [819.8756, 0.0002, 27.1306], + [874.8864, 0.0002, 27.165], + [929.8528, 0.0001, 27.2124], + [984.8253, 0.0001, 27.2484], + [1012.2269, 0.0, 27.3121] + ] + } }, "defaultBlowoutVolume": 127.235 } }, + "defaultTipOverlapDictionary": { + "default": 9.7, + "opentrons/opentrons_96_tiprack_1000ul/1": 11.5, + "opentrons/opentrons_96_filtertiprack_1000ul/1": 11.5, + "opentrons/geb_96_tiprack_1000ul/1": 9.5 + }, "maxVolume": 1000, "minVolume": 100.0, "defaultTipracks": [ diff --git a/shared-data/pipette/definitions/2/liquid/single_channel/p1000/2_2.json b/shared-data/pipette/definitions/2/liquid/single_channel/p1000/2_2.json index 750e909b609..53e5880e3b8 100644 --- a/shared-data/pipette/definitions/2/liquid/single_channel/p1000/2_2.json +++ b/shared-data/pipette/definitions/2/liquid/single_channel/p1000/2_2.json @@ -2,280 +2,110 @@ "$otSharedSchema": "#/pipette/schemas/2/pipetteLiquidPropertiesSchema.json", "supportedTips": { "t1000": { - "defaultAspirateFlowRate": 137.35, - "defaultDispenseFlowRate": 137.35, - "defaultBlowOutFlowRate": 137.35, + "defaultAspirateFlowRate": { + "default": 274.7, + "valuesByApiLevel": { + "2.0": 137.35, + "2.6": 274.7 + } + }, + "defaultDispenseFlowRate": { + "default": 274.7, + "valuesByApiLevel": { + "2.0": 137.35, + "2.6": 274.7 + } + }, + "defaultBlowOutFlowRate": { + "default": 274.7, + "valuesByApiLevel": { + "2.0": 137.35, + "2.6": 274.7 + } + }, "defaultTipLength": 78.3, - "defaultTipOverlap": 9.7, "defaultReturnTipHeight": 0.83, "aspirate": { - "opentrons/opentrons_96_tiprack_1000ul/1": [ - [83.9281, 0.0176, 25.7039], - [90.6789, 0.0125, 24.7768], - [104.4067, 0.0141, 24.6307], - [118.1219, 0.0108, 24.9777], - [131.7286, 0.0071, 25.4124], - [159.2686, 0.0072, 25.3936], - [186.7464, 0.0049, 25.7722], - [200.4731, 0.0038, 25.9749], - [214.2558, 0.0038, 25.9699], - [241.8258, 0.0032, 26.1015], - [269.5028, 0.0029, 26.1641], - [324.6789, 0.0019, 26.4311], - [379.9153, 0.0015, 26.585], - [407.5544, 0.0012, 26.6765], - [435.225, 0.0011, 26.7098], - [462.8847, 0.001, 26.7775], - [490.4011, 0.0006, 26.9595], - [518.1417, 0.0009, 26.783], - [545.5994, 0.0003, 27.094], - [573.2856, 0.0007, 26.8988], - [600.8433, 0.0004, 27.0549], - [628.3706, 0.0003, 27.1059], - [655.9225, 0.0004, 27.1005], - [711.0492, 0.0003, 27.1166], - [766.1336, 0.0003, 27.169], - [821.3261, 0.0003, 27.1451], - [876.3753, 0.0002, 27.2404], - [931.3206, 0.0001, 27.2769], - [986.4186, 0.0002, 27.2505], - [1013.9597, 0.0001, 27.2644] - ], - "opentrons/opentrons_96_filtertiprack_1000ul/1": [ - [83.9281, 0.0176, 25.7039], - [90.6789, 0.0125, 24.7768], - [104.4067, 0.0141, 24.6307], - [118.1219, 0.0108, 24.9777], - [131.7286, 0.0071, 25.4124], - [159.2686, 0.0072, 25.3936], - [186.7464, 0.0049, 25.7722], - [200.4731, 0.0038, 25.9749], - [214.2558, 0.0038, 25.9699], - [241.8258, 0.0032, 26.1015], - [269.5028, 0.0029, 26.1641], - [324.6789, 0.0019, 26.4311], - [379.9153, 0.0015, 26.585], - [407.5544, 0.0012, 26.6765], - [435.225, 0.0011, 26.7098], - [462.8847, 0.001, 26.7775], - [490.4011, 0.0006, 26.9595], - [518.1417, 0.0009, 26.783], - [545.5994, 0.0003, 27.094], - [573.2856, 0.0007, 26.8988], - [600.8433, 0.0004, 27.0549], - [628.3706, 0.0003, 27.1059], - [655.9225, 0.0004, 27.1005], - [711.0492, 0.0003, 27.1166], - [766.1336, 0.0003, 27.169], - [821.3261, 0.0003, 27.1451], - [876.3753, 0.0002, 27.2404], - [931.3206, 0.0001, 27.2769], - [986.4186, 0.0002, 27.2505], - [1013.9597, 0.0001, 27.2644] - ], - "opentrons/geb_96_tiprack_1000ul/1": [ - [83.9281, 0.0176, 25.7039], - [90.6789, 0.0125, 24.7768], - [104.4067, 0.0141, 24.6307], - [118.1219, 0.0108, 24.9777], - [131.7286, 0.0071, 25.4124], - [159.2686, 0.0072, 25.3936], - [186.7464, 0.0049, 25.7722], - [200.4731, 0.0038, 25.9749], - [214.2558, 0.0038, 25.9699], - [241.8258, 0.0032, 26.1015], - [269.5028, 0.0029, 26.1641], - [324.6789, 0.0019, 26.4311], - [379.9153, 0.0015, 26.585], - [407.5544, 0.0012, 26.6765], - [435.225, 0.0011, 26.7098], - [462.8847, 0.001, 26.7775], - [490.4011, 0.0006, 26.9595], - [518.1417, 0.0009, 26.783], - [545.5994, 0.0003, 27.094], - [573.2856, 0.0007, 26.8988], - [600.8433, 0.0004, 27.0549], - [628.3706, 0.0003, 27.1059], - [655.9225, 0.0004, 27.1005], - [711.0492, 0.0003, 27.1166], - [766.1336, 0.0003, 27.169], - [821.3261, 0.0003, 27.1451], - [876.3753, 0.0002, 27.2404], - [931.3206, 0.0001, 27.2769], - [986.4186, 0.0002, 27.2505], - [1013.9597, 0.0001, 27.2644] - ], - "default": [ - [83.9281, 0.0176, 25.7039], - [90.6789, 0.0125, 24.7768], - [104.4067, 0.0141, 24.6307], - [118.1219, 0.0108, 24.9777], - [131.7286, 0.0071, 25.4124], - [159.2686, 0.0072, 25.3936], - [186.7464, 0.0049, 25.7722], - [200.4731, 0.0038, 25.9749], - [214.2558, 0.0038, 25.9699], - [241.8258, 0.0032, 26.1015], - [269.5028, 0.0029, 26.1641], - [324.6789, 0.0019, 26.4311], - [379.9153, 0.0015, 26.585], - [407.5544, 0.0012, 26.6765], - [435.225, 0.0011, 26.7098], - [462.8847, 0.001, 26.7775], - [490.4011, 0.0006, 26.9595], - [518.1417, 0.0009, 26.783], - [545.5994, 0.0003, 27.094], - [573.2856, 0.0007, 26.8988], - [600.8433, 0.0004, 27.0549], - [628.3706, 0.0003, 27.1059], - [655.9225, 0.0004, 27.1005], - [711.0492, 0.0003, 27.1166], - [766.1336, 0.0003, 27.169], - [821.3261, 0.0003, 27.1451], - [876.3753, 0.0002, 27.2404], - [931.3206, 0.0001, 27.2769], - [986.4186, 0.0002, 27.2505], - [1013.9597, 0.0001, 27.2644] - ] + "default": { + "1": [ + [83.9281, 0.0176, 25.7039], + [90.6789, 0.0125, 24.7768], + [104.4067, 0.0141, 24.6307], + [118.1219, 0.0108, 24.9777], + [131.7286, 0.0071, 25.4124], + [159.2686, 0.0072, 25.3936], + [186.7464, 0.0049, 25.7722], + [200.4731, 0.0038, 25.9749], + [214.2558, 0.0038, 25.9699], + [241.8258, 0.0032, 26.1015], + [269.5028, 0.0029, 26.1641], + [324.6789, 0.0019, 26.4311], + [379.9153, 0.0015, 26.585], + [407.5544, 0.0012, 26.6765], + [435.225, 0.0011, 26.7098], + [462.8847, 0.001, 26.7775], + [490.4011, 0.0006, 26.9595], + [518.1417, 0.0009, 26.783], + [545.5994, 0.0003, 27.094], + [573.2856, 0.0007, 26.8988], + [600.8433, 0.0004, 27.0549], + [628.3706, 0.0003, 27.1059], + [655.9225, 0.0004, 27.1005], + [711.0492, 0.0003, 27.1166], + [766.1336, 0.0003, 27.169], + [821.3261, 0.0003, 27.1451], + [876.3753, 0.0002, 27.2404], + [931.3206, 0.0001, 27.2769], + [986.4186, 0.0002, 27.2505], + [1013.9597, 0.0001, 27.2644] + ] + } }, "dispense": { - "opentrons/opentrons_96_tiprack_1000ul/1": [ - [83.9281, 0.0176, 25.7039], - [90.6789, 0.0125, 24.7768], - [104.4067, 0.0141, 24.6307], - [118.1219, 0.0108, 24.9777], - [131.7286, 0.0071, 25.4124], - [159.2686, 0.0072, 25.3936], - [186.7464, 0.0049, 25.7722], - [200.4731, 0.0038, 25.9749], - [214.2558, 0.0038, 25.9699], - [241.8258, 0.0032, 26.1015], - [269.5028, 0.0029, 26.1641], - [324.6789, 0.0019, 26.4311], - [379.9153, 0.0015, 26.585], - [407.5544, 0.0012, 26.6765], - [435.225, 0.0011, 26.7098], - [462.8847, 0.001, 26.7775], - [490.4011, 0.0006, 26.9595], - [518.1417, 0.0009, 26.783], - [545.5994, 0.0003, 27.094], - [573.2856, 0.0007, 26.8988], - [600.8433, 0.0004, 27.0549], - [628.3706, 0.0003, 27.1059], - [655.9225, 0.0004, 27.1005], - [711.0492, 0.0003, 27.1166], - [766.1336, 0.0003, 27.169], - [821.3261, 0.0003, 27.1451], - [876.3753, 0.0002, 27.2404], - [931.3206, 0.0001, 27.2769], - [986.4186, 0.0002, 27.2505], - [1013.9597, 0.0001, 27.2644] - ], - "opentrons/opentrons_96_filtertiprack_1000ul/1": [ - [83.9281, 0.0176, 25.7039], - [90.6789, 0.0125, 24.7768], - [104.4067, 0.0141, 24.6307], - [118.1219, 0.0108, 24.9777], - [131.7286, 0.0071, 25.4124], - [159.2686, 0.0072, 25.3936], - [186.7464, 0.0049, 25.7722], - [200.4731, 0.0038, 25.9749], - [214.2558, 0.0038, 25.9699], - [241.8258, 0.0032, 26.1015], - [269.5028, 0.0029, 26.1641], - [324.6789, 0.0019, 26.4311], - [379.9153, 0.0015, 26.585], - [407.5544, 0.0012, 26.6765], - [435.225, 0.0011, 26.7098], - [462.8847, 0.001, 26.7775], - [490.4011, 0.0006, 26.9595], - [518.1417, 0.0009, 26.783], - [545.5994, 0.0003, 27.094], - [573.2856, 0.0007, 26.8988], - [600.8433, 0.0004, 27.0549], - [628.3706, 0.0003, 27.1059], - [655.9225, 0.0004, 27.1005], - [711.0492, 0.0003, 27.1166], - [766.1336, 0.0003, 27.169], - [821.3261, 0.0003, 27.1451], - [876.3753, 0.0002, 27.2404], - [931.3206, 0.0001, 27.2769], - [986.4186, 0.0002, 27.2505], - [1013.9597, 0.0001, 27.2644] - ], - "opentrons/geb_96_tiprack_1000ul/1": [ - [83.9281, 0.0176, 25.7039], - [90.6789, 0.0125, 24.7768], - [104.4067, 0.0141, 24.6307], - [118.1219, 0.0108, 24.9777], - [131.7286, 0.0071, 25.4124], - [159.2686, 0.0072, 25.3936], - [186.7464, 0.0049, 25.7722], - [200.4731, 0.0038, 25.9749], - [214.2558, 0.0038, 25.9699], - [241.8258, 0.0032, 26.1015], - [269.5028, 0.0029, 26.1641], - [324.6789, 0.0019, 26.4311], - [379.9153, 0.0015, 26.585], - [407.5544, 0.0012, 26.6765], - [435.225, 0.0011, 26.7098], - [462.8847, 0.001, 26.7775], - [490.4011, 0.0006, 26.9595], - [518.1417, 0.0009, 26.783], - [545.5994, 0.0003, 27.094], - [573.2856, 0.0007, 26.8988], - [600.8433, 0.0004, 27.0549], - [628.3706, 0.0003, 27.1059], - [655.9225, 0.0004, 27.1005], - [711.0492, 0.0003, 27.1166], - [766.1336, 0.0003, 27.169], - [821.3261, 0.0003, 27.1451], - [876.3753, 0.0002, 27.2404], - [931.3206, 0.0001, 27.2769], - [986.4186, 0.0002, 27.2505], - [1013.9597, 0.0001, 27.2644] - ], - "default": [ - [83.9281, 0.0176, 25.7039], - [90.6789, 0.0125, 24.7768], - [104.4067, 0.0141, 24.6307], - [118.1219, 0.0108, 24.9777], - [131.7286, 0.0071, 25.4124], - [159.2686, 0.0072, 25.3936], - [186.7464, 0.0049, 25.7722], - [200.4731, 0.0038, 25.9749], - [214.2558, 0.0038, 25.9699], - [241.8258, 0.0032, 26.1015], - [269.5028, 0.0029, 26.1641], - [324.6789, 0.0019, 26.4311], - [379.9153, 0.0015, 26.585], - [407.5544, 0.0012, 26.6765], - [435.225, 0.0011, 26.7098], - [462.8847, 0.001, 26.7775], - [490.4011, 0.0006, 26.9595], - [518.1417, 0.0009, 26.783], - [545.5994, 0.0003, 27.094], - [573.2856, 0.0007, 26.8988], - [600.8433, 0.0004, 27.0549], - [628.3706, 0.0003, 27.1059], - [655.9225, 0.0004, 27.1005], - [711.0492, 0.0003, 27.1166], - [766.1336, 0.0003, 27.169], - [821.3261, 0.0003, 27.1451], - [876.3753, 0.0002, 27.2404], - [931.3206, 0.0001, 27.2769], - [986.4186, 0.0002, 27.2505], - [1013.9597, 0.0001, 27.2644] - ] - }, - "defaultTipOverlapDictionary": { - "opentrons/opentrons_96_tiprack_1000ul/1": 11.5, - "opentrons/opentrons_96_filtertiprack_1000ul/1": 11.5, - "opentrons/geb_96_tiprack_1000ul/1": 9.5 + "default": { + "1": [ + [83.9281, 0.0176, 25.7039], + [90.6789, 0.0125, 24.7768], + [104.4067, 0.0141, 24.6307], + [118.1219, 0.0108, 24.9777], + [131.7286, 0.0071, 25.4124], + [159.2686, 0.0072, 25.3936], + [186.7464, 0.0049, 25.7722], + [200.4731, 0.0038, 25.9749], + [214.2558, 0.0038, 25.9699], + [241.8258, 0.0032, 26.1015], + [269.5028, 0.0029, 26.1641], + [324.6789, 0.0019, 26.4311], + [379.9153, 0.0015, 26.585], + [407.5544, 0.0012, 26.6765], + [435.225, 0.0011, 26.7098], + [462.8847, 0.001, 26.7775], + [490.4011, 0.0006, 26.9595], + [518.1417, 0.0009, 26.783], + [545.5994, 0.0003, 27.094], + [573.2856, 0.0007, 26.8988], + [600.8433, 0.0004, 27.0549], + [628.3706, 0.0003, 27.1059], + [655.9225, 0.0004, 27.1005], + [711.0492, 0.0003, 27.1166], + [766.1336, 0.0003, 27.169], + [821.3261, 0.0003, 27.1451], + [876.3753, 0.0002, 27.2404], + [931.3206, 0.0001, 27.2769], + [986.4186, 0.0002, 27.2505], + [1013.9597, 0.0001, 27.2644] + ] + } }, "defaultBlowoutVolume": 127.235 } }, + "defaultTipOverlapDictionary": { + "default": 9.7, + "opentrons/opentrons_96_tiprack_1000ul/1": 11.5, + "opentrons/opentrons_96_filtertiprack_1000ul/1": 11.5, + "opentrons/geb_96_tiprack_1000ul/1": 9.5 + }, "maxVolume": 1000, "minVolume": 100.0, "defaultTipracks": [ diff --git a/shared-data/pipette/definitions/2/liquid/single_channel/p1000/3_0.json b/shared-data/pipette/definitions/2/liquid/single_channel/p1000/3_0.json index c77164b293d..b889b8a824e 100644 --- a/shared-data/pipette/definitions/2/liquid/single_channel/p1000/3_0.json +++ b/shared-data/pipette/definitions/2/liquid/single_channel/p1000/3_0.json @@ -2,305 +2,365 @@ "$otSharedSchema": "#/pipette/schemas/2/pipetteLiquidPropertiesSchema.json", "supportedTips": { "t50": { - "defaultAspirateFlowRate": 6, - "defaultDispenseFlowRate": 6, - "defaultBlowOutFlowRate": 80, + "defaultAspirateFlowRate": { + "default": 6, + "valuesByApiLevel": { + "2.14": 6 + } + }, + "defaultDispenseFlowRate": { + "default": 6, + "valuesByApiLevel": { + "2.14": 6 + } + }, + "defaultBlowOutFlowRate": { + "default": 80, + "valuesByApiLevel": { + "2.14": 80 + } + }, "defaultTipLength": 57.9, - "defaultTipOverlap": 10.5, "defaultReturnTipHeight": 0.71, "aspirate": { - "default": [ - [0.4148, -1705.1015, 20.5455], - [0.4476, -80.633, 47.2788], - [0.5512, -1.5936, 11.9026], - [0.6027, -18.9998, 21.4972], - [0.6503, -15.8781, 19.6156], - [0.7733, 3.0612, 7.2993], - [0.8391, -5.2227, 13.7056], - [0.9736, 3.0706, 6.7467], - [1.16, -0.374, 10.1005], - [1.3964, 1.3004, 8.1582], - [1.5815, -0.4837, 10.6494], - [1.8306, 1.1464, 8.0714], - [2.0345, 0.0132, 10.1459], - [2.6221, 0.5374, 9.0794], - [2.9655, -1.7582, 15.0986], - [3.5124, 0.2754, 9.0681], - [4.6591, 1.406, 5.097], - [5.367, 0.394, 9.8123], - [6.0839, 0.3365, 10.1205], - [6.8312, 0.3379, 10.1121], - [7.5676, 0.2611, 10.637], - [8.2397, 0.095, 11.8939], - [8.9776, 0.2015, 11.0165], - [10.413, 0.1332, 11.6294], - [11.8539, 0.1074, 11.8979], - [13.3655, 0.1286, 11.6464], - [14.8236, 0.0758, 12.3519], - [16.3203, 0.083, 12.2457], - [17.7915, 0.0581, 12.6515], - [19.2145, 0.0273, 13.1995], - [20.6718, 0.0388, 12.9792], - [22.1333, 0.0357, 13.044], - [25.0761, 0.0332, 13.0977], - [28.0339, 0.029, 13.2035], - [30.967, 0.0201, 13.4538], - [33.8727, 0.013, 13.6737], - [36.8273, 0.0172, 13.5324], - [39.7594, 0.0121, 13.7191], - [42.6721, 0.0083, 13.8687], - [45.5964, 0.0085, 13.8618], - [48.5297, 0.0084, 13.8668], - [51.4512, 0.0064, 13.9651] - ] + "default": { + "1": [ + [0.4148, -1705.1015, 20.5455], + [0.4476, -80.633, 47.2788], + [0.5512, -1.5936, 11.9026], + [0.6027, -18.9998, 21.4972], + [0.6503, -15.8781, 19.6156], + [0.7733, 3.0612, 7.2993], + [0.8391, -5.2227, 13.7056], + [0.9736, 3.0706, 6.7467], + [1.16, -0.374, 10.1005], + [1.3964, 1.3004, 8.1582], + [1.5815, -0.4837, 10.6494], + [1.8306, 1.1464, 8.0714], + [2.0345, 0.0132, 10.1459], + [2.6221, 0.5374, 9.0794], + [2.9655, -1.7582, 15.0986], + [3.5124, 0.2754, 9.0681], + [4.6591, 1.406, 5.097], + [5.367, 0.394, 9.8123], + [6.0839, 0.3365, 10.1205], + [6.8312, 0.3379, 10.1121], + [7.5676, 0.2611, 10.637], + [8.2397, 0.095, 11.8939], + [8.9776, 0.2015, 11.0165], + [10.413, 0.1332, 11.6294], + [11.8539, 0.1074, 11.8979], + [13.3655, 0.1286, 11.6464], + [14.8236, 0.0758, 12.3519], + [16.3203, 0.083, 12.2457], + [17.7915, 0.0581, 12.6515], + [19.2145, 0.0273, 13.1995], + [20.6718, 0.0388, 12.9792], + [22.1333, 0.0357, 13.044], + [25.0761, 0.0332, 13.0977], + [28.0339, 0.029, 13.2035], + [30.967, 0.0201, 13.4538], + [33.8727, 0.013, 13.6737], + [36.8273, 0.0172, 13.5324], + [39.7594, 0.0121, 13.7191], + [42.6721, 0.0083, 13.8687], + [45.5964, 0.0085, 13.8618], + [48.5297, 0.0084, 13.8668], + [51.4512, 0.0064, 13.9651] + ] + } }, "dispense": { - "default": [ - [0.4148, -1705.1015, 20.5455], - [0.4476, -80.633, 47.2788], - [0.5512, -1.5936, 11.9026], - [0.6027, -18.9998, 21.4972], - [0.6503, -15.8781, 19.6156], - [0.7733, 3.0612, 7.2993], - [0.8391, -5.2227, 13.7056], - [0.9736, 3.0706, 6.7467], - [1.16, -0.374, 10.1005], - [1.3964, 1.3004, 8.1582], - [1.5815, -0.4837, 10.6494], - [1.8306, 1.1464, 8.0714], - [2.0345, 0.0132, 10.1459], - [2.6221, 0.5374, 9.0794], - [2.9655, -1.7582, 15.0986], - [3.5124, 0.2754, 9.0681], - [4.6591, 1.406, 5.097], - [5.367, 0.394, 9.8123], - [6.0839, 0.3365, 10.1205], - [6.8312, 0.3379, 10.1121], - [7.5676, 0.2611, 10.637], - [8.2397, 0.095, 11.8939], - [8.9776, 0.2015, 11.0165], - [10.413, 0.1332, 11.6294], - [11.8539, 0.1074, 11.8979], - [13.3655, 0.1286, 11.6464], - [14.8236, 0.0758, 12.3519], - [16.3203, 0.083, 12.2457], - [17.7915, 0.0581, 12.6515], - [19.2145, 0.0273, 13.1995], - [20.6718, 0.0388, 12.9792], - [22.1333, 0.0357, 13.044], - [25.0761, 0.0332, 13.0977], - [28.0339, 0.029, 13.2035], - [30.967, 0.0201, 13.4538], - [33.8727, 0.013, 13.6737], - [36.8273, 0.0172, 13.5324], - [39.7594, 0.0121, 13.7191], - [42.6721, 0.0083, 13.8687], - [45.5964, 0.0085, 13.8618], - [48.5297, 0.0084, 13.8668], - [51.4512, 0.0064, 13.9651] - ] + "default": { + "1": [ + [0.4148, -1705.1015, 20.5455], + [0.4476, -80.633, 47.2788], + [0.5512, -1.5936, 11.9026], + [0.6027, -18.9998, 21.4972], + [0.6503, -15.8781, 19.6156], + [0.7733, 3.0612, 7.2993], + [0.8391, -5.2227, 13.7056], + [0.9736, 3.0706, 6.7467], + [1.16, -0.374, 10.1005], + [1.3964, 1.3004, 8.1582], + [1.5815, -0.4837, 10.6494], + [1.8306, 1.1464, 8.0714], + [2.0345, 0.0132, 10.1459], + [2.6221, 0.5374, 9.0794], + [2.9655, -1.7582, 15.0986], + [3.5124, 0.2754, 9.0681], + [4.6591, 1.406, 5.097], + [5.367, 0.394, 9.8123], + [6.0839, 0.3365, 10.1205], + [6.8312, 0.3379, 10.1121], + [7.5676, 0.2611, 10.637], + [8.2397, 0.095, 11.8939], + [8.9776, 0.2015, 11.0165], + [10.413, 0.1332, 11.6294], + [11.8539, 0.1074, 11.8979], + [13.3655, 0.1286, 11.6464], + [14.8236, 0.0758, 12.3519], + [16.3203, 0.083, 12.2457], + [17.7915, 0.0581, 12.6515], + [19.2145, 0.0273, 13.1995], + [20.6718, 0.0388, 12.9792], + [22.1333, 0.0357, 13.044], + [25.0761, 0.0332, 13.0977], + [28.0339, 0.029, 13.2035], + [30.967, 0.0201, 13.4538], + [33.8727, 0.013, 13.6737], + [36.8273, 0.0172, 13.5324], + [39.7594, 0.0121, 13.7191], + [42.6721, 0.0083, 13.8687], + [45.5964, 0.0085, 13.8618], + [48.5297, 0.0084, 13.8668], + [51.4512, 0.0064, 13.9651] + ] + } }, "defaultBlowoutVolume": 3.2 }, "t200": { - "defaultAspirateFlowRate": 80, - "defaultDispenseFlowRate": 80, - "defaultBlowOutFlowRate": 80, + "defaultAspirateFlowRate": { + "default": 80, + "valuesByApiLevel": { + "2.14": 80 + } + }, + "defaultDispenseFlowRate": { + "default": 80, + "valuesByApiLevel": { + "2.14": 80 + } + }, + "defaultBlowOutFlowRate": { + "default": 80, + "valuesByApiLevel": { + "2.14": 80 + } + }, "defaultTipLength": 58.35, - "defaultTipOverlap": 10.5, "defaultReturnTipHeight": 0.71, "aspirate": { - "default": [ - [0.8314, -2.9322, 24.0741], - [0.8853, -30.0996, 48.7784], - [0.9778, -4.3627, 25.9941], - [0.975, 802.2301, -762.6744], - [1.1272, -4.6837, 24.0666], - [1.2747, -3.91, 23.1945], - [1.5656, -2.8032, 21.7836], - [1.6667, -7.2039, 28.6731], - [2.4403, -0.5147, 17.5244], - [3.0564, -1.6013, 20.1761], - [3.6444, -1.1974, 18.9418], - [4.1189, -1.7877, 21.0928], - [4.6467, -0.8591, 17.2684], - [5.2597, -0.207, 14.2379], - [5.8581, -0.2196, 14.3044], - [6.4772, -0.1025, 13.6183], - [7.8158, 0.0537, 12.6063], - [9.1664, 0.0507, 12.6302], - [10.5064, 0.0285, 12.8339], - [14.8361, 0.0818, 12.273], - [19.3933, 0.0801, 12.2991], - [23.9242, 0.0487, 12.9079], - [28.4922, 0.0379, 13.1666], - [36.145, 0.0277, 13.4572], - [43.7972, 0.0184, 13.7916], - [51.5125, 0.0154, 13.9248], - [59.2467, 0.0121, 14.0931], - [66.9428, 0.0084, 14.3151], - [74.6853, 0.0079, 14.3498], - [82.3722, 0.0052, 14.5512], - [90.1106, 0.0054, 14.5333], - [97.8369, 0.0043, 14.6288], - [105.6153, 0.0046, 14.5983], - [113.3686, 0.0036, 14.7076], - [121.1108, 0.003, 14.7785], - [136.61, 0.0026, 14.826], - [152.0708, 0.0018, 14.9298], - [167.6433, 0.0021, 14.8827], - [183.1011, 0.0012, 15.0438], - [198.5845, 0.0011, 15.0538], - [214.0264, 0.0008, 15.123] - ] + "default": { + "1": [ + [0.8314, -2.9322, 24.0741], + [0.8853, -30.0996, 48.7784], + [0.9778, -4.3627, 25.9941], + [0.975, 802.2301, -762.6744], + [1.1272, -4.6837, 24.0666], + [1.2747, -3.91, 23.1945], + [1.5656, -2.8032, 21.7836], + [1.6667, -7.2039, 28.6731], + [2.4403, -0.5147, 17.5244], + [3.0564, -1.6013, 20.1761], + [3.6444, -1.1974, 18.9418], + [4.1189, -1.7877, 21.0928], + [4.6467, -0.8591, 17.2684], + [5.2597, -0.207, 14.2379], + [5.8581, -0.2196, 14.3044], + [6.4772, -0.1025, 13.6183], + [7.8158, 0.0537, 12.6063], + [9.1664, 0.0507, 12.6302], + [10.5064, 0.0285, 12.8339], + [14.8361, 0.0818, 12.273], + [19.3933, 0.0801, 12.2991], + [23.9242, 0.0487, 12.9079], + [28.4922, 0.0379, 13.1666], + [36.145, 0.0277, 13.4572], + [43.7972, 0.0184, 13.7916], + [51.5125, 0.0154, 13.9248], + [59.2467, 0.0121, 14.0931], + [66.9428, 0.0084, 14.3151], + [74.6853, 0.0079, 14.3498], + [82.3722, 0.0052, 14.5512], + [90.1106, 0.0054, 14.5333], + [97.8369, 0.0043, 14.6288], + [105.6153, 0.0046, 14.5983], + [113.3686, 0.0036, 14.7076], + [121.1108, 0.003, 14.7785], + [136.61, 0.0026, 14.826], + [152.0708, 0.0018, 14.9298], + [167.6433, 0.0021, 14.8827], + [183.1011, 0.0012, 15.0438], + [198.5845, 0.0011, 15.0538], + [214.0264, 0.0008, 15.123] + ] + } }, "dispense": { - "default": [ - [0.8314, -2.9322, 24.0741], - [0.8853, -30.0996, 48.7784], - [0.9778, -4.3627, 25.9941], - [0.975, 802.2301, -762.6744], - [1.1272, -4.6837, 24.0666], - [1.2747, -3.91, 23.1945], - [1.5656, -2.8032, 21.7836], - [1.6667, -7.2039, 28.6731], - [2.4403, -0.5147, 17.5244], - [3.0564, -1.6013, 20.1761], - [3.6444, -1.1974, 18.9418], - [4.1189, -1.7877, 21.0928], - [4.6467, -0.8591, 17.2684], - [5.2597, -0.207, 14.2379], - [5.8581, -0.2196, 14.3044], - [6.4772, -0.1025, 13.6183], - [7.8158, 0.0537, 12.6063], - [9.1664, 0.0507, 12.6302], - [10.5064, 0.0285, 12.8339], - [14.8361, 0.0818, 12.273], - [19.3933, 0.0801, 12.2991], - [23.9242, 0.0487, 12.9079], - [28.4922, 0.0379, 13.1666], - [36.145, 0.0277, 13.4572], - [43.7972, 0.0184, 13.7916], - [51.5125, 0.0154, 13.9248], - [59.2467, 0.0121, 14.0931], - [66.9428, 0.0084, 14.3151], - [74.6853, 0.0079, 14.3498], - [82.3722, 0.0052, 14.5512], - [90.1106, 0.0054, 14.5333], - [97.8369, 0.0043, 14.6288], - [105.6153, 0.0046, 14.5983], - [113.3686, 0.0036, 14.7076], - [121.1108, 0.003, 14.7785], - [136.61, 0.0026, 14.826], - [152.0708, 0.0018, 14.9298], - [167.6433, 0.0021, 14.8827], - [183.1011, 0.0012, 15.0438], - [198.5845, 0.0011, 15.0538], - [214.0264, 0.0008, 15.123] - ] + "default": { + "1": [ + [0.8314, -2.9322, 24.0741], + [0.8853, -30.0996, 48.7784], + [0.9778, -4.3627, 25.9941], + [0.975, 802.2301, -762.6744], + [1.1272, -4.6837, 24.0666], + [1.2747, -3.91, 23.1945], + [1.5656, -2.8032, 21.7836], + [1.6667, -7.2039, 28.6731], + [2.4403, -0.5147, 17.5244], + [3.0564, -1.6013, 20.1761], + [3.6444, -1.1974, 18.9418], + [4.1189, -1.7877, 21.0928], + [4.6467, -0.8591, 17.2684], + [5.2597, -0.207, 14.2379], + [5.8581, -0.2196, 14.3044], + [6.4772, -0.1025, 13.6183], + [7.8158, 0.0537, 12.6063], + [9.1664, 0.0507, 12.6302], + [10.5064, 0.0285, 12.8339], + [14.8361, 0.0818, 12.273], + [19.3933, 0.0801, 12.2991], + [23.9242, 0.0487, 12.9079], + [28.4922, 0.0379, 13.1666], + [36.145, 0.0277, 13.4572], + [43.7972, 0.0184, 13.7916], + [51.5125, 0.0154, 13.9248], + [59.2467, 0.0121, 14.0931], + [66.9428, 0.0084, 14.3151], + [74.6853, 0.0079, 14.3498], + [82.3722, 0.0052, 14.5512], + [90.1106, 0.0054, 14.5333], + [97.8369, 0.0043, 14.6288], + [105.6153, 0.0046, 14.5983], + [113.3686, 0.0036, 14.7076], + [121.1108, 0.003, 14.7785], + [136.61, 0.0026, 14.826], + [152.0708, 0.0018, 14.9298], + [167.6433, 0.0021, 14.8827], + [183.1011, 0.0012, 15.0438], + [198.5845, 0.0011, 15.0538], + [214.0264, 0.0008, 15.123] + ] + } }, "defaultBlowoutVolume": 16 }, "t1000": { - "defaultAspirateFlowRate": 160, - "defaultDispenseFlowRate": 160, - "defaultBlowOutFlowRate": 80, + "defaultAspirateFlowRate": { + "default": 160, + "valuesByApiLevel": { + "2.14": 160 + } + }, + "defaultDispenseFlowRate": { + "default": 160, + "valuesByApiLevel": { + "2.14": 160 + } + }, + "defaultBlowOutFlowRate": { + "default": 80, + "valuesByApiLevel": { + "2.14": 80 + } + }, "defaultTipLength": 95.6, - "defaultTipOverlap": 10.5, "defaultReturnTipHeight": 0.82, "aspirate": { - "default": [ - [0.7511, 3.9556, 6.455], - [1.3075, 2.1664, 5.8839], - [1.8737, 1.1513, 7.2111], - [3.177, 0.9374, 7.612], - [4.5368, 0.5531, 8.8328], - [7.3103, 0.3035, 9.9651], - [10.0825, 0.1513, 11.0781], - [12.9776, 0.1293, 11.2991], - [15.9173, 0.0976, 11.7115], - [18.8243, 0.0624, 12.2706], - [21.8529, 0.07, 12.1275], - [24.8068, 0.0418, 12.7442], - [27.7744, 0.0356, 12.8984], - [35.2873, 0.0303, 13.0454], - [42.7989, 0.0202, 13.4038], - [50.4562, 0.0196, 13.4293], - [58.1081, 0.0145, 13.6843], - [65.7267, 0.0104, 13.9252], - [73.2857, 0.0068, 14.1606], - [81.0016, 0.0091, 13.9883], - [88.6617, 0.0064, 14.2052], - [103.9829, 0.0051, 14.3271], - [119.4408, 0.0049, 14.3475], - [134.889, 0.0037, 14.485], - [150.273, 0.0026, 14.6402], - [181.2798, 0.0026, 14.6427], - [212.4724, 0.0022, 14.7002], - [243.577, 0.0015, 14.8558], - [274.7216, 0.0012, 14.9205], - [305.8132, 0.0009, 15.0118], - [368.0697, 0.0007, 15.0668], - [430.2513, 0.0005, 15.1594], - [492.3487, 0.0003, 15.2291], - [554.5713, 0.0003, 15.2367], - [616.6825, 0.0002, 15.2949], - [694.4168, 0.0002, 15.3027], - [772.0327, 0.0001, 15.3494], - [849.617, 0.0001, 15.3717], - [927.2556, 0.0001, 15.3745], - [1004.87, 0.0001, 15.3912], - [1051.4648, 0.0001, 15.391] - ] + "default": { + "1": [ + [0.7511, 3.9556, 6.455], + [1.3075, 2.1664, 5.8839], + [1.8737, 1.1513, 7.2111], + [3.177, 0.9374, 7.612], + [4.5368, 0.5531, 8.8328], + [7.3103, 0.3035, 9.9651], + [10.0825, 0.1513, 11.0781], + [12.9776, 0.1293, 11.2991], + [15.9173, 0.0976, 11.7115], + [18.8243, 0.0624, 12.2706], + [21.8529, 0.07, 12.1275], + [24.8068, 0.0418, 12.7442], + [27.7744, 0.0356, 12.8984], + [35.2873, 0.0303, 13.0454], + [42.7989, 0.0202, 13.4038], + [50.4562, 0.0196, 13.4293], + [58.1081, 0.0145, 13.6843], + [65.7267, 0.0104, 13.9252], + [73.2857, 0.0068, 14.1606], + [81.0016, 0.0091, 13.9883], + [88.6617, 0.0064, 14.2052], + [103.9829, 0.0051, 14.3271], + [119.4408, 0.0049, 14.3475], + [134.889, 0.0037, 14.485], + [150.273, 0.0026, 14.6402], + [181.2798, 0.0026, 14.6427], + [212.4724, 0.0022, 14.7002], + [243.577, 0.0015, 14.8558], + [274.7216, 0.0012, 14.9205], + [305.8132, 0.0009, 15.0118], + [368.0697, 0.0007, 15.0668], + [430.2513, 0.0005, 15.1594], + [492.3487, 0.0003, 15.2291], + [554.5713, 0.0003, 15.2367], + [616.6825, 0.0002, 15.2949], + [694.4168, 0.0002, 15.3027], + [772.0327, 0.0001, 15.3494], + [849.617, 0.0001, 15.3717], + [927.2556, 0.0001, 15.3745], + [1004.87, 0.0001, 15.3912], + [1051.4648, 0.0001, 15.391] + ] + } }, "dispense": { - "default": [ - [0.7511, 3.9556, 6.455], - [1.3075, 2.1664, 5.8839], - [1.8737, 1.1513, 7.2111], - [3.177, 0.9374, 7.612], - [4.5368, 0.5531, 8.8328], - [7.3103, 0.3035, 9.9651], - [10.0825, 0.1513, 11.0781], - [12.9776, 0.1293, 11.2991], - [15.9173, 0.0976, 11.7115], - [18.8243, 0.0624, 12.2706], - [21.8529, 0.07, 12.1275], - [24.8068, 0.0418, 12.7442], - [27.7744, 0.0356, 12.8984], - [35.2873, 0.0303, 13.0454], - [42.7989, 0.0202, 13.4038], - [50.4562, 0.0196, 13.4293], - [58.1081, 0.0145, 13.6843], - [65.7267, 0.0104, 13.9252], - [73.2857, 0.0068, 14.1606], - [81.0016, 0.0091, 13.9883], - [88.6617, 0.0064, 14.2052], - [103.9829, 0.0051, 14.3271], - [119.4408, 0.0049, 14.3475], - [134.889, 0.0037, 14.485], - [150.273, 0.0026, 14.6402], - [181.2798, 0.0026, 14.6427], - [212.4724, 0.0022, 14.7002], - [243.577, 0.0015, 14.8558], - [274.7216, 0.0012, 14.9205], - [305.8132, 0.0009, 15.0118], - [368.0697, 0.0007, 15.0668], - [430.2513, 0.0005, 15.1594], - [492.3487, 0.0003, 15.2291], - [554.5713, 0.0003, 15.2367], - [616.6825, 0.0002, 15.2949], - [694.4168, 0.0002, 15.3027], - [772.0327, 0.0001, 15.3494], - [849.617, 0.0001, 15.3717], - [927.2556, 0.0001, 15.3745], - [1004.87, 0.0001, 15.3912], - [1051.4648, 0.0001, 15.391] - ] + "default": { + "1": [ + [0.7511, 3.9556, 6.455], + [1.3075, 2.1664, 5.8839], + [1.8737, 1.1513, 7.2111], + [3.177, 0.9374, 7.612], + [4.5368, 0.5531, 8.8328], + [7.3103, 0.3035, 9.9651], + [10.0825, 0.1513, 11.0781], + [12.9776, 0.1293, 11.2991], + [15.9173, 0.0976, 11.7115], + [18.8243, 0.0624, 12.2706], + [21.8529, 0.07, 12.1275], + [24.8068, 0.0418, 12.7442], + [27.7744, 0.0356, 12.8984], + [35.2873, 0.0303, 13.0454], + [42.7989, 0.0202, 13.4038], + [50.4562, 0.0196, 13.4293], + [58.1081, 0.0145, 13.6843], + [65.7267, 0.0104, 13.9252], + [73.2857, 0.0068, 14.1606], + [81.0016, 0.0091, 13.9883], + [88.6617, 0.0064, 14.2052], + [103.9829, 0.0051, 14.3271], + [119.4408, 0.0049, 14.3475], + [134.889, 0.0037, 14.485], + [150.273, 0.0026, 14.6402], + [181.2798, 0.0026, 14.6427], + [212.4724, 0.0022, 14.7002], + [243.577, 0.0015, 14.8558], + [274.7216, 0.0012, 14.9205], + [305.8132, 0.0009, 15.0118], + [368.0697, 0.0007, 15.0668], + [430.2513, 0.0005, 15.1594], + [492.3487, 0.0003, 15.2291], + [554.5713, 0.0003, 15.2367], + [616.6825, 0.0002, 15.2949], + [694.4168, 0.0002, 15.3027], + [772.0327, 0.0001, 15.3494], + [849.617, 0.0001, 15.3717], + [927.2556, 0.0001, 15.3745], + [1004.87, 0.0001, 15.3912], + [1051.4648, 0.0001, 15.391] + ] + } }, "defaultBlowoutVolume": 16 } }, + "defaultTipOverlapDictionary": { + "default": 10.5, + "opentrons/opentrons_flex_96_tiprack_1000ul/1": 10.5, + "opentrons/opentrons_flex_96_tiprack_200ul/1": 10.5, + "opentrons/opentrons_flex_96_tiprack_50ul/1": 10.5 + }, "maxVolume": 1000, "minVolume": 1, "defaultTipracks": [ diff --git a/shared-data/pipette/definitions/2/liquid/single_channel/p1000/3_3.json b/shared-data/pipette/definitions/2/liquid/single_channel/p1000/3_3.json index c77164b293d..b889b8a824e 100644 --- a/shared-data/pipette/definitions/2/liquid/single_channel/p1000/3_3.json +++ b/shared-data/pipette/definitions/2/liquid/single_channel/p1000/3_3.json @@ -2,305 +2,365 @@ "$otSharedSchema": "#/pipette/schemas/2/pipetteLiquidPropertiesSchema.json", "supportedTips": { "t50": { - "defaultAspirateFlowRate": 6, - "defaultDispenseFlowRate": 6, - "defaultBlowOutFlowRate": 80, + "defaultAspirateFlowRate": { + "default": 6, + "valuesByApiLevel": { + "2.14": 6 + } + }, + "defaultDispenseFlowRate": { + "default": 6, + "valuesByApiLevel": { + "2.14": 6 + } + }, + "defaultBlowOutFlowRate": { + "default": 80, + "valuesByApiLevel": { + "2.14": 80 + } + }, "defaultTipLength": 57.9, - "defaultTipOverlap": 10.5, "defaultReturnTipHeight": 0.71, "aspirate": { - "default": [ - [0.4148, -1705.1015, 20.5455], - [0.4476, -80.633, 47.2788], - [0.5512, -1.5936, 11.9026], - [0.6027, -18.9998, 21.4972], - [0.6503, -15.8781, 19.6156], - [0.7733, 3.0612, 7.2993], - [0.8391, -5.2227, 13.7056], - [0.9736, 3.0706, 6.7467], - [1.16, -0.374, 10.1005], - [1.3964, 1.3004, 8.1582], - [1.5815, -0.4837, 10.6494], - [1.8306, 1.1464, 8.0714], - [2.0345, 0.0132, 10.1459], - [2.6221, 0.5374, 9.0794], - [2.9655, -1.7582, 15.0986], - [3.5124, 0.2754, 9.0681], - [4.6591, 1.406, 5.097], - [5.367, 0.394, 9.8123], - [6.0839, 0.3365, 10.1205], - [6.8312, 0.3379, 10.1121], - [7.5676, 0.2611, 10.637], - [8.2397, 0.095, 11.8939], - [8.9776, 0.2015, 11.0165], - [10.413, 0.1332, 11.6294], - [11.8539, 0.1074, 11.8979], - [13.3655, 0.1286, 11.6464], - [14.8236, 0.0758, 12.3519], - [16.3203, 0.083, 12.2457], - [17.7915, 0.0581, 12.6515], - [19.2145, 0.0273, 13.1995], - [20.6718, 0.0388, 12.9792], - [22.1333, 0.0357, 13.044], - [25.0761, 0.0332, 13.0977], - [28.0339, 0.029, 13.2035], - [30.967, 0.0201, 13.4538], - [33.8727, 0.013, 13.6737], - [36.8273, 0.0172, 13.5324], - [39.7594, 0.0121, 13.7191], - [42.6721, 0.0083, 13.8687], - [45.5964, 0.0085, 13.8618], - [48.5297, 0.0084, 13.8668], - [51.4512, 0.0064, 13.9651] - ] + "default": { + "1": [ + [0.4148, -1705.1015, 20.5455], + [0.4476, -80.633, 47.2788], + [0.5512, -1.5936, 11.9026], + [0.6027, -18.9998, 21.4972], + [0.6503, -15.8781, 19.6156], + [0.7733, 3.0612, 7.2993], + [0.8391, -5.2227, 13.7056], + [0.9736, 3.0706, 6.7467], + [1.16, -0.374, 10.1005], + [1.3964, 1.3004, 8.1582], + [1.5815, -0.4837, 10.6494], + [1.8306, 1.1464, 8.0714], + [2.0345, 0.0132, 10.1459], + [2.6221, 0.5374, 9.0794], + [2.9655, -1.7582, 15.0986], + [3.5124, 0.2754, 9.0681], + [4.6591, 1.406, 5.097], + [5.367, 0.394, 9.8123], + [6.0839, 0.3365, 10.1205], + [6.8312, 0.3379, 10.1121], + [7.5676, 0.2611, 10.637], + [8.2397, 0.095, 11.8939], + [8.9776, 0.2015, 11.0165], + [10.413, 0.1332, 11.6294], + [11.8539, 0.1074, 11.8979], + [13.3655, 0.1286, 11.6464], + [14.8236, 0.0758, 12.3519], + [16.3203, 0.083, 12.2457], + [17.7915, 0.0581, 12.6515], + [19.2145, 0.0273, 13.1995], + [20.6718, 0.0388, 12.9792], + [22.1333, 0.0357, 13.044], + [25.0761, 0.0332, 13.0977], + [28.0339, 0.029, 13.2035], + [30.967, 0.0201, 13.4538], + [33.8727, 0.013, 13.6737], + [36.8273, 0.0172, 13.5324], + [39.7594, 0.0121, 13.7191], + [42.6721, 0.0083, 13.8687], + [45.5964, 0.0085, 13.8618], + [48.5297, 0.0084, 13.8668], + [51.4512, 0.0064, 13.9651] + ] + } }, "dispense": { - "default": [ - [0.4148, -1705.1015, 20.5455], - [0.4476, -80.633, 47.2788], - [0.5512, -1.5936, 11.9026], - [0.6027, -18.9998, 21.4972], - [0.6503, -15.8781, 19.6156], - [0.7733, 3.0612, 7.2993], - [0.8391, -5.2227, 13.7056], - [0.9736, 3.0706, 6.7467], - [1.16, -0.374, 10.1005], - [1.3964, 1.3004, 8.1582], - [1.5815, -0.4837, 10.6494], - [1.8306, 1.1464, 8.0714], - [2.0345, 0.0132, 10.1459], - [2.6221, 0.5374, 9.0794], - [2.9655, -1.7582, 15.0986], - [3.5124, 0.2754, 9.0681], - [4.6591, 1.406, 5.097], - [5.367, 0.394, 9.8123], - [6.0839, 0.3365, 10.1205], - [6.8312, 0.3379, 10.1121], - [7.5676, 0.2611, 10.637], - [8.2397, 0.095, 11.8939], - [8.9776, 0.2015, 11.0165], - [10.413, 0.1332, 11.6294], - [11.8539, 0.1074, 11.8979], - [13.3655, 0.1286, 11.6464], - [14.8236, 0.0758, 12.3519], - [16.3203, 0.083, 12.2457], - [17.7915, 0.0581, 12.6515], - [19.2145, 0.0273, 13.1995], - [20.6718, 0.0388, 12.9792], - [22.1333, 0.0357, 13.044], - [25.0761, 0.0332, 13.0977], - [28.0339, 0.029, 13.2035], - [30.967, 0.0201, 13.4538], - [33.8727, 0.013, 13.6737], - [36.8273, 0.0172, 13.5324], - [39.7594, 0.0121, 13.7191], - [42.6721, 0.0083, 13.8687], - [45.5964, 0.0085, 13.8618], - [48.5297, 0.0084, 13.8668], - [51.4512, 0.0064, 13.9651] - ] + "default": { + "1": [ + [0.4148, -1705.1015, 20.5455], + [0.4476, -80.633, 47.2788], + [0.5512, -1.5936, 11.9026], + [0.6027, -18.9998, 21.4972], + [0.6503, -15.8781, 19.6156], + [0.7733, 3.0612, 7.2993], + [0.8391, -5.2227, 13.7056], + [0.9736, 3.0706, 6.7467], + [1.16, -0.374, 10.1005], + [1.3964, 1.3004, 8.1582], + [1.5815, -0.4837, 10.6494], + [1.8306, 1.1464, 8.0714], + [2.0345, 0.0132, 10.1459], + [2.6221, 0.5374, 9.0794], + [2.9655, -1.7582, 15.0986], + [3.5124, 0.2754, 9.0681], + [4.6591, 1.406, 5.097], + [5.367, 0.394, 9.8123], + [6.0839, 0.3365, 10.1205], + [6.8312, 0.3379, 10.1121], + [7.5676, 0.2611, 10.637], + [8.2397, 0.095, 11.8939], + [8.9776, 0.2015, 11.0165], + [10.413, 0.1332, 11.6294], + [11.8539, 0.1074, 11.8979], + [13.3655, 0.1286, 11.6464], + [14.8236, 0.0758, 12.3519], + [16.3203, 0.083, 12.2457], + [17.7915, 0.0581, 12.6515], + [19.2145, 0.0273, 13.1995], + [20.6718, 0.0388, 12.9792], + [22.1333, 0.0357, 13.044], + [25.0761, 0.0332, 13.0977], + [28.0339, 0.029, 13.2035], + [30.967, 0.0201, 13.4538], + [33.8727, 0.013, 13.6737], + [36.8273, 0.0172, 13.5324], + [39.7594, 0.0121, 13.7191], + [42.6721, 0.0083, 13.8687], + [45.5964, 0.0085, 13.8618], + [48.5297, 0.0084, 13.8668], + [51.4512, 0.0064, 13.9651] + ] + } }, "defaultBlowoutVolume": 3.2 }, "t200": { - "defaultAspirateFlowRate": 80, - "defaultDispenseFlowRate": 80, - "defaultBlowOutFlowRate": 80, + "defaultAspirateFlowRate": { + "default": 80, + "valuesByApiLevel": { + "2.14": 80 + } + }, + "defaultDispenseFlowRate": { + "default": 80, + "valuesByApiLevel": { + "2.14": 80 + } + }, + "defaultBlowOutFlowRate": { + "default": 80, + "valuesByApiLevel": { + "2.14": 80 + } + }, "defaultTipLength": 58.35, - "defaultTipOverlap": 10.5, "defaultReturnTipHeight": 0.71, "aspirate": { - "default": [ - [0.8314, -2.9322, 24.0741], - [0.8853, -30.0996, 48.7784], - [0.9778, -4.3627, 25.9941], - [0.975, 802.2301, -762.6744], - [1.1272, -4.6837, 24.0666], - [1.2747, -3.91, 23.1945], - [1.5656, -2.8032, 21.7836], - [1.6667, -7.2039, 28.6731], - [2.4403, -0.5147, 17.5244], - [3.0564, -1.6013, 20.1761], - [3.6444, -1.1974, 18.9418], - [4.1189, -1.7877, 21.0928], - [4.6467, -0.8591, 17.2684], - [5.2597, -0.207, 14.2379], - [5.8581, -0.2196, 14.3044], - [6.4772, -0.1025, 13.6183], - [7.8158, 0.0537, 12.6063], - [9.1664, 0.0507, 12.6302], - [10.5064, 0.0285, 12.8339], - [14.8361, 0.0818, 12.273], - [19.3933, 0.0801, 12.2991], - [23.9242, 0.0487, 12.9079], - [28.4922, 0.0379, 13.1666], - [36.145, 0.0277, 13.4572], - [43.7972, 0.0184, 13.7916], - [51.5125, 0.0154, 13.9248], - [59.2467, 0.0121, 14.0931], - [66.9428, 0.0084, 14.3151], - [74.6853, 0.0079, 14.3498], - [82.3722, 0.0052, 14.5512], - [90.1106, 0.0054, 14.5333], - [97.8369, 0.0043, 14.6288], - [105.6153, 0.0046, 14.5983], - [113.3686, 0.0036, 14.7076], - [121.1108, 0.003, 14.7785], - [136.61, 0.0026, 14.826], - [152.0708, 0.0018, 14.9298], - [167.6433, 0.0021, 14.8827], - [183.1011, 0.0012, 15.0438], - [198.5845, 0.0011, 15.0538], - [214.0264, 0.0008, 15.123] - ] + "default": { + "1": [ + [0.8314, -2.9322, 24.0741], + [0.8853, -30.0996, 48.7784], + [0.9778, -4.3627, 25.9941], + [0.975, 802.2301, -762.6744], + [1.1272, -4.6837, 24.0666], + [1.2747, -3.91, 23.1945], + [1.5656, -2.8032, 21.7836], + [1.6667, -7.2039, 28.6731], + [2.4403, -0.5147, 17.5244], + [3.0564, -1.6013, 20.1761], + [3.6444, -1.1974, 18.9418], + [4.1189, -1.7877, 21.0928], + [4.6467, -0.8591, 17.2684], + [5.2597, -0.207, 14.2379], + [5.8581, -0.2196, 14.3044], + [6.4772, -0.1025, 13.6183], + [7.8158, 0.0537, 12.6063], + [9.1664, 0.0507, 12.6302], + [10.5064, 0.0285, 12.8339], + [14.8361, 0.0818, 12.273], + [19.3933, 0.0801, 12.2991], + [23.9242, 0.0487, 12.9079], + [28.4922, 0.0379, 13.1666], + [36.145, 0.0277, 13.4572], + [43.7972, 0.0184, 13.7916], + [51.5125, 0.0154, 13.9248], + [59.2467, 0.0121, 14.0931], + [66.9428, 0.0084, 14.3151], + [74.6853, 0.0079, 14.3498], + [82.3722, 0.0052, 14.5512], + [90.1106, 0.0054, 14.5333], + [97.8369, 0.0043, 14.6288], + [105.6153, 0.0046, 14.5983], + [113.3686, 0.0036, 14.7076], + [121.1108, 0.003, 14.7785], + [136.61, 0.0026, 14.826], + [152.0708, 0.0018, 14.9298], + [167.6433, 0.0021, 14.8827], + [183.1011, 0.0012, 15.0438], + [198.5845, 0.0011, 15.0538], + [214.0264, 0.0008, 15.123] + ] + } }, "dispense": { - "default": [ - [0.8314, -2.9322, 24.0741], - [0.8853, -30.0996, 48.7784], - [0.9778, -4.3627, 25.9941], - [0.975, 802.2301, -762.6744], - [1.1272, -4.6837, 24.0666], - [1.2747, -3.91, 23.1945], - [1.5656, -2.8032, 21.7836], - [1.6667, -7.2039, 28.6731], - [2.4403, -0.5147, 17.5244], - [3.0564, -1.6013, 20.1761], - [3.6444, -1.1974, 18.9418], - [4.1189, -1.7877, 21.0928], - [4.6467, -0.8591, 17.2684], - [5.2597, -0.207, 14.2379], - [5.8581, -0.2196, 14.3044], - [6.4772, -0.1025, 13.6183], - [7.8158, 0.0537, 12.6063], - [9.1664, 0.0507, 12.6302], - [10.5064, 0.0285, 12.8339], - [14.8361, 0.0818, 12.273], - [19.3933, 0.0801, 12.2991], - [23.9242, 0.0487, 12.9079], - [28.4922, 0.0379, 13.1666], - [36.145, 0.0277, 13.4572], - [43.7972, 0.0184, 13.7916], - [51.5125, 0.0154, 13.9248], - [59.2467, 0.0121, 14.0931], - [66.9428, 0.0084, 14.3151], - [74.6853, 0.0079, 14.3498], - [82.3722, 0.0052, 14.5512], - [90.1106, 0.0054, 14.5333], - [97.8369, 0.0043, 14.6288], - [105.6153, 0.0046, 14.5983], - [113.3686, 0.0036, 14.7076], - [121.1108, 0.003, 14.7785], - [136.61, 0.0026, 14.826], - [152.0708, 0.0018, 14.9298], - [167.6433, 0.0021, 14.8827], - [183.1011, 0.0012, 15.0438], - [198.5845, 0.0011, 15.0538], - [214.0264, 0.0008, 15.123] - ] + "default": { + "1": [ + [0.8314, -2.9322, 24.0741], + [0.8853, -30.0996, 48.7784], + [0.9778, -4.3627, 25.9941], + [0.975, 802.2301, -762.6744], + [1.1272, -4.6837, 24.0666], + [1.2747, -3.91, 23.1945], + [1.5656, -2.8032, 21.7836], + [1.6667, -7.2039, 28.6731], + [2.4403, -0.5147, 17.5244], + [3.0564, -1.6013, 20.1761], + [3.6444, -1.1974, 18.9418], + [4.1189, -1.7877, 21.0928], + [4.6467, -0.8591, 17.2684], + [5.2597, -0.207, 14.2379], + [5.8581, -0.2196, 14.3044], + [6.4772, -0.1025, 13.6183], + [7.8158, 0.0537, 12.6063], + [9.1664, 0.0507, 12.6302], + [10.5064, 0.0285, 12.8339], + [14.8361, 0.0818, 12.273], + [19.3933, 0.0801, 12.2991], + [23.9242, 0.0487, 12.9079], + [28.4922, 0.0379, 13.1666], + [36.145, 0.0277, 13.4572], + [43.7972, 0.0184, 13.7916], + [51.5125, 0.0154, 13.9248], + [59.2467, 0.0121, 14.0931], + [66.9428, 0.0084, 14.3151], + [74.6853, 0.0079, 14.3498], + [82.3722, 0.0052, 14.5512], + [90.1106, 0.0054, 14.5333], + [97.8369, 0.0043, 14.6288], + [105.6153, 0.0046, 14.5983], + [113.3686, 0.0036, 14.7076], + [121.1108, 0.003, 14.7785], + [136.61, 0.0026, 14.826], + [152.0708, 0.0018, 14.9298], + [167.6433, 0.0021, 14.8827], + [183.1011, 0.0012, 15.0438], + [198.5845, 0.0011, 15.0538], + [214.0264, 0.0008, 15.123] + ] + } }, "defaultBlowoutVolume": 16 }, "t1000": { - "defaultAspirateFlowRate": 160, - "defaultDispenseFlowRate": 160, - "defaultBlowOutFlowRate": 80, + "defaultAspirateFlowRate": { + "default": 160, + "valuesByApiLevel": { + "2.14": 160 + } + }, + "defaultDispenseFlowRate": { + "default": 160, + "valuesByApiLevel": { + "2.14": 160 + } + }, + "defaultBlowOutFlowRate": { + "default": 80, + "valuesByApiLevel": { + "2.14": 80 + } + }, "defaultTipLength": 95.6, - "defaultTipOverlap": 10.5, "defaultReturnTipHeight": 0.82, "aspirate": { - "default": [ - [0.7511, 3.9556, 6.455], - [1.3075, 2.1664, 5.8839], - [1.8737, 1.1513, 7.2111], - [3.177, 0.9374, 7.612], - [4.5368, 0.5531, 8.8328], - [7.3103, 0.3035, 9.9651], - [10.0825, 0.1513, 11.0781], - [12.9776, 0.1293, 11.2991], - [15.9173, 0.0976, 11.7115], - [18.8243, 0.0624, 12.2706], - [21.8529, 0.07, 12.1275], - [24.8068, 0.0418, 12.7442], - [27.7744, 0.0356, 12.8984], - [35.2873, 0.0303, 13.0454], - [42.7989, 0.0202, 13.4038], - [50.4562, 0.0196, 13.4293], - [58.1081, 0.0145, 13.6843], - [65.7267, 0.0104, 13.9252], - [73.2857, 0.0068, 14.1606], - [81.0016, 0.0091, 13.9883], - [88.6617, 0.0064, 14.2052], - [103.9829, 0.0051, 14.3271], - [119.4408, 0.0049, 14.3475], - [134.889, 0.0037, 14.485], - [150.273, 0.0026, 14.6402], - [181.2798, 0.0026, 14.6427], - [212.4724, 0.0022, 14.7002], - [243.577, 0.0015, 14.8558], - [274.7216, 0.0012, 14.9205], - [305.8132, 0.0009, 15.0118], - [368.0697, 0.0007, 15.0668], - [430.2513, 0.0005, 15.1594], - [492.3487, 0.0003, 15.2291], - [554.5713, 0.0003, 15.2367], - [616.6825, 0.0002, 15.2949], - [694.4168, 0.0002, 15.3027], - [772.0327, 0.0001, 15.3494], - [849.617, 0.0001, 15.3717], - [927.2556, 0.0001, 15.3745], - [1004.87, 0.0001, 15.3912], - [1051.4648, 0.0001, 15.391] - ] + "default": { + "1": [ + [0.7511, 3.9556, 6.455], + [1.3075, 2.1664, 5.8839], + [1.8737, 1.1513, 7.2111], + [3.177, 0.9374, 7.612], + [4.5368, 0.5531, 8.8328], + [7.3103, 0.3035, 9.9651], + [10.0825, 0.1513, 11.0781], + [12.9776, 0.1293, 11.2991], + [15.9173, 0.0976, 11.7115], + [18.8243, 0.0624, 12.2706], + [21.8529, 0.07, 12.1275], + [24.8068, 0.0418, 12.7442], + [27.7744, 0.0356, 12.8984], + [35.2873, 0.0303, 13.0454], + [42.7989, 0.0202, 13.4038], + [50.4562, 0.0196, 13.4293], + [58.1081, 0.0145, 13.6843], + [65.7267, 0.0104, 13.9252], + [73.2857, 0.0068, 14.1606], + [81.0016, 0.0091, 13.9883], + [88.6617, 0.0064, 14.2052], + [103.9829, 0.0051, 14.3271], + [119.4408, 0.0049, 14.3475], + [134.889, 0.0037, 14.485], + [150.273, 0.0026, 14.6402], + [181.2798, 0.0026, 14.6427], + [212.4724, 0.0022, 14.7002], + [243.577, 0.0015, 14.8558], + [274.7216, 0.0012, 14.9205], + [305.8132, 0.0009, 15.0118], + [368.0697, 0.0007, 15.0668], + [430.2513, 0.0005, 15.1594], + [492.3487, 0.0003, 15.2291], + [554.5713, 0.0003, 15.2367], + [616.6825, 0.0002, 15.2949], + [694.4168, 0.0002, 15.3027], + [772.0327, 0.0001, 15.3494], + [849.617, 0.0001, 15.3717], + [927.2556, 0.0001, 15.3745], + [1004.87, 0.0001, 15.3912], + [1051.4648, 0.0001, 15.391] + ] + } }, "dispense": { - "default": [ - [0.7511, 3.9556, 6.455], - [1.3075, 2.1664, 5.8839], - [1.8737, 1.1513, 7.2111], - [3.177, 0.9374, 7.612], - [4.5368, 0.5531, 8.8328], - [7.3103, 0.3035, 9.9651], - [10.0825, 0.1513, 11.0781], - [12.9776, 0.1293, 11.2991], - [15.9173, 0.0976, 11.7115], - [18.8243, 0.0624, 12.2706], - [21.8529, 0.07, 12.1275], - [24.8068, 0.0418, 12.7442], - [27.7744, 0.0356, 12.8984], - [35.2873, 0.0303, 13.0454], - [42.7989, 0.0202, 13.4038], - [50.4562, 0.0196, 13.4293], - [58.1081, 0.0145, 13.6843], - [65.7267, 0.0104, 13.9252], - [73.2857, 0.0068, 14.1606], - [81.0016, 0.0091, 13.9883], - [88.6617, 0.0064, 14.2052], - [103.9829, 0.0051, 14.3271], - [119.4408, 0.0049, 14.3475], - [134.889, 0.0037, 14.485], - [150.273, 0.0026, 14.6402], - [181.2798, 0.0026, 14.6427], - [212.4724, 0.0022, 14.7002], - [243.577, 0.0015, 14.8558], - [274.7216, 0.0012, 14.9205], - [305.8132, 0.0009, 15.0118], - [368.0697, 0.0007, 15.0668], - [430.2513, 0.0005, 15.1594], - [492.3487, 0.0003, 15.2291], - [554.5713, 0.0003, 15.2367], - [616.6825, 0.0002, 15.2949], - [694.4168, 0.0002, 15.3027], - [772.0327, 0.0001, 15.3494], - [849.617, 0.0001, 15.3717], - [927.2556, 0.0001, 15.3745], - [1004.87, 0.0001, 15.3912], - [1051.4648, 0.0001, 15.391] - ] + "default": { + "1": [ + [0.7511, 3.9556, 6.455], + [1.3075, 2.1664, 5.8839], + [1.8737, 1.1513, 7.2111], + [3.177, 0.9374, 7.612], + [4.5368, 0.5531, 8.8328], + [7.3103, 0.3035, 9.9651], + [10.0825, 0.1513, 11.0781], + [12.9776, 0.1293, 11.2991], + [15.9173, 0.0976, 11.7115], + [18.8243, 0.0624, 12.2706], + [21.8529, 0.07, 12.1275], + [24.8068, 0.0418, 12.7442], + [27.7744, 0.0356, 12.8984], + [35.2873, 0.0303, 13.0454], + [42.7989, 0.0202, 13.4038], + [50.4562, 0.0196, 13.4293], + [58.1081, 0.0145, 13.6843], + [65.7267, 0.0104, 13.9252], + [73.2857, 0.0068, 14.1606], + [81.0016, 0.0091, 13.9883], + [88.6617, 0.0064, 14.2052], + [103.9829, 0.0051, 14.3271], + [119.4408, 0.0049, 14.3475], + [134.889, 0.0037, 14.485], + [150.273, 0.0026, 14.6402], + [181.2798, 0.0026, 14.6427], + [212.4724, 0.0022, 14.7002], + [243.577, 0.0015, 14.8558], + [274.7216, 0.0012, 14.9205], + [305.8132, 0.0009, 15.0118], + [368.0697, 0.0007, 15.0668], + [430.2513, 0.0005, 15.1594], + [492.3487, 0.0003, 15.2291], + [554.5713, 0.0003, 15.2367], + [616.6825, 0.0002, 15.2949], + [694.4168, 0.0002, 15.3027], + [772.0327, 0.0001, 15.3494], + [849.617, 0.0001, 15.3717], + [927.2556, 0.0001, 15.3745], + [1004.87, 0.0001, 15.3912], + [1051.4648, 0.0001, 15.391] + ] + } }, "defaultBlowoutVolume": 16 } }, + "defaultTipOverlapDictionary": { + "default": 10.5, + "opentrons/opentrons_flex_96_tiprack_1000ul/1": 10.5, + "opentrons/opentrons_flex_96_tiprack_200ul/1": 10.5, + "opentrons/opentrons_flex_96_tiprack_50ul/1": 10.5 + }, "maxVolume": 1000, "minVolume": 1, "defaultTipracks": [ diff --git a/shared-data/pipette/definitions/2/liquid/single_channel/p1000/3_4.json b/shared-data/pipette/definitions/2/liquid/single_channel/p1000/3_4.json index cb030498c58..5c2a3efa175 100644 --- a/shared-data/pipette/definitions/2/liquid/single_channel/p1000/3_4.json +++ b/shared-data/pipette/definitions/2/liquid/single_channel/p1000/3_4.json @@ -2,231 +2,291 @@ "$otSharedSchema": "#/pipette/schemas/2/pipetteLiquidPropertiesSchema.json", "supportedTips": { "t50": { - "defaultAspirateFlowRate": 478, - "defaultDispenseFlowRate": 160, - "defaultBlowOutFlowRate": 160, + "defaultAspirateFlowRate": { + "default": 478, + "valuesByApiLevel": { + "2.14": 478 + } + }, + "defaultDispenseFlowRate": { + "default": 160, + "valuesByApiLevel": { + "2.14": 160 + } + }, + "defaultBlowOutFlowRate": { + "default": 160, + "valuesByApiLevel": { + "2.14": 160 + } + }, "defaultTipLength": 57.9, - "defaultTipOverlap": 10.5, "defaultReturnTipHeight": 0.71, "aspirate": { - "default": [ - [0.0671, 16.2577, -0.617], - [0.36, 6.1069, 0.0646], - [0.7471, 4.962, 0.4767], - [1.1486, 3.7975, 1.3468], - [1.5557, 2.86, 2.4236], - [1.9671, 2.1173, 3.5789], - [2.4, 1.4901, 4.8128], - [2.8571, 1.1013, 5.746], - [3.0371, -2.7328, 16.7006], - [4.2257, 1.6852, 3.2826], - [5.1343, 0.9119, 6.5502], - [5.9643, 0.4559, 8.8912], - [6.9471, 0.4195, 9.1086], - [7.9814, 0.2568, 10.2388], - [9.15, 0.2013, 10.6818], - [10.4614, 0.1648, 11.0153], - [11.91, 0.1068, 11.6225], - [13.5886, 0.1165, 11.507], - [15.4914, 0.0933, 11.8218], - [17.5329, 0.0427, 12.6065], - [19.9186, 0.0575, 12.3467], - [22.6129, 0.0486, 12.5247], - [25.6157, 0.033, 12.8773], - [29.0243, 0.0314, 12.9164], - [32.8643, 0.0256, 13.0874], - [37.1857, 0.0202, 13.2621], - [41.99, 0.0124, 13.5525], - [47.4957, 0.0149, 13.4474], - [53.6686, 0.0113, 13.6208] - ] + "default": { + "1": [ + [0.0671, 16.2577, -0.617], + [0.36, 6.1069, 0.0646], + [0.7471, 4.962, 0.4767], + [1.1486, 3.7975, 1.3468], + [1.5557, 2.86, 2.4236], + [1.9671, 2.1173, 3.5789], + [2.4, 1.4901, 4.8128], + [2.8571, 1.1013, 5.746], + [3.0371, -2.7328, 16.7006], + [4.2257, 1.6852, 3.2826], + [5.1343, 0.9119, 6.5502], + [5.9643, 0.4559, 8.8912], + [6.9471, 0.4195, 9.1086], + [7.9814, 0.2568, 10.2388], + [9.15, 0.2013, 10.6818], + [10.4614, 0.1648, 11.0153], + [11.91, 0.1068, 11.6225], + [13.5886, 0.1165, 11.507], + [15.4914, 0.0933, 11.8218], + [17.5329, 0.0427, 12.6065], + [19.9186, 0.0575, 12.3467], + [22.6129, 0.0486, 12.5247], + [25.6157, 0.033, 12.8773], + [29.0243, 0.0314, 12.9164], + [32.8643, 0.0256, 13.0874], + [37.1857, 0.0202, 13.2621], + [41.99, 0.0124, 13.5525], + [47.4957, 0.0149, 13.4474], + [53.6686, 0.0113, 13.6208] + ] + } }, "dispense": { - "default": [ - [0.0671, 16.2577, -0.617], - [0.36, 6.1069, 0.0646], - [0.7471, 4.962, 0.4767], - [1.1486, 3.7975, 1.3468], - [1.5557, 2.86, 2.4236], - [1.9671, 2.1173, 3.5789], - [2.4, 1.4901, 4.8128], - [2.8571, 1.1013, 5.746], - [3.0371, -2.7328, 16.7006], - [4.2257, 1.6852, 3.2826], - [5.1343, 0.9119, 6.5502], - [5.9643, 0.4559, 8.8912], - [6.9471, 0.4195, 9.1086], - [7.9814, 0.2568, 10.2388], - [9.15, 0.2013, 10.6818], - [10.4614, 0.1648, 11.0153], - [11.91, 0.1068, 11.6225], - [13.5886, 0.1165, 11.507], - [15.4914, 0.0933, 11.8218], - [17.5329, 0.0427, 12.6065], - [19.9186, 0.0575, 12.3467], - [22.6129, 0.0486, 12.5247], - [25.6157, 0.033, 12.8773], - [29.0243, 0.0314, 12.9164], - [32.8643, 0.0256, 13.0874], - [37.1857, 0.0202, 13.2621], - [41.99, 0.0124, 13.5525], - [47.4957, 0.0149, 13.4474], - [53.6686, 0.0113, 13.6208] - ] + "default": { + "1": [ + [0.0671, 16.2577, -0.617], + [0.36, 6.1069, 0.0646], + [0.7471, 4.962, 0.4767], + [1.1486, 3.7975, 1.3468], + [1.5557, 2.86, 2.4236], + [1.9671, 2.1173, 3.5789], + [2.4, 1.4901, 4.8128], + [2.8571, 1.1013, 5.746], + [3.0371, -2.7328, 16.7006], + [4.2257, 1.6852, 3.2826], + [5.1343, 0.9119, 6.5502], + [5.9643, 0.4559, 8.8912], + [6.9471, 0.4195, 9.1086], + [7.9814, 0.2568, 10.2388], + [9.15, 0.2013, 10.6818], + [10.4614, 0.1648, 11.0153], + [11.91, 0.1068, 11.6225], + [13.5886, 0.1165, 11.507], + [15.4914, 0.0933, 11.8218], + [17.5329, 0.0427, 12.6065], + [19.9186, 0.0575, 12.3467], + [22.6129, 0.0486, 12.5247], + [25.6157, 0.033, 12.8773], + [29.0243, 0.0314, 12.9164], + [32.8643, 0.0256, 13.0874], + [37.1857, 0.0202, 13.2621], + [41.99, 0.0124, 13.5525], + [47.4957, 0.0149, 13.4474], + [53.6686, 0.0113, 13.6208] + ] + } }, "defaultBlowoutVolume": 3.2 }, "t200": { - "defaultAspirateFlowRate": 716, - "defaultDispenseFlowRate": 160, - "defaultBlowOutFlowRate": 160, + "defaultAspirateFlowRate": { + "default": 716, + "valuesByApiLevel": { + "2.14": 716 + } + }, + "defaultDispenseFlowRate": { + "default": 160, + "valuesByApiLevel": { + "2.14": 160 + } + }, + "defaultBlowOutFlowRate": { + "default": 160, + "valuesByApiLevel": { + "2.14": 160 + } + }, "defaultTipLength": 58.35, - "defaultTipOverlap": 10.5, "defaultReturnTipHeight": 0.71, "aspirate": { - "default": [ - [0.1983, -15.5377, 4.4239], - [0.2467, 1.5308, 1.0387], - [0.285, -0.563, 1.5551], - [1.395, 3.9759, 0.2615], - [2.22, 2.4705, 2.3617], - [3.01, 1.5233, 4.4644], - [3.975, 1.1548, 5.5735], - [4.99, 0.6825, 7.4508], - [6.2033, 0.5072, 8.326], - [7.6183, 0.3622, 9.2251], - [9.3183, 0.2822, 9.8345], - [11.305, 0.1951, 10.6468], - [13.575, 0.1202, 11.4935], - [16.2267, 0.0827, 12.0016], - [19.4583, 0.0802, 12.0431], - [23.33, 0.0692, 12.2572], - [27.765, 0.0373, 13.0009], - [33.1483, 0.0402, 12.9213], - [39.3683, 0.0227, 13.5002], - [46.82, 0.022, 13.5259], - [55.5967, 0.0159, 13.8114], - [65.8433, 0.0103, 14.1256], - [77.925, 0.0078, 14.2893], - [92.1383, 0.0057, 14.4522], - [108.7467, 0.0033, 14.6725], - [128.425, 0.0033, 14.6798], - [151.605, 0.0025, 14.7791], - [178.705, 0.0013, 14.953], - [210.66, 0.0012, 14.9867] - ] + "default": { + "1": [ + [0.1983, -15.5377, 4.4239], + [0.2467, 1.5308, 1.0387], + [0.285, -0.563, 1.5551], + [1.395, 3.9759, 0.2615], + [2.22, 2.4705, 2.3617], + [3.01, 1.5233, 4.4644], + [3.975, 1.1548, 5.5735], + [4.99, 0.6825, 7.4508], + [6.2033, 0.5072, 8.326], + [7.6183, 0.3622, 9.2251], + [9.3183, 0.2822, 9.8345], + [11.305, 0.1951, 10.6468], + [13.575, 0.1202, 11.4935], + [16.2267, 0.0827, 12.0016], + [19.4583, 0.0802, 12.0431], + [23.33, 0.0692, 12.2572], + [27.765, 0.0373, 13.0009], + [33.1483, 0.0402, 12.9213], + [39.3683, 0.0227, 13.5002], + [46.82, 0.022, 13.5259], + [55.5967, 0.0159, 13.8114], + [65.8433, 0.0103, 14.1256], + [77.925, 0.0078, 14.2893], + [92.1383, 0.0057, 14.4522], + [108.7467, 0.0033, 14.6725], + [128.425, 0.0033, 14.6798], + [151.605, 0.0025, 14.7791], + [178.705, 0.0013, 14.953], + [210.66, 0.0012, 14.9867] + ] + } }, "dispense": { - "default": [ - [0.1983, -15.5377, 4.4239], - [0.2467, 1.5308, 1.0387], - [0.285, -0.563, 1.5551], - [1.395, 3.9759, 0.2615], - [2.22, 2.4705, 2.3617], - [3.01, 1.5233, 4.4644], - [3.975, 1.1548, 5.5735], - [4.99, 0.6825, 7.4508], - [6.2033, 0.5072, 8.326], - [7.6183, 0.3622, 9.2251], - [9.3183, 0.2822, 9.8345], - [11.305, 0.1951, 10.6468], - [13.575, 0.1202, 11.4935], - [16.2267, 0.0827, 12.0016], - [19.4583, 0.0802, 12.0431], - [23.33, 0.0692, 12.2572], - [27.765, 0.0373, 13.0009], - [33.1483, 0.0402, 12.9213], - [39.3683, 0.0227, 13.5002], - [46.82, 0.022, 13.5259], - [55.5967, 0.0159, 13.8114], - [65.8433, 0.0103, 14.1256], - [77.925, 0.0078, 14.2893], - [92.1383, 0.0057, 14.4522], - [108.7467, 0.0033, 14.6725], - [128.425, 0.0033, 14.6798], - [151.605, 0.0025, 14.7791], - [178.705, 0.0013, 14.953], - [210.66, 0.0012, 14.9867] - ] + "default": { + "1": [ + [0.1983, -15.5377, 4.4239], + [0.2467, 1.5308, 1.0387], + [0.285, -0.563, 1.5551], + [1.395, 3.9759, 0.2615], + [2.22, 2.4705, 2.3617], + [3.01, 1.5233, 4.4644], + [3.975, 1.1548, 5.5735], + [4.99, 0.6825, 7.4508], + [6.2033, 0.5072, 8.326], + [7.6183, 0.3622, 9.2251], + [9.3183, 0.2822, 9.8345], + [11.305, 0.1951, 10.6468], + [13.575, 0.1202, 11.4935], + [16.2267, 0.0827, 12.0016], + [19.4583, 0.0802, 12.0431], + [23.33, 0.0692, 12.2572], + [27.765, 0.0373, 13.0009], + [33.1483, 0.0402, 12.9213], + [39.3683, 0.0227, 13.5002], + [46.82, 0.022, 13.5259], + [55.5967, 0.0159, 13.8114], + [65.8433, 0.0103, 14.1256], + [77.925, 0.0078, 14.2893], + [92.1383, 0.0057, 14.4522], + [108.7467, 0.0033, 14.6725], + [128.425, 0.0033, 14.6798], + [151.605, 0.0025, 14.7791], + [178.705, 0.0013, 14.953], + [210.66, 0.0012, 14.9867] + ] + } }, "defaultBlowoutVolume": 16 }, "t1000": { - "defaultAspirateFlowRate": 716, - "defaultDispenseFlowRate": 160, - "defaultBlowOutFlowRate": 160, + "defaultAspirateFlowRate": { + "default": 716, + "valuesByApiLevel": { + "2.14": 716 + } + }, + "defaultDispenseFlowRate": { + "default": 160, + "valuesByApiLevel": { + "2.14": 160 + } + }, + "defaultBlowOutFlowRate": { + "default": 160, + "valuesByApiLevel": { + "2.14": 160 + } + }, "defaultTipLength": 95.6, - "defaultTipOverlap": 10.5, "defaultReturnTipHeight": 0.82, "aspirate": { - "default": [ - [4.1286, 0.3769, 9.3332], - [5.0986, 0.2729, 9.7625], - [6.3586, 0.2994, 9.6274], - [7.7614, 0.1049, 10.8643], - [9.7671, 0.2566, 9.6866], - [12.0071, 0.1033, 11.1837], - [14.8286, 0.1073, 11.1358], - [18.2071, 0.0695, 11.6974], - [22.4171, 0.0646, 11.7851], - [27.63, 0.0566, 11.9646], - [33.8729, 0.0359, 12.5378], - [41.4414, 0.0266, 12.8514], - [50.7643, 0.0238, 12.9692], - [61.9014, 0.0144, 13.4483], - [75.2757, 0.0091, 13.7703], - [91.67, 0.0088, 13.7987], - [111.55, 0.0068, 13.981], - [135.6043, 0.005, 14.1829], - [164.4186, 0.0029, 14.468], - [199.5471, 0.0028, 14.4843], - [242.0229, 0.0021, 14.6227], - [293.0014, 0.0012, 14.8373], - [354.6614, 0.001, 14.9068], - [428.7743, 0.0005, 15.0531], - [518.0643, 0.0003, 15.1363], - [626.0157, 0.0003, 15.16], - [755.8643, 0.0002, 15.2487], - [912.3771, 0.0001, 15.2914], - [1101.4771, 0.0001, 15.2962] - ] + "default": { + "1": [ + [4.1286, 0.3769, 9.3332], + [5.0986, 0.2729, 9.7625], + [6.3586, 0.2994, 9.6274], + [7.7614, 0.1049, 10.8643], + [9.7671, 0.2566, 9.6866], + [12.0071, 0.1033, 11.1837], + [14.8286, 0.1073, 11.1358], + [18.2071, 0.0695, 11.6974], + [22.4171, 0.0646, 11.7851], + [27.63, 0.0566, 11.9646], + [33.8729, 0.0359, 12.5378], + [41.4414, 0.0266, 12.8514], + [50.7643, 0.0238, 12.9692], + [61.9014, 0.0144, 13.4483], + [75.2757, 0.0091, 13.7703], + [91.67, 0.0088, 13.7987], + [111.55, 0.0068, 13.981], + [135.6043, 0.005, 14.1829], + [164.4186, 0.0029, 14.468], + [199.5471, 0.0028, 14.4843], + [242.0229, 0.0021, 14.6227], + [293.0014, 0.0012, 14.8373], + [354.6614, 0.001, 14.9068], + [428.7743, 0.0005, 15.0531], + [518.0643, 0.0003, 15.1363], + [626.0157, 0.0003, 15.16], + [755.8643, 0.0002, 15.2487], + [912.3771, 0.0001, 15.2914], + [1101.4771, 0.0001, 15.2962] + ] + } }, "dispense": { - "default": [ - [4.1286, 0.3769, 9.3332], - [5.0986, 0.2729, 9.7625], - [6.3586, 0.2994, 9.6274], - [7.7614, 0.1049, 10.8643], - [9.7671, 0.2566, 9.6866], - [12.0071, 0.1033, 11.1837], - [14.8286, 0.1073, 11.1358], - [18.2071, 0.0695, 11.6974], - [22.4171, 0.0646, 11.7851], - [27.63, 0.0566, 11.9646], - [33.8729, 0.0359, 12.5378], - [41.4414, 0.0266, 12.8514], - [50.7643, 0.0238, 12.9692], - [61.9014, 0.0144, 13.4483], - [75.2757, 0.0091, 13.7703], - [91.67, 0.0088, 13.7987], - [111.55, 0.0068, 13.981], - [135.6043, 0.005, 14.1829], - [164.4186, 0.0029, 14.468], - [199.5471, 0.0028, 14.4843], - [242.0229, 0.0021, 14.6227], - [293.0014, 0.0012, 14.8373], - [354.6614, 0.001, 14.9068], - [428.7743, 0.0005, 15.0531], - [518.0643, 0.0003, 15.1363], - [626.0157, 0.0003, 15.16], - [755.8643, 0.0002, 15.2487], - [912.3771, 0.0001, 15.2914], - [1101.4771, 0.0001, 15.2962] - ] + "default": { + "1": [ + [4.1286, 0.3769, 9.3332], + [5.0986, 0.2729, 9.7625], + [6.3586, 0.2994, 9.6274], + [7.7614, 0.1049, 10.8643], + [9.7671, 0.2566, 9.6866], + [12.0071, 0.1033, 11.1837], + [14.8286, 0.1073, 11.1358], + [18.2071, 0.0695, 11.6974], + [22.4171, 0.0646, 11.7851], + [27.63, 0.0566, 11.9646], + [33.8729, 0.0359, 12.5378], + [41.4414, 0.0266, 12.8514], + [50.7643, 0.0238, 12.9692], + [61.9014, 0.0144, 13.4483], + [75.2757, 0.0091, 13.7703], + [91.67, 0.0088, 13.7987], + [111.55, 0.0068, 13.981], + [135.6043, 0.005, 14.1829], + [164.4186, 0.0029, 14.468], + [199.5471, 0.0028, 14.4843], + [242.0229, 0.0021, 14.6227], + [293.0014, 0.0012, 14.8373], + [354.6614, 0.001, 14.9068], + [428.7743, 0.0005, 15.0531], + [518.0643, 0.0003, 15.1363], + [626.0157, 0.0003, 15.16], + [755.8643, 0.0002, 15.2487], + [912.3771, 0.0001, 15.2914], + [1101.4771, 0.0001, 15.2962] + ] + } }, "defaultBlowoutVolume": 16 } }, + "defaultTipOverlapDictionary": { + "default": 10.5, + "opentrons/opentrons_flex_96_tiprack_1000ul/1": 10.5, + "opentrons/opentrons_flex_96_tiprack_200ul/1": 10.5, + "opentrons/opentrons_flex_96_tiprack_50ul/1": 10.5 + }, "maxVolume": 1000, "minVolume": 1, "defaultTipracks": [ diff --git a/shared-data/pipette/definitions/2/liquid/single_channel/p1000/3_5.json b/shared-data/pipette/definitions/2/liquid/single_channel/p1000/3_5.json new file mode 100644 index 00000000000..5c2a3efa175 --- /dev/null +++ b/shared-data/pipette/definitions/2/liquid/single_channel/p1000/3_5.json @@ -0,0 +1,297 @@ +{ + "$otSharedSchema": "#/pipette/schemas/2/pipetteLiquidPropertiesSchema.json", + "supportedTips": { + "t50": { + "defaultAspirateFlowRate": { + "default": 478, + "valuesByApiLevel": { + "2.14": 478 + } + }, + "defaultDispenseFlowRate": { + "default": 160, + "valuesByApiLevel": { + "2.14": 160 + } + }, + "defaultBlowOutFlowRate": { + "default": 160, + "valuesByApiLevel": { + "2.14": 160 + } + }, + "defaultTipLength": 57.9, + "defaultReturnTipHeight": 0.71, + "aspirate": { + "default": { + "1": [ + [0.0671, 16.2577, -0.617], + [0.36, 6.1069, 0.0646], + [0.7471, 4.962, 0.4767], + [1.1486, 3.7975, 1.3468], + [1.5557, 2.86, 2.4236], + [1.9671, 2.1173, 3.5789], + [2.4, 1.4901, 4.8128], + [2.8571, 1.1013, 5.746], + [3.0371, -2.7328, 16.7006], + [4.2257, 1.6852, 3.2826], + [5.1343, 0.9119, 6.5502], + [5.9643, 0.4559, 8.8912], + [6.9471, 0.4195, 9.1086], + [7.9814, 0.2568, 10.2388], + [9.15, 0.2013, 10.6818], + [10.4614, 0.1648, 11.0153], + [11.91, 0.1068, 11.6225], + [13.5886, 0.1165, 11.507], + [15.4914, 0.0933, 11.8218], + [17.5329, 0.0427, 12.6065], + [19.9186, 0.0575, 12.3467], + [22.6129, 0.0486, 12.5247], + [25.6157, 0.033, 12.8773], + [29.0243, 0.0314, 12.9164], + [32.8643, 0.0256, 13.0874], + [37.1857, 0.0202, 13.2621], + [41.99, 0.0124, 13.5525], + [47.4957, 0.0149, 13.4474], + [53.6686, 0.0113, 13.6208] + ] + } + }, + "dispense": { + "default": { + "1": [ + [0.0671, 16.2577, -0.617], + [0.36, 6.1069, 0.0646], + [0.7471, 4.962, 0.4767], + [1.1486, 3.7975, 1.3468], + [1.5557, 2.86, 2.4236], + [1.9671, 2.1173, 3.5789], + [2.4, 1.4901, 4.8128], + [2.8571, 1.1013, 5.746], + [3.0371, -2.7328, 16.7006], + [4.2257, 1.6852, 3.2826], + [5.1343, 0.9119, 6.5502], + [5.9643, 0.4559, 8.8912], + [6.9471, 0.4195, 9.1086], + [7.9814, 0.2568, 10.2388], + [9.15, 0.2013, 10.6818], + [10.4614, 0.1648, 11.0153], + [11.91, 0.1068, 11.6225], + [13.5886, 0.1165, 11.507], + [15.4914, 0.0933, 11.8218], + [17.5329, 0.0427, 12.6065], + [19.9186, 0.0575, 12.3467], + [22.6129, 0.0486, 12.5247], + [25.6157, 0.033, 12.8773], + [29.0243, 0.0314, 12.9164], + [32.8643, 0.0256, 13.0874], + [37.1857, 0.0202, 13.2621], + [41.99, 0.0124, 13.5525], + [47.4957, 0.0149, 13.4474], + [53.6686, 0.0113, 13.6208] + ] + } + }, + "defaultBlowoutVolume": 3.2 + }, + "t200": { + "defaultAspirateFlowRate": { + "default": 716, + "valuesByApiLevel": { + "2.14": 716 + } + }, + "defaultDispenseFlowRate": { + "default": 160, + "valuesByApiLevel": { + "2.14": 160 + } + }, + "defaultBlowOutFlowRate": { + "default": 160, + "valuesByApiLevel": { + "2.14": 160 + } + }, + "defaultTipLength": 58.35, + "defaultReturnTipHeight": 0.71, + "aspirate": { + "default": { + "1": [ + [0.1983, -15.5377, 4.4239], + [0.2467, 1.5308, 1.0387], + [0.285, -0.563, 1.5551], + [1.395, 3.9759, 0.2615], + [2.22, 2.4705, 2.3617], + [3.01, 1.5233, 4.4644], + [3.975, 1.1548, 5.5735], + [4.99, 0.6825, 7.4508], + [6.2033, 0.5072, 8.326], + [7.6183, 0.3622, 9.2251], + [9.3183, 0.2822, 9.8345], + [11.305, 0.1951, 10.6468], + [13.575, 0.1202, 11.4935], + [16.2267, 0.0827, 12.0016], + [19.4583, 0.0802, 12.0431], + [23.33, 0.0692, 12.2572], + [27.765, 0.0373, 13.0009], + [33.1483, 0.0402, 12.9213], + [39.3683, 0.0227, 13.5002], + [46.82, 0.022, 13.5259], + [55.5967, 0.0159, 13.8114], + [65.8433, 0.0103, 14.1256], + [77.925, 0.0078, 14.2893], + [92.1383, 0.0057, 14.4522], + [108.7467, 0.0033, 14.6725], + [128.425, 0.0033, 14.6798], + [151.605, 0.0025, 14.7791], + [178.705, 0.0013, 14.953], + [210.66, 0.0012, 14.9867] + ] + } + }, + "dispense": { + "default": { + "1": [ + [0.1983, -15.5377, 4.4239], + [0.2467, 1.5308, 1.0387], + [0.285, -0.563, 1.5551], + [1.395, 3.9759, 0.2615], + [2.22, 2.4705, 2.3617], + [3.01, 1.5233, 4.4644], + [3.975, 1.1548, 5.5735], + [4.99, 0.6825, 7.4508], + [6.2033, 0.5072, 8.326], + [7.6183, 0.3622, 9.2251], + [9.3183, 0.2822, 9.8345], + [11.305, 0.1951, 10.6468], + [13.575, 0.1202, 11.4935], + [16.2267, 0.0827, 12.0016], + [19.4583, 0.0802, 12.0431], + [23.33, 0.0692, 12.2572], + [27.765, 0.0373, 13.0009], + [33.1483, 0.0402, 12.9213], + [39.3683, 0.0227, 13.5002], + [46.82, 0.022, 13.5259], + [55.5967, 0.0159, 13.8114], + [65.8433, 0.0103, 14.1256], + [77.925, 0.0078, 14.2893], + [92.1383, 0.0057, 14.4522], + [108.7467, 0.0033, 14.6725], + [128.425, 0.0033, 14.6798], + [151.605, 0.0025, 14.7791], + [178.705, 0.0013, 14.953], + [210.66, 0.0012, 14.9867] + ] + } + }, + "defaultBlowoutVolume": 16 + }, + "t1000": { + "defaultAspirateFlowRate": { + "default": 716, + "valuesByApiLevel": { + "2.14": 716 + } + }, + "defaultDispenseFlowRate": { + "default": 160, + "valuesByApiLevel": { + "2.14": 160 + } + }, + "defaultBlowOutFlowRate": { + "default": 160, + "valuesByApiLevel": { + "2.14": 160 + } + }, + "defaultTipLength": 95.6, + "defaultReturnTipHeight": 0.82, + "aspirate": { + "default": { + "1": [ + [4.1286, 0.3769, 9.3332], + [5.0986, 0.2729, 9.7625], + [6.3586, 0.2994, 9.6274], + [7.7614, 0.1049, 10.8643], + [9.7671, 0.2566, 9.6866], + [12.0071, 0.1033, 11.1837], + [14.8286, 0.1073, 11.1358], + [18.2071, 0.0695, 11.6974], + [22.4171, 0.0646, 11.7851], + [27.63, 0.0566, 11.9646], + [33.8729, 0.0359, 12.5378], + [41.4414, 0.0266, 12.8514], + [50.7643, 0.0238, 12.9692], + [61.9014, 0.0144, 13.4483], + [75.2757, 0.0091, 13.7703], + [91.67, 0.0088, 13.7987], + [111.55, 0.0068, 13.981], + [135.6043, 0.005, 14.1829], + [164.4186, 0.0029, 14.468], + [199.5471, 0.0028, 14.4843], + [242.0229, 0.0021, 14.6227], + [293.0014, 0.0012, 14.8373], + [354.6614, 0.001, 14.9068], + [428.7743, 0.0005, 15.0531], + [518.0643, 0.0003, 15.1363], + [626.0157, 0.0003, 15.16], + [755.8643, 0.0002, 15.2487], + [912.3771, 0.0001, 15.2914], + [1101.4771, 0.0001, 15.2962] + ] + } + }, + "dispense": { + "default": { + "1": [ + [4.1286, 0.3769, 9.3332], + [5.0986, 0.2729, 9.7625], + [6.3586, 0.2994, 9.6274], + [7.7614, 0.1049, 10.8643], + [9.7671, 0.2566, 9.6866], + [12.0071, 0.1033, 11.1837], + [14.8286, 0.1073, 11.1358], + [18.2071, 0.0695, 11.6974], + [22.4171, 0.0646, 11.7851], + [27.63, 0.0566, 11.9646], + [33.8729, 0.0359, 12.5378], + [41.4414, 0.0266, 12.8514], + [50.7643, 0.0238, 12.9692], + [61.9014, 0.0144, 13.4483], + [75.2757, 0.0091, 13.7703], + [91.67, 0.0088, 13.7987], + [111.55, 0.0068, 13.981], + [135.6043, 0.005, 14.1829], + [164.4186, 0.0029, 14.468], + [199.5471, 0.0028, 14.4843], + [242.0229, 0.0021, 14.6227], + [293.0014, 0.0012, 14.8373], + [354.6614, 0.001, 14.9068], + [428.7743, 0.0005, 15.0531], + [518.0643, 0.0003, 15.1363], + [626.0157, 0.0003, 15.16], + [755.8643, 0.0002, 15.2487], + [912.3771, 0.0001, 15.2914], + [1101.4771, 0.0001, 15.2962] + ] + } + }, + "defaultBlowoutVolume": 16 + } + }, + "defaultTipOverlapDictionary": { + "default": 10.5, + "opentrons/opentrons_flex_96_tiprack_1000ul/1": 10.5, + "opentrons/opentrons_flex_96_tiprack_200ul/1": 10.5, + "opentrons/opentrons_flex_96_tiprack_50ul/1": 10.5 + }, + "maxVolume": 1000, + "minVolume": 1, + "defaultTipracks": [ + "opentrons/opentrons_flex_96_tiprack_1000ul/1", + "opentrons/opentrons_flex_96_tiprack_200ul/1", + "opentrons/opentrons_flex_96_tiprack_50ul/1" + ] +} diff --git a/shared-data/pipette/definitions/2/liquid/single_channel/p20/2_0.json b/shared-data/pipette/definitions/2/liquid/single_channel/p20/2_0.json index 66766b9889e..1703bcda8cb 100644 --- a/shared-data/pipette/definitions/2/liquid/single_channel/p20/2_0.json +++ b/shared-data/pipette/definitions/2/liquid/single_channel/p20/2_0.json @@ -2,12 +2,28 @@ "$otSharedSchema": "#/pipette/schemas/2/pipetteLiquidPropertiesSchema.json", "supportedTips": { "t20": { - "defaultAspirateFlowRate": 3.78, - "defaultDispenseFlowRate": 3.78, - "defaultBlowOutFlowRate": 3.78, + "defaultAspirateFlowRate": { + "default": 3.78, + "valuesByApiLevel": { + "2.0": 3.78, + "2.6": 7.56 + } + }, + "defaultDispenseFlowRate": { + "default": 3.78, + "valuesByApiLevel": { + "2.0": 3.78, + "2.6": 7.56 + } + }, + "defaultBlowOutFlowRate": { + "default": 3.78, + "valuesByApiLevel": { + "2.0": 3.78, + "2.6": 7.56 + } + }, "defaultTipLength": 31.15, - "defaultTipOverlap": 8.25, - "defaultReturnTipHeight": null, "aspirate": { "opentrons/opentrons_96_tiprack_20ul/1": [ [0.8425, 0.0933, 0.5892], @@ -69,36 +85,38 @@ [19.62, 0.001391, 0.7273], [21.14, 0.0003498, 0.7477] ], - "default": [ - [0.8425, 0.0933, 0.5892], - [0.9934, 0.1264, 0.4953], - [1.17, 0.1658, 0.4562], - [1.299, -0.005354, 0.6565], - [1.435, 0.02079, 0.6225], - [1.603, 0.09178, 0.5206], - [1.745, 0.02307, 0.6306], - [1.916, 0.07824, 0.5345], - [2.051, -0.004942, 0.6939], - [2.417, 0.01873, 0.6454], - [2.801, 0.0253, 0.6295], - [3.163, 0.00714, 0.6804], - [3.539, 0.01305, 0.6617], - [3.949, 0.02487, 0.6198], - [4.32, 0.005296, 0.6971], - [4.692, 0.004936, 0.6987], - [5.084, 0.01144, 0.6682], - [5.791, -0.003501, 0.7441], - [7.344, 0.00678, 0.6846], - [8.857, 0.00243, 0.7165], - [10.42, 0.003968, 0.7029], - [11.94, 0.001477, 0.7289], - [13.47, 0.001089, 0.7335], - [15.01, 0.00147, 0.7284], - [16.54, 0.0008888, 0.7371], - [18.06, 0.0003974, 0.7452], - [19.62, 0.001391, 0.7273], - [21.14, 0.0003498, 0.7477] - ] + "default": { + "1": [ + [0.8425, 0.0933, 0.5892], + [0.9934, 0.1264, 0.4953], + [1.17, 0.1658, 0.4562], + [1.299, -0.005354, 0.6565], + [1.435, 0.02079, 0.6225], + [1.603, 0.09178, 0.5206], + [1.745, 0.02307, 0.6306], + [1.916, 0.07824, 0.5345], + [2.051, -0.004942, 0.6939], + [2.417, 0.01873, 0.6454], + [2.801, 0.0253, 0.6295], + [3.163, 0.00714, 0.6804], + [3.539, 0.01305, 0.6617], + [3.949, 0.02487, 0.6198], + [4.32, 0.005296, 0.6971], + [4.692, 0.004936, 0.6987], + [5.084, 0.01144, 0.6682], + [5.791, -0.003501, 0.7441], + [7.344, 0.00678, 0.6846], + [8.857, 0.00243, 0.7165], + [10.42, 0.003968, 0.7029], + [11.94, 0.001477, 0.7289], + [13.47, 0.001089, 0.7335], + [15.01, 0.00147, 0.7284], + [16.54, 0.0008888, 0.7371], + [18.06, 0.0003974, 0.7452], + [19.62, 0.001391, 0.7273], + [21.14, 0.0003498, 0.7477] + ] + } }, "dispense": { "opentrons/opentrons_96_tiprack_20ul/1": [ @@ -161,112 +179,66 @@ [19.62, 0.001391, 0.7273], [21.14, 0.0003498, 0.7477] ], - "default": [ - [0.8425, 0.0933, 0.5892], - [0.9934, 0.1264, 0.4953], - [1.17, 0.1658, 0.4562], - [1.299, -0.005354, 0.6565], - [1.435, 0.02079, 0.6225], - [1.603, 0.09178, 0.5206], - [1.745, 0.02307, 0.6306], - [1.916, 0.07824, 0.5345], - [2.051, -0.004942, 0.6939], - [2.417, 0.01873, 0.6454], - [2.801, 0.0253, 0.6295], - [3.163, 0.00714, 0.6804], - [3.539, 0.01305, 0.6617], - [3.949, 0.02487, 0.6198], - [4.32, 0.005296, 0.6971], - [4.692, 0.004936, 0.6987], - [5.084, 0.01144, 0.6682], - [5.791, -0.003501, 0.7441], - [7.344, 0.00678, 0.6846], - [8.857, 0.00243, 0.7165], - [10.42, 0.003968, 0.7029], - [11.94, 0.001477, 0.7289], - [13.47, 0.001089, 0.7335], - [15.01, 0.00147, 0.7284], - [16.54, 0.0008888, 0.7371], - [18.06, 0.0003974, 0.7452], - [19.62, 0.001391, 0.7273], - [21.14, 0.0003498, 0.7477] - ] - }, - "defaultTipOverlapDictionary": { - "opentrons/opentrons_96_tiprack_20ul/1": 8.25, - "opentrons/opentrons_96_filtertiprack_20ul/1": 8.25 + "default": { + "1": [ + [0.8425, 0.0933, 0.5892], + [0.9934, 0.1264, 0.4953], + [1.17, 0.1658, 0.4562], + [1.299, -0.005354, 0.6565], + [1.435, 0.02079, 0.6225], + [1.603, 0.09178, 0.5206], + [1.745, 0.02307, 0.6306], + [1.916, 0.07824, 0.5345], + [2.051, -0.004942, 0.6939], + [2.417, 0.01873, 0.6454], + [2.801, 0.0253, 0.6295], + [3.163, 0.00714, 0.6804], + [3.539, 0.01305, 0.6617], + [3.949, 0.02487, 0.6198], + [4.32, 0.005296, 0.6971], + [4.692, 0.004936, 0.6987], + [5.084, 0.01144, 0.6682], + [5.791, -0.003501, 0.7441], + [7.344, 0.00678, 0.6846], + [8.857, 0.00243, 0.7165], + [10.42, 0.003968, 0.7029], + [11.94, 0.001477, 0.7289], + [13.47, 0.001089, 0.7335], + [15.01, 0.00147, 0.7284], + [16.54, 0.0008888, 0.7371], + [18.06, 0.0003974, 0.7452], + [19.62, 0.001391, 0.7273], + [21.14, 0.0003498, 0.7477] + ] + } }, "defaultBlowoutVolume": 3.534 }, "t10": { - "defaultAspirateFlowRate": 3.78, - "defaultDispenseFlowRate": 3.78, - "defaultBlowOutFlowRate": 3.78, + "defaultAspirateFlowRate": { + "default": 3.78, + "valuesByApiLevel": { + "2.0": 3.78, + "2.6": 7.56 + } + }, + "defaultDispenseFlowRate": { + "default": 3.78, + "valuesByApiLevel": { + "2.0": 3.78, + "2.6": 7.56 + } + }, + "defaultBlowOutFlowRate": { + "default": 3.78, + "valuesByApiLevel": { + "2.0": 3.78, + "2.6": 7.56 + } + }, "defaultTipLength": 31.15, - "defaultTipOverlap": 8.25, - "defaultReturnTipHeight": null, "aspirate": { - "opentrons/opentrons_96_tiprack_10ul/1": [ - [0.8425, 0.0933, 0.5892], - [0.9934, 0.1264, 0.4953], - [1.17, 0.1658, 0.4562], - [1.299, -0.005354, 0.6565], - [1.435, 0.02079, 0.6225], - [1.603, 0.09178, 0.5206], - [1.745, 0.02307, 0.6306], - [1.916, 0.07824, 0.5345], - [2.051, -0.004942, 0.6939], - [2.417, 0.01873, 0.6454], - [2.801, 0.0253, 0.6295], - [3.163, 0.00714, 0.6804], - [3.539, 0.01305, 0.6617], - [3.949, 0.02487, 0.6198], - [4.32, 0.005296, 0.6971], - [4.692, 0.004936, 0.6987], - [5.084, 0.01144, 0.6682], - [5.791, -0.003501, 0.7441], - [7.344, 0.00678, 0.6846], - [8.857, 0.00243, 0.7165], - [10.42, 0.003968, 0.7029], - [11.94, 0.001477, 0.7289], - [13.47, 0.001089, 0.7335], - [15.01, 0.00147, 0.7284], - [16.54, 0.0008888, 0.7371], - [18.06, 0.0003974, 0.7452], - [19.62, 0.001391, 0.7273], - [21.14, 0.0003498, 0.7477] - ], - "opentrons/opentrons_96_filtertiprack_10ul/1": [ - [0.8425, 0.0933, 0.5892], - [0.9934, 0.1264, 0.4953], - [1.17, 0.1658, 0.4562], - [1.299, -0.005354, 0.6565], - [1.435, 0.02079, 0.6225], - [1.603, 0.09178, 0.5206], - [1.745, 0.02307, 0.6306], - [1.916, 0.07824, 0.5345], - [2.051, -0.004942, 0.6939], - [2.417, 0.01873, 0.6454], - [2.801, 0.0253, 0.6295], - [3.163, 0.00714, 0.6804], - [3.539, 0.01305, 0.6617], - [3.949, 0.02487, 0.6198], - [4.32, 0.005296, 0.6971], - [4.692, 0.004936, 0.6987], - [5.084, 0.01144, 0.6682], - [5.791, -0.003501, 0.7441], - [7.344, 0.00678, 0.6846], - [8.857, 0.00243, 0.7165], - [10.42, 0.003968, 0.7029], - [11.94, 0.001477, 0.7289], - [13.47, 0.001089, 0.7335], - [15.01, 0.00147, 0.7284], - [16.54, 0.0008888, 0.7371], - [18.06, 0.0003974, 0.7452], - [19.62, 0.001391, 0.7273], - [21.14, 0.0003498, 0.7477] - ], - "opentrons/eppendorf_96_tiprack_10ul_eptips/1": [ + "opentrons/opentrons_96_tiprack_20ul/1": [ [0.8425, 0.0933, 0.5892], [0.9934, 0.1264, 0.4953], [1.17, 0.1658, 0.4562], @@ -296,7 +268,7 @@ [19.62, 0.001391, 0.7273], [21.14, 0.0003498, 0.7477] ], - "opentrons/geb_96_tiprack_10ul/1": [ + "opentrons/opentrons_96_filtertiprack_20ul/1": [ [0.8425, 0.0933, 0.5892], [0.9934, 0.1264, 0.4953], [1.17, 0.1658, 0.4562], @@ -326,99 +298,41 @@ [19.62, 0.001391, 0.7273], [21.14, 0.0003498, 0.7477] ], - "default": [ - [0.8425, 0.0933, 0.5892], - [0.9934, 0.1264, 0.4953], - [1.17, 0.1658, 0.4562], - [1.299, -0.005354, 0.6565], - [1.435, 0.02079, 0.6225], - [1.603, 0.09178, 0.5206], - [1.745, 0.02307, 0.6306], - [1.916, 0.07824, 0.5345], - [2.051, -0.004942, 0.6939], - [2.417, 0.01873, 0.6454], - [2.801, 0.0253, 0.6295], - [3.163, 0.00714, 0.6804], - [3.539, 0.01305, 0.6617], - [3.949, 0.02487, 0.6198], - [4.32, 0.005296, 0.6971], - [4.692, 0.004936, 0.6987], - [5.084, 0.01144, 0.6682], - [5.791, -0.003501, 0.7441], - [7.344, 0.00678, 0.6846], - [8.857, 0.00243, 0.7165], - [10.42, 0.003968, 0.7029], - [11.94, 0.001477, 0.7289], - [13.47, 0.001089, 0.7335], - [15.01, 0.00147, 0.7284], - [16.54, 0.0008888, 0.7371], - [18.06, 0.0003974, 0.7452], - [19.62, 0.001391, 0.7273], - [21.14, 0.0003498, 0.7477] - ] + "default": { + "1": [ + [0.8425, 0.0933, 0.5892], + [0.9934, 0.1264, 0.4953], + [1.17, 0.1658, 0.4562], + [1.299, -0.005354, 0.6565], + [1.435, 0.02079, 0.6225], + [1.603, 0.09178, 0.5206], + [1.745, 0.02307, 0.6306], + [1.916, 0.07824, 0.5345], + [2.051, -0.004942, 0.6939], + [2.417, 0.01873, 0.6454], + [2.801, 0.0253, 0.6295], + [3.163, 0.00714, 0.6804], + [3.539, 0.01305, 0.6617], + [3.949, 0.02487, 0.6198], + [4.32, 0.005296, 0.6971], + [4.692, 0.004936, 0.6987], + [5.084, 0.01144, 0.6682], + [5.791, -0.003501, 0.7441], + [7.344, 0.00678, 0.6846], + [8.857, 0.00243, 0.7165], + [10.42, 0.003968, 0.7029], + [11.94, 0.001477, 0.7289], + [13.47, 0.001089, 0.7335], + [15.01, 0.00147, 0.7284], + [16.54, 0.0008888, 0.7371], + [18.06, 0.0003974, 0.7452], + [19.62, 0.001391, 0.7273], + [21.14, 0.0003498, 0.7477] + ] + } }, "dispense": { - "opentrons/opentrons_96_tiprack_10ul/1": [ - [0.8425, 0.0933, 0.5892], - [0.9934, 0.1264, 0.4953], - [1.17, 0.1658, 0.4562], - [1.299, -0.005354, 0.6565], - [1.435, 0.02079, 0.6225], - [1.603, 0.09178, 0.5206], - [1.745, 0.02307, 0.6306], - [1.916, 0.07824, 0.5345], - [2.051, -0.004942, 0.6939], - [2.417, 0.01873, 0.6454], - [2.801, 0.0253, 0.6295], - [3.163, 0.00714, 0.6804], - [3.539, 0.01305, 0.6617], - [3.949, 0.02487, 0.6198], - [4.32, 0.005296, 0.6971], - [4.692, 0.004936, 0.6987], - [5.084, 0.01144, 0.6682], - [5.791, -0.003501, 0.7441], - [7.344, 0.00678, 0.6846], - [8.857, 0.00243, 0.7165], - [10.42, 0.003968, 0.7029], - [11.94, 0.001477, 0.7289], - [13.47, 0.001089, 0.7335], - [15.01, 0.00147, 0.7284], - [16.54, 0.0008888, 0.7371], - [18.06, 0.0003974, 0.7452], - [19.62, 0.001391, 0.7273], - [21.14, 0.0003498, 0.7477] - ], - "opentrons/opentrons_96_filtertiprack_10ul/1": [ - [0.8425, 0.0933, 0.5892], - [0.9934, 0.1264, 0.4953], - [1.17, 0.1658, 0.4562], - [1.299, -0.005354, 0.6565], - [1.435, 0.02079, 0.6225], - [1.603, 0.09178, 0.5206], - [1.745, 0.02307, 0.6306], - [1.916, 0.07824, 0.5345], - [2.051, -0.004942, 0.6939], - [2.417, 0.01873, 0.6454], - [2.801, 0.0253, 0.6295], - [3.163, 0.00714, 0.6804], - [3.539, 0.01305, 0.6617], - [3.949, 0.02487, 0.6198], - [4.32, 0.005296, 0.6971], - [4.692, 0.004936, 0.6987], - [5.084, 0.01144, 0.6682], - [5.791, -0.003501, 0.7441], - [7.344, 0.00678, 0.6846], - [8.857, 0.00243, 0.7165], - [10.42, 0.003968, 0.7029], - [11.94, 0.001477, 0.7289], - [13.47, 0.001089, 0.7335], - [15.01, 0.00147, 0.7284], - [16.54, 0.0008888, 0.7371], - [18.06, 0.0003974, 0.7452], - [19.62, 0.001391, 0.7273], - [21.14, 0.0003498, 0.7477] - ], - "opentrons/eppendorf_96_tiprack_10ul_eptips/1": [ + "opentrons/opentrons_96_tiprack_20ul/1": [ [0.8425, 0.0933, 0.5892], [0.9934, 0.1264, 0.4953], [1.17, 0.1658, 0.4562], @@ -448,7 +362,7 @@ [19.62, 0.001391, 0.7273], [21.14, 0.0003498, 0.7477] ], - "opentrons/geb_96_tiprack_10ul/1": [ + "opentrons/opentrons_96_filtertiprack_20ul/1": [ [0.8425, 0.0933, 0.5892], [0.9934, 0.1264, 0.4953], [1.17, 0.1658, 0.4562], @@ -478,46 +392,51 @@ [19.62, 0.001391, 0.7273], [21.14, 0.0003498, 0.7477] ], - "default": [ - [0.8425, 0.0933, 0.5892], - [0.9934, 0.1264, 0.4953], - [1.17, 0.1658, 0.4562], - [1.299, -0.005354, 0.6565], - [1.435, 0.02079, 0.6225], - [1.603, 0.09178, 0.5206], - [1.745, 0.02307, 0.6306], - [1.916, 0.07824, 0.5345], - [2.051, -0.004942, 0.6939], - [2.417, 0.01873, 0.6454], - [2.801, 0.0253, 0.6295], - [3.163, 0.00714, 0.6804], - [3.539, 0.01305, 0.6617], - [3.949, 0.02487, 0.6198], - [4.32, 0.005296, 0.6971], - [4.692, 0.004936, 0.6987], - [5.084, 0.01144, 0.6682], - [5.791, -0.003501, 0.7441], - [7.344, 0.00678, 0.6846], - [8.857, 0.00243, 0.7165], - [10.42, 0.003968, 0.7029], - [11.94, 0.001477, 0.7289], - [13.47, 0.001089, 0.7335], - [15.01, 0.00147, 0.7284], - [16.54, 0.0008888, 0.7371], - [18.06, 0.0003974, 0.7452], - [19.62, 0.001391, 0.7273], - [21.14, 0.0003498, 0.7477] - ] - }, - "defaultTipOverlapDictionary": { - "opentrons/opentrons_96_tiprack_10ul/1": 8.25, - "opentrons/opentrons_96_filtertiprack_10ul/1": 8.25, - "opentrons/eppendorf_96_tiprack_10ul_eptips/1": 8.4, - "opentrons/geb_96_tiprack_10ul/1": 8.3 + "default": { + "1": [ + [0.8425, 0.0933, 0.5892], + [0.9934, 0.1264, 0.4953], + [1.17, 0.1658, 0.4562], + [1.299, -0.005354, 0.6565], + [1.435, 0.02079, 0.6225], + [1.603, 0.09178, 0.5206], + [1.745, 0.02307, 0.6306], + [1.916, 0.07824, 0.5345], + [2.051, -0.004942, 0.6939], + [2.417, 0.01873, 0.6454], + [2.801, 0.0253, 0.6295], + [3.163, 0.00714, 0.6804], + [3.539, 0.01305, 0.6617], + [3.949, 0.02487, 0.6198], + [4.32, 0.005296, 0.6971], + [4.692, 0.004936, 0.6987], + [5.084, 0.01144, 0.6682], + [5.791, -0.003501, 0.7441], + [7.344, 0.00678, 0.6846], + [8.857, 0.00243, 0.7165], + [10.42, 0.003968, 0.7029], + [11.94, 0.001477, 0.7289], + [13.47, 0.001089, 0.7335], + [15.01, 0.00147, 0.7284], + [16.54, 0.0008888, 0.7371], + [18.06, 0.0003974, 0.7452], + [19.62, 0.001391, 0.7273], + [21.14, 0.0003498, 0.7477] + ] + } }, "defaultBlowoutVolume": 3.534 } }, + "defaultTipOverlapDictionary": { + "default": 8.25, + "opentrons/opentrons_96_tiprack_10ul/1": 8.25, + "opentrons/opentrons_96_filtertiprack_10ul/1": 8.25, + "opentrons/eppendorf_96_tiprack_10ul_eptips/1": 8.4, + "opentrons/geb_96_tiprack_10ul/1": 8.3, + "opentrons/opentrons_96_tiprack_20ul/1": 8.25, + "opentrons/opentrons_96_filtertiprack_20ul/1": 8.25 + }, "maxVolume": 20, "minVolume": 1.0, "defaultTipracks": [ diff --git a/shared-data/pipette/definitions/2/liquid/single_channel/p20/2_1.json b/shared-data/pipette/definitions/2/liquid/single_channel/p20/2_1.json index 277c6aa4be8..1c0bb6f15b7 100644 --- a/shared-data/pipette/definitions/2/liquid/single_channel/p20/2_1.json +++ b/shared-data/pipette/definitions/2/liquid/single_channel/p20/2_1.json @@ -2,12 +2,28 @@ "$otSharedSchema": "#/pipette/schemas/2/pipetteLiquidPropertiesSchema.json", "supportedTips": { "t20": { - "defaultAspirateFlowRate": 3.78, - "defaultDispenseFlowRate": 3.78, - "defaultBlowOutFlowRate": 3.78, + "defaultAspirateFlowRate": { + "default": 3.78, + "valuesByApiLevel": { + "2.0": 3.78, + "2.6": 7.56 + } + }, + "defaultDispenseFlowRate": { + "default": 3.78, + "valuesByApiLevel": { + "2.0": 3.78, + "2.6": 7.56 + } + }, + "defaultBlowOutFlowRate": { + "default": 3.78, + "valuesByApiLevel": { + "2.0": 3.78, + "2.6": 7.56 + } + }, "defaultTipLength": 31.15, - "defaultTipOverlap": 8.25, - "defaultReturnTipHeight": null, "aspirate": { "opentrons/opentrons_96_tiprack_20ul/1": [ [0.9034, 0.147, 0.6223], @@ -39,36 +55,38 @@ [19.7847, 0.001, 0.7412], [21.3395, 0.0008, 0.746] ], - "default": [ - [0.9034, 0.147, 0.6223], - [1.0379, 0.0252, 0.6226], - [1.1913, 0.0856, 0.5599], - [1.3481, 0.078, 0.569], - [1.5008, 0.0533, 0.6023], - [1.6468, 0.0272, 0.6414], - [1.7939, 0.0259, 0.6435], - [1.9416, 0.0235, 0.6479], - [2.0951, 0.0321, 0.6311], - [2.4797, 0.0263, 0.6433], - [2.8632, 0.0191, 0.6611], - [3.2394, 0.0108, 0.6849], - [3.6157, 0.0087, 0.6918], - [3.9974, 0.0096, 0.6883], - [4.3741, 0.0059, 0.7033], - [4.7578, 0.0077, 0.6954], - [5.1419, 0.0067, 0.6999], - [5.9051, 0.0047, 0.7105], - [7.4406, 0.0039, 0.7154], - [8.9842, 0.003, 0.7218], - [10.5104, 0.0014, 0.7366], - [12.0673, 0.0022, 0.7274], - [13.6096, 0.0012, 0.7395], - [15.1334, 0.0004, 0.7509], - [16.6911, 0.0013, 0.7371], - [18.2255, 0.0005, 0.751], - [19.7847, 0.001, 0.7412], - [21.3395, 0.0008, 0.746] - ] + "default": { + "1": [ + [0.9034, 0.147, 0.6223], + [1.0379, 0.0252, 0.6226], + [1.1913, 0.0856, 0.5599], + [1.3481, 0.078, 0.569], + [1.5008, 0.0533, 0.6023], + [1.6468, 0.0272, 0.6414], + [1.7939, 0.0259, 0.6435], + [1.9416, 0.0235, 0.6479], + [2.0951, 0.0321, 0.6311], + [2.4797, 0.0263, 0.6433], + [2.8632, 0.0191, 0.6611], + [3.2394, 0.0108, 0.6849], + [3.6157, 0.0087, 0.6918], + [3.9974, 0.0096, 0.6883], + [4.3741, 0.0059, 0.7033], + [4.7578, 0.0077, 0.6954], + [5.1419, 0.0067, 0.6999], + [5.9051, 0.0047, 0.7105], + [7.4406, 0.0039, 0.7154], + [8.9842, 0.003, 0.7218], + [10.5104, 0.0014, 0.7366], + [12.0673, 0.0022, 0.7274], + [13.6096, 0.0012, 0.7395], + [15.1334, 0.0004, 0.7509], + [16.6911, 0.0013, 0.7371], + [18.2255, 0.0005, 0.751], + [19.7847, 0.001, 0.7412], + [21.3395, 0.0008, 0.746] + ] + } }, "dispense": { "opentrons/opentrons_96_tiprack_20ul/1": [ @@ -101,364 +119,146 @@ [19.7847, 0.001, 0.7412], [21.3395, 0.0008, 0.746] ], - "default": [ - [0.9034, 0.147, 0.6223], - [1.0379, 0.0252, 0.6226], - [1.1913, 0.0856, 0.5599], - [1.3481, 0.078, 0.569], - [1.5008, 0.0533, 0.6023], - [1.6468, 0.0272, 0.6414], - [1.7939, 0.0259, 0.6435], - [1.9416, 0.0235, 0.6479], - [2.0951, 0.0321, 0.6311], - [2.4797, 0.0263, 0.6433], - [2.8632, 0.0191, 0.6611], - [3.2394, 0.0108, 0.6849], - [3.6157, 0.0087, 0.6918], - [3.9974, 0.0096, 0.6883], - [4.3741, 0.0059, 0.7033], - [4.7578, 0.0077, 0.6954], - [5.1419, 0.0067, 0.6999], - [5.9051, 0.0047, 0.7105], - [7.4406, 0.0039, 0.7154], - [8.9842, 0.003, 0.7218], - [10.5104, 0.0014, 0.7366], - [12.0673, 0.0022, 0.7274], - [13.6096, 0.0012, 0.7395], - [15.1334, 0.0004, 0.7509], - [16.6911, 0.0013, 0.7371], - [18.2255, 0.0005, 0.751], - [19.7847, 0.001, 0.7412], - [21.3395, 0.0008, 0.746] - ] - }, - "defaultTipOverlapDictionary": { - "opentrons/opentrons_96_tiprack_20ul/1": 8.25 + "default": { + "1": [ + [0.9034, 0.147, 0.6223], + [1.0379, 0.0252, 0.6226], + [1.1913, 0.0856, 0.5599], + [1.3481, 0.078, 0.569], + [1.5008, 0.0533, 0.6023], + [1.6468, 0.0272, 0.6414], + [1.7939, 0.0259, 0.6435], + [1.9416, 0.0235, 0.6479], + [2.0951, 0.0321, 0.6311], + [2.4797, 0.0263, 0.6433], + [2.8632, 0.0191, 0.6611], + [3.2394, 0.0108, 0.6849], + [3.6157, 0.0087, 0.6918], + [3.9974, 0.0096, 0.6883], + [4.3741, 0.0059, 0.7033], + [4.7578, 0.0077, 0.6954], + [5.1419, 0.0067, 0.6999], + [5.9051, 0.0047, 0.7105], + [7.4406, 0.0039, 0.7154], + [8.9842, 0.003, 0.7218], + [10.5104, 0.0014, 0.7366], + [12.0673, 0.0022, 0.7274], + [13.6096, 0.0012, 0.7395], + [15.1334, 0.0004, 0.7509], + [16.6911, 0.0013, 0.7371], + [18.2255, 0.0005, 0.751], + [19.7847, 0.001, 0.7412], + [21.3395, 0.0008, 0.746] + ] + } }, "defaultBlowoutVolume": 3.534 }, "t10": { - "defaultAspirateFlowRate": 3.78, - "defaultDispenseFlowRate": 3.78, - "defaultBlowOutFlowRate": 3.78, + "defaultAspirateFlowRate": { + "default": 3.78, + "valuesByApiLevel": { + "2.0": 3.78, + "2.6": 7.56 + } + }, + "defaultDispenseFlowRate": { + "default": 3.78, + "valuesByApiLevel": { + "2.0": 3.78, + "2.6": 7.56 + } + }, + "defaultBlowOutFlowRate": { + "default": 3.78, + "valuesByApiLevel": { + "2.0": 3.78, + "2.6": 7.56 + } + }, "defaultTipLength": 31.15, - "defaultTipOverlap": 8.25, - "defaultReturnTipHeight": null, "aspirate": { - "opentrons/opentrons_96_tiprack_10ul/1": [ - [0.9034, 0.147, 0.6223], - [1.0379, 0.0252, 0.6226], - [1.1913, 0.0856, 0.5599], - [1.3481, 0.078, 0.569], - [1.5008, 0.0533, 0.6023], - [1.6468, 0.0272, 0.6414], - [1.7939, 0.0259, 0.6435], - [1.9416, 0.0235, 0.6479], - [2.0951, 0.0321, 0.6311], - [2.4797, 0.0263, 0.6433], - [2.8632, 0.0191, 0.6611], - [3.2394, 0.0108, 0.6849], - [3.6157, 0.0087, 0.6918], - [3.9974, 0.0096, 0.6883], - [4.3741, 0.0059, 0.7033], - [4.7578, 0.0077, 0.6954], - [5.1419, 0.0067, 0.6999], - [5.9051, 0.0047, 0.7105], - [7.4406, 0.0039, 0.7154], - [8.9842, 0.003, 0.7218], - [10.5104, 0.0014, 0.7366], - [12.0673, 0.0022, 0.7274], - [13.6096, 0.0012, 0.7395], - [15.1334, 0.0004, 0.7509], - [16.6911, 0.0013, 0.7371], - [18.2255, 0.0005, 0.751], - [19.7847, 0.001, 0.7412], - [21.3395, 0.0008, 0.746] - ], - "opentrons/opentrons_96_filtertiprack_10ul/1": [ - [0.9034, 0.147, 0.6223], - [1.0379, 0.0252, 0.6226], - [1.1913, 0.0856, 0.5599], - [1.3481, 0.078, 0.569], - [1.5008, 0.0533, 0.6023], - [1.6468, 0.0272, 0.6414], - [1.7939, 0.0259, 0.6435], - [1.9416, 0.0235, 0.6479], - [2.0951, 0.0321, 0.6311], - [2.4797, 0.0263, 0.6433], - [2.8632, 0.0191, 0.6611], - [3.2394, 0.0108, 0.6849], - [3.6157, 0.0087, 0.6918], - [3.9974, 0.0096, 0.6883], - [4.3741, 0.0059, 0.7033], - [4.7578, 0.0077, 0.6954], - [5.1419, 0.0067, 0.6999], - [5.9051, 0.0047, 0.7105], - [7.4406, 0.0039, 0.7154], - [8.9842, 0.003, 0.7218], - [10.5104, 0.0014, 0.7366], - [12.0673, 0.0022, 0.7274], - [13.6096, 0.0012, 0.7395], - [15.1334, 0.0004, 0.7509], - [16.6911, 0.0013, 0.7371], - [18.2255, 0.0005, 0.751], - [19.7847, 0.001, 0.7412], - [21.3395, 0.0008, 0.746] - ], - "opentrons/eppendorf_96_tiprack_10ul_eptips/1": [ - [0.9034, 0.147, 0.6223], - [1.0379, 0.0252, 0.6226], - [1.1913, 0.0856, 0.5599], - [1.3481, 0.078, 0.569], - [1.5008, 0.0533, 0.6023], - [1.6468, 0.0272, 0.6414], - [1.7939, 0.0259, 0.6435], - [1.9416, 0.0235, 0.6479], - [2.0951, 0.0321, 0.6311], - [2.4797, 0.0263, 0.6433], - [2.8632, 0.0191, 0.6611], - [3.2394, 0.0108, 0.6849], - [3.6157, 0.0087, 0.6918], - [3.9974, 0.0096, 0.6883], - [4.3741, 0.0059, 0.7033], - [4.7578, 0.0077, 0.6954], - [5.1419, 0.0067, 0.6999], - [5.9051, 0.0047, 0.7105], - [7.4406, 0.0039, 0.7154], - [8.9842, 0.003, 0.7218], - [10.5104, 0.0014, 0.7366], - [12.0673, 0.0022, 0.7274], - [13.6096, 0.0012, 0.7395], - [15.1334, 0.0004, 0.7509], - [16.6911, 0.0013, 0.7371], - [18.2255, 0.0005, 0.751], - [19.7847, 0.001, 0.7412], - [21.3395, 0.0008, 0.746] - ], - "opentrons/geb_96_tiprack_10ul/1": [ - [0.9034, 0.147, 0.6223], - [1.0379, 0.0252, 0.6226], - [1.1913, 0.0856, 0.5599], - [1.3481, 0.078, 0.569], - [1.5008, 0.0533, 0.6023], - [1.6468, 0.0272, 0.6414], - [1.7939, 0.0259, 0.6435], - [1.9416, 0.0235, 0.6479], - [2.0951, 0.0321, 0.6311], - [2.4797, 0.0263, 0.6433], - [2.8632, 0.0191, 0.6611], - [3.2394, 0.0108, 0.6849], - [3.6157, 0.0087, 0.6918], - [3.9974, 0.0096, 0.6883], - [4.3741, 0.0059, 0.7033], - [4.7578, 0.0077, 0.6954], - [5.1419, 0.0067, 0.6999], - [5.9051, 0.0047, 0.7105], - [7.4406, 0.0039, 0.7154], - [8.9842, 0.003, 0.7218], - [10.5104, 0.0014, 0.7366], - [12.0673, 0.0022, 0.7274], - [13.6096, 0.0012, 0.7395], - [15.1334, 0.0004, 0.7509], - [16.6911, 0.0013, 0.7371], - [18.2255, 0.0005, 0.751], - [19.7847, 0.001, 0.7412], - [21.3395, 0.0008, 0.746] - ], - "default": [ - [0.9034, 0.147, 0.6223], - [1.0379, 0.0252, 0.6226], - [1.1913, 0.0856, 0.5599], - [1.3481, 0.078, 0.569], - [1.5008, 0.0533, 0.6023], - [1.6468, 0.0272, 0.6414], - [1.7939, 0.0259, 0.6435], - [1.9416, 0.0235, 0.6479], - [2.0951, 0.0321, 0.6311], - [2.4797, 0.0263, 0.6433], - [2.8632, 0.0191, 0.6611], - [3.2394, 0.0108, 0.6849], - [3.6157, 0.0087, 0.6918], - [3.9974, 0.0096, 0.6883], - [4.3741, 0.0059, 0.7033], - [4.7578, 0.0077, 0.6954], - [5.1419, 0.0067, 0.6999], - [5.9051, 0.0047, 0.7105], - [7.4406, 0.0039, 0.7154], - [8.9842, 0.003, 0.7218], - [10.5104, 0.0014, 0.7366], - [12.0673, 0.0022, 0.7274], - [13.6096, 0.0012, 0.7395], - [15.1334, 0.0004, 0.7509], - [16.6911, 0.0013, 0.7371], - [18.2255, 0.0005, 0.751], - [19.7847, 0.001, 0.7412], - [21.3395, 0.0008, 0.746] - ] + "default": { + "1": [ + [0.9034, 0.147, 0.6223], + [1.0379, 0.0252, 0.6226], + [1.1913, 0.0856, 0.5599], + [1.3481, 0.078, 0.569], + [1.5008, 0.0533, 0.6023], + [1.6468, 0.0272, 0.6414], + [1.7939, 0.0259, 0.6435], + [1.9416, 0.0235, 0.6479], + [2.0951, 0.0321, 0.6311], + [2.4797, 0.0263, 0.6433], + [2.8632, 0.0191, 0.6611], + [3.2394, 0.0108, 0.6849], + [3.6157, 0.0087, 0.6918], + [3.9974, 0.0096, 0.6883], + [4.3741, 0.0059, 0.7033], + [4.7578, 0.0077, 0.6954], + [5.1419, 0.0067, 0.6999], + [5.9051, 0.0047, 0.7105], + [7.4406, 0.0039, 0.7154], + [8.9842, 0.003, 0.7218], + [10.5104, 0.0014, 0.7366], + [12.0673, 0.0022, 0.7274], + [13.6096, 0.0012, 0.7395], + [15.1334, 0.0004, 0.7509], + [16.6911, 0.0013, 0.7371], + [18.2255, 0.0005, 0.751], + [19.7847, 0.001, 0.7412], + [21.3395, 0.0008, 0.746] + ] + } }, "dispense": { - "opentrons/opentrons_96_tiprack_10ul/1": [ - [0.9034, 0.147, 0.6223], - [1.0379, 0.0252, 0.6226], - [1.1913, 0.0856, 0.5599], - [1.3481, 0.078, 0.569], - [1.5008, 0.0533, 0.6023], - [1.6468, 0.0272, 0.6414], - [1.7939, 0.0259, 0.6435], - [1.9416, 0.0235, 0.6479], - [2.0951, 0.0321, 0.6311], - [2.4797, 0.0263, 0.6433], - [2.8632, 0.0191, 0.6611], - [3.2394, 0.0108, 0.6849], - [3.6157, 0.0087, 0.6918], - [3.9974, 0.0096, 0.6883], - [4.3741, 0.0059, 0.7033], - [4.7578, 0.0077, 0.6954], - [5.1419, 0.0067, 0.6999], - [5.9051, 0.0047, 0.7105], - [7.4406, 0.0039, 0.7154], - [8.9842, 0.003, 0.7218], - [10.5104, 0.0014, 0.7366], - [12.0673, 0.0022, 0.7274], - [13.6096, 0.0012, 0.7395], - [15.1334, 0.0004, 0.7509], - [16.6911, 0.0013, 0.7371], - [18.2255, 0.0005, 0.751], - [19.7847, 0.001, 0.7412], - [21.3395, 0.0008, 0.746] - ], - "opentrons/opentrons_96_filtertiprack_10ul/1": [ - [0.9034, 0.147, 0.6223], - [1.0379, 0.0252, 0.6226], - [1.1913, 0.0856, 0.5599], - [1.3481, 0.078, 0.569], - [1.5008, 0.0533, 0.6023], - [1.6468, 0.0272, 0.6414], - [1.7939, 0.0259, 0.6435], - [1.9416, 0.0235, 0.6479], - [2.0951, 0.0321, 0.6311], - [2.4797, 0.0263, 0.6433], - [2.8632, 0.0191, 0.6611], - [3.2394, 0.0108, 0.6849], - [3.6157, 0.0087, 0.6918], - [3.9974, 0.0096, 0.6883], - [4.3741, 0.0059, 0.7033], - [4.7578, 0.0077, 0.6954], - [5.1419, 0.0067, 0.6999], - [5.9051, 0.0047, 0.7105], - [7.4406, 0.0039, 0.7154], - [8.9842, 0.003, 0.7218], - [10.5104, 0.0014, 0.7366], - [12.0673, 0.0022, 0.7274], - [13.6096, 0.0012, 0.7395], - [15.1334, 0.0004, 0.7509], - [16.6911, 0.0013, 0.7371], - [18.2255, 0.0005, 0.751], - [19.7847, 0.001, 0.7412], - [21.3395, 0.0008, 0.746] - ], - "opentrons/eppendorf_96_tiprack_10ul_eptips/1": [ - [0.9034, 0.147, 0.6223], - [1.0379, 0.0252, 0.6226], - [1.1913, 0.0856, 0.5599], - [1.3481, 0.078, 0.569], - [1.5008, 0.0533, 0.6023], - [1.6468, 0.0272, 0.6414], - [1.7939, 0.0259, 0.6435], - [1.9416, 0.0235, 0.6479], - [2.0951, 0.0321, 0.6311], - [2.4797, 0.0263, 0.6433], - [2.8632, 0.0191, 0.6611], - [3.2394, 0.0108, 0.6849], - [3.6157, 0.0087, 0.6918], - [3.9974, 0.0096, 0.6883], - [4.3741, 0.0059, 0.7033], - [4.7578, 0.0077, 0.6954], - [5.1419, 0.0067, 0.6999], - [5.9051, 0.0047, 0.7105], - [7.4406, 0.0039, 0.7154], - [8.9842, 0.003, 0.7218], - [10.5104, 0.0014, 0.7366], - [12.0673, 0.0022, 0.7274], - [13.6096, 0.0012, 0.7395], - [15.1334, 0.0004, 0.7509], - [16.6911, 0.0013, 0.7371], - [18.2255, 0.0005, 0.751], - [19.7847, 0.001, 0.7412], - [21.3395, 0.0008, 0.746] - ], - "opentrons/geb_96_tiprack_10ul/1": [ - [0.9034, 0.147, 0.6223], - [1.0379, 0.0252, 0.6226], - [1.1913, 0.0856, 0.5599], - [1.3481, 0.078, 0.569], - [1.5008, 0.0533, 0.6023], - [1.6468, 0.0272, 0.6414], - [1.7939, 0.0259, 0.6435], - [1.9416, 0.0235, 0.6479], - [2.0951, 0.0321, 0.6311], - [2.4797, 0.0263, 0.6433], - [2.8632, 0.0191, 0.6611], - [3.2394, 0.0108, 0.6849], - [3.6157, 0.0087, 0.6918], - [3.9974, 0.0096, 0.6883], - [4.3741, 0.0059, 0.7033], - [4.7578, 0.0077, 0.6954], - [5.1419, 0.0067, 0.6999], - [5.9051, 0.0047, 0.7105], - [7.4406, 0.0039, 0.7154], - [8.9842, 0.003, 0.7218], - [10.5104, 0.0014, 0.7366], - [12.0673, 0.0022, 0.7274], - [13.6096, 0.0012, 0.7395], - [15.1334, 0.0004, 0.7509], - [16.6911, 0.0013, 0.7371], - [18.2255, 0.0005, 0.751], - [19.7847, 0.001, 0.7412], - [21.3395, 0.0008, 0.746] - ], - "default": [ - [0.9034, 0.147, 0.6223], - [1.0379, 0.0252, 0.6226], - [1.1913, 0.0856, 0.5599], - [1.3481, 0.078, 0.569], - [1.5008, 0.0533, 0.6023], - [1.6468, 0.0272, 0.6414], - [1.7939, 0.0259, 0.6435], - [1.9416, 0.0235, 0.6479], - [2.0951, 0.0321, 0.6311], - [2.4797, 0.0263, 0.6433], - [2.8632, 0.0191, 0.6611], - [3.2394, 0.0108, 0.6849], - [3.6157, 0.0087, 0.6918], - [3.9974, 0.0096, 0.6883], - [4.3741, 0.0059, 0.7033], - [4.7578, 0.0077, 0.6954], - [5.1419, 0.0067, 0.6999], - [5.9051, 0.0047, 0.7105], - [7.4406, 0.0039, 0.7154], - [8.9842, 0.003, 0.7218], - [10.5104, 0.0014, 0.7366], - [12.0673, 0.0022, 0.7274], - [13.6096, 0.0012, 0.7395], - [15.1334, 0.0004, 0.7509], - [16.6911, 0.0013, 0.7371], - [18.2255, 0.0005, 0.751], - [19.7847, 0.001, 0.7412], - [21.3395, 0.0008, 0.746] - ] - }, - "defaultTipOverlapDictionary": { - "opentrons/opentrons_96_tiprack_10ul/1": 8.25, - "opentrons/opentrons_96_filtertiprack_10ul/1": 8.25, - "opentrons/eppendorf_96_tiprack_10ul_eptips/1": 8.4, - "opentrons/geb_96_tiprack_10ul/1": 8.3 + "default": { + "1": [ + [0.9034, 0.147, 0.6223], + [1.0379, 0.0252, 0.6226], + [1.1913, 0.0856, 0.5599], + [1.3481, 0.078, 0.569], + [1.5008, 0.0533, 0.6023], + [1.6468, 0.0272, 0.6414], + [1.7939, 0.0259, 0.6435], + [1.9416, 0.0235, 0.6479], + [2.0951, 0.0321, 0.6311], + [2.4797, 0.0263, 0.6433], + [2.8632, 0.0191, 0.6611], + [3.2394, 0.0108, 0.6849], + [3.6157, 0.0087, 0.6918], + [3.9974, 0.0096, 0.6883], + [4.3741, 0.0059, 0.7033], + [4.7578, 0.0077, 0.6954], + [5.1419, 0.0067, 0.6999], + [5.9051, 0.0047, 0.7105], + [7.4406, 0.0039, 0.7154], + [8.9842, 0.003, 0.7218], + [10.5104, 0.0014, 0.7366], + [12.0673, 0.0022, 0.7274], + [13.6096, 0.0012, 0.7395], + [15.1334, 0.0004, 0.7509], + [16.6911, 0.0013, 0.7371], + [18.2255, 0.0005, 0.751], + [19.7847, 0.001, 0.7412], + [21.3395, 0.0008, 0.746] + ] + } }, "defaultBlowoutVolume": 3.534 } }, "maxVolume": 20, "minVolume": 1.0, + "defaultTipOverlapDictionary": { + "default": 8.25, + "opentrons/opentrons_96_tiprack_10ul/1": 8.25, + "opentrons/opentrons_96_filtertiprack_10ul/1": 8.25, + "opentrons/eppendorf_96_tiprack_10ul_eptips/1": 8.4, + "opentrons/geb_96_tiprack_10ul/1": 8.3, + "opentrons/opentrons_96_tiprack_20ul/1": 8.25, + "opentrons/opentrons_96_filtertiprack_20ul/1": 8.25 + }, "defaultTipracks": [ "opentrons/opentrons_96_tiprack_20ul/1", "opentrons/opentrons_96_filtertiprack_20ul/1", diff --git a/shared-data/pipette/definitions/2/liquid/single_channel/p20/2_2.json b/shared-data/pipette/definitions/2/liquid/single_channel/p20/2_2.json index c5a5e421be5..dbb07223a32 100644 --- a/shared-data/pipette/definitions/2/liquid/single_channel/p20/2_2.json +++ b/shared-data/pipette/definitions/2/liquid/single_channel/p20/2_2.json @@ -2,12 +2,28 @@ "$otSharedSchema": "#/pipette/schemas/2/pipetteLiquidPropertiesSchema.json", "supportedTips": { "t20": { - "defaultAspirateFlowRate": 3.78, - "defaultDispenseFlowRate": 3.78, - "defaultBlowOutFlowRate": 3.78, + "defaultAspirateFlowRate": { + "default": 3.78, + "valuesByApiLevel": { + "2.0": 3.78, + "2.6": 7.56 + } + }, + "defaultDispenseFlowRate": { + "default": 3.78, + "valuesByApiLevel": { + "2.0": 3.78, + "2.6": 7.56 + } + }, + "defaultBlowOutFlowRate": { + "default": 3.78, + "valuesByApiLevel": { + "2.0": 3.78, + "2.6": 7.56 + } + }, "defaultTipLength": 31.15, - "defaultTipOverlap": 8.25, - "defaultReturnTipHeight": null, "aspirate": { "opentrons/opentrons_96_tiprack_20ul/1": [ [0.8679, 0.1607, 0.5953], @@ -39,36 +55,38 @@ [19.7746, 0.0009, 0.7434], [21.3288, 0.0008, 0.7455] ], - "default": [ - [0.8679, 0.1607, 0.5953], - [1.0259, 0.1345, 0.5032], - [1.1863, 0.1113, 0.527], - [1.3419, 0.0766, 0.5682], - [1.4882, 0.0377, 0.6204], - [1.6413, 0.0482, 0.6047], - [1.7935, 0.039, 0.6199], - [1.9447, 0.0313, 0.6336], - [2.0929, 0.021, 0.6538], - [2.4644, 0.0174, 0.6612], - [2.8527, 0.0233, 0.6466], - [3.2241, 0.0089, 0.6878], - [3.6095, 0.0141, 0.671], - [3.9964, 0.0122, 0.6779], - [4.3696, 0.0044, 0.7088], - [4.7483, 0.0059, 0.7026], - [5.1447, 0.0112, 0.6772], - [5.9135, 0.0055, 0.7066], - [7.4416, 0.0033, 0.7199], - [8.9724, 0.0023, 0.7269], - [10.5091, 0.0019, 0.7305], - [12.0515, 0.0017, 0.7331], - [13.6004, 0.0015, 0.7349], - [15.142, 0.001, 0.7422], - [16.679, 0.0007, 0.7469], - [18.221, 0.0007, 0.7466], - [19.7746, 0.0009, 0.7434], - [21.3288, 0.0008, 0.7455] - ] + "default": { + "1": [ + [0.8679, 0.1607, 0.5953], + [1.0259, 0.1345, 0.5032], + [1.1863, 0.1113, 0.527], + [1.3419, 0.0766, 0.5682], + [1.4882, 0.0377, 0.6204], + [1.6413, 0.0482, 0.6047], + [1.7935, 0.039, 0.6199], + [1.9447, 0.0313, 0.6336], + [2.0929, 0.021, 0.6538], + [2.4644, 0.0174, 0.6612], + [2.8527, 0.0233, 0.6466], + [3.2241, 0.0089, 0.6878], + [3.6095, 0.0141, 0.671], + [3.9964, 0.0122, 0.6779], + [4.3696, 0.0044, 0.7088], + [4.7483, 0.0059, 0.7026], + [5.1447, 0.0112, 0.6772], + [5.9135, 0.0055, 0.7066], + [7.4416, 0.0033, 0.7199], + [8.9724, 0.0023, 0.7269], + [10.5091, 0.0019, 0.7305], + [12.0515, 0.0017, 0.7331], + [13.6004, 0.0015, 0.7349], + [15.142, 0.001, 0.7422], + [16.679, 0.0007, 0.7469], + [18.221, 0.0007, 0.7466], + [19.7746, 0.0009, 0.7434], + [21.3288, 0.0008, 0.7455] + ] + } }, "dispense": { "opentrons/opentrons_96_tiprack_20ul/1": [ @@ -101,141 +119,66 @@ [19.7746, 0.0009, 0.7434], [21.3288, 0.0008, 0.7455] ], - "default": [ - [0.8679, 0.1607, 0.5953], - [1.0259, 0.1345, 0.5032], - [1.1863, 0.1113, 0.527], - [1.3419, 0.0766, 0.5682], - [1.4882, 0.0377, 0.6204], - [1.6413, 0.0482, 0.6047], - [1.7935, 0.039, 0.6199], - [1.9447, 0.0313, 0.6336], - [2.0929, 0.021, 0.6538], - [2.4644, 0.0174, 0.6612], - [2.8527, 0.0233, 0.6466], - [3.2241, 0.0089, 0.6878], - [3.6095, 0.0141, 0.671], - [3.9964, 0.0122, 0.6779], - [4.3696, 0.0044, 0.7088], - [4.7483, 0.0059, 0.7026], - [5.1447, 0.0112, 0.6772], - [5.9135, 0.0055, 0.7066], - [7.4416, 0.0033, 0.7199], - [8.9724, 0.0023, 0.7269], - [10.5091, 0.0019, 0.7305], - [12.0515, 0.0017, 0.7331], - [13.6004, 0.0015, 0.7349], - [15.142, 0.001, 0.7422], - [16.679, 0.0007, 0.7469], - [18.221, 0.0007, 0.7466], - [19.7746, 0.0009, 0.7434], - [21.3288, 0.0008, 0.7455] - ] - }, - "defaultTipOverlapDictionary": { - "opentrons/opentrons_96_tiprack_20ul/1": 8.25 + "default": { + "1": [ + [0.8679, 0.1607, 0.5953], + [1.0259, 0.1345, 0.5032], + [1.1863, 0.1113, 0.527], + [1.3419, 0.0766, 0.5682], + [1.4882, 0.0377, 0.6204], + [1.6413, 0.0482, 0.6047], + [1.7935, 0.039, 0.6199], + [1.9447, 0.0313, 0.6336], + [2.0929, 0.021, 0.6538], + [2.4644, 0.0174, 0.6612], + [2.8527, 0.0233, 0.6466], + [3.2241, 0.0089, 0.6878], + [3.6095, 0.0141, 0.671], + [3.9964, 0.0122, 0.6779], + [4.3696, 0.0044, 0.7088], + [4.7483, 0.0059, 0.7026], + [5.1447, 0.0112, 0.6772], + [5.9135, 0.0055, 0.7066], + [7.4416, 0.0033, 0.7199], + [8.9724, 0.0023, 0.7269], + [10.5091, 0.0019, 0.7305], + [12.0515, 0.0017, 0.7331], + [13.6004, 0.0015, 0.7349], + [15.142, 0.001, 0.7422], + [16.679, 0.0007, 0.7469], + [18.221, 0.0007, 0.7466], + [19.7746, 0.0009, 0.7434], + [21.3288, 0.0008, 0.7455] + ] + } }, "defaultBlowoutVolume": 3.534 }, "t10": { - "defaultAspirateFlowRate": 3.78, - "defaultDispenseFlowRate": 3.78, - "defaultBlowOutFlowRate": 3.78, + "defaultAspirateFlowRate": { + "default": 3.78, + "valuesByApiLevel": { + "2.0": 3.78, + "2.6": 7.56 + } + }, + "defaultDispenseFlowRate": { + "default": 3.78, + "valuesByApiLevel": { + "2.0": 3.78, + "2.6": 7.56 + } + }, + "defaultBlowOutFlowRate": { + "default": 3.78, + "valuesByApiLevel": { + "2.0": 3.78, + "2.6": 7.56 + } + }, "defaultTipLength": 31.15, - "defaultTipOverlap": 8.25, - "defaultReturnTipHeight": null, "aspirate": { - "opentrons/opentrons_96_tiprack_10ul/1": [ - [0.8679, 0.1607, 0.5953], - [1.0259, 0.1345, 0.5032], - [1.1863, 0.1113, 0.527], - [1.3419, 0.0766, 0.5682], - [1.4882, 0.0377, 0.6204], - [1.6413, 0.0482, 0.6047], - [1.7935, 0.039, 0.6199], - [1.9447, 0.0313, 0.6336], - [2.0929, 0.021, 0.6538], - [2.4644, 0.0174, 0.6612], - [2.8527, 0.0233, 0.6466], - [3.2241, 0.0089, 0.6878], - [3.6095, 0.0141, 0.671], - [3.9964, 0.0122, 0.6779], - [4.3696, 0.0044, 0.7088], - [4.7483, 0.0059, 0.7026], - [5.1447, 0.0112, 0.6772], - [5.9135, 0.0055, 0.7066], - [7.4416, 0.0033, 0.7199], - [8.9724, 0.0023, 0.7269], - [10.5091, 0.0019, 0.7305], - [12.0515, 0.0017, 0.7331], - [13.6004, 0.0015, 0.7349], - [15.142, 0.001, 0.7422], - [16.679, 0.0007, 0.7469], - [18.221, 0.0007, 0.7466], - [19.7746, 0.0009, 0.7434], - [21.3288, 0.0008, 0.7455] - ], - "opentrons/opentrons_96_filtertiprack_10ul/1": [ - [0.8679, 0.1607, 0.5953], - [1.0259, 0.1345, 0.5032], - [1.1863, 0.1113, 0.527], - [1.3419, 0.0766, 0.5682], - [1.4882, 0.0377, 0.6204], - [1.6413, 0.0482, 0.6047], - [1.7935, 0.039, 0.6199], - [1.9447, 0.0313, 0.6336], - [2.0929, 0.021, 0.6538], - [2.4644, 0.0174, 0.6612], - [2.8527, 0.0233, 0.6466], - [3.2241, 0.0089, 0.6878], - [3.6095, 0.0141, 0.671], - [3.9964, 0.0122, 0.6779], - [4.3696, 0.0044, 0.7088], - [4.7483, 0.0059, 0.7026], - [5.1447, 0.0112, 0.6772], - [5.9135, 0.0055, 0.7066], - [7.4416, 0.0033, 0.7199], - [8.9724, 0.0023, 0.7269], - [10.5091, 0.0019, 0.7305], - [12.0515, 0.0017, 0.7331], - [13.6004, 0.0015, 0.7349], - [15.142, 0.001, 0.7422], - [16.679, 0.0007, 0.7469], - [18.221, 0.0007, 0.7466], - [19.7746, 0.0009, 0.7434], - [21.3288, 0.0008, 0.7455] - ], - "opentrons/eppendorf_96_tiprack_10ul_eptips/1": [ - [0.8679, 0.1607, 0.5953], - [1.0259, 0.1345, 0.5032], - [1.1863, 0.1113, 0.527], - [1.3419, 0.0766, 0.5682], - [1.4882, 0.0377, 0.6204], - [1.6413, 0.0482, 0.6047], - [1.7935, 0.039, 0.6199], - [1.9447, 0.0313, 0.6336], - [2.0929, 0.021, 0.6538], - [2.4644, 0.0174, 0.6612], - [2.8527, 0.0233, 0.6466], - [3.2241, 0.0089, 0.6878], - [3.6095, 0.0141, 0.671], - [3.9964, 0.0122, 0.6779], - [4.3696, 0.0044, 0.7088], - [4.7483, 0.0059, 0.7026], - [5.1447, 0.0112, 0.6772], - [5.9135, 0.0055, 0.7066], - [7.4416, 0.0033, 0.7199], - [8.9724, 0.0023, 0.7269], - [10.5091, 0.0019, 0.7305], - [12.0515, 0.0017, 0.7331], - [13.6004, 0.0015, 0.7349], - [15.142, 0.001, 0.7422], - [16.679, 0.0007, 0.7469], - [18.221, 0.0007, 0.7466], - [19.7746, 0.0009, 0.7434], - [21.3288, 0.0008, 0.7455] - ], - "opentrons/geb_96_tiprack_10ul/1": [ + "opentrons/opentrons_96_tiprack_20ul/1": [ [0.8679, 0.1607, 0.5953], [1.0259, 0.1345, 0.5032], [1.1863, 0.1113, 0.527], @@ -265,129 +208,41 @@ [19.7746, 0.0009, 0.7434], [21.3288, 0.0008, 0.7455] ], - "default": [ - [0.8679, 0.1607, 0.5953], - [1.0259, 0.1345, 0.5032], - [1.1863, 0.1113, 0.527], - [1.3419, 0.0766, 0.5682], - [1.4882, 0.0377, 0.6204], - [1.6413, 0.0482, 0.6047], - [1.7935, 0.039, 0.6199], - [1.9447, 0.0313, 0.6336], - [2.0929, 0.021, 0.6538], - [2.4644, 0.0174, 0.6612], - [2.8527, 0.0233, 0.6466], - [3.2241, 0.0089, 0.6878], - [3.6095, 0.0141, 0.671], - [3.9964, 0.0122, 0.6779], - [4.3696, 0.0044, 0.7088], - [4.7483, 0.0059, 0.7026], - [5.1447, 0.0112, 0.6772], - [5.9135, 0.0055, 0.7066], - [7.4416, 0.0033, 0.7199], - [8.9724, 0.0023, 0.7269], - [10.5091, 0.0019, 0.7305], - [12.0515, 0.0017, 0.7331], - [13.6004, 0.0015, 0.7349], - [15.142, 0.001, 0.7422], - [16.679, 0.0007, 0.7469], - [18.221, 0.0007, 0.7466], - [19.7746, 0.0009, 0.7434], - [21.3288, 0.0008, 0.7455] - ] + "default": { + "1": [ + [0.8679, 0.1607, 0.5953], + [1.0259, 0.1345, 0.5032], + [1.1863, 0.1113, 0.527], + [1.3419, 0.0766, 0.5682], + [1.4882, 0.0377, 0.6204], + [1.6413, 0.0482, 0.6047], + [1.7935, 0.039, 0.6199], + [1.9447, 0.0313, 0.6336], + [2.0929, 0.021, 0.6538], + [2.4644, 0.0174, 0.6612], + [2.8527, 0.0233, 0.6466], + [3.2241, 0.0089, 0.6878], + [3.6095, 0.0141, 0.671], + [3.9964, 0.0122, 0.6779], + [4.3696, 0.0044, 0.7088], + [4.7483, 0.0059, 0.7026], + [5.1447, 0.0112, 0.6772], + [5.9135, 0.0055, 0.7066], + [7.4416, 0.0033, 0.7199], + [8.9724, 0.0023, 0.7269], + [10.5091, 0.0019, 0.7305], + [12.0515, 0.0017, 0.7331], + [13.6004, 0.0015, 0.7349], + [15.142, 0.001, 0.7422], + [16.679, 0.0007, 0.7469], + [18.221, 0.0007, 0.7466], + [19.7746, 0.0009, 0.7434], + [21.3288, 0.0008, 0.7455] + ] + } }, "dispense": { - "opentrons/opentrons_96_tiprack_10ul/1": [ - [0.8679, 0.1607, 0.5953], - [1.0259, 0.1345, 0.5032], - [1.1863, 0.1113, 0.527], - [1.3419, 0.0766, 0.5682], - [1.4882, 0.0377, 0.6204], - [1.6413, 0.0482, 0.6047], - [1.7935, 0.039, 0.6199], - [1.9447, 0.0313, 0.6336], - [2.0929, 0.021, 0.6538], - [2.4644, 0.0174, 0.6612], - [2.8527, 0.0233, 0.6466], - [3.2241, 0.0089, 0.6878], - [3.6095, 0.0141, 0.671], - [3.9964, 0.0122, 0.6779], - [4.3696, 0.0044, 0.7088], - [4.7483, 0.0059, 0.7026], - [5.1447, 0.0112, 0.6772], - [5.9135, 0.0055, 0.7066], - [7.4416, 0.0033, 0.7199], - [8.9724, 0.0023, 0.7269], - [10.5091, 0.0019, 0.7305], - [12.0515, 0.0017, 0.7331], - [13.6004, 0.0015, 0.7349], - [15.142, 0.001, 0.7422], - [16.679, 0.0007, 0.7469], - [18.221, 0.0007, 0.7466], - [19.7746, 0.0009, 0.7434], - [21.3288, 0.0008, 0.7455] - ], - "opentrons/opentrons_96_filtertiprack_10ul/1": [ - [0.8679, 0.1607, 0.5953], - [1.0259, 0.1345, 0.5032], - [1.1863, 0.1113, 0.527], - [1.3419, 0.0766, 0.5682], - [1.4882, 0.0377, 0.6204], - [1.6413, 0.0482, 0.6047], - [1.7935, 0.039, 0.6199], - [1.9447, 0.0313, 0.6336], - [2.0929, 0.021, 0.6538], - [2.4644, 0.0174, 0.6612], - [2.8527, 0.0233, 0.6466], - [3.2241, 0.0089, 0.6878], - [3.6095, 0.0141, 0.671], - [3.9964, 0.0122, 0.6779], - [4.3696, 0.0044, 0.7088], - [4.7483, 0.0059, 0.7026], - [5.1447, 0.0112, 0.6772], - [5.9135, 0.0055, 0.7066], - [7.4416, 0.0033, 0.7199], - [8.9724, 0.0023, 0.7269], - [10.5091, 0.0019, 0.7305], - [12.0515, 0.0017, 0.7331], - [13.6004, 0.0015, 0.7349], - [15.142, 0.001, 0.7422], - [16.679, 0.0007, 0.7469], - [18.221, 0.0007, 0.7466], - [19.7746, 0.0009, 0.7434], - [21.3288, 0.0008, 0.7455] - ], - "opentrons/eppendorf_96_tiprack_10ul_eptips/1": [ - [0.8679, 0.1607, 0.5953], - [1.0259, 0.1345, 0.5032], - [1.1863, 0.1113, 0.527], - [1.3419, 0.0766, 0.5682], - [1.4882, 0.0377, 0.6204], - [1.6413, 0.0482, 0.6047], - [1.7935, 0.039, 0.6199], - [1.9447, 0.0313, 0.6336], - [2.0929, 0.021, 0.6538], - [2.4644, 0.0174, 0.6612], - [2.8527, 0.0233, 0.6466], - [3.2241, 0.0089, 0.6878], - [3.6095, 0.0141, 0.671], - [3.9964, 0.0122, 0.6779], - [4.3696, 0.0044, 0.7088], - [4.7483, 0.0059, 0.7026], - [5.1447, 0.0112, 0.6772], - [5.9135, 0.0055, 0.7066], - [7.4416, 0.0033, 0.7199], - [8.9724, 0.0023, 0.7269], - [10.5091, 0.0019, 0.7305], - [12.0515, 0.0017, 0.7331], - [13.6004, 0.0015, 0.7349], - [15.142, 0.001, 0.7422], - [16.679, 0.0007, 0.7469], - [18.221, 0.0007, 0.7466], - [19.7746, 0.0009, 0.7434], - [21.3288, 0.0008, 0.7455] - ], - "opentrons/geb_96_tiprack_10ul/1": [ + "opentrons/opentrons_96_tiprack_20ul/1": [ [0.8679, 0.1607, 0.5953], [1.0259, 0.1345, 0.5032], [1.1863, 0.1113, 0.527], @@ -417,46 +272,51 @@ [19.7746, 0.0009, 0.7434], [21.3288, 0.0008, 0.7455] ], - "default": [ - [0.8679, 0.1607, 0.5953], - [1.0259, 0.1345, 0.5032], - [1.1863, 0.1113, 0.527], - [1.3419, 0.0766, 0.5682], - [1.4882, 0.0377, 0.6204], - [1.6413, 0.0482, 0.6047], - [1.7935, 0.039, 0.6199], - [1.9447, 0.0313, 0.6336], - [2.0929, 0.021, 0.6538], - [2.4644, 0.0174, 0.6612], - [2.8527, 0.0233, 0.6466], - [3.2241, 0.0089, 0.6878], - [3.6095, 0.0141, 0.671], - [3.9964, 0.0122, 0.6779], - [4.3696, 0.0044, 0.7088], - [4.7483, 0.0059, 0.7026], - [5.1447, 0.0112, 0.6772], - [5.9135, 0.0055, 0.7066], - [7.4416, 0.0033, 0.7199], - [8.9724, 0.0023, 0.7269], - [10.5091, 0.0019, 0.7305], - [12.0515, 0.0017, 0.7331], - [13.6004, 0.0015, 0.7349], - [15.142, 0.001, 0.7422], - [16.679, 0.0007, 0.7469], - [18.221, 0.0007, 0.7466], - [19.7746, 0.0009, 0.7434], - [21.3288, 0.0008, 0.7455] - ] - }, - "defaultTipOverlapDictionary": { - "opentrons/opentrons_96_tiprack_10ul/1": 8.25, - "opentrons/opentrons_96_filtertiprack_10ul/1": 8.25, - "opentrons/eppendorf_96_tiprack_10ul_eptips/1": 8.4, - "opentrons/geb_96_tiprack_10ul/1": 8.3 + "default": { + "1": [ + [0.8679, 0.1607, 0.5953], + [1.0259, 0.1345, 0.5032], + [1.1863, 0.1113, 0.527], + [1.3419, 0.0766, 0.5682], + [1.4882, 0.0377, 0.6204], + [1.6413, 0.0482, 0.6047], + [1.7935, 0.039, 0.6199], + [1.9447, 0.0313, 0.6336], + [2.0929, 0.021, 0.6538], + [2.4644, 0.0174, 0.6612], + [2.8527, 0.0233, 0.6466], + [3.2241, 0.0089, 0.6878], + [3.6095, 0.0141, 0.671], + [3.9964, 0.0122, 0.6779], + [4.3696, 0.0044, 0.7088], + [4.7483, 0.0059, 0.7026], + [5.1447, 0.0112, 0.6772], + [5.9135, 0.0055, 0.7066], + [7.4416, 0.0033, 0.7199], + [8.9724, 0.0023, 0.7269], + [10.5091, 0.0019, 0.7305], + [12.0515, 0.0017, 0.7331], + [13.6004, 0.0015, 0.7349], + [15.142, 0.001, 0.7422], + [16.679, 0.0007, 0.7469], + [18.221, 0.0007, 0.7466], + [19.7746, 0.0009, 0.7434], + [21.3288, 0.0008, 0.7455] + ] + } }, "defaultBlowoutVolume": 3.534 } }, + "defaultTipOverlapDictionary": { + "default": 8.25, + "opentrons/opentrons_96_tiprack_10ul/1": 8.25, + "opentrons/opentrons_96_filtertiprack_10ul/1": 8.25, + "opentrons/eppendorf_96_tiprack_10ul_eptips/1": 8.4, + "opentrons/geb_96_tiprack_10ul/1": 8.3, + "opentrons/opentrons_96_tiprack_20ul/1": 8.25, + "opentrons/opentrons_96_filtertiprack_20ul/1": 8.25 + }, "maxVolume": 20, "minVolume": 1.0, "defaultTipracks": [ diff --git a/shared-data/pipette/definitions/2/liquid/single_channel/p300/1_0.json b/shared-data/pipette/definitions/2/liquid/single_channel/p300/1_0.json index 93384a77da5..4fb6fbd1950 100644 --- a/shared-data/pipette/definitions/2/liquid/single_channel/p300/1_0.json +++ b/shared-data/pipette/definitions/2/liquid/single_channel/p300/1_0.json @@ -2,85 +2,94 @@ "$otSharedSchema": "#/pipette/schemas/2/pipetteLiquidPropertiesSchema.json", "supportedTips": { "t200": { - "defaultAspirateFlowRate": 150.0, - "defaultDispenseFlowRate": 300.0, - "defaultBlowOutFlowRate": 1000.0, + "defaultAspirateFlowRate": { + "default": 150, + "valuesByApiLevel": { "2.0": 150 } + }, + "defaultDispenseFlowRate": { + "default": 300, + "valuesByApiLevel": { "2.0": 300 } + }, + "defaultBlowOutFlowRate": { + "default": 1000, + "valuesByApiLevel": { "2.0": 1000 } + }, "defaultTipLength": 51.7, - "defaultTipOverlap": 7.47, - "defaultReturnTipHeight": null, "aspirate": { - "opentrons/tipone_96_tiprack_200ul/1": [ - [36.19844973, 0.043, 16.548], - [54.98518519, 0.012, 17.658], - [73.90077516, 0.008, 17.902], - [111.8437953, 0.004, 18.153], - [302.3895337, 0.001, 18.23] - ], - "opentrons/opentrons_96_filtertiprack_200ul/1": [ - [36.19844973, 0.043, 16.548], - [54.98518519, 0.012, 17.658], - [73.90077516, 0.008, 17.902], - [111.8437953, 0.004, 18.153], - [302.3895337, 0.001, 18.23] - ], - "default": [ - [36.19844973, 0.043, 16.548], - [54.98518519, 0.012, 17.658], - [73.90077516, 0.008, 17.902], - [111.8437953, 0.004, 18.153], - [302.3895337, 0.001, 18.23] - ] + "default": { + "1": [ + [36.19844973, 0.043, 16.548], + [54.98518519, 0.012, 17.658], + [73.90077516, 0.008, 17.902], + [111.8437953, 0.004, 18.153], + [302.3895337, 0.001, 18.23] + ], + "2": [ + [53.958, 0.0252, 16.6268], + [73.0217, 0.0141, 17.2234], + [82.6834, 0.0123, 17.3586], + [120.7877, 0.0055, 17.9214], + [197.3909, 0.0028, 18.2415], + [300.0, 0.0014, 18.5235] + ] + } }, "dispense": { - "opentrons/tipone_96_tiprack_200ul/1": [ - [302.3895337, 0.0, 18.83156277] - ], - "opentrons/opentrons_96_filtertiprack_200ul/1": [ - [302.3895337, 0.0, 18.83156277] - ], - "default": [[302.3895337, 0.0, 18.83156277]] - }, - "defaultTipOverlapDictionary": { - "opentrons/tipone_96_tiprack_200ul/1": 6.1, - "opentrons/opentrons_96_filtertiprack_200ul/1": 7.47 + "default": { + "1": [[302.3895337, 0.0, 18.83156277]], + "2": [[302.3895337, 0, 18.83156277]] + } }, "defaultBlowoutVolume": 58.905 }, "t300": { - "defaultAspirateFlowRate": 150.0, - "defaultDispenseFlowRate": 300.0, - "defaultBlowOutFlowRate": 1000.0, + "defaultAspirateFlowRate": { + "default": 150, + "valuesByApiLevel": { "2.0": 150 } + }, + "defaultDispenseFlowRate": { + "default": 300, + "valuesByApiLevel": { "2.0": 300 } + }, + "defaultBlowOutFlowRate": { + "default": 1000, + "valuesByApiLevel": { "2.0": 1000 } + }, "defaultTipLength": 51.7, - "defaultTipOverlap": 7.47, - "defaultReturnTipHeight": null, "aspirate": { - "opentrons/opentrons_96_tiprack_300ul/1": [ - [36.19844973, 0.043, 16.548], - [54.98518519, 0.012, 17.658], - [73.90077516, 0.008, 17.902], - [111.8437953, 0.004, 18.153], - [302.3895337, 0.001, 18.23] - ], - "default": [ - [36.19844973, 0.043, 16.548], - [54.98518519, 0.012, 17.658], - [73.90077516, 0.008, 17.902], - [111.8437953, 0.004, 18.153], - [302.3895337, 0.001, 18.23] - ] + "default": { + "1": [ + [36.19844973, 0.043, 16.548], + [54.98518519, 0.012, 17.658], + [73.90077516, 0.008, 17.902], + [111.8437953, 0.004, 18.153], + [302.3895337, 0.001, 18.23] + ], + "2": [ + [53.958, 0.0252, 16.6268], + [73.0217, 0.0141, 17.2234], + [82.6834, 0.0123, 17.3586], + [120.7877, 0.0055, 17.9214], + [197.3909, 0.0028, 18.2415], + [300.0, 0.0014, 18.5235] + ] + } }, "dispense": { - "opentrons/opentrons_96_tiprack_300ul/1": [ - [302.3895337, 0.0, 18.83156277] - ], - "default": [[302.3895337, 0.0, 18.83156277]] - }, - "defaultTipOverlapDictionary": { - "opentrons/opentrons_96_tiprack_300ul/1": 7.47 + "default": { + "1": [[302.3895337, 0.0, 18.83156277]], + "2": [[302.3895337, 0, 18.83156277]] + } }, "defaultBlowoutVolume": 58.905 } }, + "defaultTipOverlapDictionary": { + "default": 7.47, + "opentrons/tipone_96_tiprack_200ul/1": 6.1, + "opentrons/opentrons_96_filtertiprack_200ul/1": 7.47, + "opentrons/opentrons_96_tiprack_300ul/1": 7.47 + }, "maxVolume": 300, "minVolume": 30.0, "defaultTipracks": [ diff --git a/shared-data/pipette/definitions/2/liquid/single_channel/p300/1_3.json b/shared-data/pipette/definitions/2/liquid/single_channel/p300/1_3.json index 93384a77da5..4fb6fbd1950 100644 --- a/shared-data/pipette/definitions/2/liquid/single_channel/p300/1_3.json +++ b/shared-data/pipette/definitions/2/liquid/single_channel/p300/1_3.json @@ -2,85 +2,94 @@ "$otSharedSchema": "#/pipette/schemas/2/pipetteLiquidPropertiesSchema.json", "supportedTips": { "t200": { - "defaultAspirateFlowRate": 150.0, - "defaultDispenseFlowRate": 300.0, - "defaultBlowOutFlowRate": 1000.0, + "defaultAspirateFlowRate": { + "default": 150, + "valuesByApiLevel": { "2.0": 150 } + }, + "defaultDispenseFlowRate": { + "default": 300, + "valuesByApiLevel": { "2.0": 300 } + }, + "defaultBlowOutFlowRate": { + "default": 1000, + "valuesByApiLevel": { "2.0": 1000 } + }, "defaultTipLength": 51.7, - "defaultTipOverlap": 7.47, - "defaultReturnTipHeight": null, "aspirate": { - "opentrons/tipone_96_tiprack_200ul/1": [ - [36.19844973, 0.043, 16.548], - [54.98518519, 0.012, 17.658], - [73.90077516, 0.008, 17.902], - [111.8437953, 0.004, 18.153], - [302.3895337, 0.001, 18.23] - ], - "opentrons/opentrons_96_filtertiprack_200ul/1": [ - [36.19844973, 0.043, 16.548], - [54.98518519, 0.012, 17.658], - [73.90077516, 0.008, 17.902], - [111.8437953, 0.004, 18.153], - [302.3895337, 0.001, 18.23] - ], - "default": [ - [36.19844973, 0.043, 16.548], - [54.98518519, 0.012, 17.658], - [73.90077516, 0.008, 17.902], - [111.8437953, 0.004, 18.153], - [302.3895337, 0.001, 18.23] - ] + "default": { + "1": [ + [36.19844973, 0.043, 16.548], + [54.98518519, 0.012, 17.658], + [73.90077516, 0.008, 17.902], + [111.8437953, 0.004, 18.153], + [302.3895337, 0.001, 18.23] + ], + "2": [ + [53.958, 0.0252, 16.6268], + [73.0217, 0.0141, 17.2234], + [82.6834, 0.0123, 17.3586], + [120.7877, 0.0055, 17.9214], + [197.3909, 0.0028, 18.2415], + [300.0, 0.0014, 18.5235] + ] + } }, "dispense": { - "opentrons/tipone_96_tiprack_200ul/1": [ - [302.3895337, 0.0, 18.83156277] - ], - "opentrons/opentrons_96_filtertiprack_200ul/1": [ - [302.3895337, 0.0, 18.83156277] - ], - "default": [[302.3895337, 0.0, 18.83156277]] - }, - "defaultTipOverlapDictionary": { - "opentrons/tipone_96_tiprack_200ul/1": 6.1, - "opentrons/opentrons_96_filtertiprack_200ul/1": 7.47 + "default": { + "1": [[302.3895337, 0.0, 18.83156277]], + "2": [[302.3895337, 0, 18.83156277]] + } }, "defaultBlowoutVolume": 58.905 }, "t300": { - "defaultAspirateFlowRate": 150.0, - "defaultDispenseFlowRate": 300.0, - "defaultBlowOutFlowRate": 1000.0, + "defaultAspirateFlowRate": { + "default": 150, + "valuesByApiLevel": { "2.0": 150 } + }, + "defaultDispenseFlowRate": { + "default": 300, + "valuesByApiLevel": { "2.0": 300 } + }, + "defaultBlowOutFlowRate": { + "default": 1000, + "valuesByApiLevel": { "2.0": 1000 } + }, "defaultTipLength": 51.7, - "defaultTipOverlap": 7.47, - "defaultReturnTipHeight": null, "aspirate": { - "opentrons/opentrons_96_tiprack_300ul/1": [ - [36.19844973, 0.043, 16.548], - [54.98518519, 0.012, 17.658], - [73.90077516, 0.008, 17.902], - [111.8437953, 0.004, 18.153], - [302.3895337, 0.001, 18.23] - ], - "default": [ - [36.19844973, 0.043, 16.548], - [54.98518519, 0.012, 17.658], - [73.90077516, 0.008, 17.902], - [111.8437953, 0.004, 18.153], - [302.3895337, 0.001, 18.23] - ] + "default": { + "1": [ + [36.19844973, 0.043, 16.548], + [54.98518519, 0.012, 17.658], + [73.90077516, 0.008, 17.902], + [111.8437953, 0.004, 18.153], + [302.3895337, 0.001, 18.23] + ], + "2": [ + [53.958, 0.0252, 16.6268], + [73.0217, 0.0141, 17.2234], + [82.6834, 0.0123, 17.3586], + [120.7877, 0.0055, 17.9214], + [197.3909, 0.0028, 18.2415], + [300.0, 0.0014, 18.5235] + ] + } }, "dispense": { - "opentrons/opentrons_96_tiprack_300ul/1": [ - [302.3895337, 0.0, 18.83156277] - ], - "default": [[302.3895337, 0.0, 18.83156277]] - }, - "defaultTipOverlapDictionary": { - "opentrons/opentrons_96_tiprack_300ul/1": 7.47 + "default": { + "1": [[302.3895337, 0.0, 18.83156277]], + "2": [[302.3895337, 0, 18.83156277]] + } }, "defaultBlowoutVolume": 58.905 } }, + "defaultTipOverlapDictionary": { + "default": 7.47, + "opentrons/tipone_96_tiprack_200ul/1": 6.1, + "opentrons/opentrons_96_filtertiprack_200ul/1": 7.47, + "opentrons/opentrons_96_tiprack_300ul/1": 7.47 + }, "maxVolume": 300, "minVolume": 30.0, "defaultTipracks": [ diff --git a/shared-data/pipette/definitions/2/liquid/single_channel/p300/1_4.json b/shared-data/pipette/definitions/2/liquid/single_channel/p300/1_4.json index 93384a77da5..4fb6fbd1950 100644 --- a/shared-data/pipette/definitions/2/liquid/single_channel/p300/1_4.json +++ b/shared-data/pipette/definitions/2/liquid/single_channel/p300/1_4.json @@ -2,85 +2,94 @@ "$otSharedSchema": "#/pipette/schemas/2/pipetteLiquidPropertiesSchema.json", "supportedTips": { "t200": { - "defaultAspirateFlowRate": 150.0, - "defaultDispenseFlowRate": 300.0, - "defaultBlowOutFlowRate": 1000.0, + "defaultAspirateFlowRate": { + "default": 150, + "valuesByApiLevel": { "2.0": 150 } + }, + "defaultDispenseFlowRate": { + "default": 300, + "valuesByApiLevel": { "2.0": 300 } + }, + "defaultBlowOutFlowRate": { + "default": 1000, + "valuesByApiLevel": { "2.0": 1000 } + }, "defaultTipLength": 51.7, - "defaultTipOverlap": 7.47, - "defaultReturnTipHeight": null, "aspirate": { - "opentrons/tipone_96_tiprack_200ul/1": [ - [36.19844973, 0.043, 16.548], - [54.98518519, 0.012, 17.658], - [73.90077516, 0.008, 17.902], - [111.8437953, 0.004, 18.153], - [302.3895337, 0.001, 18.23] - ], - "opentrons/opentrons_96_filtertiprack_200ul/1": [ - [36.19844973, 0.043, 16.548], - [54.98518519, 0.012, 17.658], - [73.90077516, 0.008, 17.902], - [111.8437953, 0.004, 18.153], - [302.3895337, 0.001, 18.23] - ], - "default": [ - [36.19844973, 0.043, 16.548], - [54.98518519, 0.012, 17.658], - [73.90077516, 0.008, 17.902], - [111.8437953, 0.004, 18.153], - [302.3895337, 0.001, 18.23] - ] + "default": { + "1": [ + [36.19844973, 0.043, 16.548], + [54.98518519, 0.012, 17.658], + [73.90077516, 0.008, 17.902], + [111.8437953, 0.004, 18.153], + [302.3895337, 0.001, 18.23] + ], + "2": [ + [53.958, 0.0252, 16.6268], + [73.0217, 0.0141, 17.2234], + [82.6834, 0.0123, 17.3586], + [120.7877, 0.0055, 17.9214], + [197.3909, 0.0028, 18.2415], + [300.0, 0.0014, 18.5235] + ] + } }, "dispense": { - "opentrons/tipone_96_tiprack_200ul/1": [ - [302.3895337, 0.0, 18.83156277] - ], - "opentrons/opentrons_96_filtertiprack_200ul/1": [ - [302.3895337, 0.0, 18.83156277] - ], - "default": [[302.3895337, 0.0, 18.83156277]] - }, - "defaultTipOverlapDictionary": { - "opentrons/tipone_96_tiprack_200ul/1": 6.1, - "opentrons/opentrons_96_filtertiprack_200ul/1": 7.47 + "default": { + "1": [[302.3895337, 0.0, 18.83156277]], + "2": [[302.3895337, 0, 18.83156277]] + } }, "defaultBlowoutVolume": 58.905 }, "t300": { - "defaultAspirateFlowRate": 150.0, - "defaultDispenseFlowRate": 300.0, - "defaultBlowOutFlowRate": 1000.0, + "defaultAspirateFlowRate": { + "default": 150, + "valuesByApiLevel": { "2.0": 150 } + }, + "defaultDispenseFlowRate": { + "default": 300, + "valuesByApiLevel": { "2.0": 300 } + }, + "defaultBlowOutFlowRate": { + "default": 1000, + "valuesByApiLevel": { "2.0": 1000 } + }, "defaultTipLength": 51.7, - "defaultTipOverlap": 7.47, - "defaultReturnTipHeight": null, "aspirate": { - "opentrons/opentrons_96_tiprack_300ul/1": [ - [36.19844973, 0.043, 16.548], - [54.98518519, 0.012, 17.658], - [73.90077516, 0.008, 17.902], - [111.8437953, 0.004, 18.153], - [302.3895337, 0.001, 18.23] - ], - "default": [ - [36.19844973, 0.043, 16.548], - [54.98518519, 0.012, 17.658], - [73.90077516, 0.008, 17.902], - [111.8437953, 0.004, 18.153], - [302.3895337, 0.001, 18.23] - ] + "default": { + "1": [ + [36.19844973, 0.043, 16.548], + [54.98518519, 0.012, 17.658], + [73.90077516, 0.008, 17.902], + [111.8437953, 0.004, 18.153], + [302.3895337, 0.001, 18.23] + ], + "2": [ + [53.958, 0.0252, 16.6268], + [73.0217, 0.0141, 17.2234], + [82.6834, 0.0123, 17.3586], + [120.7877, 0.0055, 17.9214], + [197.3909, 0.0028, 18.2415], + [300.0, 0.0014, 18.5235] + ] + } }, "dispense": { - "opentrons/opentrons_96_tiprack_300ul/1": [ - [302.3895337, 0.0, 18.83156277] - ], - "default": [[302.3895337, 0.0, 18.83156277]] - }, - "defaultTipOverlapDictionary": { - "opentrons/opentrons_96_tiprack_300ul/1": 7.47 + "default": { + "1": [[302.3895337, 0.0, 18.83156277]], + "2": [[302.3895337, 0, 18.83156277]] + } }, "defaultBlowoutVolume": 58.905 } }, + "defaultTipOverlapDictionary": { + "default": 7.47, + "opentrons/tipone_96_tiprack_200ul/1": 6.1, + "opentrons/opentrons_96_filtertiprack_200ul/1": 7.47, + "opentrons/opentrons_96_tiprack_300ul/1": 7.47 + }, "maxVolume": 300, "minVolume": 30.0, "defaultTipracks": [ diff --git a/shared-data/pipette/definitions/2/liquid/single_channel/p300/1_5.json b/shared-data/pipette/definitions/2/liquid/single_channel/p300/1_5.json index 37f310e7837..24904d5a496 100644 --- a/shared-data/pipette/definitions/2/liquid/single_channel/p300/1_5.json +++ b/shared-data/pipette/definitions/2/liquid/single_channel/p300/1_5.json @@ -2,90 +2,78 @@ "$otSharedSchema": "#/pipette/schemas/2/pipetteLiquidPropertiesSchema.json", "supportedTips": { "t200": { - "defaultAspirateFlowRate": 150.0, - "defaultDispenseFlowRate": 300.0, - "defaultBlowOutFlowRate": 1000.0, + "defaultAspirateFlowRate": { + "default": 150, + "valuesByApiLevel": { "2.0": 150 } + }, + "defaultDispenseFlowRate": { + "default": 300, + "valuesByApiLevel": { "2.0": 300 } + }, + "defaultBlowOutFlowRate": { + "default": 1000, + "valuesByApiLevel": { "2.0": 1000 } + }, "defaultTipLength": 51.7, - "defaultTipOverlap": 7.47, - "defaultReturnTipHeight": null, "aspirate": { - "opentrons/tipone_96_tiprack_200ul/1": [ - [35.11266179, 0.03721315938, 16.2497], - [44.37338506, 0.02084320206, 16.8245], - [63.12001468, 0.01519931266, 17.0749], - [148.3020792, 0.005910516464, 17.6612], - [224.5387262, 0.00227975152, 18.1997], - [301.049323, 0.001359578667, 18.4063] - ], - "opentrons/opentrons_96_filtertiprack_200ul/1": [ - [35.11266179, 0.03721315938, 16.2497], - [44.37338506, 0.02084320206, 16.8245], - [63.12001468, 0.01519931266, 17.0749], - [148.3020792, 0.005910516464, 17.6612], - [224.5387262, 0.00227975152, 18.1997], - [301.049323, 0.001359578667, 18.4063] - ], - "default": [ - [35.11266179, 0.03721315938, 16.2497], - [44.37338506, 0.02084320206, 16.8245], - [63.12001468, 0.01519931266, 17.0749], - [148.3020792, 0.005910516464, 17.6612], - [224.5387262, 0.00227975152, 18.1997], - [301.049323, 0.001359578667, 18.4063] - ] + "default": { + "1": [ + [35.11266179, 0.03721315938, 16.2497], + [44.37338506, 0.02084320206, 16.8245], + [63.12001468, 0.01519931266, 17.0749], + [148.3020792, 0.005910516464, 17.6612], + [224.5387262, 0.00227975152, 18.1997], + [301.049323, 0.001359578667, 18.4063] + ] + } }, "dispense": { - "opentrons/tipone_96_tiprack_200ul/1": [ - [302.3895337, 0.0, 18.83156277] - ], - "opentrons/opentrons_96_filtertiprack_200ul/1": [ - [302.3895337, 0.0, 18.83156277] - ], - "default": [[302.3895337, 0.0, 18.83156277]] - }, - "defaultTipOverlapDictionary": { - "opentrons/tipone_96_tiprack_200ul/1": 6.1, - "opentrons/opentrons_96_filtertiprack_200ul/1": 7.47 + "default": { + "1": [[302.3895337, 0.0, 18.83156277]] + } }, "defaultBlowoutVolume": 58.905 }, "t300": { - "defaultAspirateFlowRate": 150.0, - "defaultDispenseFlowRate": 300.0, - "defaultBlowOutFlowRate": 1000.0, + "defaultAspirateFlowRate": { + "default": 150, + "valuesByApiLevel": { "2.0": 150 } + }, + "defaultDispenseFlowRate": { + "default": 300, + "valuesByApiLevel": { "2.0": 300 } + }, + "defaultBlowOutFlowRate": { + "default": 1000, + "valuesByApiLevel": { "2.0": 1000 } + }, "defaultTipLength": 51.7, - "defaultTipOverlap": 7.47, - "defaultReturnTipHeight": null, "aspirate": { - "opentrons/opentrons_96_tiprack_300ul/1": [ - [35.11266179, 0.03721315938, 16.2497], - [44.37338506, 0.02084320206, 16.8245], - [63.12001468, 0.01519931266, 17.0749], - [148.3020792, 0.005910516464, 17.6612], - [224.5387262, 0.00227975152, 18.1997], - [301.049323, 0.001359578667, 18.4063] - ], - "default": [ - [35.11266179, 0.03721315938, 16.2497], - [44.37338506, 0.02084320206, 16.8245], - [63.12001468, 0.01519931266, 17.0749], - [148.3020792, 0.005910516464, 17.6612], - [224.5387262, 0.00227975152, 18.1997], - [301.049323, 0.001359578667, 18.4063] - ] + "default": { + "1": [ + [35.11266179, 0.03721315938, 16.2497], + [44.37338506, 0.02084320206, 16.8245], + [63.12001468, 0.01519931266, 17.0749], + [148.3020792, 0.005910516464, 17.6612], + [224.5387262, 0.00227975152, 18.1997], + [301.049323, 0.001359578667, 18.4063] + ] + } }, "dispense": { - "opentrons/opentrons_96_tiprack_300ul/1": [ - [302.3895337, 0.0, 18.83156277] - ], - "default": [[302.3895337, 0.0, 18.83156277]] - }, - "defaultTipOverlapDictionary": { - "opentrons/opentrons_96_tiprack_300ul/1": 7.47 + "default": { + "1": [[302.3895337, 0.0, 18.83156277]] + } }, "defaultBlowoutVolume": 58.905 } }, + "defaultTipOverlapDictionary": { + "default": 7.47, + "opentrons/tipone_96_tiprack_200ul/1": 6.1, + "opentrons/opentrons_96_filtertiprack_200ul/1": 7.47, + "opentrons/opentrons_96_tiprack_300ul/1": 7.47 + }, "maxVolume": 300, "minVolume": 30.0, "defaultTipracks": [ diff --git a/shared-data/pipette/definitions/2/liquid/single_channel/p300/2_0.json b/shared-data/pipette/definitions/2/liquid/single_channel/p300/2_0.json index 26b6eb59815..9dc7403a5c1 100644 --- a/shared-data/pipette/definitions/2/liquid/single_channel/p300/2_0.json +++ b/shared-data/pipette/definitions/2/liquid/single_channel/p300/2_0.json @@ -2,286 +2,201 @@ "$otSharedSchema": "#/pipette/schemas/2/pipetteLiquidPropertiesSchema.json", "supportedTips": { "t200": { - "defaultAspirateFlowRate": 46.43, - "defaultDispenseFlowRate": 46.43, - "defaultBlowOutFlowRate": 46.43, + "defaultAspirateFlowRate": { + "default": 46.43, + "valuesByApiLevel": { + "2.0": 46.43, + "2.6": 92.86 + } + }, + "defaultDispenseFlowRate": { + "default": 46.43, + "valuesByApiLevel": { + "2.0": 46.43, + "2.6": 92.86 + } + }, + "defaultBlowOutFlowRate": { + "default": 46.43, + "valuesByApiLevel": { + "2.0": 46.43, + "2.6": 92.86 + } + }, "defaultTipLength": 49.0, - "defaultTipOverlap": 8.2, - "defaultReturnTipHeight": null, "aspirate": { - "opentrons/opentrons_96_filtertiprack_200ul/1": [ - [15.0, 0.03765, 8.267], - [16.85, 0.04986, 7.5856], - [25.87, 0.022, 8.056], - [30.38, 0.01239, 8.304], - [34.94, 0.0119, 8.312], - [39.55, 0.0118, 8.322], - [44.17, 0.009613, 8.409], - [53.34, 0.006137, 8.56], - [62.58, 0.005383, 8.603], - [71.88, 0.004954, 8.629], - [81.14, 0.003271, 8.75], - [90.51, 0.003783, 8.709], - [99.77, 0.002023, 8.868], - [109.1, 0.002414, 8.829], - [118.5, 0.002089, 8.865], - [127.7, 0.001333, 8.954], - [137.1, 0.00156, 8.925], - [146.4, 0.00137, 8.952], - [155.7, 0.0009013, 9.02], - [165.1, 0.001024, 9.001], - [174.4, 0.0007312, 9.049], - [183.7, 0.000922, 9.016], - [202.4, 0.0006839, 9.05948], - [221.0, 0.0006408, 9.068], - [239.7, 0.0005434, 9.09], - [258.4, 0.0004064, 9.123], - [277.0, 0.0002951, 9.15], - [295.8, 0.0006016, 9.066], - [305.2, 0.0005193, 9.091] - ], - "default": [ - [15.0, 0.03765, 8.267], - [16.85, 0.04986, 7.5856], - [25.87, 0.022, 8.056], - [30.38, 0.01239, 8.304], - [34.94, 0.0119, 8.312], - [39.55, 0.0118, 8.322], - [44.17, 0.009613, 8.409], - [53.34, 0.006137, 8.56], - [62.58, 0.005383, 8.603], - [71.88, 0.004954, 8.629], - [81.14, 0.003271, 8.75], - [90.51, 0.003783, 8.709], - [99.77, 0.002023, 8.868], - [109.1, 0.002414, 8.829], - [118.5, 0.002089, 8.865], - [127.7, 0.001333, 8.954], - [137.1, 0.00156, 8.925], - [146.4, 0.00137, 8.952], - [155.7, 0.0009013, 9.02], - [165.1, 0.001024, 9.001], - [174.4, 0.0007312, 9.049], - [183.7, 0.000922, 9.016], - [202.4, 0.0006839, 9.05948], - [221.0, 0.0006408, 9.068], - [239.7, 0.0005434, 9.09], - [258.4, 0.0004064, 9.123], - [277.0, 0.0002951, 9.15], - [295.8, 0.0006016, 9.066], - [305.2, 0.0005193, 9.091] - ] + "default": { + "1": [ + [15.0, 0.03765, 8.267], + [16.85, 0.04986, 7.5856], + [25.87, 0.022, 8.056], + [30.38, 0.01239, 8.304], + [34.94, 0.0119, 8.312], + [39.55, 0.0118, 8.322], + [44.17, 0.009613, 8.409], + [53.34, 0.006137, 8.56], + [62.58, 0.005383, 8.603], + [71.88, 0.004954, 8.629], + [81.14, 0.003271, 8.75], + [90.51, 0.003783, 8.709], + [99.77, 0.002023, 8.868], + [109.1, 0.002414, 8.829], + [118.5, 0.002089, 8.865], + [127.7, 0.001333, 8.954], + [137.1, 0.00156, 8.925], + [146.4, 0.00137, 8.952], + [155.7, 0.0009013, 9.02], + [165.1, 0.001024, 9.001], + [174.4, 0.0007312, 9.049], + [183.7, 0.000922, 9.016], + [202.4, 0.0006839, 9.05948], + [221.0, 0.0006408, 9.068], + [239.7, 0.0005434, 9.09], + [258.4, 0.0004064, 9.123], + [277.0, 0.0002951, 9.15], + [295.8, 0.0006016, 9.066], + [305.2, 0.0005193, 9.091] + ] + } }, "dispense": { - "opentrons/opentrons_96_filtertiprack_200ul/1": [ - [15.0, 0.03765, 8.267], - [16.85, 0.04986, 7.5856], - [25.87, 0.022, 8.056], - [30.38, 0.01239, 8.304], - [34.94, 0.0119, 8.312], - [39.55, 0.0118, 8.322], - [44.17, 0.009613, 8.409], - [53.34, 0.006137, 8.56], - [62.58, 0.005383, 8.603], - [71.88, 0.004954, 8.629], - [81.14, 0.003271, 8.75], - [90.51, 0.003783, 8.709], - [99.77, 0.002023, 8.868], - [109.1, 0.002414, 8.829], - [118.5, 0.002089, 8.865], - [127.7, 0.001333, 8.954], - [137.1, 0.00156, 8.925], - [146.4, 0.00137, 8.952], - [155.7, 0.0009013, 9.02], - [165.1, 0.001024, 9.001], - [174.4, 0.0007312, 9.049], - [183.7, 0.000922, 9.016], - [202.4, 0.0006839, 9.05948], - [221.0, 0.0006408, 9.068], - [239.7, 0.0005434, 9.09], - [258.4, 0.0004064, 9.123], - [277.0, 0.0002951, 9.15], - [295.8, 0.0006016, 9.066], - [305.2, 0.0005193, 9.091] - ], - "default": [ - [15.0, 0.03765, 8.267], - [16.85, 0.04986, 7.5856], - [25.87, 0.022, 8.056], - [30.38, 0.01239, 8.304], - [34.94, 0.0119, 8.312], - [39.55, 0.0118, 8.322], - [44.17, 0.009613, 8.409], - [53.34, 0.006137, 8.56], - [62.58, 0.005383, 8.603], - [71.88, 0.004954, 8.629], - [81.14, 0.003271, 8.75], - [90.51, 0.003783, 8.709], - [99.77, 0.002023, 8.868], - [109.1, 0.002414, 8.829], - [118.5, 0.002089, 8.865], - [127.7, 0.001333, 8.954], - [137.1, 0.00156, 8.925], - [146.4, 0.00137, 8.952], - [155.7, 0.0009013, 9.02], - [165.1, 0.001024, 9.001], - [174.4, 0.0007312, 9.049], - [183.7, 0.000922, 9.016], - [202.4, 0.0006839, 9.05948], - [221.0, 0.0006408, 9.068], - [239.7, 0.0005434, 9.09], - [258.4, 0.0004064, 9.123], - [277.0, 0.0002951, 9.15], - [295.8, 0.0006016, 9.066], - [305.2, 0.0005193, 9.091] - ] - }, - "defaultTipOverlapDictionary": { - "opentrons/opentrons_96_filtertiprack_200ul/1": 8.2 + "default": { + "1": [ + [15.0, 0.03765, 8.267], + [16.85, 0.04986, 7.5856], + [25.87, 0.022, 8.056], + [30.38, 0.01239, 8.304], + [34.94, 0.0119, 8.312], + [39.55, 0.0118, 8.322], + [44.17, 0.009613, 8.409], + [53.34, 0.006137, 8.56], + [62.58, 0.005383, 8.603], + [71.88, 0.004954, 8.629], + [81.14, 0.003271, 8.75], + [90.51, 0.003783, 8.709], + [99.77, 0.002023, 8.868], + [109.1, 0.002414, 8.829], + [118.5, 0.002089, 8.865], + [127.7, 0.001333, 8.954], + [137.1, 0.00156, 8.925], + [146.4, 0.00137, 8.952], + [155.7, 0.0009013, 9.02], + [165.1, 0.001024, 9.001], + [174.4, 0.0007312, 9.049], + [183.7, 0.000922, 9.016], + [202.4, 0.0006839, 9.05948], + [221.0, 0.0006408, 9.068], + [239.7, 0.0005434, 9.09], + [258.4, 0.0004064, 9.123], + [277.0, 0.0002951, 9.15], + [295.8, 0.0006016, 9.066], + [305.2, 0.0005193, 9.091] + ] + } }, "defaultBlowoutVolume": 43.295 }, "t300": { - "defaultAspirateFlowRate": 46.43, - "defaultDispenseFlowRate": 46.43, - "defaultBlowOutFlowRate": 46.43, + "defaultAspirateFlowRate": { + "default": 46.43, + "valuesByApiLevel": { + "2.0": 46.43, + "2.6": 92.86 + } + }, + "defaultDispenseFlowRate": { + "default": 46.43, + "valuesByApiLevel": { + "2.0": 46.43, + "2.6": 92.86 + } + }, + "defaultBlowOutFlowRate": { + "default": 46.43, + "valuesByApiLevel": { + "2.0": 46.43, + "2.6": 92.86 + } + }, "defaultTipLength": 49.0, - "defaultTipOverlap": 8.2, - "defaultReturnTipHeight": null, "aspirate": { - "opentrons/opentrons_96_tiprack_300ul/1": [ - [15.0, 0.03765, 8.267], - [16.85, 0.04986, 7.5856], - [25.87, 0.022, 8.056], - [30.38, 0.01239, 8.304], - [34.94, 0.0119, 8.312], - [39.55, 0.0118, 8.322], - [44.17, 0.009613, 8.409], - [53.34, 0.006137, 8.56], - [62.58, 0.005383, 8.603], - [71.88, 0.004954, 8.629], - [81.14, 0.003271, 8.75], - [90.51, 0.003783, 8.709], - [99.77, 0.002023, 8.868], - [109.1, 0.002414, 8.829], - [118.5, 0.002089, 8.865], - [127.7, 0.001333, 8.954], - [137.1, 0.00156, 8.925], - [146.4, 0.00137, 8.952], - [155.7, 0.0009013, 9.02], - [165.1, 0.001024, 9.001], - [174.4, 0.0007312, 9.049], - [183.7, 0.000922, 9.016], - [202.4, 0.0006839, 9.05948], - [221.0, 0.0006408, 9.068], - [239.7, 0.0005434, 9.09], - [258.4, 0.0004064, 9.123], - [277.0, 0.0002951, 9.15], - [295.8, 0.0006016, 9.066], - [305.2, 0.0005193, 9.091] - ], - "default": [ - [15.0, 0.03765, 8.267], - [16.85, 0.04986, 7.5856], - [25.87, 0.022, 8.056], - [30.38, 0.01239, 8.304], - [34.94, 0.0119, 8.312], - [39.55, 0.0118, 8.322], - [44.17, 0.009613, 8.409], - [53.34, 0.006137, 8.56], - [62.58, 0.005383, 8.603], - [71.88, 0.004954, 8.629], - [81.14, 0.003271, 8.75], - [90.51, 0.003783, 8.709], - [99.77, 0.002023, 8.868], - [109.1, 0.002414, 8.829], - [118.5, 0.002089, 8.865], - [127.7, 0.001333, 8.954], - [137.1, 0.00156, 8.925], - [146.4, 0.00137, 8.952], - [155.7, 0.0009013, 9.02], - [165.1, 0.001024, 9.001], - [174.4, 0.0007312, 9.049], - [183.7, 0.000922, 9.016], - [202.4, 0.0006839, 9.05948], - [221.0, 0.0006408, 9.068], - [239.7, 0.0005434, 9.09], - [258.4, 0.0004064, 9.123], - [277.0, 0.0002951, 9.15], - [295.8, 0.0006016, 9.066], - [305.2, 0.0005193, 9.091] - ] + "default": { + "1": [ + [15.0, 0.03765, 8.267], + [16.85, 0.04986, 7.5856], + [25.87, 0.022, 8.056], + [30.38, 0.01239, 8.304], + [34.94, 0.0119, 8.312], + [39.55, 0.0118, 8.322], + [44.17, 0.009613, 8.409], + [53.34, 0.006137, 8.56], + [62.58, 0.005383, 8.603], + [71.88, 0.004954, 8.629], + [81.14, 0.003271, 8.75], + [90.51, 0.003783, 8.709], + [99.77, 0.002023, 8.868], + [109.1, 0.002414, 8.829], + [118.5, 0.002089, 8.865], + [127.7, 0.001333, 8.954], + [137.1, 0.00156, 8.925], + [146.4, 0.00137, 8.952], + [155.7, 0.0009013, 9.02], + [165.1, 0.001024, 9.001], + [174.4, 0.0007312, 9.049], + [183.7, 0.000922, 9.016], + [202.4, 0.0006839, 9.05948], + [221.0, 0.0006408, 9.068], + [239.7, 0.0005434, 9.09], + [258.4, 0.0004064, 9.123], + [277.0, 0.0002951, 9.15], + [295.8, 0.0006016, 9.066], + [305.2, 0.0005193, 9.091] + ] + } }, "dispense": { - "opentrons/opentrons_96_tiprack_300ul/1": [ - [15.0, 0.03765, 8.267], - [16.85, 0.04986, 7.5856], - [25.87, 0.022, 8.056], - [30.38, 0.01239, 8.304], - [34.94, 0.0119, 8.312], - [39.55, 0.0118, 8.322], - [44.17, 0.009613, 8.409], - [53.34, 0.006137, 8.56], - [62.58, 0.005383, 8.603], - [71.88, 0.004954, 8.629], - [81.14, 0.003271, 8.75], - [90.51, 0.003783, 8.709], - [99.77, 0.002023, 8.868], - [109.1, 0.002414, 8.829], - [118.5, 0.002089, 8.865], - [127.7, 0.001333, 8.954], - [137.1, 0.00156, 8.925], - [146.4, 0.00137, 8.952], - [155.7, 0.0009013, 9.02], - [165.1, 0.001024, 9.001], - [174.4, 0.0007312, 9.049], - [183.7, 0.000922, 9.016], - [202.4, 0.0006839, 9.05948], - [221.0, 0.0006408, 9.068], - [239.7, 0.0005434, 9.09], - [258.4, 0.0004064, 9.123], - [277.0, 0.0002951, 9.15], - [295.8, 0.0006016, 9.066], - [305.2, 0.0005193, 9.091] - ], - "default": [ - [15.0, 0.03765, 8.267], - [16.85, 0.04986, 7.5856], - [25.87, 0.022, 8.056], - [30.38, 0.01239, 8.304], - [34.94, 0.0119, 8.312], - [39.55, 0.0118, 8.322], - [44.17, 0.009613, 8.409], - [53.34, 0.006137, 8.56], - [62.58, 0.005383, 8.603], - [71.88, 0.004954, 8.629], - [81.14, 0.003271, 8.75], - [90.51, 0.003783, 8.709], - [99.77, 0.002023, 8.868], - [109.1, 0.002414, 8.829], - [118.5, 0.002089, 8.865], - [127.7, 0.001333, 8.954], - [137.1, 0.00156, 8.925], - [146.4, 0.00137, 8.952], - [155.7, 0.0009013, 9.02], - [165.1, 0.001024, 9.001], - [174.4, 0.0007312, 9.049], - [183.7, 0.000922, 9.016], - [202.4, 0.0006839, 9.05948], - [221.0, 0.0006408, 9.068], - [239.7, 0.0005434, 9.09], - [258.4, 0.0004064, 9.123], - [277.0, 0.0002951, 9.15], - [295.8, 0.0006016, 9.066], - [305.2, 0.0005193, 9.091] - ] - }, - "defaultTipOverlapDictionary": { - "opentrons/opentrons_96_tiprack_300ul/1": 8.2 + "default": { + "1": [ + [15.0, 0.03765, 8.267], + [16.85, 0.04986, 7.5856], + [25.87, 0.022, 8.056], + [30.38, 0.01239, 8.304], + [34.94, 0.0119, 8.312], + [39.55, 0.0118, 8.322], + [44.17, 0.009613, 8.409], + [53.34, 0.006137, 8.56], + [62.58, 0.005383, 8.603], + [71.88, 0.004954, 8.629], + [81.14, 0.003271, 8.75], + [90.51, 0.003783, 8.709], + [99.77, 0.002023, 8.868], + [109.1, 0.002414, 8.829], + [118.5, 0.002089, 8.865], + [127.7, 0.001333, 8.954], + [137.1, 0.00156, 8.925], + [146.4, 0.00137, 8.952], + [155.7, 0.0009013, 9.02], + [165.1, 0.001024, 9.001], + [174.4, 0.0007312, 9.049], + [183.7, 0.000922, 9.016], + [202.4, 0.0006839, 9.05948], + [221.0, 0.0006408, 9.068], + [239.7, 0.0005434, 9.09], + [258.4, 0.0004064, 9.123], + [277.0, 0.0002951, 9.15], + [295.8, 0.0006016, 9.066], + [305.2, 0.0005193, 9.091] + ] + } }, "defaultBlowoutVolume": 43.295 } }, + "defaultTipOverlapDictionary": { + "default": 8.2, + "opentrons/opentrons_96_tiprack_300ul/1": 8.2, + "opentrons/opentrons_96_filtertiprack_200ul/1": 8.2 + }, "maxVolume": 300, "minVolume": 20.0, "defaultTipracks": [ diff --git a/shared-data/pipette/definitions/2/liquid/single_channel/p300/2_1.json b/shared-data/pipette/definitions/2/liquid/single_channel/p300/2_1.json index 10c29baca12..fd654b1c870 100644 --- a/shared-data/pipette/definitions/2/liquid/single_channel/p300/2_1.json +++ b/shared-data/pipette/definitions/2/liquid/single_channel/p300/2_1.json @@ -2,286 +2,201 @@ "$otSharedSchema": "#/pipette/schemas/2/pipetteLiquidPropertiesSchema.json", "supportedTips": { "t200": { - "defaultAspirateFlowRate": 46.43, - "defaultDispenseFlowRate": 46.43, - "defaultBlowOutFlowRate": 46.43, + "defaultAspirateFlowRate": { + "default": 46.43, + "valuesByApiLevel": { + "2.0": 46.43, + "2.6": 92.86 + } + }, + "defaultDispenseFlowRate": { + "default": 46.43, + "valuesByApiLevel": { + "2.0": 46.43, + "2.6": 92.86 + } + }, + "defaultBlowOutFlowRate": { + "default": 46.43, + "valuesByApiLevel": { + "2.0": 46.43, + "2.6": 92.86 + } + }, "defaultTipLength": 49.0, - "defaultTipOverlap": 8.2, - "defaultReturnTipHeight": null, "aspirate": { - "opentrons/opentrons_96_filtertiprack_200ul/1": [ - [14.7756, 0.0665, 8.0865], - [16.5924, 0.0482, 7.4964], - [25.7471, 0.0313, 7.7776], - [30.3716, 0.0206, 8.0522], - [35.0387, 0.0176, 8.1435], - [39.6218, 0.0099, 8.4143], - [44.2371, 0.0092, 8.4393], - [53.5373, 0.0081, 8.4885], - [62.8398, 0.0058, 8.6108], - [72.1873, 0.005, 8.6658], - [81.5098, 0.0036, 8.7661], - [90.8491, 0.003, 8.8099], - [100.1749, 0.0023, 8.8716], - [109.5784, 0.0026, 8.8434], - [118.9531, 0.002, 8.9129], - [128.3267, 0.0017, 8.9478], - [137.6582, 0.0012, 9.0146], - [147.0504, 0.0014, 8.9803], - [156.4156, 0.0011, 9.0295], - [165.7858, 0.001, 9.0439], - [175.1029, 0.0006, 9.1103], - [184.4962, 0.0009, 9.0506], - [203.316, 0.0009, 9.0599], - [222.0502, 0.0006, 9.1282], - [240.872, 0.0006, 9.108], - [259.7109, 0.0006, 9.1226], - [278.4011, 0.0002, 9.2108], - [297.4147, 0.0007, 9.0725], - [306.8498, 0.0005, 9.1596] - ], - "default": [ - [14.7756, 0.0665, 8.0865], - [16.5924, 0.0482, 7.4964], - [25.7471, 0.0313, 7.7776], - [30.3716, 0.0206, 8.0522], - [35.0387, 0.0176, 8.1435], - [39.6218, 0.0099, 8.4143], - [44.2371, 0.0092, 8.4393], - [53.5373, 0.0081, 8.4885], - [62.8398, 0.0058, 8.6108], - [72.1873, 0.005, 8.6658], - [81.5098, 0.0036, 8.7661], - [90.8491, 0.003, 8.8099], - [100.1749, 0.0023, 8.8716], - [109.5784, 0.0026, 8.8434], - [118.9531, 0.002, 8.9129], - [128.3267, 0.0017, 8.9478], - [137.6582, 0.0012, 9.0146], - [147.0504, 0.0014, 8.9803], - [156.4156, 0.0011, 9.0295], - [165.7858, 0.001, 9.0439], - [175.1029, 0.0006, 9.1103], - [184.4962, 0.0009, 9.0506], - [203.316, 0.0009, 9.0599], - [222.0502, 0.0006, 9.1282], - [240.872, 0.0006, 9.108], - [259.7109, 0.0006, 9.1226], - [278.4011, 0.0002, 9.2108], - [297.4147, 0.0007, 9.0725], - [306.8498, 0.0005, 9.1596] - ] + "default": { + "1": [ + [14.7756, 0.0665, 8.0865], + [16.5924, 0.0482, 7.4964], + [25.7471, 0.0313, 7.7776], + [30.3716, 0.0206, 8.0522], + [35.0387, 0.0176, 8.1435], + [39.6218, 0.0099, 8.4143], + [44.2371, 0.0092, 8.4393], + [53.5373, 0.0081, 8.4885], + [62.8398, 0.0058, 8.6108], + [72.1873, 0.005, 8.6658], + [81.5098, 0.0036, 8.7661], + [90.8491, 0.003, 8.8099], + [100.1749, 0.0023, 8.8716], + [109.5784, 0.0026, 8.8434], + [118.9531, 0.002, 8.9129], + [128.3267, 0.0017, 8.9478], + [137.6582, 0.0012, 9.0146], + [147.0504, 0.0014, 8.9803], + [156.4156, 0.0011, 9.0295], + [165.7858, 0.001, 9.0439], + [175.1029, 0.0006, 9.1103], + [184.4962, 0.0009, 9.0506], + [203.316, 0.0009, 9.0599], + [222.0502, 0.0006, 9.1282], + [240.872, 0.0006, 9.108], + [259.7109, 0.0006, 9.1226], + [278.4011, 0.0002, 9.2108], + [297.4147, 0.0007, 9.0725], + [306.8498, 0.0005, 9.1596] + ] + } }, "dispense": { - "opentrons/opentrons_96_filtertiprack_200ul/1": [ - [14.7756, 0.0665, 8.0865], - [16.5924, 0.0482, 7.4964], - [25.7471, 0.0313, 7.7776], - [30.3716, 0.0206, 8.0522], - [35.0387, 0.0176, 8.1435], - [39.6218, 0.0099, 8.4143], - [44.2371, 0.0092, 8.4393], - [53.5373, 0.0081, 8.4885], - [62.8398, 0.0058, 8.6108], - [72.1873, 0.005, 8.6658], - [81.5098, 0.0036, 8.7661], - [90.8491, 0.003, 8.8099], - [100.1749, 0.0023, 8.8716], - [109.5784, 0.0026, 8.8434], - [118.9531, 0.002, 8.9129], - [128.3267, 0.0017, 8.9478], - [137.6582, 0.0012, 9.0146], - [147.0504, 0.0014, 8.9803], - [156.4156, 0.0011, 9.0295], - [165.7858, 0.001, 9.0439], - [175.1029, 0.0006, 9.1103], - [184.4962, 0.0009, 9.0506], - [203.316, 0.0009, 9.0599], - [222.0502, 0.0006, 9.1282], - [240.872, 0.0006, 9.108], - [259.7109, 0.0006, 9.1226], - [278.4011, 0.0002, 9.2108], - [297.4147, 0.0007, 9.0725], - [306.8498, 0.0005, 9.1596] - ], - "default": [ - [14.7756, 0.0665, 8.0865], - [16.5924, 0.0482, 7.4964], - [25.7471, 0.0313, 7.7776], - [30.3716, 0.0206, 8.0522], - [35.0387, 0.0176, 8.1435], - [39.6218, 0.0099, 8.4143], - [44.2371, 0.0092, 8.4393], - [53.5373, 0.0081, 8.4885], - [62.8398, 0.0058, 8.6108], - [72.1873, 0.005, 8.6658], - [81.5098, 0.0036, 8.7661], - [90.8491, 0.003, 8.8099], - [100.1749, 0.0023, 8.8716], - [109.5784, 0.0026, 8.8434], - [118.9531, 0.002, 8.9129], - [128.3267, 0.0017, 8.9478], - [137.6582, 0.0012, 9.0146], - [147.0504, 0.0014, 8.9803], - [156.4156, 0.0011, 9.0295], - [165.7858, 0.001, 9.0439], - [175.1029, 0.0006, 9.1103], - [184.4962, 0.0009, 9.0506], - [203.316, 0.0009, 9.0599], - [222.0502, 0.0006, 9.1282], - [240.872, 0.0006, 9.108], - [259.7109, 0.0006, 9.1226], - [278.4011, 0.0002, 9.2108], - [297.4147, 0.0007, 9.0725], - [306.8498, 0.0005, 9.1596] - ] - }, - "defaultTipOverlapDictionary": { - "opentrons/opentrons_96_filtertiprack_200ul/1": 8.2 + "default": { + "1": [ + [14.7756, 0.0665, 8.0865], + [16.5924, 0.0482, 7.4964], + [25.7471, 0.0313, 7.7776], + [30.3716, 0.0206, 8.0522], + [35.0387, 0.0176, 8.1435], + [39.6218, 0.0099, 8.4143], + [44.2371, 0.0092, 8.4393], + [53.5373, 0.0081, 8.4885], + [62.8398, 0.0058, 8.6108], + [72.1873, 0.005, 8.6658], + [81.5098, 0.0036, 8.7661], + [90.8491, 0.003, 8.8099], + [100.1749, 0.0023, 8.8716], + [109.5784, 0.0026, 8.8434], + [118.9531, 0.002, 8.9129], + [128.3267, 0.0017, 8.9478], + [137.6582, 0.0012, 9.0146], + [147.0504, 0.0014, 8.9803], + [156.4156, 0.0011, 9.0295], + [165.7858, 0.001, 9.0439], + [175.1029, 0.0006, 9.1103], + [184.4962, 0.0009, 9.0506], + [203.316, 0.0009, 9.0599], + [222.0502, 0.0006, 9.1282], + [240.872, 0.0006, 9.108], + [259.7109, 0.0006, 9.1226], + [278.4011, 0.0002, 9.2108], + [297.4147, 0.0007, 9.0725], + [306.8498, 0.0005, 9.1596] + ] + } }, "defaultBlowoutVolume": 43.295 }, "t300": { - "defaultAspirateFlowRate": 46.43, - "defaultDispenseFlowRate": 46.43, - "defaultBlowOutFlowRate": 46.43, + "defaultAspirateFlowRate": { + "default": 46.43, + "valuesByApiLevel": { + "2.0": 46.43, + "2.6": 92.86 + } + }, + "defaultDispenseFlowRate": { + "default": 46.43, + "valuesByApiLevel": { + "2.0": 46.43, + "2.6": 92.86 + } + }, + "defaultBlowOutFlowRate": { + "default": 46.43, + "valuesByApiLevel": { + "2.0": 46.43, + "2.6": 92.86 + } + }, "defaultTipLength": 49.0, - "defaultTipOverlap": 8.2, - "defaultReturnTipHeight": null, "aspirate": { - "opentrons/opentrons_96_tiprack_300ul/1": [ - [14.7756, 0.0665, 8.0865], - [16.5924, 0.0482, 7.4964], - [25.7471, 0.0313, 7.7776], - [30.3716, 0.0206, 8.0522], - [35.0387, 0.0176, 8.1435], - [39.6218, 0.0099, 8.4143], - [44.2371, 0.0092, 8.4393], - [53.5373, 0.0081, 8.4885], - [62.8398, 0.0058, 8.6108], - [72.1873, 0.005, 8.6658], - [81.5098, 0.0036, 8.7661], - [90.8491, 0.003, 8.8099], - [100.1749, 0.0023, 8.8716], - [109.5784, 0.0026, 8.8434], - [118.9531, 0.002, 8.9129], - [128.3267, 0.0017, 8.9478], - [137.6582, 0.0012, 9.0146], - [147.0504, 0.0014, 8.9803], - [156.4156, 0.0011, 9.0295], - [165.7858, 0.001, 9.0439], - [175.1029, 0.0006, 9.1103], - [184.4962, 0.0009, 9.0506], - [203.316, 0.0009, 9.0599], - [222.0502, 0.0006, 9.1282], - [240.872, 0.0006, 9.108], - [259.7109, 0.0006, 9.1226], - [278.4011, 0.0002, 9.2108], - [297.4147, 0.0007, 9.0725], - [306.8498, 0.0005, 9.1596] - ], - "default": [ - [14.7756, 0.0665, 8.0865], - [16.5924, 0.0482, 7.4964], - [25.7471, 0.0313, 7.7776], - [30.3716, 0.0206, 8.0522], - [35.0387, 0.0176, 8.1435], - [39.6218, 0.0099, 8.4143], - [44.2371, 0.0092, 8.4393], - [53.5373, 0.0081, 8.4885], - [62.8398, 0.0058, 8.6108], - [72.1873, 0.005, 8.6658], - [81.5098, 0.0036, 8.7661], - [90.8491, 0.003, 8.8099], - [100.1749, 0.0023, 8.8716], - [109.5784, 0.0026, 8.8434], - [118.9531, 0.002, 8.9129], - [128.3267, 0.0017, 8.9478], - [137.6582, 0.0012, 9.0146], - [147.0504, 0.0014, 8.9803], - [156.4156, 0.0011, 9.0295], - [165.7858, 0.001, 9.0439], - [175.1029, 0.0006, 9.1103], - [184.4962, 0.0009, 9.0506], - [203.316, 0.0009, 9.0599], - [222.0502, 0.0006, 9.1282], - [240.872, 0.0006, 9.108], - [259.7109, 0.0006, 9.1226], - [278.4011, 0.0002, 9.2108], - [297.4147, 0.0007, 9.0725], - [306.8498, 0.0005, 9.1596] - ] + "default": { + "1": [ + [14.7756, 0.0665, 8.0865], + [16.5924, 0.0482, 7.4964], + [25.7471, 0.0313, 7.7776], + [30.3716, 0.0206, 8.0522], + [35.0387, 0.0176, 8.1435], + [39.6218, 0.0099, 8.4143], + [44.2371, 0.0092, 8.4393], + [53.5373, 0.0081, 8.4885], + [62.8398, 0.0058, 8.6108], + [72.1873, 0.005, 8.6658], + [81.5098, 0.0036, 8.7661], + [90.8491, 0.003, 8.8099], + [100.1749, 0.0023, 8.8716], + [109.5784, 0.0026, 8.8434], + [118.9531, 0.002, 8.9129], + [128.3267, 0.0017, 8.9478], + [137.6582, 0.0012, 9.0146], + [147.0504, 0.0014, 8.9803], + [156.4156, 0.0011, 9.0295], + [165.7858, 0.001, 9.0439], + [175.1029, 0.0006, 9.1103], + [184.4962, 0.0009, 9.0506], + [203.316, 0.0009, 9.0599], + [222.0502, 0.0006, 9.1282], + [240.872, 0.0006, 9.108], + [259.7109, 0.0006, 9.1226], + [278.4011, 0.0002, 9.2108], + [297.4147, 0.0007, 9.0725], + [306.8498, 0.0005, 9.1596] + ] + } }, "dispense": { - "opentrons/opentrons_96_tiprack_300ul/1": [ - [14.7756, 0.0665, 8.0865], - [16.5924, 0.0482, 7.4964], - [25.7471, 0.0313, 7.7776], - [30.3716, 0.0206, 8.0522], - [35.0387, 0.0176, 8.1435], - [39.6218, 0.0099, 8.4143], - [44.2371, 0.0092, 8.4393], - [53.5373, 0.0081, 8.4885], - [62.8398, 0.0058, 8.6108], - [72.1873, 0.005, 8.6658], - [81.5098, 0.0036, 8.7661], - [90.8491, 0.003, 8.8099], - [100.1749, 0.0023, 8.8716], - [109.5784, 0.0026, 8.8434], - [118.9531, 0.002, 8.9129], - [128.3267, 0.0017, 8.9478], - [137.6582, 0.0012, 9.0146], - [147.0504, 0.0014, 8.9803], - [156.4156, 0.0011, 9.0295], - [165.7858, 0.001, 9.0439], - [175.1029, 0.0006, 9.1103], - [184.4962, 0.0009, 9.0506], - [203.316, 0.0009, 9.0599], - [222.0502, 0.0006, 9.1282], - [240.872, 0.0006, 9.108], - [259.7109, 0.0006, 9.1226], - [278.4011, 0.0002, 9.2108], - [297.4147, 0.0007, 9.0725], - [306.8498, 0.0005, 9.1596] - ], - "default": [ - [14.7756, 0.0665, 8.0865], - [16.5924, 0.0482, 7.4964], - [25.7471, 0.0313, 7.7776], - [30.3716, 0.0206, 8.0522], - [35.0387, 0.0176, 8.1435], - [39.6218, 0.0099, 8.4143], - [44.2371, 0.0092, 8.4393], - [53.5373, 0.0081, 8.4885], - [62.8398, 0.0058, 8.6108], - [72.1873, 0.005, 8.6658], - [81.5098, 0.0036, 8.7661], - [90.8491, 0.003, 8.8099], - [100.1749, 0.0023, 8.8716], - [109.5784, 0.0026, 8.8434], - [118.9531, 0.002, 8.9129], - [128.3267, 0.0017, 8.9478], - [137.6582, 0.0012, 9.0146], - [147.0504, 0.0014, 8.9803], - [156.4156, 0.0011, 9.0295], - [165.7858, 0.001, 9.0439], - [175.1029, 0.0006, 9.1103], - [184.4962, 0.0009, 9.0506], - [203.316, 0.0009, 9.0599], - [222.0502, 0.0006, 9.1282], - [240.872, 0.0006, 9.108], - [259.7109, 0.0006, 9.1226], - [278.4011, 0.0002, 9.2108], - [297.4147, 0.0007, 9.0725], - [306.8498, 0.0005, 9.1596] - ] - }, - "defaultTipOverlapDictionary": { - "opentrons/opentrons_96_tiprack_300ul/1": 8.2 + "default": { + "1": [ + [14.7756, 0.0665, 8.0865], + [16.5924, 0.0482, 7.4964], + [25.7471, 0.0313, 7.7776], + [30.3716, 0.0206, 8.0522], + [35.0387, 0.0176, 8.1435], + [39.6218, 0.0099, 8.4143], + [44.2371, 0.0092, 8.4393], + [53.5373, 0.0081, 8.4885], + [62.8398, 0.0058, 8.6108], + [72.1873, 0.005, 8.6658], + [81.5098, 0.0036, 8.7661], + [90.8491, 0.003, 8.8099], + [100.1749, 0.0023, 8.8716], + [109.5784, 0.0026, 8.8434], + [118.9531, 0.002, 8.9129], + [128.3267, 0.0017, 8.9478], + [137.6582, 0.0012, 9.0146], + [147.0504, 0.0014, 8.9803], + [156.4156, 0.0011, 9.0295], + [165.7858, 0.001, 9.0439], + [175.1029, 0.0006, 9.1103], + [184.4962, 0.0009, 9.0506], + [203.316, 0.0009, 9.0599], + [222.0502, 0.0006, 9.1282], + [240.872, 0.0006, 9.108], + [259.7109, 0.0006, 9.1226], + [278.4011, 0.0002, 9.2108], + [297.4147, 0.0007, 9.0725], + [306.8498, 0.0005, 9.1596] + ] + } }, "defaultBlowoutVolume": 43.295 } }, + "defaultTipOverlapDictionary": { + "default": 8.2, + "opentrons/opentrons_96_tiprack_300ul/1": 8.2, + "opentrons/opentrons_96_filtertiprack_200ul/1": 8.2 + }, "maxVolume": 300, "minVolume": 20.0, "defaultTipracks": [ diff --git a/shared-data/pipette/definitions/2/liquid/single_channel/p50/1_0.json b/shared-data/pipette/definitions/2/liquid/single_channel/p50/1_0.json index 7d793ecabd5..e5c82c6aa13 100644 --- a/shared-data/pipette/definitions/2/liquid/single_channel/p50/1_0.json +++ b/shared-data/pipette/definitions/2/liquid/single_channel/p50/1_0.json @@ -2,69 +2,86 @@ "$otSharedSchema": "#/pipette/schemas/2/pipetteLiquidPropertiesSchema.json", "supportedTips": { "t200": { - "defaultAspirateFlowRate": 25.0, - "defaultDispenseFlowRate": 50.0, - "defaultBlowOutFlowRate": 1000.0, + "defaultAspirateFlowRate": { + "default": 25, + "valuesByApiLevel": { "2.0": 25 } + }, + "defaultDispenseFlowRate": { + "default": 50, + "valuesByApiLevel": { "2.0": 50 } + }, + "defaultBlowOutFlowRate": { + "default": 1000, + "valuesByApiLevel": { "2.0": 1000 } + }, "defaultTipLength": 51.7, - "defaultTipOverlap": 7.47, - "defaultReturnTipHeight": null, "aspirate": { - "opentrons/tipone_96_tiprack_200ul/1": [ - [11.79687499, -0.0098, 3.064988953], - [50.0, -0.0004, 2.954068131] - ], - "opentrons/opentrons_96_filtertiprack_200ul/1": [ - [11.79687499, -0.0098, 3.064988953], - [50.0, -0.0004, 2.954068131] - ], - "default": [ - [11.79687499, -0.0098, 3.064988953], - [50.0, -0.0004, 2.954068131] - ] + "default": { + "1": [ + [11.79687499, -0.0098, 3.064988953], + [50.0, -0.0004, 2.954068131] + ], + "2": [ + [5.538952382, 0.04994568474, 2.492829422], + [7.050333334, 0.0335171238, 2.583826438], + [11.5397619, 0.01443549911, 2.718358253], + [17.55071427, 0.006684226987, 2.807806088], + [50, 0.001789563193, 2.893710933] + ] + } }, "dispense": { - "opentrons/tipone_96_tiprack_200ul/1": [[50.0, 0.0, 2.931601299]], - "opentrons/opentrons_96_filtertiprack_200ul/1": [ - [50.0, 0.0, 2.931601299] - ], - "default": [ - [11.79687499, -0.0098, 3.064988953], - [50.0, -0.0004, 2.954068131] - ] - }, - "defaultTipOverlapDictionary": { - "opentrons/tipone_96_tiprack_200ul/1": 6.1, - "opentrons/opentrons_96_filtertiprack_200ul/1": 7.47 + "default": { + "1": [[50, 0, 2.931601299]], + "2": [[50, 0, 2.931601299]] + } }, "defaultBlowoutVolume": 4.712 }, "t300": { - "defaultAspirateFlowRate": 25.0, - "defaultDispenseFlowRate": 50.0, - "defaultBlowOutFlowRate": 1000.0, + "defaultAspirateFlowRate": { + "default": 25, + "valuesByApiLevel": { "2.0": 25 } + }, + "defaultDispenseFlowRate": { + "default": 50, + "valuesByApiLevel": { "2.0": 50 } + }, + "defaultBlowOutFlowRate": { + "default": 1000, + "valuesByApiLevel": { "2.0": 1000 } + }, "defaultTipLength": 51.7, - "defaultTipOverlap": 7.47, - "defaultReturnTipHeight": null, "aspirate": { - "opentrons/opentrons_96_tiprack_300ul/1": [ - [11.79687499, -0.0098, 3.064988953], - [50.0, -0.0004, 2.954068131] - ], - "default": [ - [11.79687499, -0.0098, 3.064988953], - [50.0, -0.0004, 2.954068131] - ] + "default": { + "1": [ + [11.79687499, -0.0098, 3.064988953], + [50.0, -0.0004, 2.954068131] + ], + "2": [ + [5.538952382, 0.04994568474, 2.492829422], + [7.050333334, 0.0335171238, 2.583826438], + [11.5397619, 0.01443549911, 2.718358253], + [17.55071427, 0.006684226987, 2.807806088], + [50, 0.001789563193, 2.893710933] + ] + } }, "dispense": { - "opentrons/opentrons_96_tiprack_300ul/1": [[50.0, 0.0, 2.931601299]], - "default": [[50.0, 0.0, 2.931601299]] - }, - "defaultTipOverlapDictionary": { - "opentrons/opentrons_96_tiprack_300ul/1": 7.47 + "default": { + "1": [[50, 0, 2.931601299]], + "2": [[50, 0, 2.931601299]] + } }, "defaultBlowoutVolume": 4.712 } }, + "defaultTipOverlapDictionary": { + "default": 7.47, + "opentrons/opentrons_96_tiprack_300ul/1": 7.47, + "opentrons/tipone_96_tiprack_200ul/1": 6.1, + "opentrons/opentrons_96_filtertiprack_200ul/1": 7.47 + }, "maxVolume": 50, "minVolume": 5.0, "defaultTipracks": [ diff --git a/shared-data/pipette/definitions/2/liquid/single_channel/p50/1_3.json b/shared-data/pipette/definitions/2/liquid/single_channel/p50/1_3.json index c9f90e2f915..70a615339a0 100644 --- a/shared-data/pipette/definitions/2/liquid/single_channel/p50/1_3.json +++ b/shared-data/pipette/definitions/2/liquid/single_channel/p50/1_3.json @@ -2,61 +2,86 @@ "$otSharedSchema": "#/pipette/schemas/2/pipetteLiquidPropertiesSchema.json", "supportedTips": { "t200": { - "defaultAspirateFlowRate": 25.0, - "defaultDispenseFlowRate": 50.0, - "defaultBlowOutFlowRate": 1000.0, + "defaultAspirateFlowRate": { + "default": 25, + "valuesByApiLevel": { "2.0": 25 } + }, + "defaultDispenseFlowRate": { + "default": 50, + "valuesByApiLevel": { "2.0": 50 } + }, + "defaultBlowOutFlowRate": { + "default": 1000, + "valuesByApiLevel": { "2.0": 1000 } + }, "defaultTipLength": 51.7, - "defaultTipOverlap": 7.47, - "defaultReturnTipHeight": null, "aspirate": { - "opentrons/tipone_96_tiprack_200ul/1": [ - [11.79687499, -0.0098, 3.064988953], - [50.0, -0.0004, 2.954068131] - ], - "opentrons/opentrons_96_filtertiprack_200ul/1": [ - [11.79687499, -0.0098, 3.064988953], - [50.0, -0.0004, 2.954068131] - ], - "default": [ - [11.79687499, -0.0098, 3.064988953], - [50.0, -0.0004, 2.954068131] - ] + "default": { + "1": [ + [11.79687499, -0.0098, 3.064988953], + [50.0, -0.0004, 2.954068131] + ], + "2": [ + [5.538952382, 0.04994568474, 2.492829422], + [7.050333334, 0.0335171238, 2.583826438], + [11.5397619, 0.01443549911, 2.718358253], + [17.55071427, 0.006684226987, 2.807806088], + [50, 0.001789563193, 2.893710933] + ] + } }, "dispense": { - "opentrons/tipone_96_tiprack_200ul/1": [[50.0, 0.0, 2.931601299]], - "opentrons/opentrons_96_filtertiprack_200ul/1": [ - [50.0, 0.0, 2.931601299] - ], - "default": [[50.0, 0.0, 2.931601299]] - }, - "defaultTipOverlapDictionary": { - "opentrons/tipone_96_tiprack_200ul/1": 6.1, - "opentrons/opentrons_96_filtertiprack_200ul/1": 7.47 + "default": { + "1": [[50.0, 0.0, 2.931601299]], + "2": [[50, 0, 2.931601299]] + } }, "defaultBlowoutVolume": 4.712 }, "t300": { - "defaultAspirateFlowRate": 25.0, - "defaultDispenseFlowRate": 50.0, - "defaultBlowOutFlowRate": 1000.0, + "defaultAspirateFlowRate": { + "default": 25, + "valuesByApiLevel": { "2.0": 25 } + }, + "defaultDispenseFlowRate": { + "default": 50, + "valuesByApiLevel": { "2.0": 50 } + }, + "defaultBlowOutFlowRate": { + "default": 1000, + "valuesByApiLevel": { "2.0": 1000 } + }, "defaultTipLength": 51.7, - "defaultTipOverlap": 7.47, - "defaultReturnTipHeight": null, "aspirate": { - "opentrons/opentrons_96_tiprack_300ul/1": [ - [11.79687499, -0.0098, 3.064988953], - [50.0, -0.0004, 2.954068131] - ] + "default": { + "1": [ + [11.79687499, -0.0098, 3.064988953], + [50.0, -0.0004, 2.954068131] + ], + "2": [ + [5.538952382, 0.04994568474, 2.492829422], + [7.050333334, 0.0335171238, 2.583826438], + [11.5397619, 0.01443549911, 2.718358253], + [17.55071427, 0.006684226987, 2.807806088], + [50, 0.001789563193, 2.893710933] + ] + } }, "dispense": { - "opentrons/opentrons_96_tiprack_300ul/1": [[50.0, 0.0, 2.931601299]] - }, - "defaultTipOverlapDictionary": { - "opentrons/opentrons_96_tiprack_300ul/1": 7.47 + "default": { + "1": [[50.0, 0.0, 2.931601299]], + "2": [[50, 0, 2.931601299]] + } }, "defaultBlowoutVolume": 4.712 } }, + "defaultTipOverlapDictionary": { + "default": 7.47, + "opentrons/opentrons_96_tiprack_300ul/1": 7.47, + "opentrons/tipone_96_tiprack_200ul/1": 6.1, + "opentrons/opentrons_96_filtertiprack_200ul/1": 7.47 + }, "maxVolume": 50, "minVolume": 5.0, "defaultTipracks": [ diff --git a/shared-data/pipette/definitions/2/liquid/single_channel/p50/1_4.json b/shared-data/pipette/definitions/2/liquid/single_channel/p50/1_4.json index f72dd55310e..70a615339a0 100644 --- a/shared-data/pipette/definitions/2/liquid/single_channel/p50/1_4.json +++ b/shared-data/pipette/definitions/2/liquid/single_channel/p50/1_4.json @@ -2,66 +2,86 @@ "$otSharedSchema": "#/pipette/schemas/2/pipetteLiquidPropertiesSchema.json", "supportedTips": { "t200": { - "defaultAspirateFlowRate": 25.0, - "defaultDispenseFlowRate": 50.0, - "defaultBlowOutFlowRate": 1000.0, + "defaultAspirateFlowRate": { + "default": 25, + "valuesByApiLevel": { "2.0": 25 } + }, + "defaultDispenseFlowRate": { + "default": 50, + "valuesByApiLevel": { "2.0": 50 } + }, + "defaultBlowOutFlowRate": { + "default": 1000, + "valuesByApiLevel": { "2.0": 1000 } + }, "defaultTipLength": 51.7, - "defaultTipOverlap": 7.47, - "defaultReturnTipHeight": null, "aspirate": { - "opentrons/tipone_96_tiprack_200ul/1": [ - [11.79687499, -0.0098, 3.064988953], - [50.0, -0.0004, 2.954068131] - ], - "opentrons/opentrons_96_filtertiprack_200ul/1": [ - [11.79687499, -0.0098, 3.064988953], - [50.0, -0.0004, 2.954068131] - ], - "default": [ - [11.79687499, -0.0098, 3.064988953], - [50.0, -0.0004, 2.954068131] - ] + "default": { + "1": [ + [11.79687499, -0.0098, 3.064988953], + [50.0, -0.0004, 2.954068131] + ], + "2": [ + [5.538952382, 0.04994568474, 2.492829422], + [7.050333334, 0.0335171238, 2.583826438], + [11.5397619, 0.01443549911, 2.718358253], + [17.55071427, 0.006684226987, 2.807806088], + [50, 0.001789563193, 2.893710933] + ] + } }, "dispense": { - "opentrons/tipone_96_tiprack_200ul/1": [[50.0, 0.0, 2.931601299]], - "opentrons/opentrons_96_filtertiprack_200ul/1": [ - [50.0, 0.0, 2.931601299] - ], - "default": [[50.0, 0.0, 2.931601299]] - }, - "defaultTipOverlapDictionary": { - "opentrons/tipone_96_tiprack_200ul/1": 6.1, - "opentrons/opentrons_96_filtertiprack_200ul/1": 7.47 + "default": { + "1": [[50.0, 0.0, 2.931601299]], + "2": [[50, 0, 2.931601299]] + } }, "defaultBlowoutVolume": 4.712 }, "t300": { - "defaultAspirateFlowRate": 25.0, - "defaultDispenseFlowRate": 50.0, - "defaultBlowOutFlowRate": 1000.0, + "defaultAspirateFlowRate": { + "default": 25, + "valuesByApiLevel": { "2.0": 25 } + }, + "defaultDispenseFlowRate": { + "default": 50, + "valuesByApiLevel": { "2.0": 50 } + }, + "defaultBlowOutFlowRate": { + "default": 1000, + "valuesByApiLevel": { "2.0": 1000 } + }, "defaultTipLength": 51.7, - "defaultTipOverlap": 7.47, - "defaultReturnTipHeight": null, "aspirate": { - "opentrons/opentrons_96_tiprack_300ul/1": [ - [11.79687499, -0.0098, 3.064988953], - [50.0, -0.0004, 2.954068131] - ], - "default": [ - [11.79687499, -0.0098, 3.064988953], - [50.0, -0.0004, 2.954068131] - ] + "default": { + "1": [ + [11.79687499, -0.0098, 3.064988953], + [50.0, -0.0004, 2.954068131] + ], + "2": [ + [5.538952382, 0.04994568474, 2.492829422], + [7.050333334, 0.0335171238, 2.583826438], + [11.5397619, 0.01443549911, 2.718358253], + [17.55071427, 0.006684226987, 2.807806088], + [50, 0.001789563193, 2.893710933] + ] + } }, "dispense": { - "opentrons/opentrons_96_tiprack_300ul/1": [[50.0, 0.0, 2.931601299]], - "default": [[50.0, 0.0, 2.931601299]] - }, - "defaultTipOverlapDictionary": { - "opentrons/opentrons_96_tiprack_300ul/1": 7.47 + "default": { + "1": [[50.0, 0.0, 2.931601299]], + "2": [[50, 0, 2.931601299]] + } }, "defaultBlowoutVolume": 4.712 } }, + "defaultTipOverlapDictionary": { + "default": 7.47, + "opentrons/opentrons_96_tiprack_300ul/1": 7.47, + "opentrons/tipone_96_tiprack_200ul/1": 6.1, + "opentrons/opentrons_96_filtertiprack_200ul/1": 7.47 + }, "maxVolume": 50, "minVolume": 5.0, "defaultTipracks": [ diff --git a/shared-data/pipette/definitions/2/liquid/single_channel/p50/1_5.json b/shared-data/pipette/definitions/2/liquid/single_channel/p50/1_5.json index 87ca0f644c0..fbbc0bc2398 100644 --- a/shared-data/pipette/definitions/2/liquid/single_channel/p50/1_5.json +++ b/shared-data/pipette/definitions/2/liquid/single_channel/p50/1_5.json @@ -2,86 +2,78 @@ "$otSharedSchema": "#/pipette/schemas/2/pipetteLiquidPropertiesSchema.json", "supportedTips": { "t200": { - "defaultAspirateFlowRate": 25.0, - "defaultDispenseFlowRate": 50.0, - "defaultBlowOutFlowRate": 1000.0, + "defaultAspirateFlowRate": { + "default": 25, + "valuesByApiLevel": { "2.0": 25 } + }, + "defaultDispenseFlowRate": { + "default": 50, + "valuesByApiLevel": { "2.0": 50 } + }, + "defaultBlowOutFlowRate": { + "default": 1000, + "valuesByApiLevel": { "2.0": 1000 } + }, "defaultTipLength": 51.7, - "defaultTipOverlap": 7.47, - "defaultReturnTipHeight": null, "aspirate": { - "opentrons/tipone_96_tiprack_200ul/1": [ - [5.762111167, 0.02912395377, 2.7132], - [7.208999967, 0.001758534127, 2.8709], - [10.18300033, 0.008684827443, 2.821], - [35.954444, 0.003367098915, 2.8751], - [42.075889, 0.001505686352, 2.9421], - [50.0, 0.001091358226, 2.9595] - ], - "opentrons/opentrons_96_filtertiprack_200ul/1": [ - [5.762111167, 0.02912395377, 2.7132], - [7.208999967, 0.001758534127, 2.8709], - [10.18300033, 0.008684827443, 2.821], - [35.954444, 0.003367098915, 2.8751], - [42.075889, 0.001505686352, 2.9421], - [50.0, 0.001091358226, 2.9595] - ], - "default": [ - [5.762111167, 0.02912395377, 2.7132], - [7.208999967, 0.001758534127, 2.8709], - [10.18300033, 0.008684827443, 2.821], - [35.954444, 0.003367098915, 2.8751], - [42.075889, 0.001505686352, 2.9421], - [50.0, 0.001091358226, 2.9595] - ] + "default": { + "1": [ + [5.762111167, 0.02912395377, 2.7132], + [7.208999967, 0.001758534127, 2.8709], + [10.18300033, 0.008684827443, 2.821], + [35.954444, 0.003367098915, 2.8751], + [42.075889, 0.001505686352, 2.9421], + [50.0, 0.001091358226, 2.9595] + ] + } }, "dispense": { - "opentrons/tipone_96_tiprack_200ul/1": [[50.0, 0.0, 2.931601299]], - "opentrons/opentrons_96_filtertiprack_200ul/1": [ - [50.0, 0.0, 2.931601299] - ], - "default": [[50.0, 0.0, 2.931601299]] - }, - "defaultTipOverlapDictionary": { - "opentrons/tipone_96_tiprack_200ul/1": 6.1, - "opentrons/opentrons_96_filtertiprack_200ul/1": 7.47 + "default": { + "1": [[50.0, 0.0, 2.931601299]] + } }, "defaultBlowoutVolume": 4.712 }, "t300": { - "defaultAspirateFlowRate": 25.0, - "defaultDispenseFlowRate": 50.0, - "defaultBlowOutFlowRate": 1000.0, + "defaultAspirateFlowRate": { + "default": 25, + "valuesByApiLevel": { "2.0": 25 } + }, + "defaultDispenseFlowRate": { + "default": 50, + "valuesByApiLevel": { "2.0": 50 } + }, + "defaultBlowOutFlowRate": { + "default": 1000, + "valuesByApiLevel": { "2.0": 1000 } + }, "defaultTipLength": 51.7, - "defaultTipOverlap": 7.47, - "defaultReturnTipHeight": null, "aspirate": { - "opentrons/opentrons_96_tiprack_300ul/1": [ - [5.762111167, 0.02912395377, 2.7132], - [7.208999967, 0.001758534127, 2.8709], - [10.18300033, 0.008684827443, 2.821], - [35.954444, 0.003367098915, 2.8751], - [42.075889, 0.001505686352, 2.9421], - [50.0, 0.001091358226, 2.9595] - ], - "default": [ - [5.762111167, 0.02912395377, 2.7132], - [7.208999967, 0.001758534127, 2.8709], - [10.18300033, 0.008684827443, 2.821], - [35.954444, 0.003367098915, 2.8751], - [42.075889, 0.001505686352, 2.9421], - [50.0, 0.001091358226, 2.9595] - ] + "default": { + "1": [ + [5.762111167, 0.02912395377, 2.7132], + [7.208999967, 0.001758534127, 2.8709], + [10.18300033, 0.008684827443, 2.821], + [35.954444, 0.003367098915, 2.8751], + [42.075889, 0.001505686352, 2.9421], + [50.0, 0.001091358226, 2.9595] + ] + } }, "dispense": { - "opentrons/opentrons_96_tiprack_300ul/1": [[50.0, 0.0, 2.931601299]], - "default": [[50.0, 0.0, 2.931601299]] - }, - "defaultTipOverlapDictionary": { - "opentrons/opentrons_96_tiprack_300ul/1": 7.47 + "default": { + "1": [[50.0, 0.0, 2.931601299]] + } }, "defaultBlowoutVolume": 4.712 } }, + "defaultTipOverlapDictionary": { + "default": 7.47, + "opentrons/opentrons_96_tiprack_300ul/1": 7.47, + "opentrons/tipone_96_tiprack_200ul/1": 6.1, + "opentrons/opentrons_96_filtertiprack_200ul/1": 7.47 + }, "maxVolume": 50, "minVolume": 5.0, "defaultTipracks": [ diff --git a/shared-data/pipette/definitions/2/liquid/single_channel/p50/3_0.json b/shared-data/pipette/definitions/2/liquid/single_channel/p50/3_0.json index e524d458788..1e1bccface9 100644 --- a/shared-data/pipette/definitions/2/liquid/single_channel/p50/3_0.json +++ b/shared-data/pipette/definitions/2/liquid/single_channel/p50/3_0.json @@ -2,79 +2,95 @@ "$otSharedSchema": "#/pipette/schemas/2/pipetteLiquidPropertiesSchema.json", "supportedTips": { "t50": { - "defaultAspirateFlowRate": 8, - "defaultDispenseFlowRate": 8, - "defaultBlowOutFlowRate": 4, + "defaultAspirateFlowRate": { + "default": 8, + "valuesByApiLevel": { "2.14": 8 } + }, + "defaultDispenseFlowRate": { + "default": 8, + "valuesByApiLevel": { "2.14": 8 } + }, + "defaultBlowOutFlowRate": { + "default": 4, + "valuesByApiLevel": { "2.14": 4 } + }, "defaultTipLength": 57.9, - "defaultTipOverlap": 10.5, "defaultReturnTipHeight": 0.71, "aspirate": { - "default": [ - [0.6464, 0.4817, 0.0427], - [1.0889, 0.2539, 0.1591], - [1.5136, 0.1624, 0.2587], - [1.9108, 0.1042, 0.3467], - [2.2941, 0.0719, 0.4085], - [2.9978, 0.037, 0.4886], - [3.7731, 0.0378, 0.4863], - [4.7575, 0.0516, 0.4342], - [5.5024, 0.011, 0.6275], - [6.2686, 0.0114, 0.6253], - [7.005, 0.0054, 0.6625], - [8.5207, 0.0063, 0.6563], - [10.0034, 0.003, 0.6844], - [11.5075, 0.0031, 0.6833], - [13.0327, 0.0032, 0.6829], - [14.5356, 0.0018, 0.7003], - [17.5447, 0.0014, 0.7063], - [20.5576, 0.0011, 0.7126], - [23.5624, 0.0007, 0.7197], - [26.5785, 0.0007, 0.721], - [29.593, 0.0005, 0.7248], - [32.6109, 0.0004, 0.7268], - [35.6384, 0.0004, 0.727], - [38.6439, 0.0002, 0.7343], - [41.6815, 0.0004, 0.7284], - [44.6895, 0.0002, 0.7372], - [47.6926, 0.0001, 0.7393], - [51.4567, 0.0001, 0.7382] - ] + "default": { + "1": [ + [0.6464, 0.4817, 0.0427], + [1.0889, 0.2539, 0.1591], + [1.5136, 0.1624, 0.2587], + [1.9108, 0.1042, 0.3467], + [2.2941, 0.0719, 0.4085], + [2.9978, 0.037, 0.4886], + [3.7731, 0.0378, 0.4863], + [4.7575, 0.0516, 0.4342], + [5.5024, 0.011, 0.6275], + [6.2686, 0.0114, 0.6253], + [7.005, 0.0054, 0.6625], + [8.5207, 0.0063, 0.6563], + [10.0034, 0.003, 0.6844], + [11.5075, 0.0031, 0.6833], + [13.0327, 0.0032, 0.6829], + [14.5356, 0.0018, 0.7003], + [17.5447, 0.0014, 0.7063], + [20.5576, 0.0011, 0.7126], + [23.5624, 0.0007, 0.7197], + [26.5785, 0.0007, 0.721], + [29.593, 0.0005, 0.7248], + [32.6109, 0.0004, 0.7268], + [35.6384, 0.0004, 0.727], + [38.6439, 0.0002, 0.7343], + [41.6815, 0.0004, 0.7284], + [44.6895, 0.0002, 0.7372], + [47.6926, 0.0001, 0.7393], + [51.4567, 0.0001, 0.7382] + ] + } }, "dispense": { - "default": [ - [0.6464, 0.4817, 0.0427], - [1.0889, 0.2539, 0.1591], - [1.5136, 0.1624, 0.2587], - [1.9108, 0.1042, 0.3467], - [2.2941, 0.0719, 0.4085], - [2.9978, 0.037, 0.4886], - [3.7731, 0.0378, 0.4863], - [4.7575, 0.0516, 0.4342], - [5.5024, 0.011, 0.6275], - [6.2686, 0.0114, 0.6253], - [7.005, 0.0054, 0.6625], - [8.5207, 0.0063, 0.6563], - [10.0034, 0.003, 0.6844], - [11.5075, 0.0031, 0.6833], - [13.0327, 0.0032, 0.6829], - [14.5356, 0.0018, 0.7003], - [17.5447, 0.0014, 0.7063], - [20.5576, 0.0011, 0.7126], - [23.5624, 0.0007, 0.7197], - [26.5785, 0.0007, 0.721], - [29.593, 0.0005, 0.7248], - [32.6109, 0.0004, 0.7268], - [35.6384, 0.0004, 0.727], - [38.6439, 0.0002, 0.7343], - [41.6815, 0.0004, 0.7284], - [44.6895, 0.0002, 0.7372], - [47.6926, 0.0001, 0.7393], - [51.4567, 0.0001, 0.7382] - ] + "default": { + "1": [ + [0.6464, 0.4817, 0.0427], + [1.0889, 0.2539, 0.1591], + [1.5136, 0.1624, 0.2587], + [1.9108, 0.1042, 0.3467], + [2.2941, 0.0719, 0.4085], + [2.9978, 0.037, 0.4886], + [3.7731, 0.0378, 0.4863], + [4.7575, 0.0516, 0.4342], + [5.5024, 0.011, 0.6275], + [6.2686, 0.0114, 0.6253], + [7.005, 0.0054, 0.6625], + [8.5207, 0.0063, 0.6563], + [10.0034, 0.003, 0.6844], + [11.5075, 0.0031, 0.6833], + [13.0327, 0.0032, 0.6829], + [14.5356, 0.0018, 0.7003], + [17.5447, 0.0014, 0.7063], + [20.5576, 0.0011, 0.7126], + [23.5624, 0.0007, 0.7197], + [26.5785, 0.0007, 0.721], + [29.593, 0.0005, 0.7248], + [32.6109, 0.0004, 0.7268], + [35.6384, 0.0004, 0.727], + [38.6439, 0.0002, 0.7343], + [41.6815, 0.0004, 0.7284], + [44.6895, 0.0002, 0.7372], + [47.6926, 0.0001, 0.7393], + [51.4567, 0.0001, 0.7382] + ] + } }, "defaultBlowoutVolume": 1.5 } }, + "defaultTipOverlapDictionary": { + "default": 10.5, + "opentrons/opentrons_flex_96_tiprack_50ul/1": 10.5 + }, "maxVolume": 50, "minVolume": 0.5, "defaultTipracks": ["opentrons/opentrons_flex_96_tiprack_50ul/1"] diff --git a/shared-data/pipette/definitions/2/liquid/single_channel/p50/3_3.json b/shared-data/pipette/definitions/2/liquid/single_channel/p50/3_3.json index e524d458788..1e1bccface9 100644 --- a/shared-data/pipette/definitions/2/liquid/single_channel/p50/3_3.json +++ b/shared-data/pipette/definitions/2/liquid/single_channel/p50/3_3.json @@ -2,79 +2,95 @@ "$otSharedSchema": "#/pipette/schemas/2/pipetteLiquidPropertiesSchema.json", "supportedTips": { "t50": { - "defaultAspirateFlowRate": 8, - "defaultDispenseFlowRate": 8, - "defaultBlowOutFlowRate": 4, + "defaultAspirateFlowRate": { + "default": 8, + "valuesByApiLevel": { "2.14": 8 } + }, + "defaultDispenseFlowRate": { + "default": 8, + "valuesByApiLevel": { "2.14": 8 } + }, + "defaultBlowOutFlowRate": { + "default": 4, + "valuesByApiLevel": { "2.14": 4 } + }, "defaultTipLength": 57.9, - "defaultTipOverlap": 10.5, "defaultReturnTipHeight": 0.71, "aspirate": { - "default": [ - [0.6464, 0.4817, 0.0427], - [1.0889, 0.2539, 0.1591], - [1.5136, 0.1624, 0.2587], - [1.9108, 0.1042, 0.3467], - [2.2941, 0.0719, 0.4085], - [2.9978, 0.037, 0.4886], - [3.7731, 0.0378, 0.4863], - [4.7575, 0.0516, 0.4342], - [5.5024, 0.011, 0.6275], - [6.2686, 0.0114, 0.6253], - [7.005, 0.0054, 0.6625], - [8.5207, 0.0063, 0.6563], - [10.0034, 0.003, 0.6844], - [11.5075, 0.0031, 0.6833], - [13.0327, 0.0032, 0.6829], - [14.5356, 0.0018, 0.7003], - [17.5447, 0.0014, 0.7063], - [20.5576, 0.0011, 0.7126], - [23.5624, 0.0007, 0.7197], - [26.5785, 0.0007, 0.721], - [29.593, 0.0005, 0.7248], - [32.6109, 0.0004, 0.7268], - [35.6384, 0.0004, 0.727], - [38.6439, 0.0002, 0.7343], - [41.6815, 0.0004, 0.7284], - [44.6895, 0.0002, 0.7372], - [47.6926, 0.0001, 0.7393], - [51.4567, 0.0001, 0.7382] - ] + "default": { + "1": [ + [0.6464, 0.4817, 0.0427], + [1.0889, 0.2539, 0.1591], + [1.5136, 0.1624, 0.2587], + [1.9108, 0.1042, 0.3467], + [2.2941, 0.0719, 0.4085], + [2.9978, 0.037, 0.4886], + [3.7731, 0.0378, 0.4863], + [4.7575, 0.0516, 0.4342], + [5.5024, 0.011, 0.6275], + [6.2686, 0.0114, 0.6253], + [7.005, 0.0054, 0.6625], + [8.5207, 0.0063, 0.6563], + [10.0034, 0.003, 0.6844], + [11.5075, 0.0031, 0.6833], + [13.0327, 0.0032, 0.6829], + [14.5356, 0.0018, 0.7003], + [17.5447, 0.0014, 0.7063], + [20.5576, 0.0011, 0.7126], + [23.5624, 0.0007, 0.7197], + [26.5785, 0.0007, 0.721], + [29.593, 0.0005, 0.7248], + [32.6109, 0.0004, 0.7268], + [35.6384, 0.0004, 0.727], + [38.6439, 0.0002, 0.7343], + [41.6815, 0.0004, 0.7284], + [44.6895, 0.0002, 0.7372], + [47.6926, 0.0001, 0.7393], + [51.4567, 0.0001, 0.7382] + ] + } }, "dispense": { - "default": [ - [0.6464, 0.4817, 0.0427], - [1.0889, 0.2539, 0.1591], - [1.5136, 0.1624, 0.2587], - [1.9108, 0.1042, 0.3467], - [2.2941, 0.0719, 0.4085], - [2.9978, 0.037, 0.4886], - [3.7731, 0.0378, 0.4863], - [4.7575, 0.0516, 0.4342], - [5.5024, 0.011, 0.6275], - [6.2686, 0.0114, 0.6253], - [7.005, 0.0054, 0.6625], - [8.5207, 0.0063, 0.6563], - [10.0034, 0.003, 0.6844], - [11.5075, 0.0031, 0.6833], - [13.0327, 0.0032, 0.6829], - [14.5356, 0.0018, 0.7003], - [17.5447, 0.0014, 0.7063], - [20.5576, 0.0011, 0.7126], - [23.5624, 0.0007, 0.7197], - [26.5785, 0.0007, 0.721], - [29.593, 0.0005, 0.7248], - [32.6109, 0.0004, 0.7268], - [35.6384, 0.0004, 0.727], - [38.6439, 0.0002, 0.7343], - [41.6815, 0.0004, 0.7284], - [44.6895, 0.0002, 0.7372], - [47.6926, 0.0001, 0.7393], - [51.4567, 0.0001, 0.7382] - ] + "default": { + "1": [ + [0.6464, 0.4817, 0.0427], + [1.0889, 0.2539, 0.1591], + [1.5136, 0.1624, 0.2587], + [1.9108, 0.1042, 0.3467], + [2.2941, 0.0719, 0.4085], + [2.9978, 0.037, 0.4886], + [3.7731, 0.0378, 0.4863], + [4.7575, 0.0516, 0.4342], + [5.5024, 0.011, 0.6275], + [6.2686, 0.0114, 0.6253], + [7.005, 0.0054, 0.6625], + [8.5207, 0.0063, 0.6563], + [10.0034, 0.003, 0.6844], + [11.5075, 0.0031, 0.6833], + [13.0327, 0.0032, 0.6829], + [14.5356, 0.0018, 0.7003], + [17.5447, 0.0014, 0.7063], + [20.5576, 0.0011, 0.7126], + [23.5624, 0.0007, 0.7197], + [26.5785, 0.0007, 0.721], + [29.593, 0.0005, 0.7248], + [32.6109, 0.0004, 0.7268], + [35.6384, 0.0004, 0.727], + [38.6439, 0.0002, 0.7343], + [41.6815, 0.0004, 0.7284], + [44.6895, 0.0002, 0.7372], + [47.6926, 0.0001, 0.7393], + [51.4567, 0.0001, 0.7382] + ] + } }, "defaultBlowoutVolume": 1.5 } }, + "defaultTipOverlapDictionary": { + "default": 10.5, + "opentrons/opentrons_flex_96_tiprack_50ul/1": 10.5 + }, "maxVolume": 50, "minVolume": 0.5, "defaultTipracks": ["opentrons/opentrons_flex_96_tiprack_50ul/1"] diff --git a/shared-data/pipette/definitions/2/liquid/single_channel/p50/3_4.json b/shared-data/pipette/definitions/2/liquid/single_channel/p50/3_4.json index 311425cbcef..fc892dcd27c 100644 --- a/shared-data/pipette/definitions/2/liquid/single_channel/p50/3_4.json +++ b/shared-data/pipette/definitions/2/liquid/single_channel/p50/3_4.json @@ -2,81 +2,97 @@ "$otSharedSchema": "#/pipette/schemas/2/pipetteLiquidPropertiesSchema.json", "supportedTips": { "t50": { - "defaultAspirateFlowRate": 35, - "defaultDispenseFlowRate": 57, - "defaultBlowOutFlowRate": 57, + "defaultAspirateFlowRate": { + "default": 35, + "valuesByApiLevel": { "2.14": 35 } + }, + "defaultDispenseFlowRate": { + "default": 57, + "valuesByApiLevel": { "2.14": 57 } + }, + "defaultBlowOutFlowRate": { + "default": 57, + "valuesByApiLevel": { "2.14": 57 } + }, "defaultTipLength": 57.9, - "defaultTipOverlap": 10.5, "defaultReturnTipHeight": 0.71, "aspirate": { - "default": [ - [0.45, 0.4702, 0.0464], - [0.6717, 0.3617, 0.0952], - [0.9133, 0.259, 0.1642], - [1.1783, 0.1997, 0.2184], - [1.46, 0.1366, 0.2927], - [1.8183, 0.1249, 0.3098], - [2.1783, 0.0719, 0.4061], - [2.615, 0.0666, 0.4176], - [3.015, 0.0152, 0.552], - [3.4433, 0.0008, 0.5956], - [4.3033, 0.0659, 0.3713], - [5.0933, 0.0306, 0.5234], - [5.915, 0.0135, 0.6102], - [6.8233, 0.0083, 0.6414], - [7.85, 0.0051, 0.6631], - [9.005, 0.0025, 0.6838], - [10.3517, 0.0036, 0.6735], - [11.9, 0.0032, 0.6775], - [13.6617, 0.0023, 0.6886], - [15.6383, 0.001, 0.7058], - [17.95, 0.0015, 0.6976], - [20.58, 0.0012, 0.7033], - [23.5483, 0.0005, 0.7183], - [26.9983, 0.0008, 0.7105], - [30.88, 0.0003, 0.7233], - [35.3167, 0.0003, 0.725], - [40.4283, 0.0004, 0.7224], - [46.255, 0.0003, 0.7271], - [52.8383, 0.0, 0.7369] - ] + "default": { + "1": [ + [0.45, 0.4702, 0.0464], + [0.6717, 0.3617, 0.0952], + [0.9133, 0.259, 0.1642], + [1.1783, 0.1997, 0.2184], + [1.46, 0.1366, 0.2927], + [1.8183, 0.1249, 0.3098], + [2.1783, 0.0719, 0.4061], + [2.615, 0.0666, 0.4176], + [3.015, 0.0152, 0.552], + [3.4433, 0.0008, 0.5956], + [4.3033, 0.0659, 0.3713], + [5.0933, 0.0306, 0.5234], + [5.915, 0.0135, 0.6102], + [6.8233, 0.0083, 0.6414], + [7.85, 0.0051, 0.6631], + [9.005, 0.0025, 0.6838], + [10.3517, 0.0036, 0.6735], + [11.9, 0.0032, 0.6775], + [13.6617, 0.0023, 0.6886], + [15.6383, 0.001, 0.7058], + [17.95, 0.0015, 0.6976], + [20.58, 0.0012, 0.7033], + [23.5483, 0.0005, 0.7183], + [26.9983, 0.0008, 0.7105], + [30.88, 0.0003, 0.7233], + [35.3167, 0.0003, 0.725], + [40.4283, 0.0004, 0.7224], + [46.255, 0.0003, 0.7271], + [52.8383, 0.0, 0.7369] + ] + } }, "dispense": { - "default": [ - [0.45, 0.4702, 0.0464], - [0.6717, 0.3617, 0.0952], - [0.9133, 0.259, 0.1642], - [1.1783, 0.1997, 0.2184], - [1.46, 0.1366, 0.2927], - [1.8183, 0.1249, 0.3098], - [2.1783, 0.0719, 0.4061], - [2.615, 0.0666, 0.4176], - [3.015, 0.0152, 0.552], - [3.4433, 0.0008, 0.5956], - [4.3033, 0.0659, 0.3713], - [5.0933, 0.0306, 0.5234], - [5.915, 0.0135, 0.6102], - [6.8233, 0.0083, 0.6414], - [7.85, 0.0051, 0.6631], - [9.005, 0.0025, 0.6838], - [10.3517, 0.0036, 0.6735], - [11.9, 0.0032, 0.6775], - [13.6617, 0.0023, 0.6886], - [15.6383, 0.001, 0.7058], - [17.95, 0.0015, 0.6976], - [20.58, 0.0012, 0.7033], - [23.5483, 0.0005, 0.7183], - [26.9983, 0.0008, 0.7105], - [30.88, 0.0003, 0.7233], - [35.3167, 0.0003, 0.725], - [40.4283, 0.0004, 0.7224], - [46.255, 0.0003, 0.7271], - [52.8383, 0.0, 0.7369] - ] + "default": { + "1": [ + [0.45, 0.4702, 0.0464], + [0.6717, 0.3617, 0.0952], + [0.9133, 0.259, 0.1642], + [1.1783, 0.1997, 0.2184], + [1.46, 0.1366, 0.2927], + [1.8183, 0.1249, 0.3098], + [2.1783, 0.0719, 0.4061], + [2.615, 0.0666, 0.4176], + [3.015, 0.0152, 0.552], + [3.4433, 0.0008, 0.5956], + [4.3033, 0.0659, 0.3713], + [5.0933, 0.0306, 0.5234], + [5.915, 0.0135, 0.6102], + [6.8233, 0.0083, 0.6414], + [7.85, 0.0051, 0.6631], + [9.005, 0.0025, 0.6838], + [10.3517, 0.0036, 0.6735], + [11.9, 0.0032, 0.6775], + [13.6617, 0.0023, 0.6886], + [15.6383, 0.001, 0.7058], + [17.95, 0.0015, 0.6976], + [20.58, 0.0012, 0.7033], + [23.5483, 0.0005, 0.7183], + [26.9983, 0.0008, 0.7105], + [30.88, 0.0003, 0.7233], + [35.3167, 0.0003, 0.725], + [40.4283, 0.0004, 0.7224], + [46.255, 0.0003, 0.7271], + [52.8383, 0.0, 0.7369] + ] + } }, "defaultBlowoutVolume": 1.5 } }, + "defaultTipOverlapDictionary": { + "default": 10.5, + "opentrons/opentrons_flex_96_tiprack_50ul/1": 10.5 + }, "maxVolume": 50, "minVolume": 0.5, "defaultTipracks": ["opentrons/opentrons_flex_96_tiprack_50ul/1"] diff --git a/shared-data/pipette/definitions/2/liquid/single_channel/p50/3_5.json b/shared-data/pipette/definitions/2/liquid/single_channel/p50/3_5.json new file mode 100644 index 00000000000..fc892dcd27c --- /dev/null +++ b/shared-data/pipette/definitions/2/liquid/single_channel/p50/3_5.json @@ -0,0 +1,99 @@ +{ + "$otSharedSchema": "#/pipette/schemas/2/pipetteLiquidPropertiesSchema.json", + "supportedTips": { + "t50": { + "defaultAspirateFlowRate": { + "default": 35, + "valuesByApiLevel": { "2.14": 35 } + }, + "defaultDispenseFlowRate": { + "default": 57, + "valuesByApiLevel": { "2.14": 57 } + }, + "defaultBlowOutFlowRate": { + "default": 57, + "valuesByApiLevel": { "2.14": 57 } + }, + "defaultTipLength": 57.9, + "defaultReturnTipHeight": 0.71, + "aspirate": { + "default": { + "1": [ + [0.45, 0.4702, 0.0464], + [0.6717, 0.3617, 0.0952], + [0.9133, 0.259, 0.1642], + [1.1783, 0.1997, 0.2184], + [1.46, 0.1366, 0.2927], + [1.8183, 0.1249, 0.3098], + [2.1783, 0.0719, 0.4061], + [2.615, 0.0666, 0.4176], + [3.015, 0.0152, 0.552], + [3.4433, 0.0008, 0.5956], + [4.3033, 0.0659, 0.3713], + [5.0933, 0.0306, 0.5234], + [5.915, 0.0135, 0.6102], + [6.8233, 0.0083, 0.6414], + [7.85, 0.0051, 0.6631], + [9.005, 0.0025, 0.6838], + [10.3517, 0.0036, 0.6735], + [11.9, 0.0032, 0.6775], + [13.6617, 0.0023, 0.6886], + [15.6383, 0.001, 0.7058], + [17.95, 0.0015, 0.6976], + [20.58, 0.0012, 0.7033], + [23.5483, 0.0005, 0.7183], + [26.9983, 0.0008, 0.7105], + [30.88, 0.0003, 0.7233], + [35.3167, 0.0003, 0.725], + [40.4283, 0.0004, 0.7224], + [46.255, 0.0003, 0.7271], + [52.8383, 0.0, 0.7369] + ] + } + }, + "dispense": { + "default": { + "1": [ + [0.45, 0.4702, 0.0464], + [0.6717, 0.3617, 0.0952], + [0.9133, 0.259, 0.1642], + [1.1783, 0.1997, 0.2184], + [1.46, 0.1366, 0.2927], + [1.8183, 0.1249, 0.3098], + [2.1783, 0.0719, 0.4061], + [2.615, 0.0666, 0.4176], + [3.015, 0.0152, 0.552], + [3.4433, 0.0008, 0.5956], + [4.3033, 0.0659, 0.3713], + [5.0933, 0.0306, 0.5234], + [5.915, 0.0135, 0.6102], + [6.8233, 0.0083, 0.6414], + [7.85, 0.0051, 0.6631], + [9.005, 0.0025, 0.6838], + [10.3517, 0.0036, 0.6735], + [11.9, 0.0032, 0.6775], + [13.6617, 0.0023, 0.6886], + [15.6383, 0.001, 0.7058], + [17.95, 0.0015, 0.6976], + [20.58, 0.0012, 0.7033], + [23.5483, 0.0005, 0.7183], + [26.9983, 0.0008, 0.7105], + [30.88, 0.0003, 0.7233], + [35.3167, 0.0003, 0.725], + [40.4283, 0.0004, 0.7224], + [46.255, 0.0003, 0.7271], + [52.8383, 0.0, 0.7369] + ] + } + }, + "defaultBlowoutVolume": 1.5 + } + }, + "defaultTipOverlapDictionary": { + "default": 10.5, + "opentrons/opentrons_flex_96_tiprack_50ul/1": 10.5 + }, + "maxVolume": 50, + "minVolume": 0.5, + "defaultTipracks": ["opentrons/opentrons_flex_96_tiprack_50ul/1"] +} diff --git a/shared-data/pipette/schemas/2/pipetteLiquidPropertiesSchema.json b/shared-data/pipette/schemas/2/pipetteLiquidPropertiesSchema.json index 6b0604588f1..45d0ae6f2ea 100644 --- a/shared-data/pipette/schemas/2/pipetteLiquidPropertiesSchema.json +++ b/shared-data/pipette/schemas/2/pipetteLiquidPropertiesSchema.json @@ -23,15 +23,15 @@ } }, "flowRate": { + "description": "Object with a default value and optional dict keyed by api level. If API level is unavailable, default is used.", "type": "object", - "required": ["value", "min", "max"], + "required": ["default", "valuesByApiLevel"], "properties": { - "value": { + "default": { "$ref": "#/definitions/positiveNumber", - "$comment": "This key is deprecated in favor of valuesByApiLevel" + "$comment": "The default value of the flowrate" }, - "min": { "$ref": "#/definitions/positiveNumber" }, - "max": { "$ref": "#/definitions/positiveNumber" } + "valuesByApiLevel": { "type": "object", "required": [] } } } }, @@ -41,7 +41,8 @@ "maxVolume", "minVolume", "defaultTipracks", - "supportedTips" + "supportedTips", + "defaultTipOverlapDictionary" ], "additionalProperties": false, "properties": { @@ -78,9 +79,6 @@ "defaultTipLength": { "$ref": "#/definitions/positiveNumber" }, - "defaultTipOverlap": { - "$ref": "#/definitions/positiveNumber" - }, "defaultReturnTipHeight": { "$ref": "#/definitions/positiveNumber" }, @@ -97,6 +95,16 @@ } } }, + "defaultTipOverlapDictionary": { + "type": "object", + "description": "Map of tip overlap values with defaults", + "required": ["default"], + "$comment": "Other keys in here should be labware URIs", + "properties": { + "default": { "type": "number" } + }, + "additionalProperties": { "type": "number" } + }, "maxVolume": { "$ref": "#/definitions/positiveNumber" }, "minVolume": { "$ref": "#/definitions/positiveNumber" }, "defaultTipracks": { diff --git a/shared-data/python/opentrons_shared_data/pipette/load_data.py b/shared-data/python/opentrons_shared_data/pipette/load_data.py index e143b0d0d1b..6f5b3d2187a 100644 --- a/shared-data/python/opentrons_shared_data/pipette/load_data.py +++ b/shared-data/python/opentrons_shared_data/pipette/load_data.py @@ -9,14 +9,17 @@ from .pipette_definition import ( PipetteConfigurations, + PipetteLiquidPropertiesDefinition, +) +from .model_constants import MOUNT_CONFIG_LOOKUP_TABLE, _MAP_KEY_TO_V2 +from .types import ( PipetteChannelType, - PipetteVersionType, PipetteModelType, PipetteGenerationType, + PipetteVersionType, PipetteModelMajorVersion, PipetteModelMinorVersion, ) -from .model_constants import MOUNT_CONFIG_LOOKUP_TABLE LoadedConfiguration = Dict[str, Union[str, Dict[str, Any]]] @@ -25,7 +28,7 @@ def _get_configuration_dictionary( config_type: Literal["general", "geometry", "liquid"], channels: PipetteChannelType, - max_volume: PipetteModelType, + model: PipetteModelType, version: PipetteVersionType, ) -> LoadedConfiguration: config_path = ( @@ -35,7 +38,7 @@ def _get_configuration_dictionary( / "2" / config_type / channels.name.lower() - / max_volume.value + / model.value / f"{version.major}_{version.minor}.json" ) return json.loads(load_shared_data(config_path)) @@ -44,28 +47,28 @@ def _get_configuration_dictionary( @lru_cache(maxsize=None) def _geometry( channels: PipetteChannelType, - max_volume: PipetteModelType, + model: PipetteModelType, version: PipetteVersionType, ) -> LoadedConfiguration: - return _get_configuration_dictionary("geometry", channels, max_volume, version) + return _get_configuration_dictionary("geometry", channels, model, version) @lru_cache(maxsize=None) def _liquid( channels: PipetteChannelType, - max_volume: PipetteModelType, + model: PipetteModelType, version: PipetteVersionType, ) -> LoadedConfiguration: - return _get_configuration_dictionary("liquid", channels, max_volume, version) + return _get_configuration_dictionary("liquid", channels, model, version) @lru_cache(maxsize=None) def _physical( channels: PipetteChannelType, - max_volume: PipetteModelType, + model: PipetteModelType, version: PipetteVersionType, ) -> LoadedConfiguration: - return _get_configuration_dictionary("general", channels, max_volume, version) + return _get_configuration_dictionary("general", channels, model, version) @lru_cache(maxsize=None) @@ -105,8 +108,72 @@ def load_serial_lookup_table() -> Dict[str, str]: return _lookup_table +def load_liquid_model( + model: PipetteModelType, + channels: PipetteChannelType, + version: PipetteVersionType, +) -> PipetteLiquidPropertiesDefinition: + liquid_dict = _liquid(channels, model, version) + return PipetteLiquidPropertiesDefinition.parse_obj(liquid_dict) + + +def _change_to_camel_case(c: str) -> str: + # Tiny helper function to convert to camelCase. + config_name = c.split("_") + if len(config_name) == 1: + return config_name[0] + return f"{config_name[0]}" + "".join(s.capitalize() for s in config_name[1::]) + + +def update_pipette_configuration( + base_configurations: PipetteConfigurations, + v1_configuration_changes: Dict[str, Any], +) -> PipetteConfigurations: + """Helper function to update 'V1' format configurations (left over from PipetteDict). + + #TODO (lc 7-14-2023) Remove once the pipette config dict is eliminated. + Given an input of v1 mutable configs, look up the equivalent keyed + value of that configuration.""" + quirks_list = [] + dict_of_base_model = base_configurations.dict(by_alias=True) + + for c, v in v1_configuration_changes.items(): + lookup_key = _change_to_camel_case(c) + if c == "quirks" and isinstance(v, dict): + quirks_list.extend([b.name for b in v.values() if b.value]) + else: + try: + dict_of_base_model.pop(lookup_key) + dict_of_base_model[lookup_key] = v + except KeyError: + # The name is not the same format as previous so + # we need to look it up from the V2 key map + new_names = _MAP_KEY_TO_V2[lookup_key] + top_name = new_names["top_level_name"] + nested_name = new_names["nested_name"] + if lookup_key == "tipLength": + # This is only a concern for OT-2 configs and I think we can + # be less smart about handling multiple tip types by updating + # all tips. + for k in dict_of_base_model[new_names["top_level_name"]].keys(): + dict_of_base_model[top_name][k][nested_name] = v + else: + # isinstances are needed for type checking. + dict_of_base_model[top_name][nested_name] = v + dict_of_base_model["quirks"] = list( + set(dict_of_base_model["quirks"]) - set(quirks_list) + ) + + # re-serialization is not great for this nested enum so we need + # to perform this workaround. + dict_of_base_model["supportedTips"] = { + k.name: v for k, v in dict_of_base_model["supportedTips"].items() + } + return PipetteConfigurations.parse_obj(dict_of_base_model) + + def load_definition( - max_volume: PipetteModelType, + model: PipetteModelType, channels: PipetteChannelType, version: PipetteVersionType, ) -> PipetteConfigurations: @@ -116,12 +183,12 @@ def load_definition( ): raise KeyError("Pipette version not found.") - geometry_dict = _geometry(channels, max_volume, version) - physical_dict = _physical(channels, max_volume, version) - liquid_dict = _liquid(channels, max_volume, version) + geometry_dict = _geometry(channels, model, version) + physical_dict = _physical(channels, model, version) + liquid_dict = _liquid(channels, model, version) generation = PipetteGenerationType(physical_dict["displayCategory"]) - mount_configs = MOUNT_CONFIG_LOOKUP_TABLE[generation.value] + mount_configs = MOUNT_CONFIG_LOOKUP_TABLE[generation][channels] return PipetteConfigurations.parse_obj( { diff --git a/shared-data/python/opentrons_shared_data/pipette/model_constants.py b/shared-data/python/opentrons_shared_data/pipette/model_constants.py index 9cd29428a45..4f9f5de5c38 100644 --- a/shared-data/python/opentrons_shared_data/pipette/model_constants.py +++ b/shared-data/python/opentrons_shared_data/pipette/model_constants.py @@ -1,11 +1,27 @@ from typing import Dict, Union -from .types import Quirks, RobotMountConfigs, AvailableUnits +from .types import ( + Quirks, + RobotMountConfigs, + AvailableUnits, + PipetteGenerationType, + PipetteChannelType, +) MOUNT_CONFIG_LOOKUP_TABLE = { - "GEN1": RobotMountConfigs(768, 220, 30), - "GEN2": RobotMountConfigs(3200, 155.75, 60), - "FLEX": RobotMountConfigs(2133.33, 230.15, 80), + PipetteGenerationType.GEN1: { + PipetteChannelType.SINGLE_CHANNEL: RobotMountConfigs(768, 220, 30), + PipetteChannelType.EIGHT_CHANNEL: RobotMountConfigs(768, 220, 30), + }, + PipetteGenerationType.GEN2: { + PipetteChannelType.SINGLE_CHANNEL: RobotMountConfigs(3200, 172.15, 60), + PipetteChannelType.EIGHT_CHANNEL: RobotMountConfigs(3200, 155.75, 60), + }, + PipetteGenerationType.FLEX: { + PipetteChannelType.SINGLE_CHANNEL: RobotMountConfigs(2133.33, 230.15, 80), + PipetteChannelType.EIGHT_CHANNEL: RobotMountConfigs(2133.33, 230.15, 80), + PipetteChannelType.NINETY_SIX_CHANNEL: RobotMountConfigs(2133.33, 230.15, 80), + }, } diff --git a/shared-data/python/opentrons_shared_data/pipette/mutable_configurations.py b/shared-data/python/opentrons_shared_data/pipette/mutable_configurations.py index 42466d58bf7..57a44d3608b 100644 --- a/shared-data/python/opentrons_shared_data/pipette/mutable_configurations.py +++ b/shared-data/python/opentrons_shared_data/pipette/mutable_configurations.py @@ -4,7 +4,7 @@ from pathlib import Path from typing import Optional, List, Dict, Any, cast -from .pipette_definition import PipetteConfigurations +from .pipette_definition import PipetteConfigurations, PipetteModelVersionType from .model_constants import ( MUTABLE_CONFIGS_V1, VALID_QUIRKS, @@ -13,7 +13,6 @@ _TYPE_LOOKUP, _UNITS_LOOKUP, ) -from .pipette_load_name_conversions import PipetteModelVersionType from .load_data import load_definition, load_serial_lookup_table from .types import MutableConfig, Quirks, QuirkConfig, TypeOverrides, OverrideType from .pipette_load_name_conversions import ( @@ -66,7 +65,9 @@ def _migrate_to_v2_configurations( elif isinstance(v, MutableConfig): # isinstances are needed for type checking. dict_of_base_model[top_name][nested_name] = v.value - dict_of_base_model["quirks"] = quirks_list + dict_of_base_model["quirks"] = list( + set(dict_of_base_model["quirks"]).union(set(quirks_list)) + ) # re-serialization is not great for this nested enum so we need # to perform this workaround. @@ -250,7 +251,6 @@ def load_with_mutable_configurations( base_configurations = _migrate_to_v2_configurations( base_configurations, override ) - # the ulPerMm functions are structured in pipetteModelSpecs.json as # a list sorted from oldest to newest. That means the latest functions # are always the last element and, as of right now, the older ones are diff --git a/shared-data/python/opentrons_shared_data/pipette/pipette_definition.py b/shared-data/python/opentrons_shared_data/pipette/pipette_definition.py index 55056fb7b31..77ea1130e85 100644 --- a/shared-data/python/opentrons_shared_data/pipette/pipette_definition.py +++ b/shared-data/python/opentrons_shared_data/pipette/pipette_definition.py @@ -1,107 +1,81 @@ -from typing_extensions import Literal -from typing import List, Dict, Tuple, cast, Optional +from typing import List, Dict, Tuple, Optional from pydantic import BaseModel, Field, validator -from enum import Enum +from typing_extensions import Literal from dataclasses import dataclass -from . import types as pip_types +from . import types as pip_types, dev_types PLUNGER_CURRENT_MINIMUM = 0.1 PLUNGER_CURRENT_MAXIMUM = 1.5 -PipetteModelMajorVersion = [1, 2, 3] -PipetteModelMinorVersion = [0, 1, 2, 3, 4, 5] - -# TODO Literals are only good for writing down -# exact values. Is there a better typing mechanism -# so we don't need to keep track of versions in two -# different places? -PipetteModelMajorVersionType = Literal[1, 2, 3] -PipetteModelMinorVersionType = Literal[0, 1, 2, 3, 4, 5] - - -class PipetteTipType(Enum): - t10 = 10 - t20 = 20 - t50 = 50 - t200 = 200 - t300 = 300 - t1000 = 1000 - - -class PipetteChannelType(Enum): - SINGLE_CHANNEL = 1 - EIGHT_CHANNEL = 8 - NINETY_SIX_CHANNEL = 96 - - @property - def as_int(self) -> int: - return self.value - - def __str__(self) -> str: - if self.value == 96: - return "96" - elif self.value == 8: - return "multi" +# TODO (lc 12-5-2022) Ideally we can deprecate this +# at somepoint once we load pipettes by channels and type +@dataclass +class PipetteNameType: + pipette_type: pip_types.PipetteModelType + pipette_channels: pip_types.PipetteChannelType + pipette_generation: pip_types.PipetteGenerationType + + def __repr__(self) -> str: + base_name = f"{self.pipette_type.name}_{str(self.pipette_channels)}" + if self.pipette_generation == pip_types.PipetteGenerationType.GEN1: + return base_name + elif self.pipette_channels == pip_types.PipetteChannelType.NINETY_SIX_CHANNEL: + return base_name else: - return "single" + return f"{base_name}_{self.pipette_generation.name.lower()}" + def get_version(self) -> pip_types.PipetteVersionType: + if self.pipette_generation == pip_types.PipetteGenerationType.FLEX: + return pip_types.PipetteVersionType(3, 0) + elif self.pipette_generation == pip_types.PipetteGenerationType.GEN2: + return pip_types.PipetteVersionType(2, 0) + else: + return pip_types.PipetteVersionType(1, 0) -class PipetteModelType(Enum): - p10 = "p10" - p20 = "p20" - p50 = "p50" - p300 = "p300" - p1000 = "p1000" +@dataclass +class PipetteModelVersionType: + pipette_type: pip_types.PipetteModelType + pipette_channels: pip_types.PipetteChannelType + pipette_version: pip_types.PipetteVersionType -class PipetteGenerationType(Enum): - GEN1 = "GEN1" - GEN2 = "GEN2" - FLEX = "FLEX" + def __repr__(self) -> str: + base_name = f"{self.pipette_type.name}_{str(self.pipette_channels)}" + return f"{base_name}_v{self.pipette_version}" -PIPETTE_AVAILABLE_TYPES = [m.name for m in PipetteModelType] -PIPETTE_CHANNELS_INTS = [c.as_int for c in PipetteChannelType] -PIPETTE_GENERATIONS = [g.name.lower() for g in PipetteGenerationType] +class FlowRateDefinition(BaseModel): + default: float = Field(..., description="Highest API level default fallback.") + values_by_api_level: Dict[str, float] = Field( + ..., description="flow rates keyed by API level.", alias="valuesByApiLevel" + ) -@dataclass(frozen=True) -class PipetteVersionType: - major: PipetteModelMajorVersionType - minor: PipetteModelMinorVersionType - @classmethod - def convert_from_float(cls, version: float) -> "PipetteVersionType": - major = cast(PipetteModelMajorVersionType, int(version // 1)) - minor = cast(PipetteModelMinorVersionType, int(round((version % 1), 2) * 10)) - return cls(major=major, minor=minor) +PipetteFunctionKeyType = Literal["1", "2", "3"] +ulPerMMType = Dict[PipetteFunctionKeyType, List[Tuple[float, float, float]]] - def __str__(self) -> str: - return f"{self.major}.{self.minor}" - @property - def as_tuple( - self, - ) -> Tuple[PipetteModelMajorVersionType, PipetteModelMinorVersionType]: - return (self.major, self.minor) +class ulPerMMDefinition(BaseModel): + default: ulPerMMType class SupportedTipsDefinition(BaseModel): """Tip parameters available for every tip size.""" - default_aspirate_flowrate: float = Field( + default_aspirate_flowrate: FlowRateDefinition = Field( ..., description="The flowrate used in aspirations by default.", alias="defaultAspirateFlowRate", ) - default_dispense_flowrate: float = Field( + default_dispense_flowrate: FlowRateDefinition = Field( ..., description="The flowrate used in dispenses by default.", alias="defaultDispenseFlowRate", ) - default_blowout_flowrate: float = Field( + default_blowout_flowrate: FlowRateDefinition = Field( ..., description="The flowrate used in blowouts by default.", alias="defaultBlowOutFlowRate", @@ -111,27 +85,17 @@ class SupportedTipsDefinition(BaseModel): description="The default tip length associated with this tip type.", alias="defaultTipLength", ) - default_tip_overlap: float = Field( - ..., - description="The default tip overlap associated with this tip type.", - alias="defaultTipOverlap", - ) - default_return_tip_height: Optional[float] = Field( - ..., + default_return_tip_height: float = Field( + default=0.5, description="The height to return a tip to its tiprack.", alias="defaultReturnTipHeight", ) - aspirate: Dict[str, List[Tuple[float, float, float]]] = Field( + aspirate: ulPerMMDefinition = Field( ..., description="The default pipetting functions list for aspirate." ) - dispense: Dict[str, List[Tuple[float, float, float]]] = Field( + dispense: ulPerMMDefinition = Field( ..., description="The default pipetting functions list for dispensing." ) - tip_overlap_dictionary: Dict[str, float] = Field( - default={}, - description="The default tip overlap associated with this tip type.", - alias="defaultTipOverlapDictionary", - ) default_blowout_volume: Optional[float] = Field( ..., description="The default volume for a blowout command with this tip type.", @@ -215,17 +179,17 @@ class PipettePhysicalPropertiesDefinition(BaseModel): description="The display or full product name of the pipette.", alias="displayName", ) - pipette_backcompat_names: List[str] = Field( + pipette_backcompat_names: List[dev_types.PipetteName] = Field( ..., description="A list of pipette names that are compatible with this pipette.", alias="backCompatNames", ) - pipette_type: PipetteModelType = Field( + pipette_type: pip_types.PipetteModelType = Field( ..., description="The pipette model type (related to number of channels).", alias="model", ) - display_category: PipetteGenerationType = Field( + display_category: pip_types.PipetteGenerationType = Field( ..., description="The product model of the pipette.", alias="displayCategory" ) pick_up_tip_configurations: TipHandlingConfigurations = Field( @@ -244,7 +208,7 @@ class PipettePhysicalPropertiesDefinition(BaseModel): partial_tip_configurations: PartialTipDefinition = Field( ..., alias="partialTipConfigurations" ) - channels: PipetteChannelType = Field( + channels: pip_types.PipetteChannelType = Field( ..., description="The maximum number of channels on the pipette." ) shaft_diameter: float = Field( @@ -265,30 +229,29 @@ class PipettePhysicalPropertiesDefinition(BaseModel): ) @validator("pipette_type", pre=True) - def convert_pipette_model_string(cls, v: str) -> PipetteModelType: - return PipetteModelType(v) + def convert_pipette_model_string(cls, v: str) -> pip_types.PipetteModelType: + return pip_types.PipetteModelType(v) @validator("channels", pre=True) - def convert_channels(cls, v: int) -> PipetteChannelType: - return PipetteChannelType(v) + def convert_channels(cls, v: int) -> pip_types.PipetteChannelType: + return pip_types.PipetteChannelType(v) @validator("display_category", pre=True) - def convert_display_category(cls, v: str) -> PipetteGenerationType: + def convert_display_category(cls, v: str) -> pip_types.PipetteGenerationType: if not v: - return PipetteGenerationType.GEN1 - return PipetteGenerationType(v) + return pip_types.PipetteGenerationType.GEN1 + return pip_types.PipetteGenerationType(v) @validator("quirks", pre=True) - def convert_quirks(cls, v: str) -> List[pip_types.Quirks]: - if not v: - return [] + def convert_quirks(cls, v: List[str]) -> List[pip_types.Quirks]: return [pip_types.Quirks(q) for q in v] class Config: json_encoders = { - PipetteChannelType: lambda v: v.value, - PipetteModelType: lambda v: v.value, - PipetteGenerationType: lambda v: v.value, + pip_types.PipetteChannelType: lambda v: v.value, + pip_types.PipetteModelType: lambda v: v.value, + pip_types.PipetteGenerationType: lambda v: v.value, + pip_types.Quirks: lambda v: v.value, } @@ -306,9 +269,14 @@ class PipetteGeometryDefinition(BaseModel): class PipetteLiquidPropertiesDefinition(BaseModel): """The liquid properties definition of a pipette.""" - supported_tips: Dict[PipetteTipType, SupportedTipsDefinition] = Field( + supported_tips: Dict[pip_types.PipetteTipType, SupportedTipsDefinition] = Field( ..., alias="supportedTips" ) + tip_overlap_dictionary: Dict[str, float] = Field( + ..., + description="The default tip overlap associated with this tip type.", + alias="defaultTipOverlapDictionary", + ) max_volume: int = Field( ..., description="The maximum supported volume of the pipette.", @@ -329,8 +297,8 @@ class PipetteLiquidPropertiesDefinition(BaseModel): @validator("supported_tips", pre=True) def convert_aspirate_key_to_channel_type( cls, v: Dict[str, SupportedTipsDefinition] - ) -> Dict[PipetteTipType, SupportedTipsDefinition]: - return {PipetteTipType[key]: value for key, value in v.items()} + ) -> Dict[pip_types.PipetteTipType, SupportedTipsDefinition]: + return {pip_types.PipetteTipType[key]: value for key, value in v.items()} class PipetteConfigurations( @@ -340,7 +308,7 @@ class PipetteConfigurations( ): """The full pipette configurations of a given model and version.""" - version: PipetteVersionType = Field( + version: pip_types.PipetteVersionType = Field( ..., description="The version of the configuration loaded." ) mount_configurations: pip_types.RobotMountConfigs = Field( diff --git a/shared-data/python/opentrons_shared_data/pipette/pipette_load_name_conversions.py b/shared-data/python/opentrons_shared_data/pipette/pipette_load_name_conversions.py index 48584fc10c5..49b2c59fdb9 100644 --- a/shared-data/python/opentrons_shared_data/pipette/pipette_load_name_conversions.py +++ b/shared-data/python/opentrons_shared_data/pipette/pipette_load_name_conversions.py @@ -1,52 +1,40 @@ import re from typing import List, Optional, Union, cast -from dataclasses import dataclass from .dev_types import PipetteModel, PipetteName -from .pipette_definition import ( +from .types import ( PipetteChannelType, PipetteModelType, PipetteVersionType, PipetteGenerationType, - PIPETTE_AVAILABLE_TYPES, - PIPETTE_CHANNELS_INTS, PipetteModelMajorVersionType, PipetteModelMinorVersionType, ) +from .pipette_definition import ( + PipetteNameType, + PipetteModelVersionType, +) DEFAULT_CALIBRATION_OFFSET = [0.0, 0.0, 0.0] DEFAULT_MODEL = PipetteModelType.p1000 DEFAULT_CHANNELS = PipetteChannelType.SINGLE_CHANNEL DEFAULT_MODEL_VERSION = PipetteVersionType(major=1, minor=0) - -# TODO (lc 12-5-2022) Ideally we can deprecate this -# at somepoint once we load pipettes by channels and type -@dataclass -class PipetteNameType: - pipette_type: PipetteModelType - pipette_channels: PipetteChannelType - pipette_generation: PipetteGenerationType - - def __repr__(self) -> str: - base_name = f"{self.pipette_type.name}_{self.pipette_channels}" - if self.pipette_generation == PipetteGenerationType.GEN1: - return base_name - elif self.pipette_channels == PipetteChannelType.NINETY_SIX_CHANNEL: - return base_name - else: - return f"{base_name}_{self.pipette_generation.name.lower()}" +PIPETTE_AVAILABLE_TYPES = [m.name for m in PipetteModelType] +PIPETTE_CHANNELS_INTS = [c.value for c in PipetteChannelType] -@dataclass -class PipetteModelVersionType: - pipette_type: PipetteModelType - pipette_channels: PipetteChannelType - pipette_version: PipetteVersionType +def is_model(model_or_name: Union[PipetteName, PipetteModel, None]) -> bool: + """Determine if we have a real model or just a PipetteName. - def __repr__(self) -> str: - base_name = f"{self.pipette_type.name}_{self.pipette_channels}" + Args: + model_or_name (Union[PipetteName, PipetteModel, None]): The pipette we want to check. - return f"{base_name}_v{self.pipette_version}" + Returns: + bool: Whether or not the given string is a PipetteModel + """ + if not model_or_name: + return False + return "v" in model_or_name def supported_pipette(model_or_name: Union[PipetteName, PipetteModel, None]) -> bool: @@ -61,10 +49,13 @@ def supported_pipette(model_or_name: Union[PipetteName, PipetteModel, None]) -> if not model_or_name: return False split_model_or_name = model_or_name.split("_") - channels_as_int = channels_from_string(split_model_or_name[1]).as_int + try: + channels_as_int = int(channels_from_string(split_model_or_name[1])) + except ValueError: + channels_as_int = 0 if ( split_model_or_name[0] in PIPETTE_AVAILABLE_TYPES - or channels_as_int in PIPETTE_CHANNELS_INTS + and channels_as_int in PIPETTE_CHANNELS_INTS ): return True return False @@ -88,8 +79,10 @@ def channels_from_string(channels: str) -> PipetteChannelType: return PipetteChannelType.NINETY_SIX_CHANNEL elif channels == "multi": return PipetteChannelType.EIGHT_CHANNEL - else: + elif channels == "single": return PipetteChannelType.SINGLE_CHANNEL + else: + raise ValueError("Invalid number of channels") def version_from_string(version: str) -> PipetteVersionType: @@ -106,7 +99,10 @@ def version_from_string(version: str) -> PipetteVersionType: """ version_list = [v for v in re.split("\\.|[v]", version) if v] major = cast(PipetteModelMajorVersionType, int(version_list[0])) - minor = cast(PipetteModelMinorVersionType, int(version_list[1])) + if len(version_list) > 1: + minor = cast(PipetteModelMinorVersionType, int(version_list[1])) + else: + minor = 0 return PipetteVersionType(major, minor) @@ -151,7 +147,9 @@ def generation_from_string(pipette_name_list: List[str]) -> PipetteGenerationTyp return PipetteGenerationType.GEN1 -def convert_to_pipette_name_type(name: PipetteName) -> PipetteNameType: +def convert_to_pipette_name_type( + model_or_name: Union[PipetteName, PipetteModel] +) -> PipetteNameType: """Convert the py:data:PipetteName to a py:obj:PipetteModelVersionType. `PipetteNames` are in the format of "p300_single" or "p300_single_gen1". @@ -164,10 +162,10 @@ def convert_to_pipette_name_type(name: PipetteName) -> PipetteNameType: string. """ - split_pipette_name = name.split("_") - channels = channels_from_string(split_pipette_name[1]) - generation = generation_from_string(split_pipette_name) - pipette_type = PipetteModelType[split_pipette_name[0]] + split_pipette_model_or_name = model_or_name.split("_") + channels = channels_from_string(split_pipette_model_or_name[1]) + generation = generation_from_string(split_pipette_model_or_name) + pipette_type = PipetteModelType[split_pipette_model_or_name[0]] return PipetteNameType(pipette_type, channels, generation) diff --git a/shared-data/python/opentrons_shared_data/pipette/types.py b/shared-data/python/opentrons_shared_data/pipette/types.py index 39278c68771..9e05981202c 100644 --- a/shared-data/python/opentrons_shared_data/pipette/types.py +++ b/shared-data/python/opentrons_shared_data/pipette/types.py @@ -1,13 +1,87 @@ import enum from dataclasses import dataclass -from typing import Union, Dict, Mapping +from typing import Union, Dict, Mapping, Tuple, cast +from typing_extensions import Literal +"""Pipette Definition V2 Types""" -@dataclass -class RobotMountConfigs: - stepsPerMM: float - homePosition: float - travelDistance: float +# Needed for Int Comparison. Keeping it next to +# the Literal type for ease of readability +PipetteModelMajorVersion = [1, 2, 3] +PipetteModelMinorVersion = [0, 1, 2, 3, 4, 5] + +# TODO Literals are only good for writing down +# exact values. Is there a better typing mechanism +# so we don't need to keep track of versions in two +# different places? +PipetteModelMajorVersionType = Literal[1, 2, 3] +PipetteModelMinorVersionType = Literal[0, 1, 2, 3, 4, 5] + + +class PipetteTipType(enum.Enum): + t10 = 10 + t20 = 20 + t50 = 50 + t200 = 200 + t300 = 300 + t1000 = 1000 + + +class PipetteChannelType(int, enum.Enum): + SINGLE_CHANNEL = 1 + EIGHT_CHANNEL = 8 + NINETY_SIX_CHANNEL = 96 + + def __str__(self) -> str: + if self.value == 96: + return "96" + elif self.value == 8: + return "multi" + else: + return "single" + + +class PipetteModelType(enum.Enum): + p10 = "p10" + p20 = "p20" + p50 = "p50" + p300 = "p300" + p1000 = "p1000" + + +class PipetteGenerationType(enum.Enum): + GEN1 = "GEN1" + GEN2 = "GEN2" + FLEX = "FLEX" + + +@dataclass(frozen=True) +class PipetteVersionType: + major: PipetteModelMajorVersionType + minor: PipetteModelMinorVersionType + + @classmethod + def convert_from_float(cls, version: float) -> "PipetteVersionType": + major = cast(PipetteModelMajorVersionType, int(version // 1)) + minor = cast(PipetteModelMinorVersionType, int(round((version % 1), 2) * 10)) + return cls(major=major, minor=minor) + + def __str__(self) -> str: + if self.major == 1 and self.minor == 0: + # Maintain the format of V1 pipettes that + # do not contain a minor version at all. + return f"{self.major}" + else: + return f"{self.major}.{self.minor}" + + @property + def as_tuple( + self, + ) -> Tuple[PipetteModelMajorVersionType, PipetteModelMinorVersionType]: + return (self.major, self.minor) + + +"""Mutable Configs Types""" class Quirks(enum.Enum): @@ -24,6 +98,13 @@ class AvailableUnits(enum.Enum): presses = "presses" +@dataclass +class RobotMountConfigs: + stepsPerMM: float + homePosition: float + travelDistance: float + + @dataclass class MutableConfig: value: Union[int, float] diff --git a/shared-data/python/tests/pipette/test_load_data.py b/shared-data/python/tests/pipette/test_load_data.py index bbe3dc531ea..cb6cc72ea92 100644 --- a/shared-data/python/tests/pipette/test_load_data.py +++ b/shared-data/python/tests/pipette/test_load_data.py @@ -1,10 +1,16 @@ import pytest -from opentrons_shared_data.pipette import load_data -from opentrons_shared_data.pipette.pipette_definition import ( +from typing import Dict, Any, cast +from opentrons_shared_data.pipette import ( + load_data, + pipette_load_name_conversions, + dev_types, +) +from opentrons_shared_data.pipette.types import ( PipetteChannelType, PipetteModelType, PipetteVersionType, PipetteTipType, + Quirks, ) @@ -15,28 +21,34 @@ def test_load_pipette_definition() -> None: PipetteVersionType(major=3, minor=3), ) - assert pipette_config_one.channels.as_int == 1 + assert pipette_config_one.channels == 1 assert pipette_config_one.pipette_type.value == "p50" assert pipette_config_one.nozzle_offset == [-8.0, -22.0, -259.15] assert ( - pipette_config_one.supported_tips[PipetteTipType.t50].default_aspirate_flowrate + pipette_config_one.supported_tips[ + PipetteTipType.t50 + ].default_aspirate_flowrate.default == 8.0 ) + assert pipette_config_one.quirks == [] pipette_config_two = load_data.load_definition( PipetteModelType.p50, PipetteChannelType.SINGLE_CHANNEL, PipetteVersionType(major=1, minor=0), ) - assert pipette_config_two.channels.as_int == 1 + assert pipette_config_two.channels == 1 assert pipette_config_two.pipette_type.value == "p50" assert pipette_config_two.nozzle_offset == [0.0, 0.0, 25.0] assert ( - pipette_config_two.supported_tips[PipetteTipType.t200].default_aspirate_flowrate + pipette_config_two.supported_tips[ + PipetteTipType.t200 + ].default_aspirate_flowrate.default == 25.0 ) + assert pipette_config_two.quirks == [Quirks.dropTipShake] @pytest.mark.parametrize( @@ -52,3 +64,33 @@ def test_load_pipette_definition() -> None: def test_build_serial_number_lookup(key_spot_check: str, value_spot_check: str) -> None: lookup_table = load_data.load_serial_lookup_table() assert lookup_table[key_spot_check] == value_spot_check + + +@pytest.mark.parametrize( + argnames=["pipette_model", "v1_configuration_changes"], + argvalues=[ + ["p300_multi_v1.4", {"max_volume": 200, "min_volume": 10}], + ["p1000_96_v3.3", {"tip_length": 40, "min_volume": 300}], + ], +) +def test_update_pipette_configuration( + pipette_model: str, v1_configuration_changes: Dict[str, Any] +) -> None: + + model_name = pipette_load_name_conversions.convert_pipette_model( + cast(dev_types.PipetteModel, pipette_model) + ) + base_configurations = load_data.load_definition( + model_name.pipette_type, model_name.pipette_channels, model_name.pipette_version + ) + updated_configurations = load_data.update_pipette_configuration( + base_configurations, v1_configuration_changes + ) + + updated_configurations_dict = updated_configurations.dict() + for k, v in v1_configuration_changes.items(): + if k == "tip_length": + for i in updated_configurations_dict["supported_tips"].values(): + assert i["default_tip_length"] == v + else: + assert updated_configurations_dict[k] == v diff --git a/shared-data/python/tests/pipette/test_mutable_configurations.py b/shared-data/python/tests/pipette/test_mutable_configurations.py index 53a7de27967..0ab38dd9fe5 100644 --- a/shared-data/python/tests/pipette/test_mutable_configurations.py +++ b/shared-data/python/tests/pipette/test_mutable_configurations.py @@ -8,6 +8,7 @@ from opentrons_shared_data.pipette import ( mutable_configurations, types, + pipette_definition, pipette_load_name_conversions as pip_conversions, load_data, dev_types, @@ -223,7 +224,7 @@ def test_save_invalid_overrides( ) def test_load_with_overrides( overrides_fixture: types.MutableConfig, - pipette_model: pip_conversions.PipetteModelVersionType, + pipette_model: pipette_definition.PipetteModelVersionType, serial_number: str, override_configuration_path: Path, ) -> None: diff --git a/shared-data/python/tests/pipette/test_pipette_definition.py b/shared-data/python/tests/pipette/test_pipette_definition.py index d0fcf9e67d1..b1ca65bf6f1 100644 --- a/shared-data/python/tests/pipette/test_pipette_definition.py +++ b/shared-data/python/tests/pipette/test_pipette_definition.py @@ -1,6 +1,6 @@ import pytest from typing import cast -from opentrons_shared_data.pipette.pipette_definition import ( +from opentrons_shared_data.pipette.types import ( PipetteChannelType, PipetteModelType, PipetteVersionType, @@ -20,7 +20,7 @@ def test_model_enum(model: str, expected_enum: PipetteModelType) -> None: @pytest.mark.parametrize(argnames="channels", argvalues=[1, 8, 96]) def test_channel_enum(channels: int) -> None: channel_type = PipetteChannelType(channels) - assert channels == channel_type.as_int + assert channels == channel_type def test_incorrect_values() -> None: diff --git a/shared-data/python/tests/pipette/test_pipette_load_name_conversions.py b/shared-data/python/tests/pipette/test_pipette_load_name_conversions.py index 2aafdf8e1a7..2cb589ba636 100644 --- a/shared-data/python/tests/pipette/test_pipette_load_name_conversions.py +++ b/shared-data/python/tests/pipette/test_pipette_load_name_conversions.py @@ -1,13 +1,17 @@ import pytest -from opentrons_shared_data.pipette.pipette_definition import ( +from typing import Union +from opentrons_shared_data.pipette.types import ( PipetteChannelType, PipetteModelType, PipetteVersionType, PipetteGenerationType, ) from opentrons_shared_data.pipette.dev_types import PipetteModel, PipetteName -from opentrons_shared_data.pipette import pipette_load_name_conversions as pc +from opentrons_shared_data.pipette import ( + pipette_definition as pc, + pipette_load_name_conversions as ps, +) @pytest.mark.parametrize( @@ -42,7 +46,7 @@ def test_convert_pipette_model( model: PipetteModel, output: pc.PipetteModelVersionType ) -> None: - assert output == pc.convert_pipette_model(model) + assert output == ps.convert_pipette_model(model) @pytest.mark.parametrize( @@ -80,7 +84,7 @@ def test_convert_pipette_model( def test_convert_pipette_model_provided_version( model: PipetteModel, version: str, output: pc.PipetteModelVersionType ) -> None: - assert output == pc.convert_pipette_model(model, version) + assert output == ps.convert_pipette_model(model, version) @pytest.mark.parametrize( @@ -115,7 +119,7 @@ def test_convert_pipette_model_provided_version( def test_convert_pipette_name( name: PipetteName, output: pc.PipetteModelVersionType ) -> None: - assert output == pc.convert_pipette_name(name) + assert output == ps.convert_pipette_name(name) @pytest.mark.parametrize( @@ -163,7 +167,7 @@ def test_model_version_type_string_version( PipetteModelType.p50, PipetteChannelType.SINGLE_CHANNEL, PipetteVersionType(1, 0), - "p50_single_v1.0", + "p50_single_v1", ], [ PipetteModelType.p1000, @@ -189,3 +193,30 @@ def test_name_type_string_generation( pipette_type=model_type, pipette_channels=channels, pipette_version=version ) assert output == str(data) + + +@pytest.mark.parametrize( + argnames=["model_or_name", "valid"], + argvalues=[ + [ + "p50_single", + True, + ], + [ + "p50_sing", + False, + ], + [ + "p100_multi", + False, + ], + [ + "p1000_multi_v3.3", + True, + ], + ], +) +def test_supported_pipette( + model_or_name: Union[PipetteName, PipetteModel, None], valid: bool +) -> None: + assert ps.supported_pipette(model_or_name) == valid