From bf40938370c26437d31161b93cdc542c98425654 Mon Sep 17 00:00:00 2001 From: ximenes Date: Tue, 5 May 2026 16:53:50 -0300 Subject: [PATCH 01/14] Adapt classes to use new optics.consts --- .../types/as_corrloop_params.py | 36 ++++++++++--------- .../clientconfigdb/types/as_diagnostics.py | 7 +++- .../clientconfigdb/types/global_config.py | 6 ++-- siriuspy/siriuspy/currinfo/main.py | 7 ++-- siriuspy/siriuspy/devices/timing.py | 9 ++--- siriuspy/siriuspy/diagbeam/bpm/csdev.py | 7 ++-- siriuspy/siriuspy/fpmosc/csdev.py | 4 ++- siriuspy/siriuspy/fpmosc/main.py | 3 +- siriuspy/siriuspy/injctrl/csdev.py | 9 +++-- siriuspy/siriuspy/optics/constants.py | 2 ++ siriuspy/siriuspy/sofb/csdev.py | 13 +++---- siriuspy/siriuspy/stabinfo/csdev.py | 3 +- 12 files changed, 64 insertions(+), 42 deletions(-) diff --git a/siriuspy/siriuspy/clientconfigdb/types/as_corrloop_params.py b/siriuspy/siriuspy/clientconfigdb/types/as_corrloop_params.py index a11aaeda8..39c4fc333 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 ...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..4aa8e049f 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 ...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 c85e58e64..47c959428 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/timing.py b/siriuspy/siriuspy/devices/timing.py index dd6df725b..35aa72dec 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, @@ -138,13 +139,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/diagbeam/bpm/csdev.py b/siriuspy/siriuspy/diagbeam/bpm/csdev.py index 8014a218b..5fde3b491 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 ...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 03f97f7bf..0f873d989 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 2891c87f7..7624a8685 100644 --- a/siriuspy/siriuspy/optics/constants.py +++ b/siriuspy/siriuspy/optics/constants.py @@ -20,6 +20,8 @@ class SI(Ring): class BO(Ring): """BO.""" + sector = 'BO' + beam_energy = 0.150 # [GeV] - Low Energy Booster length = 496.396 # [m] circumference = length harmonic_number = 828 diff --git a/siriuspy/siriuspy/sofb/csdev.py b/siriuspy/siriuspy/sofb/csdev.py index 0b4ce6039..1e63705f9 100644 --- a/siriuspy/siriuspy/sofb/csdev.py +++ b/siriuspy/siriuspy/sofb/csdev.py @@ -5,6 +5,7 @@ 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 from ..search import BPMSearch as _BPMSearch, LLTimeSearch as _TISearch, \ MASearch as _MASearch, PSSearch as _PSSearch from ..timesys import csdev as _cstiming @@ -783,9 +784,9 @@ 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 + self.circum = _BO.circumference # [m] # NOTE: 496.8 m -> 496.396 m + self.harm_number = _BO.harmonic_number + self.rev_per = self.circum / 299792458 # [s] def get_sofb_database(self, prefix=""): """Return SOFB database.""" @@ -997,9 +998,9 @@ 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 + self.circum = _SI.circumference # [m] + self.harm_number = _SI.harmonic_number + self.rev_per = _SI.rev_period # [s] def get_sofb_database(self, prefix=""): """Return SOFB database.""" 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] From 1d96e74da1f3d2f68bca95156d7c372f9f9e8f76 Mon Sep 17 00:00:00 2001 From: ximenes Date: Wed, 6 May 2026 08:30:17 -0300 Subject: [PATCH 02/14] MNT: use rev_period from optics.consts at sofv csdev --- siriuspy/siriuspy/sofb/csdev.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/siriuspy/siriuspy/sofb/csdev.py b/siriuspy/siriuspy/sofb/csdev.py index 1e63705f9..2b981c3e0 100644 --- a/siriuspy/siriuspy/sofb/csdev.py +++ b/siriuspy/siriuspy/sofb/csdev.py @@ -784,9 +784,9 @@ class SOFBRings(SOFBTLines, ConstRings): def __init__(self, acc): """Init method.""" SOFBTLines.__init__(self, acc) - self.circum = _BO.circumference # [m] # NOTE: 496.8 m -> 496.396 m + self.circum = _BO.circumference # [m] NOTE: 496.8 m -> 496.396 m self.harm_number = _BO.harmonic_number - self.rev_per = self.circum / 299792458 # [s] + self.rev_per = _BO.rev_period def get_sofb_database(self, prefix=""): """Return SOFB database.""" From 76e423f9e1fe18d7cd27540283befe4c1a6126b4 Mon Sep 17 00:00:00 2001 From: ximenes Date: Wed, 6 May 2026 13:31:46 -0300 Subject: [PATCH 03/14] ENH: update use of new optics.constants --- siriuspy/siriuspy/sofb/csdev.py | 43 ++++++++++++++++++--------------- 1 file changed, 24 insertions(+), 19 deletions(-) diff --git a/siriuspy/siriuspy/sofb/csdev.py b/siriuspy/siriuspy/sofb/csdev.py index 2b981c3e0..c44716463 100644 --- a/siriuspy/siriuspy/sofb/csdev.py +++ b/siriuspy/siriuspy/sofb/csdev.py @@ -5,7 +5,12 @@ 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 +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 @@ -33,8 +38,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 = (_TB.section, _TS.section) + RINGS = (_BO.section, _SI.section) ACCELERATORS = TLINES + RINGS STS_LBLS_CORR_TLINES = ( @@ -136,7 +141,7 @@ 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) @@ -146,12 +151,12 @@ def __init__(self, acc): # Define correctors: filter_ch = dict(sec=acc, dis="PS", dev="CH") filter_cv = dict(sec=acc, dis="PS", dev="CV") - if self.acc == "SI": + if self.acc == _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 == _TS: self.ch_names = [_PVName("TS-01:PU-EjeSeptG")] + self.ch_names self.cv_names = [ cvn @@ -163,7 +168,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 == _TS: self.ch_nicknames[0] = "EjeseptG" # Find their position along the ring: @@ -195,8 +200,8 @@ 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_acq_name = self.acc.section + '-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.clk_cor_name = 'Clock3' @@ -205,8 +210,8 @@ def __init__(self, acc): 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 + self.circum = self.acc.length + self.rev_per = self.circum / self.acc.velocity @property def isring(self): @@ -784,9 +789,9 @@ class SOFBRings(SOFBTLines, ConstRings): def __init__(self, acc): """Init method.""" SOFBTLines.__init__(self, acc) - self.circum = _BO.circumference # [m] NOTE: 496.8 m -> 496.396 m - self.harm_number = _BO.harmonic_number - self.rev_per = _BO.rev_period + 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.""" @@ -998,9 +1003,9 @@ 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 = _SI.circumference # [m] - self.harm_number = _SI.harmonic_number - self.rev_per = _SI.rev_period # [s] + 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.""" @@ -1351,8 +1356,8 @@ class SOFBFactory: def create(acc): """Return appropriate SOFB object.""" acc = acc.upper() - if acc == "SI": - return SOFBSI(acc) + if acc == _SI.sector: + return SOFBSI(_SI) elif acc in _et.RINGS: return SOFBRings(acc) elif acc in _et.TLINES: From 897277009a3cf8412513fee504080e38eaea04e0 Mon Sep 17 00:00:00 2001 From: ximenes Date: Wed, 6 May 2026 13:37:28 -0300 Subject: [PATCH 04/14] BUG: fix import in use of new optics.constants --- siriuspy/siriuspy/clientconfigdb/types/as_corrloop_params.py | 2 +- siriuspy/siriuspy/clientconfigdb/types/as_diagnostics.py | 2 +- siriuspy/siriuspy/diagbeam/bpm/csdev.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/siriuspy/siriuspy/clientconfigdb/types/as_corrloop_params.py b/siriuspy/siriuspy/clientconfigdb/types/as_corrloop_params.py index 39c4fc333..8bbfc51fe 100644 --- a/siriuspy/siriuspy/clientconfigdb/types/as_corrloop_params.py +++ b/siriuspy/siriuspy/clientconfigdb/types/as_corrloop_params.py @@ -1,7 +1,7 @@ """Parameters of the IOCs of the AP discipline.""" from copy import deepcopy as _dcopy -from ...optics.constants import SI as _SI +from siriuspy.optics.constants import SI as _SI _SI_HARM_NR = _SI.harmonic_number diff --git a/siriuspy/siriuspy/clientconfigdb/types/as_diagnostics.py b/siriuspy/siriuspy/clientconfigdb/types/as_diagnostics.py index 4aa8e049f..f376db543 100644 --- a/siriuspy/siriuspy/clientconfigdb/types/as_diagnostics.py +++ b/siriuspy/siriuspy/clientconfigdb/types/as_diagnostics.py @@ -1,7 +1,7 @@ """Diagnostic equipments configuration.""" from copy import deepcopy as _dcopy -from ...optics.constants import SI as _SI +from siriuspy.optics.constants import SI as _SI SI_HARM_NR = _SI.harmonic_number diff --git a/siriuspy/siriuspy/diagbeam/bpm/csdev.py b/siriuspy/siriuspy/diagbeam/bpm/csdev.py index 5fde3b491..b625a3aba 100644 --- a/siriuspy/siriuspy/diagbeam/bpm/csdev.py +++ b/siriuspy/siriuspy/diagbeam/bpm/csdev.py @@ -3,7 +3,7 @@ import numpy as _np from ... import csdev as _csdev -from ...optics.constants import SI as _SI +from siriuspy.optics.constants import SI as _SI # --- Enumeration Types --- From 7cdc620d0f61f16842cbb988e2f7159d4c69c5cc Mon Sep 17 00:00:00 2001 From: ximenes Date: Wed, 6 May 2026 14:01:15 -0300 Subject: [PATCH 05/14] BUG: fix bug in clientconfig.as_diagnostics --- siriuspy/siriuspy/clientconfigdb/types/as_diagnostics.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/siriuspy/siriuspy/clientconfigdb/types/as_diagnostics.py b/siriuspy/siriuspy/clientconfigdb/types/as_diagnostics.py index f376db543..db0c9f4d2 100644 --- a/siriuspy/siriuspy/clientconfigdb/types/as_diagnostics.py +++ b/siriuspy/siriuspy/clientconfigdb/types/as_diagnostics.py @@ -4,7 +4,7 @@ from siriuspy.optics.constants import SI as _SI -SI_HARM_NR = _SI.harmonic_number +_SI_HARM_NR = _SI.harmonic_number def get_dict(): From dec13aee4bff129bb468de723295a49f9959c505 Mon Sep 17 00:00:00 2001 From: ximenes Date: Wed, 6 May 2026 14:15:50 -0300 Subject: [PATCH 06/14] BUG: fix mispelling in sofb.csdev --- siriuspy/siriuspy/sofb/csdev.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/siriuspy/siriuspy/sofb/csdev.py b/siriuspy/siriuspy/sofb/csdev.py index c44716463..d1a59fafd 100644 --- a/siriuspy/siriuspy/sofb/csdev.py +++ b/siriuspy/siriuspy/sofb/csdev.py @@ -38,8 +38,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.section, _TS.section) - RINGS = (_BO.section, _SI.section) + TLINES = (_TB.sector, _TS.sector) + RINGS = (_BO.sector, _SI.sector) ACCELERATORS = TLINES + RINGS STS_LBLS_CORR_TLINES = ( From 45f5cad28fa141b5e011978606f184756fa99a37 Mon Sep 17 00:00:00 2001 From: ximenes Date: Wed, 6 May 2026 14:21:41 -0300 Subject: [PATCH 07/14] BUG: fix mispelling in sofb csdev --- siriuspy/siriuspy/sofb/csdev.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/siriuspy/siriuspy/sofb/csdev.py b/siriuspy/siriuspy/sofb/csdev.py index d1a59fafd..786cb9404 100644 --- a/siriuspy/siriuspy/sofb/csdev.py +++ b/siriuspy/siriuspy/sofb/csdev.py @@ -200,7 +200,7 @@ def __init__(self, acc): ext = acc.lower() + "respmat" self.respmat_fname = _os.path.join(ioc_fol, "respmat." + ext) - self.trigger_acq_name = self.acc.section + '-Fam:TI-BPM' + self.trigger_acq_name = self.acc.sector + '-Fam:TI-BPM' if self.acc == _SI: self.trigger_cor_name = self.acc + '-Glob:TI-Mags-Corrs' self.evt_cor_name = 'Orb' + self.acc From 87ea5cb515fd173b6e844431a12af6e4163867cb Mon Sep 17 00:00:00 2001 From: ximenes Date: Tue, 19 May 2026 15:17:47 -0300 Subject: [PATCH 08/14] MNT: (SOFB) remove unused rev_per param from classes --- siriuspy/siriuspy/sofb/csdev.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/siriuspy/siriuspy/sofb/csdev.py b/siriuspy/siriuspy/sofb/csdev.py index 786cb9404..887f59a09 100644 --- a/siriuspy/siriuspy/sofb/csdev.py +++ b/siriuspy/siriuspy/sofb/csdev.py @@ -211,7 +211,6 @@ def __init__(self, acc): self.matrix_size = self.nr_corrs * (2 * self.nr_bpms) self.nr_svals = min(self.nr_corrs, 2 * self.nr_bpms) self.circum = self.acc.length - self.rev_per = self.circum / self.acc.velocity @property def isring(self): @@ -791,7 +790,6 @@ def __init__(self, acc): 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.""" @@ -1005,7 +1003,6 @@ def __init__(self, acc): 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.""" From 5b0a0b75e663dca16db9b5eaf57549eea4f84204 Mon Sep 17 00:00:00 2001 From: ximenes Date: Tue, 19 May 2026 15:36:07 -0300 Subject: [PATCH 09/14] MNT: (SOFB) remove circum attribut from classes --- siriuspy/siriuspy/sofb/csdev.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/siriuspy/siriuspy/sofb/csdev.py b/siriuspy/siriuspy/sofb/csdev.py index 887f59a09..80a1a906f 100644 --- a/siriuspy/siriuspy/sofb/csdev.py +++ b/siriuspy/siriuspy/sofb/csdev.py @@ -210,7 +210,6 @@ def __init__(self, acc): 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 = self.acc.length @property def isring(self): @@ -788,7 +787,6 @@ class SOFBRings(SOFBTLines, ConstRings): def __init__(self, acc): """Init method.""" SOFBTLines.__init__(self, acc) - self.circum = 496.8 # in meter self.harm_number = 828 def get_sofb_database(self, prefix=""): @@ -1001,7 +999,6 @@ 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 def get_sofb_database(self, prefix=""): From 7d515a2d0d2269360b280db9be657f79f4675648 Mon Sep 17 00:00:00 2001 From: ximenes Date: Sat, 25 Jul 2026 23:10:28 -0300 Subject: [PATCH 10/14] MNT: (SOFB) Refactor using optics.constants --- siriuspy/siriuspy/sofb/base_class.py | 19 +++++++----- siriuspy/siriuspy/sofb/bpms.py | 20 +++++++----- siriuspy/siriuspy/sofb/correctors.py | 27 ++++++++-------- siriuspy/siriuspy/sofb/csdev.py | 46 ++++++++++++---------------- siriuspy/siriuspy/sofb/main.py | 2 +- 5 files changed, 61 insertions(+), 53 deletions(-) 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 80a1a906f..5e6f9cf65 100644 --- a/siriuspy/siriuspy/sofb/csdev.py +++ b/siriuspy/siriuspy/sofb/csdev.py @@ -9,8 +9,9 @@ SI as _SI, BO as _BO, TB as _TB, - TS as _TS + TS as _TS, ) + from ..search import BPMSearch as _BPMSearch, LLTimeSearch as _TISearch, \ MASearch as _MASearch, PSSearch as _PSSearch from ..timesys import csdev as _cstiming @@ -38,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.sector, _TS.sector) - RINGS = (_BO.sector, _SI.sector) + TLINES = (_CSOPT.TB.sector, _CSOPT.TS.sector) + RINGS = (_CSOPT.BO.sector, _CSOPT.SI.sector) ACCELERATORS = TLINES + RINGS STS_LBLS_CORR_TLINES = ( @@ -92,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) @@ -143,20 +139,19 @@ def __init__(self, acc): """Init1 method.""" 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 @@ -168,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: @@ -201,9 +196,9 @@ def __init__(self, acc): self.respmat_fname = _os.path.join(ioc_fol, "respmat." + ext) self.trigger_acq_name = self.acc.sector + '-Fam:TI-BPM' - if self.acc == _SI: - self.trigger_cor_name = self.acc + '-Glob:TI-Mags-Corrs' - self.evt_cor_name = 'Orb' + self.acc + 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' @@ -214,7 +209,7 @@ def __init__(self, acc): @property def isring(self): """.""" - return self.acc in self.Rings._fields + return self.acc.isring def get_ioc_database(self, prefix=""): """Return IOC database.""" @@ -1349,12 +1344,11 @@ class SOFBFactory: @staticmethod def create(acc): """Return appropriate SOFB object.""" - acc = acc.upper() - if acc == _SI.sector: - return SOFBSI(_SI) - 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): From e84cfaea341bf8ffc8e3cf78f8a2352743f232b2 Mon Sep 17 00:00:00 2001 From: ximenes Date: Sat, 25 Jul 2026 23:11:06 -0300 Subject: [PATCH 11/14] MNT: (OPT.CONST) Add sector to accelrator dict --- siriuspy/siriuspy/optics/constants.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) 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, +} From f0b445025b287e33d56acb5c81ed303bb58327fb Mon Sep 17 00:00:00 2001 From: ximenes Date: Sat, 25 Jul 2026 23:11:49 -0300 Subject: [PATCH 12/14] MNT: (DEV.SOFB) Refactor using optics.constants --- siriuspy/siriuspy/devices/sofb.py | 31 +++++++++++++++++++++++-------- 1 file changed, 23 insertions(+), 8 deletions(-) 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 From edfde4b9d2b9adfb8a953a693a18fc3428fa40ec Mon Sep 17 00:00:00 2001 From: ximenes Date: Sat, 25 Jul 2026 23:12:04 -0300 Subject: [PATCH 13/14] MNT: (RAMP) Refactor using optics.constants --- siriuspy/siriuspy/ramp/conn.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 From d5ddac527123f92294b35f53ab19e12f57c84fc3 Mon Sep 17 00:00:00 2001 From: ximenes Date: Sat, 25 Jul 2026 23:12:21 -0300 Subject: [PATCH 14/14] MNT: (DEV.TUNE) Refactor using optics.constants --- siriuspy/siriuspy/devices/tune.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) 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