Skip to content
Snippets Groups Projects
Commit ea506057 authored by Benedikt's avatar Benedikt
Browse files

first version of dsi multi vector

parent 40665cb5
No related branches found
No related tags found
No related merge requests found
.idea/
__pycache__/
config.py
...@@ -287,8 +287,8 @@ class SensorCalibrationData: ...@@ -287,8 +287,8 @@ class SensorCalibrationData:
'application/xml', 'application/xml',
open(dumyXMLFileName, "rb").read()) open(dumyXMLFileName, "rb").read())
if __name__=='main': if __name__=='main':
xlsFileName = '../sampledata/ERGEBNISS_sheets/20220708_8305_SN1864992_Auswertung.xlsx' xlsFileName = '../sampledata/ERGEBNISS_sheets/20220708_8305_SN1864992_Auswertung.xlsx'
print("Test")
callData=SensorCalibrationData(xlsFileName) callData=SensorCalibrationData(xlsFileName)
def upload_fit_data(attr, old, new): def upload_fit_data(attr, old, new):
......
import json import json
import numpy as np import numpy as np
#for interpolation methodes import scipy.interpolate
# for interpolation methodes
from scipy.interpolate import interp1d from scipy.interpolate import interp1d
import functools import functools
class NumpyEncoder(json.JSONEncoder): class NumpyEncoder(json.JSONEncoder):
def default(self, obj): def default(self, obj):
if isinstance(obj, np.ndarray): if isinstance(obj, np.ndarray):
return obj.tolist() return obj.tolist()
if isinstance(obj, interp1d):
return 'Inter Polator Not serilized create from data'
return json.JSONEncoder.default(self, obj) return json.JSONEncoder.default(self, obj)
DsiASCICOnversion={ 'Hz' : r'\hertz',
'm/s^2' : r'\metre\second\tothe{-2}',
'mV/(m/s^2)' : r'\milli\volt\metre\tothe{-2}\second\tothe{2}',
'%' : r'\percent',
'degree' : r'\degree',
'None' :''
}
revd=dict([reversed(i) for i in DsiASCICOnversion.items()]) DsiASCICOnversion = {'Hz': r'\hertz',
'm/s^2': r'\metre\second\tothe{-2}',
'mV/(m/s^2)': r'\milli\volt\metre\tothe{-2}\second\tothe{2}',
'%': r'\percent',
'degree': r'\degree',
'None': ''
}
revd = dict([reversed(i) for i in DsiASCICOnversion.items()])
DsiASCICOnversion.update(revd) DsiASCICOnversion.update(revd)
del revd del revd
def getpartialInterpolFunction(type):
if type in ['data', 'linear', 'cubic']:
return functools.partial(interp1d ,kind=type)
else:
raise NotImplementedError("Interpolation Type " + str(type) + r" is not supoorted use ['data', 'linear', 'cubic']")
#interpolationMethode='linear'
self.interPolationType='linear'
self.interpolationFunction=getpartialInterpolFunction(interpolationMethode)
class dsiVector: class dsiVector:
def __init__(self,values,uncer,quantity,unit,uncerType="absolute"): def __init__(self, values, uncer, quantity, unit, uncerType="absolute", intPolDSIVector=None, intPolType=None):
#TODO private vars # TODO private vars
self.__dict__={ if type(values) == np.array:
'values':np.array(values), self.values = values
'unit':unit,
'quantity':quantity,
'originalUncerType':uncerType}
if uncerType=="absolute":
self.__dict__['uncer']=uncer
elif uncerType=='rel':
self.__dict__['uncer']= uncer * values
elif uncerType=='relPercent':
self.__dict__['uncer']= uncer / 100 * values
elif uncerType=='relPPM':
self.__dict__['uncer']= uncer / 1e6 * values
else: else:
raise NotImplementedError("uncetType "+str(uncerType)+r" is not supoorted/implemented use ['absolute','rel','relPercent','relPPM']") self.values = np.array(values)
if type(uncer) != np.array: # if its not an array try to convert to an array
uncer = np.array(uncer)
self.unit = str(unit)
self.quantity = str(quantity) # TODO why is this tuple and unit not
self.originalUncerType = str(uncerType)
if uncerType == "absolute":
self.uncer = uncer
elif uncerType == 'rel':
self.uncer = uncer * values
elif uncerType == 'relPercent':
self.uncer = uncer / 100 * values
elif uncerType == 'relPPM':
self.uncer = uncer / 1e6 * values
else:
raise NotImplementedError("uncetType " + str(
uncerType) + r" is not supoorted/implemented use ['absolute','rel','relPercent','relPPM']")
if intPolType != None and intPolDSIVector['values'].size == self.values.size:
intPolXVals = intPolDSIVector['values']
self.intpolParams = {'xValuesDSIVectorQuantity': intPolDSIVector['quantity'],
'interPolationType': intPolType}
if intPolType in ['linear', 'nearest', 'nearest-up', 'zero', 'slinear', 'quadratic', 'cubic', 'previous',
'next']:
self.interpolators = {
'values': scipy.interpolate.interp1d(intPolXVals, self.values, kind=intPolType, copy='False',
bounds_error=True),
'uncer': scipy.interpolate.interp1d(intPolXVals, self.uncer, kind=intPolType, copy='False',
bounds_error=True)}
else:
raise KeyError("Interpolator Kind >" + str(
intPolType) + " not supported, no interpolator created. Use 'linear', 'nearest', 'nearest-up', 'zero', 'slinear', 'quadratic', 'cubic', 'previous' or 'next'")
elif intPolType != None and intPolDSIVector['values'].size != self.values.size:
raise ValueError("X>" + str(intPolDSIVector['values'].size) + " and Y>" + str(
self.values.size) + " vector length for interpolator do not match, no interpolator created")
@classmethod @classmethod
def fromdict(cls, dict): def fromdict(cls, dict):
#change constructor so that np.arrays are created # change constructor so that np.arrays are created
instance=cls(np.array(dict['values']), instance = cls(np.array(dict['values']),
np.array(dict['uncer']), np.array(dict['uncer']),
dict['unit'], str(dict['quantity']),
dict['quantity'], str(dict['unit']),
uncerType=dict['originalUncerType']) uncerType=dict['originalUncerType'])
additionalkeys=dict.keys()-set(['values','uncer','unit','quantity','originalUncerType']) additionalkeys = dict.keys() - set(['values', 'uncer', 'unit', 'quantity', 'originalUncerType'])
for key in additionalkeys: for key in additionalkeys:
instance.__dict__[key]=dict[key] instance.__dict__[key] = dict[key]
#TODO add additional key vaule pairs # TODO add additional key vaule pairs
return instance return instance
@classmethod @classmethod
def fromjson(cls, jsonstr): def fromjson(cls, jsonstr):
dict=json.loads(jsonstr) dict = json.loads(jsonstr)
return cls.fromdict(dict) return cls.fromdict(dict)
def jsonDumps(self): def jsonDumps(self):
return json.dumps(self.__dict__, cls=NumpyEncoder) return json.dumps(self.__dict__, cls=NumpyEncoder)
def addInterPolator(self, intPolDSIVector, intPolType):
if intPolType != None and intPolDSIVector['values'].size == self.values.size:
intPolXVals = intPolDSIVector['values']
self.intpolParams = {'xValuesDSIVectorQuantity': intPolDSIVector['quantity'],
'interPolationType': intPolType}
if intPolType in ['linear', 'nearest', 'nearest-up', 'zero', 'slinear', 'quadratic', 'cubic', 'previous',
'next']:
self.interpolators = {
'values': scipy.interpolate.interp1d(intPolXVals, self.values, kind=intPolType, copy='False',
bounds_error=True),
'uncer': scipy.interpolate.interp1d(intPolXVals, self.uncer, kind=intPolType, copy='False',
bounds_error=True)}
else:
raise KeyError("Interpolator Kind >" + str(
intPolType) + " not supported, no interpolator created. Use 'linear', 'nearest', 'nearest-up', 'zero', 'slinear', 'quadratic', 'cubic', 'previous' or 'next'")
elif intPolType != None and intPolDSIVector['values'].size != self.values.size:
raise ValueError("X>" + str(intPolDSIVector['values'].size) + " and Y>" + str(
self.values.size) + " vector length for interpolator do not match, no interpolator created")
def __getitem__(self, key): def __getitem__(self, key):
print(key) # print(key)
if type(key)==int: if type(key) == int:
return (self.__dict__['values'][key], self.__dict__['uncer'][key]) return (self.values[key], self.uncer[key])
elif type(key)==str: if type(key) == slice:
return (self.values[key], self.uncer[key])
elif type(key) == float:
if self.interpolators:
return self.interpolators['values'](key), self.interpolators['uncer'](key)
else:
raise RuntimeError("Interpolatioin not set! But Interpolated value needed for sucscription")
elif type(key) == np.ndarray:
if self.interpolators:
return self.interpolators['values'](key), self.interpolators['uncer'](key)
else:
raise RuntimeError("Interpolatioin not set! but Interpolated value needed")
elif type(key) == str:
try: try:
return self.__dict__[key] return self.__dict__[key]
except KeyError: except KeyError:
if key=='uncer_relPercent': if key == 'uncer_relPercent':
return self.__dict__['uncer'] / self.__dict__['values'] * 100 return self.uncer / self.values * 100
elif key=='uncer_relPPM': elif key == 'uncer_relPPM':
return self.__dict__['uncer'] / self.__dict__['values'] * 1e6 return self.uncer / self.values * 1e6
elif key=='uncer_rel': elif key == 'uncer_rel':
return self.__dict__['uncer'] / self.__dict__['values'] return self.uncer / self.values
else: else:
raise KeyError(key +' not supoorted try:' + str(list(self.__dict__.keys())) + r" or ['uncer_rel','uncer_relPercent','uncer_relPPM]") raise KeyError(key + ' not supoorted try:' + str(
elif type(key)==tuple: list(self.__dict__.keys())) + r" or ['uncer_rel','uncer_relPercent','uncer_relPPM]")
if type(key[0])==str and type(key[1])==int: elif type(key) == tuple:
if type(key[0]) == str and type(key[1]) == int:
try: try:
return self.__dict__[key[0]][key[1]] return self.__dict__[key[0]][key[1]]
except KeyError: except KeyError:
if key[0] == 'uncer_relPercent': if key[0] == 'uncer_relPercent':
return self.__dict__['uncer'][key[1]] / self.__dict__['values'][key[1]] * 100 return self.uncer[key[1]] / self.values[key[1]] * 100
elif key[0] == 'uncer_relPPM': elif key[0] == 'uncer_relPPM':
return self.__dict__['uncer'][key[1]] / self.__dict__['values'][key[1]] * 1e6 return self.uncer[key[1]] / self.values[key[1]] * 1e6
elif key[0] == 'uncer_rel': elif key[0] == 'uncer_rel':
return self.__dict__['uncer'][key[1]] / self.__dict__['values'][key[1]] return self.uncer[key[1]] / self.values[key[1]]
else: else:
raise KeyError(key + ' not supoorted try:' + str( raise KeyError(key + ' not supoorted try:' + str(
list(self.__dict__.keys())) + r" or ['uncer_relPercent','uncer_relPPM]") list(self.__dict__.keys())) + r" or ['uncer_relPercent','uncer_relPPM]")
else: else:
raise KeyError (key +" Not Supported try dsiVector[int], dsiVector[" + str( raise KeyError(
list(self.__dict__.keys())) + r" or 'uncer_relPercent','uncer_relPPM" + "dsiVector[values,int] or dsiVector['uncer',int]") str(key) + "from type " + str(type(key)) + " Not Supported try dsiVector[int], dsiVector[" + str(
list(
self.__dict__.keys())) + r" or 'uncer_relPercent','uncer_relPPM" + "dsiVector[values,int] or dsiVector['uncer',int]")
def __str__(self): def __str__(self):
length=self['values'].size length = self['values'].size
string='DSI_dict :'+str(self['quantity'])+' in '+str(self['unit'])+' len='+str(length)+' ' string = 'DSI_Vector :' + str(self['quantity']) + ' in ' + str(self['unit']) + ' len=' + str(length) + ' '
if length<8: if length < 8:
for i in range(length): for i in range(length):
string=string+str(self[i])+' ' string = string + str(self[i]) + ' '
else: else:
firstblock='' firstblock = ''
secondblock='' secondblock = ''
for i in range(4): for i in range(4):
firstblock=firstblock+str(self[i])+' ' firstblock = firstblock + str(self[i]) + ' '
secondblock = secondblock + str(self[-(i+1)]) secondblock = secondblock + str(self[-(i + 1)])
string=string+firstblock+' ... '+secondblock string = string + firstblock + ' ... ' + secondblock
return string return string
def __repr__(self): def __repr__(self):
return 'dsiVector @'+hex(id(self)) +' '+self.__str__() return 'dsiVector @' + hex(id(self)) + ' ' + self.__str__()
class dsiMultiVector:
def __init__(self,indexVector,valueVectors,interpolationMethode='None'):
self.__dict__['index']=indexVector
for dataVector in valueVectors:
self.__dict__[dataVector.key]=dataVector
self.__dict__[interpolationMethode]=interpolationMethode
class dsiMultiVector:
def __init__(self, indexVector, valueVectors, interpolationType='None'):
self.index = indexVector
for valueVector in valueVectors:
if interpolationType != None:
valueVector.addInterPolator(self.index, interpolationType)
self.__dict__[valueVector['quantity']] = valueVector
else:
self.__dict__[valueVector['quantity']] = valueVector
print("INIT Done ")
def __getitem__(self, item):
return self.__dict__[item]
...@@ -2,8 +2,13 @@ import numpy as np ...@@ -2,8 +2,13 @@ import numpy as np
from pccDccTools import dsiVector,dsiMultiVector,DsiASCICOnversion from pccDccTools import dsiVector,dsiMultiVector,DsiASCICOnversion
if __name__ == "__main__": if __name__ == "__main__":
testDSiVector = dsiVector((np.arange(20) + 1) * 0.5, np.ones(20) * 0.1, 'Magnitude', r'\volt', uncerType="relPercent") testDSiVector = dsiVector((np.arange(20) + 1) * 0.5, np.ones(20) * 0.1, 'Frequqncy', r'\hertz', uncerType="relPercent")
testValueDSiVector = dsiVector((np.arange(20) + 1) * 5, np.ones(20) * 0.1, 'Magnitude', r'\volt',
uncerType="relPercent")
testValueDSiVectorPhase = dsiVector((np.arange(20) + 1) * 0.1*np.pi, np.ones(20) * 0.1, 'Phase', r'\radian',
uncerType="relPercent")
print(testDSiVector[10]) print(testDSiVector[10])
print(testDSiVector[1:8])
print(testDSiVector['unit']) print(testDSiVector['unit'])
print(testDSiVector['quantity']) print(testDSiVector['quantity'])
print(testDSiVector['uncer']) print(testDSiVector['uncer'])
...@@ -15,4 +20,13 @@ if __name__ == "__main__": ...@@ -15,4 +20,13 @@ if __name__ == "__main__":
jsonStr = testDSiVector.jsonDumps() jsonStr = testDSiVector.jsonDumps()
loadedDSIVector = dsiVector.fromjson(jsonStr) loadedDSIVector = dsiVector.fromjson(jsonStr)
print(loadedDSIVector['values', 10]) print(loadedDSIVector['values', 10])
print(testDSiVector.__str__()) print(testDSiVector.__str__())
\ No newline at end of file
testMultVector=dsiMultiVector(testDSiVector,[testValueDSiVector,testValueDSiVectorPhase],interpolationType='linear')
print(testMultVector['Magnitude'][int(0)])
print(testMultVector['Magnitude'][2.25])
print(testMultVector['Magnitude'][np.array([2.25,3.5,4.75])])
print(testMultVector['Phase'][(np.arange(89)*0.1+1.0)][0])
print(testMultVector['Phase'][1.25])
tmp=testMultVector['Phase'].jsonDumps()
print(tmp)
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment