def getWFderivative(self): sign=1 #print 'Smoothed Data',self.DataSN self.WFnormP() for k in range(0,self.length-1): self.derivative[k]=PPGfunc.getSlope(self.outData[0][k],self.outData[0][k+1],self.outData[1][k],self.outData[1][k+1]) self.derivative[self.length-1]=PPGfunc.getSlope(self.outData[0][self.length-2],self.outData[0][self.length-1],self.outData[1][self.length-2],self.outData[1][self.length-1]) #print "DerivativeNow", self.derivative self.derivativeN=self.getNormalized(self.derivative) for k in range(0,self.length-1): if self.derivativeN[k]==float('nan'): self.derivativeN[k]=sign else: sign=self.derivativeN[k]/self.derivativeN[k] if self.derivativeN[self.length-1]==float('nan'): self.derivativeN[k]=sign #for k in range(0,self.length-1): #if self.derivativeN[k]==float('nan'): #print 'NAN= ', k self.outData[1]=self.derivativeN return np.copy(self.outData)
def getWFderivative(self): self.Spectrum() self.fileteredWave() for k in range(0, self.length - 1): self.derivative[k] = PPGfunc.getSlope(self.Time[k], self.Time[k + 1], self.filtered_sig[k], self.filtered_sig[k + 1]) self.derivative[self.length - 1] = PPGfunc.getSlope( self.Time[self.length - 2], self.Time[self.length - 1], self.filtered_sig[self.length - 2], self.filtered_sig[self.length - 1]) sign = 1 for k in range(0, self.length - 1): if self.derivative[k] == float('nan'): self.derivative[k] = sign else: sign = self.derivative[k] / self.derivative[k] if self.derivative[self.length - 1] == float('nan'): self.derivative[k] = sign return np.copy(self.derivative)
def fileteredWave(self): n = len(self.Data) / 100 if n < 5: n = 5 n = 5 #print ('n=',n) lowcut = 0.5 #print ('lowcut=',lowcut) highcut = 5 #print ('highcut=',highcut) fs = 60 #print ('fs=',fs) b, a = PPGfunc.butter_bandpass(lowcut, highcut, fs, n) #print ('Butter') self.filtered_sig = PPGfunc.butter_bandpass_filter(self.Data, b, a) #print ('Filter') #self.PlotPPGWave() #self.PlotPPGWaveFiltered() min = self.filtered_sig[0] for i in self.filtered_sig: if i < min: min = i self.filtered_sig = self.filtered_sig - min
def getMinFiltered(self): self.minFiltered = PPGfunc.getMin(self.filtered_sig) return self.minFiltered
def getMaxFiltered(self): self.maxFiltered = PPGfunc.getMax(self.filtered_sig) return self.maxFiltered
def getMinValue(self): self.minValue = PPGfunc.getMin(self.Data) return self.minValue
def getMaxValue(self): self.maxValue = PPGfunc.getMax(self.Data) return self.maxValue
def getMinTime(self): self.minTime = PPGfunc.getMin(self.Time) return self.minTime
def getMaxTime(self): self.maxTime = PPGfunc.getMax(self.Time) return self.maxTime
def make(self,PPGData): self.ppg=PPGData # self.smoothS=smoothSpan # self.smooth= [[0 for x in range(columns)] for y in range(rows)] # self.smoothN=[ self.PulseWaveSystolicPeakPos=-1 self.PulseWaveEndPos=-1 self.DicroticNotchPos=-1 self.DiastolicPeakPos=-1 self.HalfHeight=-1 self.HalfTimeLow=-1 self.HalfTimeHigh=-1 self.PulseWaveAmplitude=-1 self.SystolicPhase=-1 self.SystolicPeak=-1 self.DiastolicPhase=-1 self.PulseWaveDuration=-1 self.PulsePropogationTme=-1 self.PulseWidthTime=-1 self.RiseTime=-1 self.PulseInflectionPointAmplitude=-1 self.RelectionIndex=-1 self.PulseArea=-1 self.PulseArea1=-1 self.PulseArea2=-1 self.DicroticNotchTime=-1 self.DicroticNotchValue=-1 self.InflectionPointAreaRatio=-1 self.HalfHeightHiPos=-1 self.HalfHeightLowPos=-1 self.AverageWaveForm=self.ppg.getAverageWF() self.PulseWaveSystolicPeakPos=int(self.AverageWaveForm[2][0]) self.PulseWaveEndPos=int(self.AverageWaveForm[2][1]) self.StdDevPWD=self.AverageWaveForm[2][2] self.StdDevPWA=self.AverageWaveForm[2][4] firstD=PPGfunc.derivative(self.AverageWaveForm[0],self.AverageWaveForm[1]) secondD=PPGfunc.derivative(self.AverageWaveForm[0],firstD) # x1 = self.AverageWaveForm[0] # y1 = self.AverageWaveForm[1] # plt.plot(x1, y1,label = "pulse", color= "red") # x2 = self.AverageWaveForm[0] # y2 = firstD*10 # plt.plot(x2, y2,label = "First Derivative", color= "blue") # x2 = self.AverageWaveForm[0] # y2 = secondD*100 # plt.plot(x2, y2,label = "Second Derivative", color= "green") # plt.xlabel('Time [ms]') # plt.ylabel('Pulse Waveform [Arb. Units]') # plt.legend(loc='upper right') # plt.title('Pulse Derivatives') # plt.show() self.HalfHeight=0.5*self.AverageWaveForm[1][self.PulseWaveSystolicPeakPos] #print 'Half Height= ',self.HalfHeight for i in range(0,self.PulseWaveSystolicPeakPos-1): if self.AverageWaveForm[1][i]>self.HalfHeight: DeltaX=self.AverageWaveForm[0][i]-self.AverageWaveForm[0][i-1] DeltaY=self.AverageWaveForm[1][i]-self.AverageWaveForm[1][i-1] DeltaV=self.HalfHeight-self.AverageWaveForm[1][i-1] self.HalfTimeLow=self.AverageWaveForm[0][i-1]+DeltaX*DeltaV/DeltaY self.HalfHeightLowPos=i break for i in range(self.PulseWaveSystolicPeakPos+1,self.PulseWaveEndPos-1): if self.AverageWaveForm[1][i]<self.HalfHeight: DeltaX=self.AverageWaveForm[0][i]-self.AverageWaveForm[0][i-1] DeltaY=-self.AverageWaveForm[1][i]+self.AverageWaveForm[1][i-1] DeltaV=self.HalfHeight-self.AverageWaveForm[1][i] self.HalfTimeHigh=self.AverageWaveForm[0][i-1]+DeltaX*DeltaV/DeltaY self.HalfHeightHiPos=i break Inflections=PPGfunc.FindNotch(self.AverageWaveForm[0],self.AverageWaveForm[1],self.HalfHeightHiPos-(self.HalfHeightHiPos-self.PulseWaveSystolicPeakPos)/2,self.HalfHeightHiPos+(self.PulseWaveEndPos-self.HalfHeightHiPos)/2,firstD,secondD) print (self.PulseWaveSystolicPeakPos-self.HalfHeightHiPos)/2,self.HalfHeightHiPos,(self.PulseWaveEndPos-self.HalfHeightHiPos)/2 if(len(Inflections)>1): self.DiastolicPeakPos=Inflections.pop() self.DicroticNotchPos=Inflections.pop() self.DicroticNotchTime=self.AverageWaveForm[0][self.DicroticNotchPos] self.DicroticNotchValue=self.AverageWaveForm[1][self.DicroticNotchPos] else: self.DicroticNotchPos=-1 self.DiastolicPeakPos=-1 self.PulseWaveAmplitude=self.AverageWaveForm[1][self.PulseWaveSystolicPeakPos] self.SystolicPhase=self.RiseTime=self.AverageWaveForm[0][self.PulseWaveSystolicPeakPos] self.SystolicPeak=self.AverageWaveForm[1][self.PulseWaveSystolicPeakPos] self.DiastolicPhase=self.AverageWaveForm[0][self.PulseWaveEndPos]-self.AverageWaveForm[0][self.PulseWaveSystolicPeakPos] self.PulseWaveDuration=self.AverageWaveForm[0][self.PulseWaveEndPos] self.PulsePropogationTme=self.AverageWaveForm[0][self.DiastolicPeakPos]-self.AverageWaveForm[0][self.PulseWaveSystolicPeakPos] self.PulseWidthTime=self.HalfTimeHigh-self.HalfTimeLow self.PulseInflectionPointAmplitude=self.AverageWaveForm[1][self.DiastolicPeakPos] self.RelectionIndex=self.PulseInflectionPointAmplitude/self.PulseWaveAmplitude*100 self.PulseArea1=0 for i in range(1,self.DicroticNotchPos): self.PulseArea1=self.PulseArea1+abs((self.AverageWaveForm[1][i]+self.AverageWaveForm[1][i-1])/2*(self.AverageWaveForm[0][i]-self.AverageWaveForm[0][i-1])) self.PulseArea2=0 for i in range(self.DicroticNotchPos,self.PulseWaveEndPos): self.PulseArea2=self.PulseArea2+abs((self.AverageWaveForm[1][i]+self.AverageWaveForm[1][i-1])/2*(self.AverageWaveForm[0][i]-self.AverageWaveForm[0][i-1])) self.PulseArea=self.PulseArea1+self.PulseArea2 self.InflectionPointAreaRatio=self.PulseArea2/self.PulseArea1
def make(self, PPGData): self.ppg = PPGData # self.smoothS=smoothSpan # self.smooth= [[0 for x in range(columns)] for y in range(rows)] # self.smoothN=[ self.InflectionPoints = [] self.PulseWaveSystolicPeakPos = -1 self.PulseWaveEndPos = -1 self.DicroticNotchPos = -1 self.DiastolicPeakPos = -1 self.HalfHeight = -1 self.HalfTimeLow = -1 self.HalfTimeHigh = -1 self.PulseWaveAmplitude = -1 self.SystolicPhase = -1 self.DiastolicPhase = -1 self.PulseWaveDuration = -1 self.PulseWavePropogationTme = -1 self.PulseWidthTime = -1 self.RiseTime = -1 self.wf1 = self.ppg.getWFnormP() #print "Waveform0", self.wf1[1] #data_obj = Data(self.wf1[0], self.wf1[1], smoothness=11) #print "Waveform1", self.wf1[1] #data_obj.get_peaks(method='slope') #print "Waveform2", self.wf1[1] self.wfD = self.ppg.getWFderivative() self.wfCP = self.ppg.getWFCriticalP() self.AverageWaveForm = [] #print "Waveform3", self.wf1[1] #print data_obj.peaks #print data_obj.peaks['peaks'][0] #print data_obj.peaks['peaks'][1] #print data_obj.peaks['valleys'] #print 'Critical Points',self.wfCP # Pulse = go.Scatter(x=self.wf1[0],y=self.wf1[1],mode = 'markers',marker = dict(size = 1,color = 'rgba(255, 0, 0, .8)'),name='Pulse',) # Trace4 = go.Scatter(x=self.wfCP[0],y=self.wfCP[1],mode = 'markers',marker = dict(size = 3,color = 'rgba(255, 0, 0, .8)'),name='Pulse',) #Valleys = go.Scatter(x=data_obj.peaks['peaks'][0],y=data_obj.peaks['peaks'][1],mode = 'markers',marker = dict(size = 5,color = 'rgba(0, 255, 100, .8)'),name='Valleys',) #Peaks = go.Scatter(x=data_obj.peaks['valleys'][0],y=data_obj.peaks['valleys'][1],mode = 'markers',marker = dict(size = 5,color = 'rgba(0, 0, 255, .8)'),name='Peaks',) # data = [Pulse,Trace4] # layout = go.Layout(title='PPG',hovermode='closest', # xaxis=dict(title='Time [ms]',), # yaxis=dict(title='Pulse Waveform [Arb. Units]',),) # fig = go.Figure(data=data, layout=layout) #print data # py.plot(fig, filename='basic-scatter') #print "Out" self.AverageWaveForm = self.ppg.AverageWF() self.InflectionPoints = PPGfunc.inflection(self.AverageWaveForm[0], self.AverageWaveForm[1]) self.PulseWaveSystolicPeakPos = int(self.AverageWaveForm[2][0]) self.PulseWaveEndPos = int(self.AverageWaveForm[2][1]) #print "Inflection Points= ", self.InflectionPoints, 'Length= ',len(self.InflectionPoints) if (len(self.InflectionPoints) > 0): temp = self.InflectionPoints.pop() self.DicroticNotchPos = temp[0] self.DiastolicPeakPos = temp[1] else: self.DicroticNotchPos = -1 self.DiastolicPeakPos = -1 self.HalfHeight = 0.5 * self.AverageWaveForm[1][ self.PulseWaveSystolicPeakPos] print 'Half Height= ', self.HalfHeight for i in range(0, self.PulseWaveSystolicPeakPos - 1): if self.AverageWaveForm[1][i] > self.HalfHeight: # print 'Point i=(',self.AverageWaveForm[0][i],self.AverageWaveForm[1][i],')' # print 'Point i-1=(',self.AverageWaveForm[0][i-1],self.AverageWaveForm[1][i-1],')' DeltaX = self.AverageWaveForm[0][i] - self.AverageWaveForm[0][ i - 1] # print "Delta X=", DeltaX DeltaY = self.AverageWaveForm[1][i] - self.AverageWaveForm[1][ i - 1] # print "Delta y=", DeltaY DeltaV = self.HalfHeight - self.AverageWaveForm[1][i - 1] # print "Delta V=", DeltaV self.HalfTimeLow = self.AverageWaveForm[0][ i - 1] + DeltaX * DeltaV / DeltaY # print "Half Time Low=", self.HalfTimeLow break for i in range(self.PulseWaveSystolicPeakPos + 1, self.PulseWaveEndPos - 1): if self.AverageWaveForm[1][i] < self.HalfHeight: # print 'Point i=(',self.AverageWaveForm[0][i],self.AverageWaveForm[1][i],')' # print 'Point i-1=(',self.AverageWaveForm[0][i-1],self.AverageWaveForm[1][i-1],')' DeltaX = self.AverageWaveForm[0][i] - self.AverageWaveForm[0][ i - 1] # print "Delta X=", DeltaX DeltaY = -self.AverageWaveForm[1][i] + self.AverageWaveForm[1][ i - 1] # print "Delta y=", DeltaY DeltaV = self.HalfHeight - self.AverageWaveForm[1][i] # print "Delta V=", DeltaV self.HalfTimeHigh = self.AverageWaveForm[0][ i - 1] + DeltaX * DeltaV / DeltaY # print "Half Time Low=", self.HalfTimeLow break self.PulseWaveAmplitude = self.AverageWaveForm[1][ self.PulseWaveSystolicPeakPos] self.SystolicPhase = self.RiseTime = self.AverageWaveForm[0][ self.PulseWaveSystolicPeakPos] self.DiastolicPhase = self.AverageWaveForm[0][ self.PulseWaveEndPos] - self.AverageWaveForm[0][ self.PulseWaveSystolicPeakPos] self.PulseWaveDuration = self.AverageWaveForm[0][self.PulseWaveEndPos] self.PulseWavePropogationTme = self.AverageWaveForm[0][ self.DicroticNotchPos] - self.AverageWaveForm[0][ self.PulseWaveSystolicPeakPos] self.PulseWidthTime = self.HalfTimeHigh - self.HalfTimeLow