Skip to content

fix(shared-data): Glycerol 96ch max flowrate should be 228 not 250 #18856

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 5 commits into
base: chore_release-8.5.0
Choose a base branch
from

Conversation

andySigler
Copy link
Contributor

@andySigler andySigler commented Jul 8, 2025

Overview

Max flow-rate for T1000 at high volumes is 223 ul/sec, but the definitions say in places 250 ul/sec which is too high for ALL volumes. While lower target volumes cannot high 223 ul/sec (eg: 10 ul aspirate maxes out at <200 ul/sec), at least if we configure the default to be the max's max speed then we can tell a logic story for why it is that value.

Here's the 96ch water function with T1000 tips:

[3.9, 1.789, 5.4283],
[5.6991, 0.3019, 11.2278],
[8.5155, 0.2111, 11.7453],
[13.1482, 0.0858, 12.8124],
[17.8909, 0.0604, 13.1472],
[46.0982, 0.0155, 13.9505],
[93.5618, 0.0046, 14.4523],
[112.5991, 0.0023, 14.6687],
[189.5555, 0.002, 14.7035],
[305.5891, 0.001, 14.887],
[431.2836, 0.0004, 15.055],
[625.0209, 0.0003, 15.1309],
[818.6909, 0.0001, 15.2112],
[963.9909, 0.0001, 15.2445],
[992.0791, -0.0005, 15.7723],
[1012.2118, 0.0007, 14.6701],    <----- this is the line I'll use for 1000 uL
[1037.1873, 0.0005, 14.8072]

then my math to find that max flow-rate at 1000ul is:

// mm-per-mm (target volume is 1000 ul)
(1000 * 0.0007) + 14.6701 = 15.3701

// mm distance
1000 / 15.3701 = 65.0613

// max flow-rate (plunger max speed is 15 mm/sec)
1000 / (65.0613 / 15) = 230.5518

// distance of push-out (35 ul of air)
35 / 15.904 = 2.2007

// max flow-rate (including push-out this time)
1000 / ((65.0613 + 2.2007) / 15) = 223.0085

Test Plan and Hands on Testing

Changelog

Review requests

Risk assessment

No risk. Does not change robot performance at all (because the hardware-controller was already limiting it silently).

@andySigler andySigler requested review from sanni-t and ncdiehl11 July 8, 2025 18:59
@andySigler andySigler requested review from a team as code owners July 8, 2025 18:59
Copy link

codecov bot commented Jul 8, 2025

Codecov Report

All modified and coverable lines are covered by tests ✅

Project coverage is 24.43%. Comparing base (9efbc96) to head (86874cc).

Additional details and impacted files

Impacted file tree graph

@@                   Coverage Diff                   @@
##           chore_release-8.5.0   #18856      +/-   ##
=======================================================
- Coverage                25.70%   24.43%   -1.28%     
=======================================================
  Files                     3265     3258       -7     
  Lines                   282652   281757     -895     
  Branches                 29924    29872      -52     
=======================================================
- Hits                     72664    68844    -3820     
- Misses                  209966   212886    +2920     
- Partials                    22       27       +5     
Flag Coverage Δ
protocol-designer 18.70% <ø> (ø)
step-generation 4.32% <ø> (-1.13%) ⬇️

Flags with carried forward coverage won't be shown. Click here to find out more.

see 146 files with indirect coverage changes

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@sanni-t sanni-t changed the base branch from edge to chore_release-8.5.0 July 8, 2025 19:05
@sanni-t sanni-t requested a review from a team as a code owner July 8, 2025 19:05
@andySigler andySigler closed this Jul 8, 2025
@andySigler andySigler force-pushed the fix-shared-data-glycerol-96ch-max-flowrate-228 branch from 5d9ff63 to 9efbc96 Compare July 8, 2025 19:29
@andySigler andySigler reopened this Jul 8, 2025
Copy link
Member

@sanni-t sanni-t left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ty!

