slsDetectorPackage/python/sls_detector/detector_property.py

51 lines
1.7 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(i) for i in range(self.get_nmod())]
elif isinstance(key, Iterable):
return [self.get(k) for k in key]
else:
return self.get(key)
def __setitem__(self, key, value):
#operate on all values
if key == slice(None, None, None):
if isinstance(value, (np.integer, int)):
for i in range(self.get_nmod()):
self.set(i, value)
elif isinstance(value, Iterable):
for i in range(self.get_nmod()):
self.set(i, value[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(k,v)
elif isinstance(value, int):
for k in key:
self.set(k, value)
#Set single value
elif isinstance(key, int):
self.set(key, value)
def __repr__(self):
s = ', '.join(str(v) for v in self[:])
return '{}: [{}]'.format(self.__name__, s)