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)
Example #2
0
 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)
Example #3
0
 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
Example #4
0
 def getMinFiltered(self):
     self.minFiltered = PPGfunc.getMin(self.filtered_sig)
     return self.minFiltered
Example #5
0
 def getMaxFiltered(self):
     self.maxFiltered = PPGfunc.getMax(self.filtered_sig)
     return self.maxFiltered
Example #6
0
 def getMinValue(self):
     self.minValue = PPGfunc.getMin(self.Data)
     return self.minValue
Example #7
0
 def getMaxValue(self):
     self.maxValue = PPGfunc.getMax(self.Data)
     return self.maxValue
Example #8
0
 def getMinTime(self):
     self.minTime = PPGfunc.getMin(self.Time)
     return self.minTime
Example #9
0
 def getMaxTime(self):
     self.maxTime = PPGfunc.getMax(self.Time)
     return self.maxTime
Example #10
0
    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
Example #11
0
    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