From 8e31580a646394176bc3b0f06c702c2b0337b2ab Mon Sep 17 00:00:00 2001 From: Ana Clara Oliveira Date: Tue, 16 Apr 2024 11:54:39 -0300 Subject: [PATCH] orbintlk.FIX: handle BPM false positive problem --- siriuspy/siriuspy/orbintlk/csdev.py | 1 + siriuspy/siriuspy/orbintlk/main.py | 12 +++++++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/siriuspy/siriuspy/orbintlk/csdev.py b/siriuspy/siriuspy/orbintlk/csdev.py index 3d9f303fe..441993a0e 100644 --- a/siriuspy/siriuspy/orbintlk/csdev.py +++ b/siriuspy/siriuspy/orbintlk/csdev.py @@ -213,6 +213,7 @@ def __init__(self): if NR_BPM != len(self.bpm_names): raise ValueError('Inconsistent NR_BPM parameter!') self.bpm_nicknames = _BPMSearch.get_nicknames(self.bpm_names) + self.bpm_idcs = {b: idx for idx, b in enumerate(self.bpm_names)} # bpm position along the ring self.bpm_pos = _BPMSearch.get_positions(self.bpm_names) diff --git a/siriuspy/siriuspy/orbintlk/main.py b/siriuspy/siriuspy/orbintlk/main.py index cce2cd5de..7ca7dbd5e 100644 --- a/siriuspy/siriuspy/orbintlk/main.py +++ b/siriuspy/siriuspy/orbintlk/main.py @@ -1358,13 +1358,23 @@ def _callback_bpm_intlk(self, pvname, value, **kws): if not value: return # launch thread to log interlock details + bpmname = _PVName(pvname).device_name _CAThread( target=self._log_bpm_intlk, - args=(_PVName(pvname).device_name, ), + args=(bpmname, ), daemon=True).start() # launch thread to send interlock to RF as a backup if self._thread_cbbpm and self._thread_cbbpm.is_alive(): return + + # NOTE: the next lines help to avoid killing beam in case one BPM that + # is not enabled raises a false positive interlock signal. + idx = self._const.bpm_idcs[bpmname] + enbl = self._enable_lists['pos'][idx] or self._enable_lists['ang'][idx] + if not enbl: + self._update_log(f'WARN:{bpmname} false positive') + return + self._thread_cbbpm = _CAThread( target=self._do_callback_bpm_intlk, daemon=True) self._thread_cbbpm.start()