Skip to content

Commit

Permalink
feat(hardware-testing): add the 200ul 96 channel to the gravimetric a…
Browse files Browse the repository at this point in the history
…nd photometric tests (#16774)

<!--
Thanks for taking the time to open a Pull Request (PR)! Please make sure
you've read the "Opening Pull Requests" section of our Contributing
Guide:


https://github.com/Opentrons/opentrons/blob/edge/CONTRIBUTING.md#opening-pull-requests

GitHub provides robust markdown to format your PR. Links, diagrams,
pictures, and videos along with text formatting make it possible to
create a rich and informative PR. For more information on GitHub
markdown, see:


https://docs.github.com/en/get-started/writing-on-github/getting-started-with-writing-and-formatting-on-github/basic-writing-and-formatting-syntax

To ensure your code is reviewed quickly and thoroughly, please fill out
the sections below to the best of your ability!
-->

# Overview
Adds the 200ul pipette into the scripts and currently uses the same
settings as the other 96 but can now go through the normal tuning
process.
<!--
Describe your PR at a high level. State acceptance criteria and how this
PR fits into other work. Link issues, PRs, and other relevant resources.
-->

## Test Plan and Hands on Testing

<!--
Describe your testing of the PR. Emphasize testing not reflected in the
code. Attach protocols, logs, screenshots and any other assets that
support your testing.
-->

## Changelog

<!--
List changes introduced by this PR considering future developers and the
end user. Give careful thought and clear documentation to breaking
changes.
-->

## Review requests

<!--
- What do you need from reviewers to feel confident this PR is ready to
merge?
- Ask questions.
-->

## Risk assessment

<!--
- Indicate the level of attention this PR needs.
- Provide context to guide reviewers.
- Discuss trade-offs, coupling, and side effects.
- Look for the possibility, even if you think it's small, that your
change may affect some other part of the system.
- For instance, changing return tip behavior may also change the
behavior of labware calibration.
- How do your unit tests and on hands on testing mitigate this PR's
risks and the risk of future regressions?
- Especially in high risk PRs, explain how you know your testing is
enough.
-->
  • Loading branch information
ryanthecoder authored Nov 13, 2024
1 parent 1a8ea86 commit 00a6ccc
Show file tree
Hide file tree
Showing 9 changed files with 336 additions and 5 deletions.
2 changes: 1 addition & 1 deletion api/src/opentrons/protocols/api_support/instrument.py
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ def tip_length_for(


VALID_PIP_TIPRACK_VOL = {
"FLEX": {"p50": [50], "p1000": [50, 200, 1000]},
"FLEX": {"p50": [50], "p200": [50, 200], "p1000": [50, 200, 1000]},
"OT2": {
"p10": [10, 20],
"p20": [10, 20],
Expand Down
2 changes: 2 additions & 0 deletions hardware-testing/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,7 @@ test-photometric-multi:
test-photometric:
$(python) -m hardware_testing.gravimetric --photometric --simulate --pipette 1000 --channels 96 --tip 50 --trials 1
$(python) -m hardware_testing.gravimetric --photometric --simulate --pipette 1000 --channels 96 --tip 200 --trials 1
$(python) -m hardware_testing.gravimetric --photometric --simulate --pipette 200 --channels 96 --tip 50 --trials 1

.PHONY: test-gravimetric-single
test-gravimetric-single:
Expand All @@ -121,6 +122,7 @@ test-gravimetric-multi:
.PHONY: test-gravimetric-96
test-gravimetric-96:
$(python) -m hardware_testing.gravimetric --simulate --pipette 1000 --channels 96 --trials 2 --no-blank
$(python) -m hardware_testing.gravimetric --simulate --pipette 200 --channels 96 --trials 2 --no-blank

.PHONY: test-gravimetric
test-gravimetric:
Expand Down
19 changes: 18 additions & 1 deletion hardware-testing/hardware_testing/gravimetric/__main__.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
from hardware_testing.data import create_run_id_and_start_time, ui, get_git_description
from hardware_testing.protocols.gravimetric_lpc.gravimetric import (
gravimetric_ot3_p1000_96,
gravimetric_ot3_p200_96,
gravimetric_ot3_p1000_multi,
gravimetric_ot3_p1000_single,
gravimetric_ot3_p50_single,
Expand All @@ -26,6 +27,7 @@
photometric_ot3_p1000_single,
photometric_ot3_p50_multi,
photometric_ot3_p1000_96,
photometric_ot3_p200_96,
photometric_ot3_p50_single,
)

Expand Down Expand Up @@ -56,6 +58,9 @@
1: gravimetric_ot3_p50_single,
8: gravimetric_ot3_p50_multi,
},
200: {
96: gravimetric_ot3_p200_96,
},
1000: {
1: gravimetric_ot3_p1000_single,
8: gravimetric_ot3_p1000_multi,
Expand All @@ -68,6 +73,12 @@
1: {50: gravimetric_ot3_p50_single},
8: {50: gravimetric_ot3_p50_multi_50ul_tip_increment},
},
200: {
96: {
50: gravimetric_ot3_p200_96,
200: gravimetric_ot3_p200_96,
},
},
1000: {
1: {
50: gravimetric_ot3_p1000_single,
Expand All @@ -92,6 +103,9 @@
1: "p50_single_flex",
8: "p50_multi_flex",
},
200: {
96: "p200_96_flex",
},
1000: {
1: "p1000_single_flex",
8: "p1000_multi_flex",
Expand All @@ -109,6 +123,9 @@
50: photometric_ot3_p50_multi,
},
},
200: {
96: {50: photometric_ot3_p200_96, 200: photometric_ot3_p200_96},
},
1000: {
1: {
50: photometric_ot3_p1000_single,
Expand Down Expand Up @@ -553,7 +570,7 @@ def _main(
if __name__ == "__main__":
parser = argparse.ArgumentParser("Pipette Testing")
parser.add_argument("--simulate", action="store_true")
parser.add_argument("--pipette", type=int, choices=[50, 1000], required=True)
parser.add_argument("--pipette", type=int, choices=[50, 200, 1000], required=True)
parser.add_argument("--channels", type=int, choices=[1, 8, 96], default=1)
parser.add_argument("--tip", type=int, choices=[0, 50, 200, 1000], default=0)
parser.add_argument("--trials", type=int, default=0)
Expand Down
37 changes: 37 additions & 0 deletions hardware-testing/hardware_testing/gravimetric/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,20 @@ class PhotometricConfig(VolumetricConfig):
},
},
},
200: {
96: {
50: {
"mount_speed": 5,
"plunger_speed": 20,
"sensor_threshold_pascals": 15,
},
200: {
"mount_speed": 5,
"plunger_speed": 20,
"sensor_threshold_pascals": 15,
},
}
},
1000: {
1: {
50: {
Expand Down Expand Up @@ -199,6 +213,10 @@ def _get_liquid_probe_settings(
],
},
96: {
200: [
(50, [1.0, 50.0]), # T50
(200, [200.0]), # T200
],
1000: [ # P1000
(50, [5.0]), # T50
(200, [200.0]), # T200
Expand Down Expand Up @@ -260,6 +278,10 @@ def _get_liquid_probe_settings(
],
},
96: {
200: [
(50, [1.0, 5.0]), # T50
(200, [200.0]), # T200
],
1000: [ # P1000
(50, [5.0]), # T50
(200, [200.0]), # T200
Expand Down Expand Up @@ -340,6 +362,21 @@ def _get_liquid_probe_settings(
},
},
96: {
200: {
50: { # T50
1.0: (2.5, 2.0),
2.0: (2.5, 2.0),
3.0: (2.5, 2.0),
5.0: (2.5, 2.0),
10.0: (3.1, 1.7),
50.0: (1.5, 0.75),
},
200: { # T200
5.0: (2.5, 4.0),
50.0: (1.5, 2.0),
200.0: (1.4, 0.9),
},
},
1000: { # P1000
50: { # T50
1.0: (2.5, 2.0),
Expand Down
58 changes: 57 additions & 1 deletion hardware-testing/hardware_testing/gravimetric/increments.py
Original file line number Diff line number Diff line change
Expand Up @@ -266,6 +266,62 @@
},
},
96: {
200: {
50: {
"default": [
2.000,
3.000,
4.000,
5.000,
6.000,
7.000,
8.000,
9.000,
10.000,
15.000,
25.000,
40.000,
60.000,
],
"lowVolumeDefault": [
1.100,
1.200,
1.370,
1.700,
2.040,
2.660,
3.470,
3.960,
4.350,
4.800,
5.160,
5.890,
6.730,
8.200,
10.020,
11.100,
14.910,
28.940,
48.27,
],
},
200: {
"default": [
2.000,
3.000,
4.000,
5.000,
6.000,
7.000,
8.000,
9.000,
10.000,
50.000,
100.000,
220.000,
],
},
},
1000: { # FIXME: need to update based on DVT data
50: {
"default": [
Expand Down Expand Up @@ -322,7 +378,7 @@
1075.00,
],
},
}
},
},
}

Expand Down
126 changes: 126 additions & 0 deletions hardware-testing/hardware_testing/gravimetric/liquid_class/defaults.py
Original file line number Diff line number Diff line change
Expand Up @@ -357,6 +357,66 @@
),
},
},
200: { # P200
50: { # T50
5: DispenseSettings( # 5uL
z_submerge_depth=_default_submerge_dispense_mm,
plunger_acceleration=_default_accel_96ch_ul_sec_sec,
plunger_flow_rate=80, # ul/sec
delay=_default_dispense_delay_seconds,
z_retract_discontinuity=_default_retract_discontinuity,
z_retract_height=_default_retract_mm,
blow_out_submerged=5,
),
10: DispenseSettings( # 10uL
z_submerge_depth=_default_submerge_dispense_mm,
plunger_acceleration=_default_accel_96ch_ul_sec_sec,
plunger_flow_rate=80, # ul/sec
delay=_default_dispense_delay_seconds,
z_retract_discontinuity=_default_retract_discontinuity,
z_retract_height=_default_retract_mm,
blow_out_submerged=5,
),
50: DispenseSettings( # 50uL
z_submerge_depth=_default_submerge_dispense_mm,
plunger_acceleration=_default_accel_96ch_ul_sec_sec,
plunger_flow_rate=80, # ul/sec
delay=_default_dispense_delay_seconds,
z_retract_discontinuity=_default_retract_discontinuity,
z_retract_height=_default_retract_mm,
blow_out_submerged=5,
),
},
200: { # T200
5: DispenseSettings( # 5uL
z_submerge_depth=_default_submerge_dispense_mm,
plunger_acceleration=_default_accel_96ch_ul_sec_sec,
plunger_flow_rate=80, # ul/sec
delay=_default_dispense_delay_seconds,
z_retract_discontinuity=_default_retract_discontinuity,
z_retract_height=_default_retract_mm,
blow_out_submerged=5,
),
50: DispenseSettings( # 50uL
z_submerge_depth=_default_submerge_dispense_mm,
plunger_acceleration=_default_accel_96ch_ul_sec_sec,
plunger_flow_rate=80, # ul/sec
delay=_default_dispense_delay_seconds,
z_retract_discontinuity=_default_retract_discontinuity,
z_retract_height=_default_retract_mm,
blow_out_submerged=5,
),
200: DispenseSettings( # 200uL
z_submerge_depth=_default_submerge_dispense_mm,
plunger_acceleration=_default_accel_96ch_ul_sec_sec,
plunger_flow_rate=80, # ul/sec
delay=_default_dispense_delay_seconds,
z_retract_discontinuity=_default_retract_discontinuity,
z_retract_height=_default_retract_mm,
blow_out_submerged=5,
),
},
},
},
}

Expand Down Expand Up @@ -728,6 +788,72 @@
),
},
},
200: { # P200
50: { # T50
5: AspirateSettings( # 5uL
z_submerge_depth=_default_submerge_aspirate_mm,
plunger_acceleration=_default_accel_96ch_ul_sec_sec,
plunger_flow_rate=6.5, # ul/sec
delay=_default_aspirate_delay_seconds,
z_retract_discontinuity=_default_retract_discontinuity,
z_retract_height=_default_retract_mm,
leading_air_gap=0,
trailing_air_gap=0.1,
),
10: AspirateSettings( # 10uL
z_submerge_depth=_default_submerge_aspirate_mm,
plunger_acceleration=_default_accel_96ch_ul_sec_sec,
plunger_flow_rate=6.5, # ul/sec
delay=_default_aspirate_delay_seconds,
z_retract_discontinuity=_default_retract_discontinuity,
z_retract_height=_default_retract_mm,
leading_air_gap=0,
trailing_air_gap=0.1,
),
50: AspirateSettings( # 50uL
z_submerge_depth=_default_submerge_aspirate_mm,
plunger_acceleration=_default_accel_96ch_ul_sec_sec,
plunger_flow_rate=6.5, # ul/sec
delay=_default_aspirate_delay_seconds,
z_retract_discontinuity=_default_retract_discontinuity,
z_retract_height=_default_retract_mm,
leading_air_gap=0,
trailing_air_gap=0.1,
),
},
200: { # T200
5: AspirateSettings( # 5uL
z_submerge_depth=_default_submerge_aspirate_mm,
plunger_acceleration=_default_accel_96ch_ul_sec_sec,
plunger_flow_rate=80, # ul/sec
delay=_default_aspirate_delay_seconds,
z_retract_discontinuity=_default_retract_discontinuity,
z_retract_height=_default_retract_mm,
leading_air_gap=0,
trailing_air_gap=2,
),
50: AspirateSettings( # 50uL
z_submerge_depth=_default_submerge_aspirate_mm,
plunger_acceleration=_default_accel_96ch_ul_sec_sec,
plunger_flow_rate=80, # ul/sec
delay=_default_aspirate_delay_seconds,
z_retract_discontinuity=_default_retract_discontinuity,
z_retract_height=_default_retract_mm,
leading_air_gap=0,
trailing_air_gap=3.5,
),
200: AspirateSettings( # 200uL
z_submerge_depth=_default_submerge_aspirate_mm,
plunger_acceleration=_default_accel_96ch_ul_sec_sec,
plunger_flow_rate=80, # ul/sec
delay=_default_aspirate_delay_seconds,
z_retract_discontinuity=_default_retract_discontinuity,
z_retract_height=_default_retract_mm,
leading_air_gap=0,
trailing_air_gap=2,
),
},
},
},
}

Expand Down
12 changes: 10 additions & 2 deletions hardware-testing/hardware_testing/opentrons_api/helpers_ot3.py
Original file line number Diff line number Diff line change
Expand Up @@ -109,9 +109,17 @@ def _create_fake_pipette_id(mount: OT3Mount, model: Optional[str]) -> Optional[s
return None
items = model.split("_")
assert len(items) == 3
size = "P1K" if items[0] == "p1000" else "P50"
match items[0]:
case "p1000":
size = "P1K"
version = 35
case "p50":
size = "P50"
version = 35
case "p200":
size = "P2H"
version = 30
channels = "S" if items[1] == "single" else "M"
version = 35 # model names don't have a version so just fake a 3.5 version
date = datetime.now().strftime("%y%m%d")
unique_number = 1 if mount == OT3Mount.LEFT else 2
return f"{size}{channels}{version}{date}A0{unique_number}"
Expand Down
Loading

0 comments on commit 00a6ccc

Please sign in to comment.