Source code for dripline.core.calibrate

try:
    import asteval
except ImportError:
    # optional only when doing a docs build
    pass

#TODO need to put exceptions back, this is fragile/wrong right now
#from . import exceptions


__all__ = []

import logging
logger = logging.getLogger(__name__)

__all__.append("calibrate")
[docs]def calibrate(cal_functions=None): if callable(cal_functions): cal_functions = {cal_functions.__name__: cal_functions} elif isinstance(cal_functions, list): cal_functions = {f.__name__:f for f in cal_functions} elif cal_functions is None: cal_functions = {} def calibration(fun): def wrapper(self, *args, **kwargs): very_raw = fun(self) if isinstance(very_raw, list): very_raw = very_raw[0] val_dict = {'value_raw':very_raw} logger.debug('attempting to calibrate') if val_dict['value_raw'] is None: return None if self._calibration is None: pass elif isinstance(self._calibration, str): evaluator = asteval.Interpreter(usersyms=cal_functions) if isinstance(val_dict['value_raw'], float): eval_str = self._calibration.format(val_dict['value_raw']) elif isinstance(val_dict['value_raw'], str): eval_str = self._calibration.format(val_dict['value_raw'].strip()) else: eval_str = self._calibration.format(val_dict['value_raw']) logger.debug(f"formatted cal is:\n{eval_str}") try: cal = evaluator(eval_str) except OverflowError: logger.debug('GOT AN OVERFLOW ERROR') cal = None except Exception as e: raise exceptions.DriplineValueError(repr(e), result=val_dict) if cal is not None: val_dict['value_cal'] = cal elif isinstance(self._calibration, dict): logger.debug('calibration is dictionary, looking up value') if val_dict['value_raw'] in self._calibration: val_dict['value_cal'] = self._calibration[val_dict['value_raw']] else: raise exceptions.DriplineValueError(f"raw value <{repr(val_dict['value_raw'])}> not in cal dict", result=val_dict) else: logger.warning('the _calibration property is of unknown type') return val_dict return wrapper return calibration