-
David Hammer authoredDavid Hammer authored
test_calcat_utils.py 4.97 KiB
import pathlib
import timeit
from calng import calcat_utils
from calng.utils import Stopwatch
from karabo.bound import Hash, Schema
# TODO: secrets management
_test_dir = pathlib.Path(__file__).absolute().parent
_test_calcat_secrets_fn = _test_dir / "calibration-client-secrets.json"
class DummyLogger:
DEBUG = print
INFO = print
WARN = print
class DummyBaseDevice:
log = DummyLogger()
def log_status_info(self, msg):
self.log.INFO(msg)
def log_status_warn(self, msg):
self.log.WARN(msg)
def get(self, key):
return self.schema.get(key)
def set(self, key, value):
print(f'Would set "{key}" = {value}')
# TODO: consider testing by attaching to real karabo.bound.PythonDevice
class DummyAgipdDevice(DummyBaseDevice):
device_class_schema = Schema()
managed_keys = set()
@staticmethod
def expectedParameters(expected):
calcat_utils.AgipdCalcatFriend.add_schema(
expected, DummyAgipdDevice.managed_keys
)
def __init__(self, config):
self.schema = config
self.calibration_constant_manager = calcat_utils.AgipdCalcatFriend(
self,
_test_calcat_secrets_fn,
)
print(self.managed_keys)
DummyAgipdDevice.expectedParameters(DummyAgipdDevice.device_class_schema)
print(DummyAgipdDevice.device_class_schema)
print(DummyAgipdDevice.managed_keys)
class DummyDsscDevice(DummyBaseDevice):
device_class_schema = Schema()
managed_keys = set()
@staticmethod
def expectedParameters(expected):
# super(DummyDsscDevice, DummyDsscDevice).expectedParameters(expected)
calcat_utils.DsscCalcatFriend.add_schema(expected, DummyDsscDevice.managed_keys)
def __init__(self, config):
# TODO: check config against schema (as Karabo would)
self.schema = config
self.calibration_constant_manager = calcat_utils.DsscCalcatFriend(
self,
_test_calcat_secrets_fn,
)
DummyDsscDevice.expectedParameters(DummyDsscDevice.device_class_schema)
def test_agipd_constants_and_caching_and_async():
# def test_agipd_constants():
conf = Hash()
conf["constantParameters.detectorType"] = "AGIPD-Type"
conf["constantParameters.detectorName"] = "SPB_DET_AGIPD1M-1"
conf["constantParameters.karaboDa"] = "AGIPD00"
conf["constantParameters.pixelsX"] = 512
conf["constantParameters.pixelsY"] = 128
conf["constantParameters.memoryCells"] = 352
conf["constantParameters.acquisitionRate"] = 1.1
conf["constantParameters.biasVoltage"] = 300
conf["constantParameters.gainSetting"] = 0
conf["constantParameters.photonEnergy"] = 9.2
device = DummyAgipdDevice(conf)
def backcall(constant_name, metadata_and_data):
# TODO: think of something reasonable to check
data = metadata_and_data
assert data.nbytes > 1000
with Stopwatch() as timer_async_cold:
# TODO: put this sort of thing in BaseCalcatFriend
threads = []
for constant in calcat_utils.AgipdConstants:
thread = device.calibration_constant_manager.get_constant_version_and_call_me_back(
constant, backcall
)
threads.append(thread)
for thread in threads:
thread.join()
with Stopwatch() as timer_async_warm:
threads = []
for constant in calcat_utils.AgipdConstants:
thread = device.calibration_constant_manager.get_constant_version_and_call_me_back(
constant, backcall
)
threads.append(thread)
for thread in threads:
thread.join()
with Stopwatch() as timer_sync_warm:
for constant in calcat_utils.AgipdConstants:
data = device.calibration_constant_manager.get_constant_version(
constant,
)
assert data.nbytes > 1000, "Should find some constant data"
print(f"Cold async took {timer_async_cold.elapsed} s")
print(f"Warm async took {timer_async_warm.elapsed} s")
print(f"Warm sync took {timer_sync_warm.elapsed} s")
assert (
timer_async_cold.elapsed > timer_async_warm.elapsed
), "Caching should make second go faster"
assert timer_sync_warm.elapsed > timer_async_warm.elapsed, "Async should be faster"
def test_dssc_constants():
conf = Hash()
conf["constantParameters.detectorType"] = "DSSC-Type"
conf["constantParameters.detectorName"] = "SCS_DET_DSSC1M-1"
conf["constantParameters.karaboDa"] = "DSSC00"
conf["constantParameters.memoryCells"] = 400
conf["constantParameters.biasVoltage"] = 100
conf["constantParameters.pixelsX"] = 512
conf["constantParameters.pixelsY"] = 128
# conf["constantParameters.pulseIdChecksum"] = 2.8866323107820637e-36
# conf["constantParameters.acquisitionRate"] = 4.5
# conf["constantParameters.encodedGain"] = 67328
device = DummyDsscDevice(conf)
offset_map = device.calibration_constant_manager.get_constant_version("Offset")
assert offset_map is not None