@alexjoel42
Copy link
Contributor

alexjoel42 commented Jul 8, 2025

image

@andySigler @ncdiehl
I am testing on
https://github.com/Opentrons/opentrons/pull/18858/files

Please someone verify if that's an okay way to check this

It looks like your numbers disagreed

import json
from opentrons import protocol_api, types

metadata = {
    "created": "2025-07-08T20:51:12.902Z",
    "lastModified": "2025-07-08T21:10:18.918Z",
    "protocolDesigner": "8.5.0-alpha.2",
    "source": "Protocol Designer",
}

requirements = {"robotType": "Flex", "apiLevel": "2.24"}

def run(protocol: protocol_api.ProtocolContext) -> None:
    # Load Adapters:
    adapter_1 = protocol.load_adapter(
        "opentrons_flex_96_tiprack_adapter",
        location="C2",
        namespace="opentrons",
    )

    # Load Labware:
    tip_rack_1 = adapter_1.load_labware(
        "opentrons_flex_96_tiprack_1000ul",
        namespace="opentrons",
    )
    reservoir_1 = protocol.load_labware(
        "agilent_1_reservoir_290ml",
        location="B1",
        namespace="opentrons",
    )

    # Load Pipettes:
    pipette = protocol.load_instrument("flex_96channel_1000", tip_racks=[tip_rack_1])

    # Load Trash Bins:
    trash_bin_1 = protocol.load_trash_bin("A3")

    # Define Liquids:
    liquid_1 = protocol.define_liquid(
        "f",
        display_color="#b925ff",
    )

    # Load Liquids:
    reservoir_1.load_liquid(
        wells=["A1"],
        liquid=liquid_1,
        volume=124124,
    )

    # Load Liquid Classes:
    glycerol_50_base_class = protocol.get_liquid_class("glycerol_50")

    # PROTOCOL STEPS

    # Step 1:
    pipette.configure_nozzle_layout(
        protocol_api.ALL,
        tip_racks=[tip_rack_1],
    )
    pipette.transfer_with_liquid_class(
        volume=1000,
        source=[reservoir_1["A1"]],
        dest=[reservoir_1["A1"]],
        new_tip="always",
        trash_location=trash_bin_1,
        group_wells=False,
        keep_last_tip=True,
        liquid_class=protocol.define_liquid_class(
            name="transfer_step_1",
            base_liquid_class=glycerol_50_base_class,
            properties={"flex_96channel_1000": {"opentrons/opentrons_flex_96_tiprack_1000ul/1": {
                "aspirate": {
                    "aspirate_position": {
                        "offset": {"x": 0, "y": 0, "z": 2},
                        "position_reference": "well-bottom",
                    },
                    "flow_rate_by_volume": [(0, 200)],
                    "pre_wet": False,
                    "correction_by_volume": [(0, 12)],
                    "delay": {"enabled": True, "duration": 0.7},
                    "mix": {"enabled": False},
                    "submerge": {
                        "delay": {"enabled": False},
                        "speed": 10,
                        "start_position": {
                            "offset": {"x": 0, "y": 0, "z": 2},
                            "position_reference": "well-top",
                        },
                    },
                    "retract": {
                        "air_gap_by_volume": [(0, 0)],
                        "delay": {"enabled": False},
                        "end_position": {
                            "offset": {"x": 0, "y": 0, "z": 2},
                            "position_reference": "well-top",
                        },
                        "speed": 10,
                        "touch_tip": {"enabled": False},
                    },
                },
                "dispense": {
                    "dispense_position": {
                        "offset": {"x": 0, "y": 0, "z": 2},
                        "position_reference": "well-bottom",
                    },
                    "push_out_by_volume": [(0, 35)],
                    "flow_rate_by_volume": [(0, 223)],
                    "correction_by_volume": [(0, 12)],
                    "delay": {"enabled": True, "duration": 0.5},
                    "mix": {"enabled": False},
                    "submerge": {
                        "delay": {"enabled": False},
                        "speed": 10,
                        "start_position": {
                            "offset": {"x": 0, "y": 0, "z": 2},
                            "position_reference": "well-top",
                        },
                    },
                    "retract": {
                        "air_gap_by_volume": [(0, 0)],
                        "delay": {"enabled": False},
                        "end_position": {
                            "offset": {"x": 0, "y": 0, "z": 2},
                            "position_reference": "well-top",
                        },
                        "speed": 10,
                        "touch_tip": {"enabled": False},
                        "blowout": {"enabled": False},
                    },
                },
            }}},
        ),
    )
    pipette.drop_tip()

