From e3f12552b6dbd470717b9a72fdbea7708d533b6e Mon Sep 17 00:00:00 2001 From: pmoegenburg Date: Mon, 19 Aug 2024 16:26:15 -0400 Subject: [PATCH] moved magic numbers into shared-data LiquidProbeSettings --- api/src/opentrons/config/defaults_ot3.py | 6 ++++++ api/src/opentrons/config/types.py | 2 ++ api/src/opentrons/hardware_control/ot3api.py | 14 +++++++------ api/tests/opentrons/config/ot3_settings.py | 2 ++ .../backends/test_ot3_controller.py | 2 ++ .../hardware_control/test_ot3_api.py | 20 +++++++++++++++++-- .../hardware_testing/gravimetric/config.py | 2 ++ .../hardware_testing/liquid_sense/execute.py | 2 ++ .../pipette_assembly_qc_ot3/__main__.py | 2 ++ 9 files changed, 44 insertions(+), 8 deletions(-) diff --git a/api/src/opentrons/config/defaults_ot3.py b/api/src/opentrons/config/defaults_ot3.py index b09235ce35b..50384fbb26a 100644 --- a/api/src/opentrons/config/defaults_ot3.py +++ b/api/src/opentrons/config/defaults_ot3.py @@ -29,6 +29,8 @@ sensor_threshold_pascals=15, output_option=OutputOptions.sync_buffer_to_csv, aspirate_while_sensing=False, + samples_for_baselining=20, + sample_time_sec=0.004, data_files={InstrumentProbeType.PRIMARY: "/data/pressure_sensor_data.csv"}, ) @@ -343,6 +345,10 @@ def _build_default_liquid_probe( aspirate_while_sensing=from_conf.get( "aspirate_while_sensing", default.aspirate_while_sensing ), + samples_for_baselining=from_conf.get( + "samples_for_baselining", default.samples_for_baselining + ), + sample_time_sec=from_conf.get("sample_time_sec", default.sample_time_sec), data_files=data_files, ) diff --git a/api/src/opentrons/config/types.py b/api/src/opentrons/config/types.py index b7306156c37..85f5356a8e5 100644 --- a/api/src/opentrons/config/types.py +++ b/api/src/opentrons/config/types.py @@ -137,6 +137,8 @@ class LiquidProbeSettings: sensor_threshold_pascals: float output_option: OutputOptions aspirate_while_sensing: bool + samples_for_baselining: int + sample_time_sec: float data_files: Optional[Dict[InstrumentProbeType, str]] diff --git a/api/src/opentrons/hardware_control/ot3api.py b/api/src/opentrons/hardware_control/ot3api.py index a0a760a83d8..47887343cb1 100644 --- a/api/src/opentrons/hardware_control/ot3api.py +++ b/api/src/opentrons/hardware_control/ot3api.py @@ -2606,17 +2606,17 @@ def remove_gripper_probe(self) -> None: self._gripper_handler.remove_probe() @staticmethod - def liquid_probe_non_responsive_z_distance(z_speed: float) -> float: + def liquid_probe_non_responsive_z_distance( + z_speed: float, samples_for_baselining: int, sample_time_sec: float + ) -> float: """Calculate the Z distance travelled where the LLD pass will be unresponsive.""" # NOTE: (sigler) Here lye some magic numbers. # The Z axis probing motion uses the first 20 samples to calculate # a baseline for all following samples, making the very beginning of # that Z motion unable to detect liquid. The sensor is configured for # 4ms sample readings, and so we then assume it takes ~80ms to complete. - # If the Z is moving at 5mm/sec, then ~80ms equates to ~0.4 - baseline_during_z_sample_num = 20 # FIXME: (sigler) shouldn't be defined here? - sample_time_sec = 0.004 # FIXME: (sigler) shouldn't be defined here? - baseline_duration_sec = baseline_during_z_sample_num * sample_time_sec + # If the Z is moving at 5mm/sec, then ~80ms equates to ~0.4mm + baseline_duration_sec = samples_for_baselining * sample_time_sec non_responsive_z_mm = baseline_duration_sec * z_speed return non_responsive_z_mm @@ -2710,7 +2710,9 @@ async def liquid_probe( # TODO: (sigler) add this to pipette's liquid def (per tip) z_overlap_between_passes_mm = 0.1 sensor_baseline_z_move_mm = OT3API.liquid_probe_non_responsive_z_distance( - probe_settings.mount_speed + probe_settings.mount_speed, + probe_settings.samples_for_baselining, + probe_settings.sample_time_sec, ) z_offset_per_pass = sensor_baseline_z_move_mm + z_overlap_between_passes_mm diff --git a/api/tests/opentrons/config/ot3_settings.py b/api/tests/opentrons/config/ot3_settings.py index 4ef58d2ddbe..868cd314468 100644 --- a/api/tests/opentrons/config/ot3_settings.py +++ b/api/tests/opentrons/config/ot3_settings.py @@ -124,6 +124,8 @@ "sensor_threshold_pascals": 17, "output_option": OutputOptions.stream_to_csv, "aspirate_while_sensing": False, + "samples_for_baselining": 20, + "sample_time_sec": 0.004, "data_files": {"PRIMARY": "/data/pressure_sensor_data.csv"}, }, "calibration": { 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 fa57c4347ff..c993924758a 100644 --- a/api/tests/opentrons/hardware_control/backends/test_ot3_controller.py +++ b/api/tests/opentrons/hardware_control/backends/test_ot3_controller.py @@ -182,6 +182,8 @@ def fake_liquid_settings() -> LiquidProbeSettings: sensor_threshold_pascals=15, output_option=OutputOptions.can_bus_only, aspirate_while_sensing=False, + samples_for_baselining=20, + sample_time_sec=0.004, data_files={InstrumentProbeType.PRIMARY: "fake_file_name"}, ) diff --git a/api/tests/opentrons/hardware_control/test_ot3_api.py b/api/tests/opentrons/hardware_control/test_ot3_api.py index 5e79f8ed149..8b11423915b 100644 --- a/api/tests/opentrons/hardware_control/test_ot3_api.py +++ b/api/tests/opentrons/hardware_control/test_ot3_api.py @@ -122,6 +122,8 @@ def fake_liquid_settings() -> LiquidProbeSettings: sensor_threshold_pascals=15, output_option=OutputOptions.can_bus_only, aspirate_while_sensing=False, + samples_for_baselining=20, + sample_time_sec=0.004, data_files={InstrumentProbeType.PRIMARY: "fake_file_name"}, ) @@ -825,6 +827,8 @@ async def test_liquid_probe( sensor_threshold_pascals=15, output_option=OutputOptions.can_bus_only, aspirate_while_sensing=True, + samples_for_baselining=20, + sample_time_sec=0.004, data_files={InstrumentProbeType.PRIMARY: "fake_file_name"}, ) fake_max_z_dist = 10.0 @@ -901,8 +905,12 @@ async def test_liquid_probe_plunger_moves( fake_max_z_dist = 75.0 config = ot3_hardware.config.liquid_sense mount_speed = config.mount_speed + samples_for_baselining = config.samples_for_baselining + sample_time_sec = config.sample_time_sec non_responsive_z_mm = ot3_hardware.liquid_probe_non_responsive_z_distance( - mount_speed + mount_speed, + samples_for_baselining, + sample_time_sec, ) probe_pass_overlap = 0.1 @@ -995,8 +1003,12 @@ async def test_liquid_probe_mount_moves( fake_max_z_dist = 10.0 config = ot3_hardware.config.liquid_sense mount_speed = config.mount_speed + samples_for_baselining = config.samples_for_baselining + sample_time_sec = config.sample_time_sec non_responsive_z_mm = ot3_hardware.liquid_probe_non_responsive_z_distance( - mount_speed + mount_speed, + samples_for_baselining, + sample_time_sec, ) probe_pass_overlap = 0.1 @@ -1068,6 +1080,8 @@ async def test_multi_liquid_probe( sensor_threshold_pascals=15, output_option=OutputOptions.can_bus_only, aspirate_while_sensing=True, + samples_for_baselining=20, + sample_time_sec=0.004, data_files={InstrumentProbeType.PRIMARY: "fake_file_name"}, ) fake_max_z_dist = 10.0 @@ -1140,6 +1154,8 @@ async def _fake_pos_update_and_raise( sensor_threshold_pascals=15, output_option=OutputOptions.can_bus_only, aspirate_while_sensing=True, + samples_for_baselining=20, + sample_time_sec=0.004, data_files={InstrumentProbeType.PRIMARY: "fake_file_name"}, ) # with a mount speed of 5, pass overlap of 0.5 and a 0.2s delay on z diff --git a/hardware-testing/hardware_testing/gravimetric/config.py b/hardware-testing/hardware_testing/gravimetric/config.py index 53663fdd614..cf9909bb858 100644 --- a/hardware-testing/hardware_testing/gravimetric/config.py +++ b/hardware-testing/hardware_testing/gravimetric/config.py @@ -172,6 +172,8 @@ def _get_liquid_probe_settings( sensor_threshold_pascals=lqid_cfg["sensor_threshold_pascals"], output_option=OutputOptions.sync_only, aspirate_while_sensing=False, + samples_for_baselining=20, + sample_time_sec=0.004, data_files={InstrumentProbeType.PRIMARY: "/data/testing_data/pressure.csv"}, ) diff --git a/hardware-testing/hardware_testing/liquid_sense/execute.py b/hardware-testing/hardware_testing/liquid_sense/execute.py index 15e94325a91..304ac8060cd 100644 --- a/hardware-testing/hardware_testing/liquid_sense/execute.py +++ b/hardware-testing/hardware_testing/liquid_sense/execute.py @@ -447,6 +447,8 @@ def _run_trial( sensor_threshold_pascals=lqid_cfg["sensor_threshold_pascals"], output_option=OutputOptions.sync_buffer_to_csv, aspirate_while_sensing=run_args.aspirate, + samples_for_baselining=20, + sample_time_sec=0.004, data_files=data_files, ) diff --git a/hardware-testing/hardware_testing/production_qc/pipette_assembly_qc_ot3/__main__.py b/hardware-testing/hardware_testing/production_qc/pipette_assembly_qc_ot3/__main__.py index b6fd22b73e2..607bec97fee 100644 --- a/hardware-testing/hardware_testing/production_qc/pipette_assembly_qc_ot3/__main__.py +++ b/hardware-testing/hardware_testing/production_qc/pipette_assembly_qc_ot3/__main__.py @@ -1380,6 +1380,8 @@ async def _test_liquid_probe( sensor_threshold_pascals=probe_cfg.sensor_threshold_pascals, output_option=OutputOptions.can_bus_only, # FIXME: remove aspirate_while_sensing=False, + samples_for_baselining=20, + sample_time_sec=0.004, data_files=None, ) end_z = await api.liquid_probe(