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

zfhifi/cryosms hifi tests #655

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
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
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