From 0a0a0ef4b7941fcd7881405c59f3a29dca301206 Mon Sep 17 00:00:00 2001 From: juliacscarvalho Date: Thu, 9 May 2024 16:15:37 -0300 Subject: [PATCH] Add acc filter gain --- siriuspy/siriuspy/devices/fofb.py | 24 ++++++++++++++++++++++++ siriuspy/siriuspy/devices/pwrsupply.py | 11 ++++++++++- siriuspy/siriuspy/fofb/csdev.py | 10 ++++++---- siriuspy/siriuspy/fofb/main.py | 16 +++++++++++++++- 4 files changed, 55 insertions(+), 6 deletions(-) diff --git a/siriuspy/siriuspy/devices/fofb.py b/siriuspy/siriuspy/devices/fofb.py index 5d5fe3768..4ecefe00b 100644 --- a/siriuspy/siriuspy/devices/fofb.py +++ b/siriuspy/siriuspy/devices/fofb.py @@ -715,6 +715,7 @@ class FamFastCorrs(_DeviceSet): DEF_ATOL_CURRENT_RB = 1e-6 DEF_ATOL_CURRENT_MON = 2e-2 DEF_ATOL_ACCFILTER = 2**-17 + DEF_ATOL_ACCFILTERGAIN = 2**-12 def __init__(self, psnames=None): """Init.""" @@ -1112,6 +1113,29 @@ def check_fofbacc_filter( if not _np.allclose(values[i], dev.fofbacc_filter, atol=atol): return False return True + + def set_fofbacc_filter_gain(self, value, psnames=None, psindices=None): + """Command to set accumulator filter gain.""" + if not isinstance(value, (list, tuple, _np.ndarray)): + raise ValueError('Value must be iterable.') + devs = self._get_devices(psnames, psindices) + for i, dev in enumerate(devs): + dev.fofbacc_filter_gain = value + return True + + def check_fofbacc_filter_gain( + self, values, psnames=None, psindices=None, + atol=DEF_ATOL_ACCFILTERGAIN): + """Check accumulator filter gain.""" + if not self.connected: + return False + devs = self._get_devices(psnames, psindices) + impltd = _np.asarray([d.fofbacc_filter_gain for d in devs]) + if isinstance(values, (int, float)): + values = len(devs) * [values] + if _np.allclose(values, impltd, atol=atol): + return True + return False # ----- private methods ----- diff --git a/siriuspy/siriuspy/devices/pwrsupply.py b/siriuspy/siriuspy/devices/pwrsupply.py index 214095f14..445d4ae08 100644 --- a/siriuspy/siriuspy/devices/pwrsupply.py +++ b/siriuspy/siriuspy/devices/pwrsupply.py @@ -65,7 +65,8 @@ class _PSDev(_Device): 'FOFBAccSatMin-SP', 'FOFBAccSatMin-RB', 'FOFBAcc-Mon', 'FOFBAccDecimation-SP', 'FOFBAccDecimation-RB', - 'FOFBAccFilter-SP', 'FOFBAccFilter-RB', + 'FOFBAccFilter-SP', 'FOFBAccFilter-RB', + 'FOFBAccFilterGain-SP', 'FOFBAccFilterGain-RB', ) _properties_pulsed = ( 'Voltage-SP', 'Voltage-RB', 'Voltage-Mon', @@ -1041,6 +1042,14 @@ def fofbacc_filter(self): def fofbacc_filter(self, value): self['FOFBAccFilter-SP'] = value + @property + def fofbacc_filter_gain(self): + """FOFB accumulator filter gain.""" + return self['FOFBAccFilterGain-RB'] + + @fofbacc_filter_gain.setter + def fofbacc_filter_gain(self, value): + self['FOFBAccFilterGain-SP'] = value class PowerSupplyFBP(PowerSupply): """FBP Power Supply Device.""" diff --git a/siriuspy/siriuspy/fofb/csdev.py b/siriuspy/siriuspy/fofb/csdev.py index 4f56d0865..f613bd718 100644 --- a/siriuspy/siriuspy/fofb/csdev.py +++ b/siriuspy/siriuspy/fofb/csdev.py @@ -130,10 +130,6 @@ def __init__(self): self.dccenbl_min = _np.array([ bpm.sub[2:] in ['M1', 'M2'] for bpm in self.bpm_names]) - # acc filters - # self.acc_filter_unit = 50*[1] - # self - def get_hlfofb_database(self): """Return Soft IOC database.""" pvs_database = { @@ -287,6 +283,12 @@ def get_hlfofb_database(self): 'FOFBAccFilter-RB': { 'type': 'float', 'value': 50*[0], 'prec': 5, 'count': 50, 'unit': 'coef'}, + 'FOFBAccFilterGain-SP': { + 'type': 'float', 'value': 1.0, 'prec': 5, + 'lolim': 0, 'hilim': 1000,'unit': 'gain'}, + 'FOFBAccFilterGain-RB': { + 'type': 'float', 'value': 1.0, 'prec': 5, + 'unit': 'gain'}, # Reference Orbit (same order of SOFB) 'RefOrbX-SP': { diff --git a/siriuspy/siriuspy/fofb/main.py b/siriuspy/siriuspy/fofb/main.py index 2af784aea..1e838e91e 100644 --- a/siriuspy/siriuspy/fofb/main.py +++ b/siriuspy/siriuspy/fofb/main.py @@ -74,6 +74,7 @@ def __init__(self, tests=False): self._corr_accdec_enm = self._const.DecOpt.FOFB self._corr_accfilter_val = 20*[0.0] self._corr_accfilter_enm = self._const.FilterOpt.Unit + self._corr_accfilter_gain = 1.0 self._thread_enbllist = None self._abort_thread_enbllist = False self._min_sing_val = self._const.MIN_SING_VAL @@ -156,6 +157,7 @@ def __init__(self, tests=False): 'FOFBAccDecimation-SP': _part(self.set_corr_accdec, 'value'), 'FOFBAccFilter-Sel': _part(self.set_corr_accfilter, 'enum'), 'FOFBAccFilter-SP': _part(self.set_corr_accfilter, 'value'), + 'FOFBAccFilterGain-SP': self.set_corr_accfilter_gain, 'RefOrbX-SP': _part(self.set_reforbit, 'x'), 'RefOrbY-SP': _part(self.set_reforbit, 'y'), 'RespMat-SP': self.set_respmat, @@ -729,7 +731,7 @@ def set_corr_accfilter(self, option, value): else: filter = self._corr_accfilter_val - self._corr_accdfilter_enm = value + self._corr_accfilter_enm = value self.run_callbacks('FOFBAccFilter-Sts', value) self.run_callbacks('FOFBAccFilter-SP', filter) else: @@ -743,6 +745,18 @@ def set_corr_accfilter(self, option, value): return True + def set_corr_accfilter_gain(self, value): + """Set corrector accumulator filter gain.""" + + self._corr_accfilter_gain = value + self.run_callbacks('FOFBAccFilterGain-RB', value) + + self._update_log('Setting FOFB Acc filter gain...') + self._corrs_dev.set_fofbacc_filter_gain(value) + self._update_log('...done!') + + return True + def _thread_corr_currzero(self): if self._corrs_dev.check_current(0): self._update_log('Current of all correctors already zeroed.')