improve softcal

- bugfix: stop searching for file on the first match
- allow to ignore the sign on input by abs (bool) parameter

Change-Id: I0e5544d7645f124d4c4ac720174b0f5bde7e71a6
Reviewed-on: https://forge.frm2.tum.de/review/c/sine2020/secop/playground/+/24928
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
Reviewed-by: Markus Zolliker <markus.zolliker@psi.ch>
This commit is contained in:
zolliker 2021-01-26 09:29:48 +01:00
parent 7895470301
commit 9afcc49430

View File

@ -26,7 +26,7 @@ import math
import numpy as np import numpy as np
from scipy.interpolate import splrep, splev # pylint: disable=import-error from scipy.interpolate import splrep, splev # pylint: disable=import-error
from secop.core import Readable, Parameter, Override, Attached, StringType from secop.core import Readable, Parameter, Override, Attached, StringType, BoolType
def linear(x): def linear(x):
@ -51,7 +51,7 @@ class StdParser:
self.xdata, self.ydata = [], [] self.xdata, self.ydata = [], []
def parse(self, line): def parse(self, line):
"""get numbers from a line and put them to self.output""" """get numbers from a line and put them to self.xdata / self.ydata"""
row = line.split() row = line.split()
try: try:
self.xdata.append(float(row[self.xcol])) self.xdata.append(float(row[self.xcol]))
@ -109,10 +109,14 @@ class CalCurve:
kind = ext if dot else None kind = ext if dot else None
break break
# then try adding all kinds as extension # then try adding all kinds as extension
for kind in KINDS: for nam in calibname, calibname.upper(), calibname.lower():
filename = join(path.strip(), '%s.%s' % (calibname, kind)) for kind in KINDS:
if exists(filename): filename = join(path.strip(), '%s.%s' % (nam, kind))
break if exists(filename):
break
else:
continue
break
else: else:
continue continue
break break
@ -151,6 +155,7 @@ class Sensor(Readable):
} }
parameters = { parameters = {
'calib': Parameter('calibration name', datatype=StringType(), readonly=False), 'calib': Parameter('calibration name', datatype=StringType(), readonly=False),
'abs': Parameter('True: take abs(raw) before calib', datatype=BoolType(), readonly=False, default=True),
'value': Override(unit='K'), 'value': Override(unit='K'),
'pollinterval': Override(export=False), 'pollinterval': Override(export=False),
'status': Override(default=(Readable.Status.ERROR, 'unintialized')) 'status': Override(default=(Readable.Status.ERROR, 'unintialized'))
@ -168,10 +173,15 @@ class Sensor(Readable):
return value return value
def update_value(self, value): def update_value(self, value):
if self.abs:
value = abs(value)
self.value = self._calib(value) self.value = self._calib(value)
self._value_error = None self._value_error = None
def error_update_value(self, err): def error_update_value(self, err):
if self.abs and str(err) == 'R_UNDER': # hack: ignore R_UNDER from ls370
self._value_error = None
return None
self._value_error = repr(err) self._value_error = repr(err)
raise err raise err