DESIGNER_APPLICATION = """{"robot":{"model":"OT-3 Standard"},"designerApplication":{"name":"opentrons/protocol-designer","version":"8.5.0","data":{"pipetteTiprackAssignments":{"77256c19-9f4f-4229-853e-3e2c6e1ce7d0":["opentrons/opentrons_flex_96_tiprack_1000ul/1"]},"dismissedWarnings":{"form":[],"timeline":[]},"ingredients":{"0":{"displayName":"f","displayColor":"#b925ff","liquidClass":"glycerol50V1","description":null,"liquidGroupId":"0"}},"ingredLocations":{"1ce7c748-a641-4285-811b-639ee5ad4b81:opentrons/agilent_1_reservoir_290ml/3":{"A1":{"0":{"volume":124124}}}},"savedStepForms":{"__INITIAL_DECK_SETUP_STEP__":{"stepType":"manualIntervention","id":"__INITIAL_DECK_SETUP_STEP__","labwareLocationUpdate":{"5acddb58-a2b4-4d20-b9f7-fe6eeaeef5aa:opentrons/opentrons_flex_96_tiprack_adapter/1":"C2","3996b0b6-c6ad-4f3a-91e5-b680f37ee9ea:opentrons/opentrons_flex_96_tiprack_1000ul/1":"5acddb58-a2b4-4d20-b9f7-fe6eeaeef5aa:opentrons/opentrons_flex_96_tiprack_adapter/1","1ce7c748-a641-4285-811b-639ee5ad4b81:opentrons/agilent_1_reservoir_290ml/3":"B1"},"pipetteLocationUpdate":{"77256c19-9f4f-4229-853e-3e2c6e1ce7d0":"left"},"moduleLocationUpdate":{},"trashBinLocationUpdate":{"907ada4e-4996-4304-9844-b5c33858a582:trashBin":"cutoutA3"},"wasteChuteLocationUpdate":{},"stagingAreaLocationUpdate":{},"gripperLocationUpdate":{}},"930da113-1c57-44af-8674-4acfe9aef649":{"id":"930da113-1c57-44af-8674-4acfe9aef649","stepType":"moveLiquid","stepName":"transfer","stepDetails":"","stepNumber":0,"aspirate_airGap_checkbox":false,"aspirate_airGap_volume":"","aspirate_delay_checkbox":true,"aspirate_delay_seconds":"0.7","aspirate_flowRate":"200","aspirate_labware":"1ce7c748-a641-4285-811b-639ee5ad4b81:opentrons/agilent_1_reservoir_290ml/3","aspirate_mix_checkbox":false,"aspirate_mix_times":"1","aspirate_mix_volume":"50","aspirate_mmFromBottom":2,"aspirate_position_reference":"well-bottom","aspirate_retract_delay_seconds":"0","aspirate_retract_mmFromBottom":2,"aspirate_retract_speed":"10","aspirate_retract_x_position":0,"aspirate_retract_y_position":0,"aspirate_retract_position_reference":"well-top","aspirate_submerge_delay_seconds":"0","aspirate_submerge_speed":"10","aspirate_submerge_mmFromBottom":2,"aspirate_submerge_x_position":0,"aspirate_submerge_y_position":0,"aspirate_submerge_position_reference":"well-top","aspirate_touchTip_checkbox":false,"aspirate_touchTip_mmFromTop":-1,"aspirate_touchTip_speed":"30","aspirate_touchTip_mmFromEdge":"0.5","aspirate_wellOrder_first":"t2b","aspirate_wellOrder_second":"l2r","aspirate_wells_grouped":false,"aspirate_wells":["A1"],"aspirate_x_position":0,"aspirate_y_position":0,"blowout_checkbox":false,"blowout_flowRate":"223","blowout_location":"destination","changeTip":"always","conditioning_checkbox":false,"conditioning_volume":"","dispense_airGap_checkbox":false,"dispense_airGap_volume":"","dispense_delay_checkbox":true,"dispense_delay_seconds":"0.5","dispense_flowRate":"223","dispense_labware":"1ce7c748-a641-4285-811b-639ee5ad4b81:opentrons/agilent_1_reservoir_290ml/3","dispense_mix_checkbox":false,"dispense_mix_times":"1","dispense_mix_volume":"50","dispense_mmFromBottom":2,"dispense_position_reference":"well-bottom","dispense_retract_delay_seconds":"0","dispense_retract_mmFromBottom":2,"dispense_retract_speed":"10","dispense_retract_x_position":0,"dispense_retract_y_position":0,"dispense_retract_position_reference":"well-top","dispense_submerge_delay_seconds":"0","dispense_submerge_speed":"10","dispense_submerge_mmFromBottom":2,"dispense_submerge_x_position":0,"dispense_submerge_y_position":0,"dispense_submerge_position_reference":"well-top","dispense_touchTip_checkbox":false,"dispense_touchTip_mmFromTop":-1,"dispense_touchTip_speed":"30","dispense_touchTip_mmFromEdge":"0.5","dispense_wellOrder_first":"t2b","dispense_wellOrder_second":"l2r","dispense_wells":["A1"],"dispense_x_position":0,"dispense_y_position":0,"disposalVolume_checkbox":false,"disposalVolume_volume":"","dropTip_location":"907ada4e-4996-4304-9844-b5c33858a582:trashBin","liquidClassesSupported":true,"liquidClass":"glycerol50V1","nozzles":"ALL","path":"single","pipette":"77256c19-9f4f-4229-853e-3e2c6e1ce7d0","preWetTip":false,"pushOut_checkbox":true,"pushOut_volume":"35","tipRack":"opentrons/opentrons_flex_96_tiprack_1000ul/1","volume":"1000"}},"orderedStepIds":["930da113-1c57-44af-8674-4acfe9aef649"],"pipettes":{"77256c19-9f4f-4229-853e-3e2c6e1ce7d0":{"pipetteName":"p1000_96"}},"modules":{},"labware":{"5acddb58-a2b4-4d20-b9f7-fe6eeaeef5aa:opentrons/opentrons_flex_96_tiprack_adapter/1":{"displayName":"Opentrons Flex 96 Tip Rack Adapter","labwareDefURI":"opentrons/opentrons_flex_96_tiprack_adapter/1"},"3996b0b6-c6ad-4f3a-91e5-b680f37ee9ea:opentrons/opentrons_flex_96_tiprack_1000ul/1":{"displayName":"Opentrons Flex 96 Tip Rack 1000 µL","labwareDefURI":"opentrons/opentrons_flex_96_tiprack_1000ul/1"},"1ce7c748-a641-4285-811b-639ee5ad4b81:opentrons/agilent_1_reservoir_290ml/3":{"displayName":"Agilent 1 Well Reservoir 290 mL","labwareDefURI":"opentrons/agilent_1_reservoir_290ml/3"}}}},"metadata":{"protocolName":"","author":"","description":"","source":"Protocol Designer","created":1752007872902,"lastModified":1752009018918}}"""

@alexjoel42 alexjoel42 self-requested a review July 8, 2025 21:15
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants