slsDetectorPackage/python/slsdet/detector_property.py
2020-02-17 17:43:14 +01:00

49 lines
1.6 KiB
Python
Executable File

from collections.abc import Iterable
import numpy as np
class DetectorProperty:
"""
Base class for a detector property that should be accessed by name and index
TODO! Calls are not in parallel and exposes object that can be passes around
"""
def __init__(self, get_func, set_func, nmod_func, name):
self.get = get_func
self.set = set_func
self.get_nmod = nmod_func
self.__name__ = name
def __getitem__(self, key):
if key == slice(None, None, None):
return self.get()
elif isinstance(key, Iterable):
return self.get(list(key))
else:
return self.get([key])[0] #No list for single value
def __setitem__(self, key, value):
#operate on all values
if key == slice(None, None, None):
if isinstance(value, (np.integer, int)):
self.set(value, [])
elif isinstance(value, Iterable):
for i in range(self.get_nmod()):
self.set(value[i], [i])
else:
raise ValueError('Value should be int or np.integer not', type(value))
#Iterate over some
elif isinstance(key, Iterable):
if isinstance(value, Iterable):
for k,v in zip(key, value):
self.set(v, [k])
elif isinstance(value, int):
self.set(value, list(key))
#Set single value
elif isinstance(key, int):
self.set(value, [key])
def __repr__(self):
s = ', '.join(str(v) for v in self[:])
return '{}: [{}]'.format(self.__name__, s)