diff --git a/siriuspy/siriuspy/clientconfigdb/types/as_corrloop_params.py b/siriuspy/siriuspy/clientconfigdb/types/as_corrloop_params.py index a11aaeda8..8bbfc51fe 100644 --- a/siriuspy/siriuspy/clientconfigdb/types/as_corrloop_params.py +++ b/siriuspy/siriuspy/clientconfigdb/types/as_corrloop_params.py @@ -1,8 +1,10 @@ """Parameters of the IOCs of the AP discipline.""" from copy import deepcopy as _dcopy -_off = 0 -_on = 1 +from siriuspy.optics.constants import SI as _SI + + +_SI_HARM_NR = _SI.harmonic_number def get_dict(): @@ -90,11 +92,11 @@ def get_dict(): ['SI-Glob:DI-BbBProc-L:CSET3', [0.0]*31, 0.0], ['SI-Glob:DI-BbBProc-L:FB_PATTERN', '', 0.0], ['SI-Glob:DI-BbBProc-L:CF_PATTERN', '', 0.0], - ['SI-Glob:DI-BbBProc-L:FB_MASK', [0]*864, 0.0], - ['SI-Glob:DI-BbBProc-L:CF_MASK', [0]*864, 0.0], - ['SI-Glob:DI-BbBProc-L:DRIVE0_MASK', [0]*864, 0.0], - ['SI-Glob:DI-BbBProc-L:DRIVE1_MASK', [0]*864, 0.0], - ['SI-Glob:DI-BbBProc-L:DRIVE2_MASK', [0]*864, 0.0], + ['SI-Glob:DI-BbBProc-L:FB_MASK', [0]*_SI_HARM_NR, 0.0], + ['SI-Glob:DI-BbBProc-L:CF_MASK', [0]*_SI_HARM_NR, 0.0], + ['SI-Glob:DI-BbBProc-L:DRIVE0_MASK', [0]*_SI_HARM_NR, 0.0], + ['SI-Glob:DI-BbBProc-L:DRIVE1_MASK', [0]*_SI_HARM_NR, 0.0], + ['SI-Glob:DI-BbBProc-L:DRIVE2_MASK', [0]*_SI_HARM_NR, 0.0], ['SI-Glob:DI-BbBProc-L:DRIVE0_PATTERN', '', 0.0], ['SI-Glob:DI-BbBProc-L:DRIVE1_PATTERN', '', 0.0], ['SI-Glob:DI-BbBProc-L:DRIVE2_PATTERN', '', 0.0], @@ -128,17 +130,17 @@ def get_dict(): ['SI-Glob:DI-BbBProc-H:CSET3', [0.0]*31, 0.0], ['SI-Glob:DI-BbBProc-H:FB_PATTERN', '', 0.0], ['SI-Glob:DI-BbBProc-H:CF_PATTERN', '', 0.0], - ['SI-Glob:DI-BbBProc-H:FB_MASK', [0]*864, 0.0], - ['SI-Glob:DI-BbBProc-H:CF_MASK', [0]*864, 0.0], + ['SI-Glob:DI-BbBProc-H:FB_MASK', [0]*_SI_HARM_NR, 0.0], + ['SI-Glob:DI-BbBProc-H:CF_MASK', [0]*_SI_HARM_NR, 0.0], ['SI-Glob:DI-BbBProc-H:CLEAN_PATTERN', '', 0.0], ['SI-Glob:DI-BbBProc-H:CLEAN_ENABLE', 0, 0.0], ['SI-Glob:DI-BbBProc-H:CLEAN_PERIOD', 0.0, 0.0], ['SI-Glob:DI-BbBProc-H:CLEAN_SPAN', 0.0, 0.0], ['SI-Glob:DI-BbBProc-H:CLEAN_TUNE', 0.0, 0.0], ['SI-Glob:DI-BbBProc-H:CLEAN_AMPL', 0.0, 0.0], - ['SI-Glob:DI-BbBProc-H:DRIVE0_MASK', [0]*864, 0.0], - ['SI-Glob:DI-BbBProc-H:DRIVE1_MASK', [0]*864, 0.0], - ['SI-Glob:DI-BbBProc-H:DRIVE2_MASK', [0]*864, 0.0], + ['SI-Glob:DI-BbBProc-H:DRIVE0_MASK', [0]*_SI_HARM_NR, 0.0], + ['SI-Glob:DI-BbBProc-H:DRIVE1_MASK', [0]*_SI_HARM_NR, 0.0], + ['SI-Glob:DI-BbBProc-H:DRIVE2_MASK', [0]*_SI_HARM_NR, 0.0], ['SI-Glob:DI-BbBProc-H:DRIVE0_PATTERN', '', 0.0], ['SI-Glob:DI-BbBProc-H:DRIVE1_PATTERN', '', 0.0], ['SI-Glob:DI-BbBProc-H:DRIVE2_PATTERN', '', 0.0], @@ -172,17 +174,17 @@ def get_dict(): ['SI-Glob:DI-BbBProc-V:CSET3', [0.0]*31, 0.0], ['SI-Glob:DI-BbBProc-V:FB_PATTERN', '', 0.0], ['SI-Glob:DI-BbBProc-V:CF_PATTERN', '', 0.0], - ['SI-Glob:DI-BbBProc-V:FB_MASK', [0]*864, 0.0], - ['SI-Glob:DI-BbBProc-V:CF_MASK', [0]*864, 0.0], + ['SI-Glob:DI-BbBProc-V:FB_MASK', [0]*_SI_HARM_NR, 0.0], + ['SI-Glob:DI-BbBProc-V:CF_MASK', [0]*_SI_HARM_NR, 0.0], ['SI-Glob:DI-BbBProc-V:CLEAN_PATTERN', '', 0.0], ['SI-Glob:DI-BbBProc-V:CLEAN_ENABLE', 0, 0.0], ['SI-Glob:DI-BbBProc-V:CLEAN_PERIOD', 0.0, 0.0], ['SI-Glob:DI-BbBProc-V:CLEAN_SPAN', 0.0, 0.0], ['SI-Glob:DI-BbBProc-V:CLEAN_TUNE', 0.0, 0.0], ['SI-Glob:DI-BbBProc-V:CLEAN_AMPL', 0.0, 0.0], - ['SI-Glob:DI-BbBProc-V:DRIVE0_MASK', [0]*864, 0.0], - ['SI-Glob:DI-BbBProc-V:DRIVE1_MASK', [0]*864, 0.0], - ['SI-Glob:DI-BbBProc-V:DRIVE2_MASK', [0]*864, 0.0], + ['SI-Glob:DI-BbBProc-V:DRIVE0_MASK', [0]*_SI_HARM_NR, 0.0], + ['SI-Glob:DI-BbBProc-V:DRIVE1_MASK', [0]*_SI_HARM_NR, 0.0], + ['SI-Glob:DI-BbBProc-V:DRIVE2_MASK', [0]*_SI_HARM_NR, 0.0], ['SI-Glob:DI-BbBProc-V:DRIVE0_PATTERN', '', 0.0], ['SI-Glob:DI-BbBProc-V:DRIVE1_PATTERN', '', 0.0], ['SI-Glob:DI-BbBProc-V:DRIVE2_PATTERN', '', 0.0], diff --git a/siriuspy/siriuspy/clientconfigdb/types/as_diagnostics.py b/siriuspy/siriuspy/clientconfigdb/types/as_diagnostics.py index 252ce3331..db0c9f4d2 100644 --- a/siriuspy/siriuspy/clientconfigdb/types/as_diagnostics.py +++ b/siriuspy/siriuspy/clientconfigdb/types/as_diagnostics.py @@ -1,6 +1,11 @@ """Diagnostic equipments configuration.""" from copy import deepcopy as _dcopy +from siriuspy.optics.constants import SI as _SI + + +_SI_HARM_NR = _SI.harmonic_number + def get_dict(): """Return configuration type dictionary.""" @@ -423,7 +428,7 @@ def get_dict(): [':GENTriggerHwDly-SP', 0, 0.0], [':PMTriggerHwDly-SP', 0, 0.0], # [':INFOClkFreq-SP', 220910069.0, 0.0], - [':INFOHarmonicNumber-SP', 864, 0.0], + [':INFOHarmonicNumber-SP', _SI_HARM_NR, 0.0], [':INFOTbTRate-SP', 382, 0.0], [':INFOFOFBRate-SP', 8786, 0.0], [':INFOMONITRate-SP', 21929856, 0.0], diff --git a/siriuspy/siriuspy/clientconfigdb/types/global_config.py b/siriuspy/siriuspy/clientconfigdb/types/global_config.py index 535d9aeac..163cf1b86 100644 --- a/siriuspy/siriuspy/clientconfigdb/types/global_config.py +++ b/siriuspy/siriuspy/clientconfigdb/types/global_config.py @@ -3,6 +3,7 @@ import numpy as _np +from siriuspy.optics.constants import SI as _SI from siriuspy.pwrsupply.csdev import \ DEFAULT_WFM_FBP as _DEFAULT_WFM_FBP, \ MAX_WFMSIZE_FBP as _MAX_WFMSIZE_FBP, \ @@ -11,9 +12,8 @@ from siriuspy.clientconfigdb.types.as_diagnostics import _bpms -_OFF = 0 -_ON = 1 _SLOWREF = 0 +_SI_HARM_NR = _SI.harmonic_number def get_dict(): @@ -2714,7 +2714,7 @@ def get_dict(): _pvs_as_injection = [ [ 'AS-Glob:AP-InjCtrl:BucketListAllowedMask-SP', - _np.ones(864, dtype=int), + _np.ones(_SI_HARM_NR, dtype=int), 0.0 ], ] diff --git a/siriuspy/siriuspy/currinfo/main.py b/siriuspy/siriuspy/currinfo/main.py index 74dcda0a0..46e3501b2 100644 --- a/siriuspy/siriuspy/currinfo/main.py +++ b/siriuspy/siriuspy/currinfo/main.py @@ -13,6 +13,7 @@ from ..clientarch import ClientArchiver as _ClientArch from ..envars import VACA_PREFIX as _vaca_prefix from ..epics import PV as _PV, SiriusPVTimeSerie as _SiriusPVTimeSerie +from ..optics.constants import SI as _SI, BO as _BO from ..oscilloscope import Keysight as _Keysight, Scopes as _Scopes from ..pwrsupply.csdev import Const as _PSc from ..search import LLTimeSearch as _LLTimeSearch @@ -201,7 +202,7 @@ def _update_pvs(self, *args): class BOCurrInfoApp(_CurrInfoApp): """Main Class.""" - HARMNUM = 828 + HARMNUM = _BO.harmonic_number INTCURR_INTVL = 53.5 * 1e-3 / 3600 # [h] MAX_CURRENT = 3.0 # [A] ENERGY2TIME = { # energy: time[s] @@ -376,8 +377,8 @@ def _update_pvs(self): class SICurrInfoApp(_CurrInfoApp): """Main Class.""" - HARMNUM = 864 - HARMNUM_RATIO = 864 / 828 + HARMNUM = _SI.harmonic_number + HARMNUM_RATIO = _SI.harmonic_number / _BO.harmonic_number CURR_THRESHOLD = 0.02 # [mA] MAX_CURRENT = 1.0 # [A] diff --git a/siriuspy/siriuspy/devices/sofb.py b/siriuspy/siriuspy/devices/sofb.py index ffec4e613..3bd26b875 100644 --- a/siriuspy/siriuspy/devices/sofb.py +++ b/siriuspy/siriuspy/devices/sofb.py @@ -4,6 +4,14 @@ import numpy as _np +from ..optics.constants import ( + SI as _SI, + BO as _BO, + TB as _TB, + TS as _TS, + accelerators as _accelerators, +) + from ..sofb.csdev import SOFBFactory from ..sofb.utils import si_calculate_bump as _si_calculate_bump from .device import Device as _Device @@ -34,9 +42,10 @@ def __new__( raise NotImplementedError(devname) # SOFB object - data = SOFBFactory.create(devname[:2]) + acc = _accelerators.accelerators[devname[:2]] + data = SOFBFactory.create(acc) - if data.acc == 'SI': + if acc == _SI: return SISOFB( devname, data, @@ -44,7 +53,7 @@ def __new__( auto_monitor=auto_monitor, auto_monitor_mon=auto_monitor_mon, ) - elif data.isring: + elif acc == _BO: return BOSOFB( devname, data, @@ -147,7 +156,8 @@ def __init__( raise NotImplementedError(devname) # SOFB object - self._data = data or SOFBFactory.create(devname[:2]) + acc = _accelerators[devname[:2]] + self._data = data or SOFBFactory.create(acc) # call base class constructor super().__init__( devname, @@ -156,6 +166,11 @@ def __init__( auto_monitor_mon=auto_monitor_mon, ) + @property + def acc(self): + """Accelerator.""" + return self._data.acc + @property def data(self): """.""" @@ -1018,12 +1033,12 @@ def drivedata_bpm(self): @property def orbx(self): """.""" - return self['SlowOrbX-Mon'] if self._data.isring else None + return self['SlowOrbX-Mon'] if self.acc.isring else None @property def orby(self): """.""" - return self['SlowOrbY-Mon'] if self._data.isring else None + return self['SlowOrbY-Mon'] if self.acc.isring else None @property def kickrf(self): @@ -1063,13 +1078,13 @@ def mancorrgainrf(self, value): @property def rfenbl(self): """.""" - if self._data.acc_idx == self._data.Rings.SI: + if self.acc == _SI: return bool(self['RFEnbl-Sts']) @rfenbl.setter def rfenbl(self, value): """.""" - if self._data.acc_idx == self._data.Rings.SI: + if self.acc == _SI: self['RFEnbl-Sel'] = value @property diff --git a/siriuspy/siriuspy/devices/timing.py b/siriuspy/siriuspy/devices/timing.py index 20695b241..8ae8d7fa5 100644 --- a/siriuspy/siriuspy/devices/timing.py +++ b/siriuspy/siriuspy/devices/timing.py @@ -6,6 +6,7 @@ import numpy as _np from mathphys.functions import get_namedtuple as _get_namedtuple +from ..optics.constants import SI as _SI from ..search import HLTimeSearch as _HLTimeSearch from ..timesys.csdev import ( Const as _TIConst, @@ -148,13 +149,13 @@ def injection_count(self): def fill_bucketlist(self, stop, start=1, step=30, timeout=10): """Fill bucket list.""" if (step > 0) and (start > stop): - stop += 864 + stop += _SI.harmonic_number if (step < 0) and (stop > start): - stop -= 864 + stop -= _SI.harmonic_number value = _np.arange(start, stop, step) - value = (value - 1) % 864 + 1 + value = (value - 1) % _SI.harmonic_number + 1 self.bucketlist = value - rb_value = _np.zeros(864) + rb_value = _np.zeros(_SI.harmonic_number) rb_value[: len(value)] = value return self.wait('BucketList-RB', rb_value, timeout=timeout) diff --git a/siriuspy/siriuspy/devices/tune.py b/siriuspy/siriuspy/devices/tune.py index 98653e61a..ca0753354 100644 --- a/siriuspy/siriuspy/devices/tune.py +++ b/siriuspy/siriuspy/devices/tune.py @@ -1,5 +1,7 @@ """Tune devices.""" +from ..optics.constants import SI as _SI + from .device import Device as _Device, DeviceSet as _DeviceSet @@ -55,8 +57,9 @@ def rev_harmonic(self): @rev_harmonic.setter def rev_harmonic(self, value): """Revolution harmonic.""" - if not 0 <= int(value) <= 864: - raise ValueError('rev_harmonic must be in range [0, 864]') + hnumber = _SI.harmonic_number + if not 0 <= int(value) <= hnumber: + raise ValueError(f'rev_harmonic must be in range [0, {hnumber}]') self['RevN-SP'] = int(value) @property diff --git a/siriuspy/siriuspy/diagbeam/bpm/csdev.py b/siriuspy/siriuspy/diagbeam/bpm/csdev.py index 8014a218b..b625a3aba 100644 --- a/siriuspy/siriuspy/diagbeam/bpm/csdev.py +++ b/siriuspy/siriuspy/diagbeam/bpm/csdev.py @@ -3,6 +3,7 @@ import numpy as _np from ... import csdev as _csdev +from siriuspy.optics.constants import SI as _SI # --- Enumeration Types --- @@ -79,9 +80,11 @@ def get_bpm_database(prefix=''): 'INFOFOFBRate-RB': { 'type': 'int', 'value': 1910, 'low': 0, 'high': 2**31-1}, 'INFOHarmonicNumber-SP': { - 'type': 'int', 'value': 864, 'low': 0, 'high': 2**31-1}, + 'type': 'int', 'value': _SI.harmonic_number, + 'low': 0, 'high': 2**31-1}, 'INFOHarmonicNumber-RB': { - 'type': 'int', 'value': 864, 'low': 0, 'high': 2**31-1}, + 'type': 'int', 'value': _SI.harmonic_number, + 'low': 0, 'high': 2**31-1}, 'INFOMONITRate-SP': { 'type': 'int', 'value': 21965000, 'low': 0, 'high': 2**31-1}, 'INFOMONITRate-RB': { diff --git a/siriuspy/siriuspy/fpmosc/csdev.py b/siriuspy/siriuspy/fpmosc/csdev.py index cc344a673..aed6ab8a7 100644 --- a/siriuspy/siriuspy/fpmosc/csdev.py +++ b/siriuspy/siriuspy/fpmosc/csdev.py @@ -1,6 +1,8 @@ """Define PVs, constants and properties of Filling Pattern SoftIOCs.""" from .. import csdev as _csdev +from ..optics.constants import SI as _SI + # --- Const class --- @@ -9,7 +11,7 @@ class Const(_csdev.Const): """Const class defining Filling Pattern constants.""" FP_MAX_ARR_SIZE = 40000 - FP_HARM_NUM = 864 + FP_HARM_NUM = _SI.harmonic_number FP_MAX_UPDT_TIME = 600 # [s] DEVNAME = 'SI-Glob:DI-FPMOsc' diff --git a/siriuspy/siriuspy/fpmosc/main.py b/siriuspy/siriuspy/fpmosc/main.py index 6bb3eddda..848bbc171 100644 --- a/siriuspy/siriuspy/fpmosc/main.py +++ b/siriuspy/siriuspy/fpmosc/main.py @@ -12,6 +12,7 @@ from ..callbacks import Callback as _Callback from ..envars import VACA_PREFIX as _VACA_PREFIX from ..epics import PV as _PV +from ..optics.constants import SI as _SI from ..oscilloscope import Keysight as _Keysight, ScopeSignals as _ScopeSignals from .csdev import Const as _Const, get_si_fpmosc_database as _get_database @@ -88,7 +89,7 @@ def write(self, reason, value): if not isinstance(value, (_np.ndarray, list, tuple)): return False value = _np.array(value) - if value.size != 864 or value.min() < 0: + if value.size != _SI.harmonic_number or value.min() < 0: return False self._fillpat_ref = value / value.sum() self.run_callbacks('FillPatternRef-RB', self._fillpat_ref) diff --git a/siriuspy/siriuspy/injctrl/csdev.py b/siriuspy/siriuspy/injctrl/csdev.py index 0d1e0010b..8e33f8549 100644 --- a/siriuspy/siriuspy/injctrl/csdev.py +++ b/siriuspy/siriuspy/injctrl/csdev.py @@ -1,6 +1,7 @@ """Injection Control App.""" from .. import csdev as _csdev +from ..optics.constants import SI as _SI from ..util import ClassProperty as _classproperty from ..search import PSSearch as _PSSearch @@ -68,7 +69,7 @@ class Const(_csdev.Const): ) MIN_BKT = 1 - MAX_BKT = 864 + MAX_BKT = _SI.harmonic_number RF_RMP_TIMEOUT = 3*60 # [s] TI_INJ_TIMEOUT = 3*60 # [s] @@ -257,10 +258,12 @@ def get_injctrl_propty_database(): 'type': 'int', 'value': 1, 'unit': 'bucket index', 'lolim': _ct.MIN_BKT, 'hilim': _ct.MAX_BKT}, 'BucketListStop-SP': { - 'type': 'int', 'value': 864, 'unit': 'bucket index', + 'type': 'int', 'value': _SI.harmonic_number, + 'unit': 'bucket index', 'lolim': _ct.MIN_BKT, 'hilim': _ct.MAX_BKT, }, 'BucketListStop-RB': { - 'type': 'int', 'value': 864, 'unit': 'bucket index', + 'type': 'int', 'value': _SI.harmonic_number, + 'unit': 'bucket index', 'lolim': _ct.MIN_BKT, 'hilim': _ct.MAX_BKT}, 'BucketListStep-SP': { 'type': 'int', 'value': 29, 'unit': 'buckets', diff --git a/siriuspy/siriuspy/optics/constants.py b/siriuspy/siriuspy/optics/constants.py index 875aa4543..77e510374 100644 --- a/siriuspy/siriuspy/optics/constants.py +++ b/siriuspy/siriuspy/optics/constants.py @@ -21,10 +21,14 @@ def velocity(cls): class TLine(Accelerator): """Transport line.""" + isring = False + class Ring(Accelerator): """Ring.""" + isring = True + @_ClassProperty def circumference(cls): """Ring circumference [m].""" @@ -75,3 +79,11 @@ class TS(TLine): sector = 'TS' beam_energy = 3 # [GeV] length = 26.8933 # [m] + + +accelerators = { + 'SI': SI, + 'BO': BO, + 'TB': TB, + 'TS': TS, +} diff --git a/siriuspy/siriuspy/ramp/conn.py b/siriuspy/siriuspy/ramp/conn.py index c7c996fdc..2733376ce 100644 --- a/siriuspy/siriuspy/ramp/conn.py +++ b/siriuspy/siriuspy/ramp/conn.py @@ -18,6 +18,7 @@ from ..epics import EpicsProperty as _EpicsProperty, \ EpicsPropertiesList as _EpicsPropsList from ..namesys import SiriusPVName as _PVName +from ..optics.constants import BO as _BO from ..pwrsupply.csdev import Const as _PSConst from ..timesys.csdev import Const as _TIConst, \ get_hl_trigger_database as _get_trig_db @@ -730,7 +731,7 @@ def __init__(self, prefix=_PREFIX, def get_deltakicks(self): """Get CH and CV delta kicks calculated by SOFB.""" - bo_sofb_db = _SOFBRings(acc='BO') + bo_sofb_db = _SOFBRings(acc=_BO) rb_dic = self.readbacks ch_dkicks = rb_dic[ConnSOFB.IOC_PREFIX + ':DeltaKickCH-Mon'] ch_names = bo_sofb_db.ch_names diff --git a/siriuspy/siriuspy/sofb/base_class.py b/siriuspy/siriuspy/sofb/base_class.py index fe78f3f36..0193657c7 100644 --- a/siriuspy/siriuspy/sofb/base_class.py +++ b/siriuspy/siriuspy/sofb/base_class.py @@ -43,18 +43,13 @@ def prefix(self): @property def acc(self): - """Accelerator name.""" + """Accelerator class.""" return self._csorb.acc - @property - def acc_idx(self): - """Accelerator index.""" - return self._csorb.acc_idx - @property def isring(self): """Ring accelerator status.""" - return self._csorb.isring + return self.acc.isring @property def status(self): @@ -114,6 +109,16 @@ def __init__(self, acc, callback=None): self._pvs = {} self.put_enable = True + @property + def acc(self): + """Accelerator class.""" + return self._csorb.acc + + @property + def isring(self): + """Ring accelerator status.""" + return self.acc.isring + @property def connected(self): """Status connected.""" diff --git a/siriuspy/siriuspy/sofb/bpms.py b/siriuspy/siriuspy/sofb/bpms.py index 41f600370..e6d47daa7 100644 --- a/siriuspy/siriuspy/sofb/bpms.py +++ b/siriuspy/siriuspy/sofb/bpms.py @@ -6,6 +6,11 @@ from ..diagbeam.bpm.csdev import Const as _CSBPM from ..envars import VACA_PREFIX as LL_PREF from ..epics import PV as _PV +from ..optics.constants import ( + SI as _SI, + BO as _BO, + accelerators as _accelerators, +) from ..search import HLTimeSearch as _HLTimesearch from ..timesys.csdev import Const as _TIConst from .base_class import BaseTimingConfig as _BaseTimingConfig @@ -18,7 +23,8 @@ class BPM(_BaseTimingConfig): def __init__(self, name, callback=None): """.""" - super().__init__(name[:2], callback) + acc = _accelerators[name[:2]] + super().__init__(acc, callback) self.has_news = True self._name = name @@ -63,7 +69,7 @@ def __init__(self, name, callback=None): "SwPhaseSyncEn": _CSBPM.DsblEnbl.enabled, # Enable Switching sync "TestDataEn": _CSBPM.DsblEnbl.disabled, } - if self._name.sec in {'SI', 'BO'}: + if self.acc in {_SI, _BO}: self._config_ok_vals["ACQChannel"] = _CSBPM.AcqChan.TbT pvs = { "SwMode": "SwMode-Sel", @@ -187,7 +193,7 @@ def switching_mode(self, val): @property def adcfreq(self): """.""" - defv = 218446014.0 if self._csorb.acc == "BO" else 220870069.0 + defv = 218446014.0 if self.acc == _BO else 220870069.0 pvobj = self._config_pvs_rb["INFOClkFreq"] val = pvobj.value if pvobj.connected else defv return val if val else defv @@ -195,7 +201,7 @@ def adcfreq(self): @property def tbtrate(self): """.""" - defv = 362 if self._csorb.acc == "BO" else 382 + defv = 362 if self.acc == _BO else 382 pvobj = self._config_pvs_rb["INFOTbTRate"] val = pvobj.value if pvobj.connected else defv return val if val else defv @@ -208,7 +214,7 @@ def tbtperiod(self): @property def fofbrate(self): """.""" - defv = (362 if self._csorb.acc == "BO" else 382) * 24 + defv = (362 if self.acc == _BO else 382) * 24 pvobj = self._config_pvs_rb["INFOFOFBRate"] val = pvobj.value if pvobj.connected else defv return val if val else defv @@ -221,7 +227,7 @@ def fofbperiod(self): @property def monitrate(self): """.""" - defv = (362 if self._csorb.acc == "BO" else 382) * 59904 + defv = (362 if self.acc == _BO else 382) * 59904 pvobj = self._config_pvs_rb["INFOMONITRate"] val = pvobj.value if pvobj.connected else defv return val if val else defv @@ -234,7 +240,7 @@ def monitperiod(self): @property def facqrate(self): """.""" - defv = (362 if self._csorb.acc == "BO" else 382) * 603 + defv = (362 if self.acc == _BO else 382) * 603 pvobj = self._config_pvs_rb["INFOFAcqRate"] val = pvobj.value if pvobj.connected else defv return val if val else defv diff --git a/siriuspy/siriuspy/sofb/correctors.py b/siriuspy/siriuspy/sofb/correctors.py index 9464a1ace..6827d4c52 100644 --- a/siriuspy/siriuspy/sofb/correctors.py +++ b/siriuspy/siriuspy/sofb/correctors.py @@ -6,8 +6,11 @@ import numpy as _np +from mathphys import constants as _Const + from .. import util as _util from ..epics import PV as _PV +from ..optics.constants import SI as _SI, BO as _BO from ..thread import RepeaterThread as _Repeat from ..pwrsupply.csdev import Const as _PSConst from ..timesys.csdev import Const as _TIConst @@ -466,7 +469,7 @@ def __init__(self, acc, prefix='', callback=None): if self.isring: self._corrs.append(RFCtrl(self.acc)) - if self.acc == 'SI': + if self.acc == _SI: self.sync_kicks = self._csorb.CorrSync.Off self.timing = TimingConfig(acc) self._corrs_thread = _Repeat( @@ -480,7 +483,7 @@ def connected(self): for cor in self._corrs: if not cor.connected: return False - if self.acc == 'SI' and not self.timing.connected: + if self.acc == _SI and not self.timing.connected: return False return True @@ -505,7 +508,7 @@ def wait_for_connection(self, timeout=10): tout = timeout - (_time.time() - t0_) if tout <= 0 or not cor.wait_for_connection(tout): return False - if self.acc != 'SI': + if self.acc != _SI: return True tout = timeout - (_time.time() - t0_) if tout <= 0 or not self.timing.wait_for_connection(tout): @@ -521,7 +524,7 @@ def shutdown(self): def get_map2write(self): """Get the write methods of the class.""" dbase = {"CorrConfig-Cmd": self.configure_correctors} - if self.acc == "SI": + if self.acc == _SI: dbase["CorrSync-Sel"] = self.set_corrs_mode return dbase @@ -533,7 +536,7 @@ def apply_kicks(self, values): Will return 0 if all previous kick were implemented. Will return >0 indicating how many previous kicks were not implemented. """ - if self.acc == "BO": + if self.acc == _BO: msg = "ERR: Cannot correct Orbit in Booster. Use Ramp Interface!" self._update_log(msg) _log.error(msg[5:]) @@ -589,7 +592,7 @@ def put_value_in_corr(self, corr, value): def send_evt(self): """Send event method.""" - if self.acc != "SI" or self.sync_kicks != self._csorb.CorrSync.Event: + if self.acc != _SI or self.sync_kicks != self._csorb.CorrSync.Event: return if not self.timing.connected: msg = "ERR: timing disconnected." @@ -630,7 +633,7 @@ def _update_corrs_strength(self): # than zero not to take the inverse of 0. It will be 0 in case # there is a failure to get the RF frequency from its PV. rfv = corr_vals[-1] - circ = 1 / rfv * self._csorb.harm_number * 299792458 + circ = 1 / rfv * self.acc.harmonic_number * _Const.light_speed self.run_callbacks("KickRF-Mon", rfv) self.run_callbacks("OrbLength-Mon", circ) except Exception as err: @@ -702,13 +705,13 @@ def configure_correctors(self, val): _log.error(msg[5:]) continue # Do not configure opmode in BO corrs because they are ramping. - if self.acc == "BO": + if self.acc == _BO: corr.state = True continue corr.configure() if not self.isring: return True - if self.acc == "SI" and self.sync_kicks != self._csorb.CorrSync.Off: + if self.acc == _SI and self.sync_kicks != self._csorb.CorrSync.Off: if not self.timing.configure(): msg = "ERR: Failed to configure timing" self._update_log(msg) @@ -717,7 +720,7 @@ def configure_correctors(self, val): def _update_status(self): status = 0b0000111 - if self.acc == "SI": + if self.acc == _SI: status = 0b1111111 elif self.isring: status = 0b0011111 @@ -731,13 +734,13 @@ def _update_status(self): ) # Do not check mode of BO correctors because they are ramping. opmode_ok = True - if self.acc != "BO": + if self.acc != _BO: opmode_ok = all(corr.opmode_ok for corr in chcvs) status = _util.update_bit(status, bit_pos=1, bit_val=not opmode_ok) status = _util.update_bit( status, bit_pos=2, bit_val=not all(corr.state for corr in chcvs) ) - if self.acc == "SI" and self.sync_kicks != self._csorb.CorrSync.Off: + if self.acc == _SI and self.sync_kicks != self._csorb.CorrSync.Off: tim_conn = self.timing.connected tim_conf = self.timing.is_ok else: diff --git a/siriuspy/siriuspy/sofb/csdev.py b/siriuspy/siriuspy/sofb/csdev.py index 0b4ce6039..5e6f9cf65 100644 --- a/siriuspy/siriuspy/sofb/csdev.py +++ b/siriuspy/siriuspy/sofb/csdev.py @@ -5,6 +5,13 @@ from .. import csdev as _csdev from ..diagbeam.bpm.csdev import Const as _CSBPM from ..namesys import SiriusPVName as _PVName +from ..optics.constants import ( + SI as _SI, + BO as _BO, + TB as _TB, + TS as _TS, +) + from ..search import BPMSearch as _BPMSearch, LLTimeSearch as _TISearch, \ MASearch as _MASearch, PSSearch as _PSSearch from ..timesys import csdev as _cstiming @@ -32,8 +39,8 @@ class ETypes(_csdev.ETypes): MEAS_RMAT_CMD = ('Start', 'Stop', 'Reset') MEAS_RMAT_MON = ('Idle', 'Measuring', 'Completed', 'Aborted') DRIVE_TYPE = ('Sine', 'Square', 'Impulse') - TLINES = ('TB', 'TS') - RINGS = ('BO', 'SI') + TLINES = (_CSOPT.TB.sector, _CSOPT.TS.sector) + RINGS = (_CSOPT.BO.sector, _CSOPT.SI.sector) ACCELERATORS = TLINES + RINGS STS_LBLS_CORR_TLINES = ( @@ -86,11 +93,6 @@ class ConstTLines(_csdev.Const): RespMatMode = _csdev.Const.register("RespMatMode", _et.RESPMAT_MODE) MeasRespMatCmd = _csdev.Const.register("MeasRespMatCmd", _et.MEAS_RMAT_CMD) MeasRespMatMon = _csdev.Const.register("MeasRespMatMon", _et.MEAS_RMAT_MON) - TransportLines = _csdev.Const.register( - "TransportLines", _et.TLINES, (0, 1) - ) - Rings = _csdev.Const.register("Rings", _et.RINGS, (2, 3)) - Accelerators = _csdev.Const.register("Accelerators", _et.ACCELERATORS) SOFBMode = _csdev.Const.register("SOFBMode", _et.ORB_MODE_TLINES) SyncWithInj = _csdev.Const.register("SyncWithInj", _et.OFF_ON) @@ -135,22 +137,21 @@ class SOFBTLines(ConstTLines): def __init__(self, acc): """Init1 method.""" - self.acc = acc.upper() + self.acc = acc self.evg_name = _TISearch.get_evg_name() - self.acc_idx = self.Accelerators._fields.index(self.acc) # Define the BPMs: - self.bpm_names = _BPMSearch.get_names({"sec": acc, "dev": "BPM"}) + self.bpm_names = _BPMSearch.get_names({"sec": acc.sector, "dev": "BPM"}) # Define correctors: - filter_ch = dict(sec=acc, dis="PS", dev="CH") - filter_cv = dict(sec=acc, dis="PS", dev="CV") - if self.acc == "SI": + filter_ch = dict(sec=acc.sector, dis="PS", dev="CH") + filter_cv = dict(sec=acc.sector, dis="PS", dev="CV") + if self.acc == _CSOPT.SI: filter_ch.update({"sub": "..(M|C)."}) filter_cv.update({"sub": "..(M|C)."}) self.ch_names = _PSSearch.get_psnames(filter_ch) self.cv_names = _PSSearch.get_psnames(filter_cv) - if self.acc == "TS": + if self.acc == _CSOPT.TS: self.ch_names = [_PVName("TS-01:PU-EjeSeptG")] + self.ch_names self.cv_names = [ cvn @@ -162,7 +163,7 @@ def __init__(self, acc): self.bpm_nicknames = _BPMSearch.get_nicknames(self.bpm_names) self.ch_nicknames = _PSSearch.get_psnicknames(self.ch_names) self.cv_nicknames = _PSSearch.get_psnicknames(self.cv_names) - if self.acc == "TS": + if self.acc == _CSOPT.TS: self.ch_nicknames[0] = "EjeseptG" # Find their position along the ring: @@ -194,23 +195,21 @@ def __init__(self, acc): ext = acc.lower() + "respmat" self.respmat_fname = _os.path.join(ioc_fol, "respmat." + ext) - self.trigger_acq_name = self.acc + '-Fam:TI-BPM' - if self.acc == 'SI': - self.trigger_cor_name = self.acc + '-Glob:TI-Mags-Corrs' - self.evt_cor_name = 'Orb' + self.acc + self.trigger_acq_name = self.acc.sector + '-Fam:TI-BPM' + if self.acc == _CSOPT.SI: + self.trigger_cor_name = self.acc.sector + '-Glob:TI-Mags-Corrs' + self.evt_cor_name = 'Orb' + self.acc.sector self.clk_cor_name = 'Clock3' self.evt_rmpbo = 'RmpBO' self.evt_acq_name = "Linac" self.matrix_size = self.nr_corrs * (2 * self.nr_bpms) self.nr_svals = min(self.nr_corrs, 2 * self.nr_bpms) - self.circum = 21.2477 if self.acc == "TB" else 26.8933 # in meters - self.rev_per = self.circum / 299792458 # in seconds @property def isring(self): """.""" - return self.acc in self.Rings._fields + return self.acc.isring def get_ioc_database(self, prefix=""): """Return IOC database.""" @@ -783,9 +782,7 @@ class SOFBRings(SOFBTLines, ConstRings): def __init__(self, acc): """Init method.""" SOFBTLines.__init__(self, acc) - self.circum = 496.8 # in meter self.harm_number = 828 - self.rev_per = self.circum / 299792458 # in seconds def get_sofb_database(self, prefix=""): """Return SOFB database.""" @@ -997,9 +994,7 @@ def __init__(self, acc): vals = _cstiming.get_hl_trigger_database(self.trigger_cor_name) evts = vals["Src-Sel"]["enums"] self.CorrExtEvtSrc = self.register("CorrExtEvtSrc", evts) - self.circum = 518.396 # in meter self.harm_number = 864 - self.rev_per = self.circum / 299792458 # in seconds def get_sofb_database(self, prefix=""): """Return SOFB database.""" @@ -1349,12 +1344,11 @@ class SOFBFactory: @staticmethod def create(acc): """Return appropriate SOFB object.""" - acc = acc.upper() - if acc == "SI": - return SOFBSI(acc) - elif acc in _et.RINGS: - return SOFBRings(acc) - elif acc in _et.TLINES: + if acc == _SI: + return SOFBSI(_CSOPT.SI) + elif acc == _BO: + return SOFBRings(_CSOPT.BO) + elif acc in (_TB, _TS): return SOFBTLines(acc) else: - raise ValueError('Invalid accelerator name "{}"'.format(acc)) + raise ValueError('Invalid accelerator "{}"'.format(acc)) diff --git a/siriuspy/siriuspy/sofb/main.py b/siriuspy/siriuspy/sofb/main.py index 6f6f29b24..f443f6d27 100644 --- a/siriuspy/siriuspy/sofb/main.py +++ b/siriuspy/siriuspy/sofb/main.py @@ -14,7 +14,7 @@ from .matrix import BaseMatrix as _BaseMatrix from .orbit import BaseOrbit as _BaseOrbit -INTERVAL = 1 +INTERVAL = 1 # [s] class SOFB(_BaseClass): diff --git a/siriuspy/siriuspy/stabinfo/csdev.py b/siriuspy/siriuspy/stabinfo/csdev.py index 718690e7b..ed8ce8bf2 100644 --- a/siriuspy/siriuspy/stabinfo/csdev.py +++ b/siriuspy/siriuspy/stabinfo/csdev.py @@ -3,6 +3,7 @@ import os as _os from .. import csdev as _csdev +from ..optics.constants import SI as _SI # --- Enumeration Types --- @@ -23,7 +24,7 @@ class StabInfoConst(_csdev.Const): StabUnstab = _csdev.Const.register('StabUnstab', _et.STAB_UNSTAB) - SI_HARMNUM = 864 + SI_HARMNUM = _SI.harmonic_number CURR_THRES = 5 # [mA]