-
Notifications
You must be signed in to change notification settings - Fork 183
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
base: chore_release-8.5.0
Are you sure you want to change the base?
fix(shared-data): Glycerol 96ch max flowrate should be 228 not 250 #18856
Conversation
Codecov ReportAll modified and coverable lines are covered by tests ✅
Additional details and impacted files@@ 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
Flags with carried forward coverage won't be shown. Click here to find out more. 🚀 New features to boost your workflow:
|
5d9ff63
to
9efbc96
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ty!
@andySigler @ncdiehl 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}}""" |
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:
then my math to find that max flow-rate at 1000ul is:
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).