From e644ffa1230e3ede2a7f468f7b8a210692693f7e Mon Sep 17 00:00:00 2001 From: Tom Willemsen Date: Fri, 14 Feb 2025 16:37:21 +0000 Subject: [PATCH] zfhifi/cryosms hifi tests --- tests/cryosms.py | 69 ++++++++++++++++++++++-------------------------- tests/zfhifi.py | 30 ++++++++++++--------- 2 files changed, 48 insertions(+), 51 deletions(-) diff --git a/tests/cryosms.py b/tests/cryosms.py index 79ef7ba0..0be92365 100644 --- a/tests/cryosms.py +++ b/tests/cryosms.py @@ -34,7 +34,7 @@ def local_cryosms_pv(pv): "MAX_VOLT": 9.9, "WRITE_UNIT": "TESLA", "DISPLAY_UNIT": "TESLA", - "RAMP_FILE": r"C:\\Instrument\\Apps\\EPICS\\support\\cryosms\\master\\ramps\\default.txt", + "RAMP_FILE": r"C:\\Instrument\\Apps\\EPICS\\support\\cryosms\\master\\ramps\\test.txt", "MID_TOLERANCE": 0.1, "TARGET_TOLERANCE": 0.01, "ALLOW_PERSIST": "Yes", @@ -42,9 +42,9 @@ def local_cryosms_pv(pv): "FAST_FILTER_VALUE": 1, "FILTER_VALUE": 0.1, "NPP": 0.0005, - "FAST_PERSISTENT_SETTLETIME": 5, - "PERSISTENT_SETTLETIME": 5, # 60 on HIFI - "NON_PERSISTENT_SETTLETIME": 5, # 30 on HIFI + "FAST_PERSISTENT_SETTLETIME": 0, + "PERSISTENT_SETTLETIME": 0, # 60 on HIFI + "NON_PERSISTENT_SETTLETIME": 0, # 30 on HIFI "SWITCH_TEMP_PV": local_cryosms_pv("SIM:SWITCH:TEMP"), "SWITCH_HIGH": 3.7, "SWITCH_LOW": 3.65, @@ -63,8 +63,8 @@ def local_cryosms_pv(pv): "MIN_NO_OF_COMP": 1, "COMP_1_STAT_PV": local_cryosms_pv("SIM:COMP1STAT"), "COMP_2_STAT_PV": local_cryosms_pv("SIM:COMP2STAT"), - "HOLD_TIME_ZERO": 5, # 12 on HIFI - "HOLD_TIME": 5, # 30 on HIFI + "HOLD_TIME_ZERO": 0, # 12 on HIFI + "HOLD_TIME": 0, # 30 on HIFI "VOLT_STABILITY_DURATION": 300, "VOLT_TOLERANCE": 0.2, "FAST_RATE": 5.0, @@ -90,6 +90,20 @@ def local_cryosms_pv(pv): class CryoSMSTests(unittest.TestCase): + def set_and_wait(self, target): + self.ca.set_pv_value("ABORT", 1) + time.sleep(10) + + self.ca.set_pv_value("PAUSE:SP", 0) + self.ca.set_pv_value("TARGET:SP", target) + self.ca.set_pv_value("START:SP", 1) + + self.ca.assert_that_pv_is("OUTPUT", target, timeout=120) + self.ca.assert_that_pv_is("RAMP:STAT", "HOLDING ON TARGET") + self.ca.assert_that_pv_is("STAT", "Ready") + self.ca.assert_that_pv_is("READY", "Ready") + self.ca.assert_that_pv_is("RAMP:RAMPING", "Not Ramping") + def setUp(self): self._lewis, self._ioc = typing.cast( tuple[EmulatorLauncher, BaseLauncher], @@ -102,22 +116,12 @@ def setUp(self): else: self._lewis.backdoor_set_on_device("is_quenched", False) self.ca.assert_that_pv_is("INIT", "Startup complete", timeout=60) - self.ca.set_pv_value("PERSIST", 0) + self.ca.set_pv_value("PERSIST:SP", 0) self.ca.set_pv_value("SIM:TEMP:MAGNET", 3.67) self.ca.set_pv_value("SIM:COMP1STAT", 1) self.ca.set_pv_value("SIM:COMP2STAT", 1) - self._lewis.backdoor_set_on_device("mid_target", 0) - self._lewis.backdoor_set_on_device("output", 0) - self.ca.assert_that_pv_is("MID", 0) - self.ca.assert_that_pv_is("OUTPUT:RAW", 0) - - self.ca.set_pv_value("HEATER:STAT:_SP", 1) - self.ca.set_pv_value("ABORT", 1) - - self.ca.assert_that_pv_is("RAMP:STAT", "HOLDING ON TARGET") - self.ca.assert_that_pv_is("OUTPUT:RAW", 0) - self.ca.assert_that_pv_is("OUTPUT", 0) + self.set_and_wait(0) @skip_if_recsim("Cannot properly simulate device startup in recsim") def test_GIVEN_certain_macros_WHEN_IOC_loads_THEN_correct_values_initialised(self): @@ -175,19 +179,7 @@ def test_GIVEN_psu_at_field_strength_A_WHEN_told_to_ramp_to_B_THEN_correct_rates ): start_point, end_point = ramp_data[0] ramp_rates = ramp_data[1] - output = None - # When setting output, convert from Gauss to Amps by dividing by 10000 and T_TO_A, also ensure sign handled - # correctly - sign = 1 if start_point >= 0 else -1 - - self.ca.set_pv_value("ABORT", 1) - time.sleep(3) # Time for abort to be noticed - self._lewis.backdoor_run_function_on_device("switch_direction", [sign]) - self._lewis.backdoor_set_on_device("mid_target", abs(start_point)) - self._lewis.backdoor_set_on_device("output", abs(start_point)) - self.ca.assert_that_pv_is_number("MID", abs(start_point), tolerance=0.0001, timeout=120) - self.ca.assert_that_pv_is_number("OUTPUT:RAW", start_point, tolerance=0.0001, timeout=120) - self.ca.assert_that_pv_is("RAMP:STAT", "HOLDING ON TARGET") + self.set_and_wait(start_point) self.ca.set_pv_value("TARGET:SP", end_point) self.ca.set_pv_value("START:SP", 1) @@ -212,6 +204,10 @@ def test_GIVEN_psu_at_field_strength_A_WHEN_told_to_ramp_to_B_THEN_correct_rates self.ca.assert_that_pv_is("RAMP:STAT", "HOLDING ON TARGET", timeout=120) self.ca.assert_that_pv_is_within_range("OUTPUT", end_point - 0.01, end_point + 0.01) + self.ca.assert_that_pv_is("STAT", "Ready") + self.ca.assert_that_pv_is("READY", "Ready") + self.ca.assert_that_pv_is("RAMP:RAMPING", "Not Ramping") + @skip_if_recsim("C++ driver can not correctly initialised in recsim") def test_GIVEN_IOC_not_ramping_WHEN_ramp_started_THEN_simulated_ramp_performed(self): self.ca.set_pv_value("TARGET:SP", 1) @@ -238,9 +234,8 @@ def test_GIVEN_IOC_ramping_WHEN_paused_and_unpaused_THEN_ramp_is_paused_resumed_ ) # Resumes when pause set to false, completes ramp self.ca.set_pv_value("PAUSE:SP", 0) - self.ca.assert_that_pv_is("RAMP:STAT", "RAMPING", msg="Ramping failed to resume") self.ca.assert_that_pv_is( - "RAMP:STAT", "HOLDING ON TARGET", timeout=10, msg="Ramping failed to complete" + "RAMP:STAT", "HOLDING ON TARGET", msg="Ramping failed to complete" ) @skip_if_recsim("C++ driver can not correctly initialised in recsim") @@ -251,7 +246,7 @@ def test_GIVEN_IOC_ramping_WHEN_aborted_THEN_ramp_aborted(self): self.ca.assert_that_pv_is("RAMP:STAT", "RAMPING") # Aborts when abort set to true, then hits ready again self.ca.set_pv_value("ABORT", 1) - self.ca.assert_that_pv_is("RAMP:STAT", "HOLDING ON TARGET", timeout=10) + self.ca.assert_that_pv_is("RAMP:STAT", "HOLDING ON TARGET") @skip_if_recsim("C++ driver can not correctly initialised in recsim") def test_GIVEN_IOC_paused_WHEN_aborted_THEN_ramp_aborted(self): @@ -260,12 +255,10 @@ def test_GIVEN_IOC_paused_WHEN_aborted_THEN_ramp_aborted(self): self.ca.set_pv_value("START:SP", 1) self.ca.assert_that_pv_is("RAMP:STAT", "RAMPING") self.ca.set_pv_value("PAUSE:SP", 1) - ramp_target = self.ca.get_pv_value("MID") self.ca.assert_that_pv_is("RAMP:STAT", "HOLDING ON PAUSE", msg="Ramping failed to pause") # Aborts when abort set to true, then hits ready again self.ca.set_pv_value("ABORT", 1) - self.ca.assert_that_pv_is("RAMP:STAT", "HOLDING ON TARGET", timeout=10) - self.ca.assert_that_pv_is_not("MID", ramp_target) + self.ca.assert_that_pv_is("RAMP:STAT", "HOLDING ON TARGET") @skip_if_recsim("Test is to tell whether data from emulator is correctly received") def test_GIVEN_output_nonzero_WHEN_units_changed_THEN_output_raw_adjusts(self): @@ -357,7 +350,7 @@ def test_GIVEN_persistent_mode_and_leads_at_field_WHEN_target_reached_THEN_cools self, ): # Start a ramp in persistent mode with leads staying at field - self.ca.set_pv_value("PERSIST", 1) + self.ca.set_pv_value("PERSIST:SP", 1) self.ca.set_pv_value("RAMP:LEADS", 0) self.ca.set_pv_value("TARGET:SP", 1) self.ca.set_pv_value("START:SP", 1) diff --git a/tests/zfhifi.py b/tests/zfhifi.py index 77b0e88c..36393c71 100644 --- a/tests/zfhifi.py +++ b/tests/zfhifi.py @@ -13,7 +13,7 @@ PREFIX = os.environ.get("testing_prefix") or os.environ.get("MYPVPREFIX") -SMALL = 0.00001 +SMALL = 0.002 # Limited by rounding in cryosms ioc def local_cryosms_pv(pv: str, iocnum: int) -> str: @@ -31,8 +31,8 @@ def cryosms_macros(iocnum: int) -> dict[str, Any]: "WRITE_UNIT": "AMPS", "DISPLAY_UNIT": "GAUSS", "RAMP_FILE": r"C:\\Instrument\\Apps\\EPICS\\support\\cryosms\\master\\ramps\\default.txt", - "MID_TOLERANCE": 9999999999, # 0.1 - "TARGET_TOLERANCE": 9999999999, # 0.1 + "MID_TOLERANCE": 999999999, # 0.1 + "TARGET_TOLERANCE": 999999999, # 0.1 "ALLOW_PERSIST": "No", "USE_SWITCH": "No", "FAST_FILTER_VALUE": 1, @@ -40,7 +40,7 @@ def cryosms_macros(iocnum: int) -> dict[str, Any]: "NPP": 0.0005, "FAST_PERSISTENT_SETTLETIME": 0, "PERSISTENT_SETTLETIME": 0, # 60 on HIFI - "NON_PERSISTENT_SETTLETIME": 0, + "NON_PERSISTENT_SETTLETIME": 0, # Should not be used in ZF mode "SWITCH_TEMP_PV": local_cryosms_pv("SIM:SWITCH:TEMP", iocnum), "SWITCH_HIGH": 3.7, "SWITCH_LOW": 3.65, @@ -59,8 +59,8 @@ def cryosms_macros(iocnum: int) -> dict[str, Any]: "MIN_NO_OF_COMP": 0, "COMP_1_STAT_PV": "NULL", "COMP_2_STAT_PV": "NULL", - "HOLD_TIME_ZERO": 0, # 12 on HIFI - "HOLD_TIME": 0, + "HOLD_TIME_ZERO": 0, # Should not be used in ZF mode + "HOLD_TIME": 0, # Should not be used in ZF mode "VOLT_STABILITY_DURATION": 1, "VOLT_TOLERANCE": 0.2, "FAST_RATE": 0.5, @@ -97,7 +97,7 @@ def group3_hall_probe_ioc(iocnum: int) -> dict[str, Any]: "system_tests", ), "macros": { - "FIELD_SCAN_RATE": "Passive", + "FIELD_SCAN_RATE": ".1 second", "TEMP_SCAN_RATE": ".1 second", "NAME0": "X", "NAME1": "Y", @@ -195,6 +195,8 @@ def ca_lewis_ioc( self.backdoor_set_raw_meas_fields(x1=0, y1=0, z1=0, x2=0, y2=0, z2=0) self.ca.set_pv_value("FEEDBACK", 1) + self.ca.set_pv_value("STATEMACHINE:LOOP_DELAY", 250) + self.ca.set_pv_value("STATEMACHINE:WRITE_TIMEOUT", 10) self.ca.set_pv_value("AUTOFEEDBACK", 0, sleep_after_set=5) self.ca.assert_that_pv_is("STATUS", "No error", timeout=30) @@ -278,12 +280,14 @@ def test_WHEN_magnetometer_disconnected_THEN_reflected_in_zf_ioc(self): self.ca.assert_that_pv_is("STATUS", "No error", timeout=30) def test_WHEN_psu_disconnected_THEN_reflected_in_zf_ioc(self): - self.ca.set_pv_value("AUTOFEEDBACK", 1) - for psu in [self.x_psu_lewis, self.y_psu_lewis, self.z_psu_lewis]: + self.ca.set_pv_value("AUTOFEEDBACK", 0) + self.wait_for_psus_ready() with psu.backdoor_simulate_disconnected_device(): - self.ca.assert_that_pv_is("STATUS", "Power supply invalid", timeout=30) - self.ca.assert_that_pv_is("STATUS", "No error", timeout=30) + self.ca.set_pv_value("AUTOFEEDBACK", 1) + self.ca.assert_that_pv_is("STATUS", "Power supply invalid", timeout=120) + self.ca.set_pv_value("AUTOFEEDBACK", 0) + self.ca.assert_that_pv_is("STATUS", "No error", timeout=300) def test_WHEN_has_a_persistent_gradient_THEN_magnetometer_readings_adjusted_correctly(self): y1_raw = 100 @@ -354,7 +358,7 @@ def test_WHEN_has_inhomogenity_THEN_magnetometer_readings_adjusted_correctly(sel def test_WHEN_autofeedback_on_and_field_always_too_low_THEN_output_goes_up_until_limit(self): self.ca.set_pv_value("AUTOFEEDBACK", 1) - self.backdoor_set_raw_meas_fields(x1=-1, y1=-1, z1=-1, x2=-1, y2=-1, z2=-1) + self.backdoor_set_raw_meas_fields(x1=-5, y1=-5, z1=-5, x2=-5, y2=-5, z2=-5) self.ca.assert_that_pv_is_number("OUTPUT:X:SP", 15, timeout=300) # Limited by MAX self.ca.assert_that_pv_is_number("OUTPUT:Y:SP", 15, timeout=300) @@ -365,7 +369,7 @@ def test_WHEN_autofeedback_on_and_field_always_too_low_THEN_output_goes_up_until def test_WHEN_autofeedback_on_and_field_always_too_high_THEN_output_goes_down_until_limit(self): self.ca.set_pv_value("AUTOFEEDBACK", 1) - self.backdoor_set_raw_meas_fields(x1=1, y1=1, z1=1, x2=1, y2=1, z2=1) + self.backdoor_set_raw_meas_fields(x1=5, y1=5, z1=5, x2=5, y2=5, z2=5) self.ca.assert_that_pv_is_number("OUTPUT:X:SP", -15, timeout=300) # Limited by MIN self.ca.assert_that_pv_is_number("OUTPUT:Y:SP", -15, timeout=300)