Skip to content

Commit

Permalink
zfhifi/cryosms hifi tests
Browse files Browse the repository at this point in the history
  • Loading branch information
Tom-Willemsen committed Feb 14, 2025
1 parent 418f616 commit e644ffa
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 51 deletions.
69 changes: 31 additions & 38 deletions tests/cryosms.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,17 +34,17 @@ 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",
"USE_SWITCH": "Yes",
"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,
Expand All @@ -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,
Expand All @@ -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],
Expand All @@ -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):
Expand Down Expand Up @@ -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)
Expand All @@ -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)
Expand All @@ -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")
Expand All @@ -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):
Expand All @@ -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):
Expand Down Expand Up @@ -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)
Expand Down
30 changes: 17 additions & 13 deletions tests/zfhifi.py
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand All @@ -31,16 +31,16 @@ 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,
"FILTER_VALUE": 0.1,
"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,
Expand All @@ -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,
Expand Down Expand Up @@ -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",
Expand Down Expand Up @@ -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)

Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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)
Expand All @@ -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)
Expand Down

0 comments on commit e644ffa

Please sign in to comment.