Skip to content
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

feat(hardware-testing): add the 200ul 96 channel to the gravimetric and photometric tests #16774

Merged
merged 7 commits into from
Nov 13, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
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
Loading