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:
'application/xml',
open(dumyXMLFileName, "rb").read())
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)
def upload_fit_data(attr, old, new):
......
import json
import numpy as np
#for interpolation methodes
import scipy.interpolate
# for interpolation methodes
from scipy.interpolate import interp1d
import functools
class NumpyEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, np.ndarray):
return obj.tolist()
if isinstance(obj, interp1d):
return 'Inter Polator Not serilized create from data'
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)
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:
def __init__(self,values,uncer,quantity,unit,uncerType="absolute"):
#TODO private vars
self.__dict__={
'values':np.array(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
def __init__(self, values, uncer, quantity, unit, uncerType="absolute", intPolDSIVector=None, intPolType=None):
# TODO private vars
if type(values) == np.array:
self.values = values
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
def fromdict(cls, dict):
#change constructor so that np.arrays are created
instance=cls(np.array(dict['values']),
np.array(dict['uncer']),
dict['unit'],
dict['quantity'],
uncerType=dict['originalUncerType'])
additionalkeys=dict.keys()-set(['values','uncer','unit','quantity','originalUncerType'])
# change constructor so that np.arrays are created
instance = cls(np.array(dict['values']),
np.array(dict['uncer']),
str(dict['quantity']),
str(dict['unit']),
uncerType=dict['originalUncerType'])
additionalkeys = dict.keys() - set(['values', 'uncer', 'unit', 'quantity', 'originalUncerType'])
for key in additionalkeys:
instance.__dict__[key]=dict[key]
#TODO add additional key vaule pairs
instance.__dict__[key] = dict[key]
# TODO add additional key vaule pairs
return instance
@classmethod
def fromjson(cls, jsonstr):
dict=json.loads(jsonstr)
dict = json.loads(jsonstr)
return cls.fromdict(dict)
def jsonDumps(self):
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):
print(key)
if type(key)==int:
return (self.__dict__['values'][key], self.__dict__['uncer'][key])
elif type(key)==str:
# print(key)
if type(key) == int:
return (self.values[key], self.uncer[key])
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:
return self.__dict__[key]
except KeyError:
if key=='uncer_relPercent':
return self.__dict__['uncer'] / self.__dict__['values'] * 100
elif key=='uncer_relPPM':
return self.__dict__['uncer'] / self.__dict__['values'] * 1e6
elif key=='uncer_rel':
return self.__dict__['uncer'] / self.__dict__['values']
if key == 'uncer_relPercent':
return self.uncer / self.values * 100
elif key == 'uncer_relPPM':
return self.uncer / self.values * 1e6
elif key == 'uncer_rel':
return self.uncer / self.values
else:
raise KeyError(key +' not supoorted try:' + str(list(self.__dict__.keys())) + r" or ['uncer_rel','uncer_relPercent','uncer_relPPM]")
elif type(key)==tuple:
if type(key[0])==str and type(key[1])==int:
raise KeyError(key + ' not supoorted try:' + str(
list(self.__dict__.keys())) + r" or ['uncer_rel','uncer_relPercent','uncer_relPPM]")
elif type(key) == tuple:
if type(key[0]) == str and type(key[1]) == int:
try:
return self.__dict__[key[0]][key[1]]
except KeyError:
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':
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':
return self.__dict__['uncer'][key[1]] / self.__dict__['values'][key[1]]
return self.uncer[key[1]] / self.values[key[1]]
else:
raise KeyError(key + ' not supoorted try:' + str(
list(self.__dict__.keys())) + r" or ['uncer_relPercent','uncer_relPPM]")
else:
raise KeyError (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]")
raise KeyError(
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):
length=self['values'].size
string='DSI_dict :'+str(self['quantity'])+' in '+str(self['unit'])+' len='+str(length)+' '
if length<8:
for i in range(length):
string=string+str(self[i])+' '
else:
firstblock=''
secondblock=''
for i in range(4):
firstblock=firstblock+str(self[i])+' '
secondblock = secondblock + str(self[-(i+1)])
string=string+firstblock+' ... '+secondblock
return string
length = self['values'].size
string = 'DSI_Vector :' + str(self['quantity']) + ' in ' + str(self['unit']) + ' len=' + str(length) + ' '
if length < 8:
for i in range(length):
string = string + str(self[i]) + ' '
else:
firstblock = ''
secondblock = ''
for i in range(4):
firstblock = firstblock + str(self[i]) + ' '
secondblock = secondblock + str(self[-(i + 1)])
string = string + firstblock + ' ... ' + secondblock
return string
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
from pccDccTools import dsiVector,dsiMultiVector,DsiASCICOnversion
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[1:8])
print(testDSiVector['unit'])
print(testDSiVector['quantity'])
print(testDSiVector['uncer'])
......@@ -15,4 +20,13 @@ if __name__ == "__main__":
jsonStr = testDSiVector.jsonDumps()
loadedDSIVector = dsiVector.fromjson(jsonStr)
print(loadedDSIVector['values', 10])
print(testDSiVector.__str__())
\ No newline at end of file
print(testDSiVector.__str__())
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