diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..73358ad --- /dev/null +++ b/.gitignore @@ -0,0 +1,139 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + diff --git a/Ecol.py b/Ecol.py deleted file mode 100755 index f8f818a..0000000 --- a/Ecol.py +++ /dev/null @@ -1,53 +0,0 @@ -from slic.core.adjustable import Adjustable, PVAdjustable -from slic.core.device import SimpleDevice - -class EcolScaler(Adjustable): - def __init__(self, ID="ECOL-SCALER", factor=1): - super().__init__(ID) - self.factor = factor - mag01 = Magnet("SARCL02-MQUA130") - mag02 = Magnet("SARCL02-MQUA150") - mag03 = Magnet("SARCL02-MQSK160") - mag04 = Magnet("SARCL02-MQUA210") - mag05 = Magnet("SARCL02-MQUA250") - mag06 = Magnet("SARCL02-MQKS300") - mag07 = Magnet("SARCL02-MQUA310") - mag08 = Magnet("SARCL02-MQUA350") - mag09 = Magnet("SARCL02-MQSK420") - mag10 = Magnet("SARCL02-MQUA430") - mag11 = Magnet("SARCL02-MQUA460") - self.magnets = SimpleDevice( - ID, - m01=mag01, - m02=mag02, - m02=mag03, - m02=mag04, - m02=mag05, - m02=mag06, - m02=mag07, - m02=mag08, - m02=mag09, - m02=mag10, - m02=mag11 - ) - def get_current_value(self): - return self.factor - def set_target_value(self, factor): - old_factor = self.factor - self.factor = factor - print(old_factor, factor) - tasks = [] - for m in self.magnets: - current = m.get() - t = m.set(current / old_factor * factor) - for t in tasks: - t.wait() - def is_moving(self): - return any(m.is_moving() for m in self.magnets) - -class Magnet(PVAdjustable): - def __init__(self, ID): - pvn_set = ID + ":I-SET" - pvn_read = ID + ":I-READ" - super().__init__(pvn_set, pvn_read, accuracy=0.01) - diff --git a/ecol.py b/ecol.py new file mode 100644 index 0000000..f6d85fc --- /dev/null +++ b/ecol.py @@ -0,0 +1,25 @@ +from magnets import MagnetsScaler + + +MAGNET_NAMES = ( + "SARCL02-MQUA130", + "SARCL02-MQUA150", + "SARCL02-MQSK160", + "SARCL02-MQUA210", + "SARCL02-MQUA250", + "SARCL02-MQKS300", + "SARCL02-MQUA310", + "SARCL02-MQUA350", + "SARCL02-MQSK420", + "SARCL02-MQUA430", + "SARCL02-MQUA460" +) + + +class EcolScaler(MagnetsScaler): + + def __init__(self, ID="ECOL-SCALER", magnet_names=MAGNET_NAMES, factor=1): + super().__init__(ID, magnet_names, factor=factor) + + + diff --git a/magnet.py b/magnet.py new file mode 100644 index 0000000..30d0172 --- /dev/null +++ b/magnet.py @@ -0,0 +1,14 @@ +from slic.core.adjustable import PVAdjustable + + +class Magnet(PVAdjustable): + + def __init__(self, ID, accuracy=0.01): + pvn_set = ID + ":I-SET" + pvn_read = ID + ":I-READ" + super().__init__(pvn_set, pvn_read, accuracy=accuracy, ID=ID) +# pvn_comp = ID + ":I_COMP" +# super().__init__(pvn_set, pvn_read, pvname_moving=pvn_comp) # COMP updates only once per second, so we cannot use it as moving status + + + diff --git a/magnets.py b/magnets.py index 78fcd8e..5ee87b7 100755 --- a/magnets.py +++ b/magnets.py @@ -1,38 +1,33 @@ -from slic.core.adjustable import Adjustable, PVAdjustable +from slic.core.adjustable import Adjustable from slic.core.device import SimpleDevice +from magnet import Magnet + + class MagnetsScaler(Adjustable): - def __init__(self, ID="MAGNETS-SCALER", factor=1): + + def __init__(self, ID, magnet_names, factor=1): super().__init__(ID) self.factor = factor - mag1 = Magnet("SINEG01-MSOL010") -# mag2 = Magnet("SINEG01-MSOL010") - self.magnets = SimpleDevice( - ID, - m1=mag1, -# m2=mag2 - ) + mags = {f"m{i+1}": Magnet(n) for i, n in enumerate(magnet_names)} + self.magnets = SimpleDevice(ID, **mags) + def get_current_value(self): return self.factor + def set_target_value(self, factor): old_factor = self.factor self.factor = factor - print(old_factor, factor) tasks = [] # we collect tasks to run in parallel, ... for m in self.magnets: current = m.get() - print(current, current / old_factor * factor) t = m.set(current / old_factor * factor) + tasks.append(t) for t in tasks: # ... then we need to wait for all tasks to finish t.wait() + def is_moving(self): return any(m.is_moving() for m in self.magnets) -class Magnet(PVAdjustable): - def __init__(self, ID): - pvn_set = ID + ":I-SET" - pvn_read = ID + ":I-READ" -# pvn_comp = ID + ":I_COMP" -# super().__init__(pvn_set, pvn_read, pvname_moving=pvn_comp) # COMP updates only once per second, so we cannot use it. - super().__init__(pvn_set, pvn_read, accuracy=0.01) + diff --git a/sfop.py b/sfop.py index 7e31c0c..c72a127 100755 --- a/sfop.py +++ b/sfop.py @@ -1,5 +1,9 @@ +from ecol import EcolScaler from magnets import MagnetsScaler -mags = MagnetsScaler() -ecol = EcolScaler() + +ecol = EcolScaler() +mags = MagnetsScaler("MAGNETS-SCALER", ["SINEG01-MSOL010"]) + +