Diff of /Inference/PyQT_Plot.py [000000] .. [c0487b]

Switch to unified view

a b/Inference/PyQT_Plot.py
1
from pyqtgraph.Qt import QtGui, QtCore, QtWidgets
2
import pyqtgraph as pg
3
import numpy as np
4
import sys 
5
import tkinter as tk
6
7
8
def create_dashboard(data, peaks,all_hr, all_br):
9
    """[summary]
10
    
11
    Arguments:
12
        data {numpy.ndarray} -- ECG plot
13
        peaks {list} -- R peaks
14
        all_hr {list} -- Heart rate per minute
15
        all_br {list} -- Breathing rate per minute
16
    """
17
    global i, rpindex, win, rpeakx, rpeaky, hr, br, hrslid, brslid, slidflaghr, slidflagbr, slidPoshr, slidPosbr, hrindex, chk, chkbr, popflag, trigflag, popwind
18
  
19
    class KeyPressWindow(pg.GraphicsLayoutWidget):
20
        sigKeyPress = QtCore.pyqtSignal(object)
21
        def keyPressEvent(self, ev):
22
            self.scene().keyPressEvent(ev)
23
            self.sigKeyPress.emit(ev)
24
25
    def keyPressed(evt):
26
        if evt.key() == QtCore.Qt.Key_P:
27
            timer.stop()
28
        if evt.key() == QtCore.Qt.Key_S:
29
            timer.start()
30
    
31
    timer = QtCore.QTimer()
32
    app = QtGui.QApplication(sys.argv)
33
    
34
    mscreen = KeyPressWindow()
35
    mscreen.sigKeyPress.connect(keyPressed)
36
    mscreen.show()
37
    mscreen.resize(tk.Tk().winfo_screenwidth(), tk.Tk().winfo_screenheight())
38
    
39
    popwind = QtWidgets.QMessageBox()
40
    popwind.setIcon(QtWidgets.QMessageBox.Critical)
41
    popwind.setWindowTitle("WARNING/COURSE OF ACTION")
42
    popwind.setFont(QtGui.QFont("sans-serif", 16))
43
    changingLabel = QtGui.QLabel()
44
45
    #########IDENTIFIERS###################
46
47
    rpindex = 0
48
    win = 37
49
    hrindex = 37
50
    slidPoshr = 0.5
51
    slidPosbr = 0.5
52
    popflag = 0 
53
    trigflag = 1
54
    ecg = []
55
    slidflaghr = 0
56
    slidflagbr = 0
57
    hr = all_hr[hrindex]
58
    br = all_br[hrindex]
59
   ############ECG PLOT#############
60
61
    rpeaks = pg.ScatterPlotItem(size=10, pen=pg.mkPen(0.5), brush=pg.mkBrush(0, 0, 255, 120))
62
    ecgwind = mscreen.addPlot(row = 0, col = 0, colspan = 3)
63
    ecgwind.hideAxis('left')
64
    ecgwind.hideAxis('bottom')
65
    plt_grid = pg.GridItem()
66
    ecgbg = ecgwind.getViewBox()
67
    ecgbg.setBackgroundColor((255, 255, 255))
68
    curve_ecg = ecgwind.plot( pen=pg.mkPen((0, 0, 0), width=1))
69
    ecgwind.addItem(curve_ecg)
70
    ecgwind.addItem(rpeaks)
71
    ecgwind.addItem(plt_grid)
72
73
    #####################################3
74
75
    #####HEART RATE#############
76
    curvex1 = np.linspace(-5, 5, 10)
77
    curvey1 = np.sin(curvex1) / curvex1
78
79
    hrwind = mscreen.addPlot(row = 1, col = 0)
80
    hrwind.plot(x = curvex1, y = curvey1, pen=(255, 255, 255))
81
    
82
    hrbg = hrwind.getViewBox()
83
    hrbg.setBackgroundColor((255, 255, 255))
84
85
    fileNamehr = '../images/HR.jpg'
86
    imghr = pg.QtGui.QGraphicsPixmapItem(pg.QtGui.QPixmap(fileNamehr))
87
    imghr.scale(1, -1)
88
    
89
    hrwind.hideAxis('left')
90
    hrwind.hideAxis('bottom') 
91
    hrwind.addItem(imghr)
92
93
    hrval = pg.TextItem(color = (0,0,0), anchor=(-0.3,0.5))
94
    fonthrval = changingLabel.font()
95
    fonthrval.setPointSize(86)
96
    hrval.setFont(fonthrval)
97
    fonthrval.setPointSize(40)
98
99
    texthr = pg.TextItem(color = (0,0,0), anchor=(-0.3,0.5))
100
    fonthr = changingLabel.font()
101
    fonthr.setPointSize(40)
102
    texthr.setFont(fonthr)
103
    texthr.setText("HR")
104
    texthr.setPos(130, curvey1.max()/2 - 220)
105
    
106
    hrwind.addItem(hrval) 
107
    hrwind.addItem(texthr) 
108
    
109
    #################################
110
    
111
    #####BREATHING RATE#############
112
    curvex2 = np.linspace(-5, 5, 10)
113
    curvey2 = np.sin(curvex2) / curvex2
114
    
115
    brwind = mscreen.addPlot(row = 1, col = 1)
116
    brwind.plot(x = curvex2,y = curvey2, pen=(255, 255, 255))
117
118
    brbg = brwind.getViewBox()
119
    brbg.setBackgroundColor((255, 255, 255))
120
    
121
    filebr = '../images/BR.jpg'
122
    imgbr = pg.QtGui.QGraphicsPixmapItem(pg.QtGui.QPixmap(filebr))
123
    imgbr.scale(1, -1)
124
    brwind.addItem(imgbr)
125
    brwind.hideAxis('left')
126
    brwind.hideAxis('bottom') 
127
128
    brval = pg.TextItem(color = (0,0,0), anchor=(-0.3,0.5))
129
    font1 = changingLabel.font()
130
    font1.setPointSize(86)
131
    brval.setFont(font1)
132
    
133
    textbr = pg.TextItem(color = (0,0,0), anchor=(-0.3,0.5))
134
    fontbr = changingLabel.font()
135
    fontbr.setPointSize(40)
136
    textbr.setFont(fontbr)
137
    textbr.setText("BR")
138
    textbr.setPos(130, curvey2.max()/2 - 220)
139
140
    brwind.addItem(brval) 
141
    brwind.addItem(textbr) 
142
    #################################
143
    
144
145
    ###### SLIDER #############
146
    slidwind = mscreen.addPlot(row = 1, col = 2)
147
    slidbg = slidwind.getViewBox()
148
    slidbg.setBackgroundColor((255, 255, 255))
149
    curvex3 = np.linspace(0, 860, 2)
150
    curvey3 = [-158 for x in curvex3]
151
152
    fileslider = '../images/Slider.jpg'
153
    imgslid = pg.QtGui.QGraphicsPixmapItem(pg.QtGui.QPixmap(fileslider))
154
    imgslid.scale(1, -1)
155
    slidwind.addItem(imgslid)
156
157
    linehr = slidwind.plot(x = curvex3,y = curvey3, pen=(255, 255, 255))
158
    hrslid = pg.CurvePoint(linehr)
159
    slidwind.addItem(hrslid)
160
161
    texthr1 = pg.TextItem(color = (0,0,0), anchor=(-0.3,0.5))
162
    fonthr1 = changingLabel.font()
163
    fonthr1.setPointSize(40)
164
    texthr1.setFont(fonthr1)
165
    texthr1.setText("HR")
166
    texthr1.setPos(320, curvey1.max() - 270)
167
168
    slidwind.addItem(texthr1) 
169
    arrowhr = pg.ArrowItem(angle=90)
170
    arrowhr.setStyle(headLen = 30)
171
    arrowhr.setParentItem(hrslid)
172
    hrslid.setPos(slidPoshr) 
173
174
    curvey4 = [-465 for x in curvex3]
175
    linebr = slidwind.plot(x = curvex3 ,y = curvey4 , pen=(255, 255, 255))
176
    brslid = pg.CurvePoint(linebr)
177
    slidwind.addItem(brslid)
178
179
    textbr1 = pg.TextItem(color = (0,0,0), anchor=(-0.3,0.5))
180
    fontbr1 = changingLabel.font()
181
    fontbr1.setPointSize(40)
182
    textbr1.setFont(fontbr1)
183
    textbr1.setText("BR")
184
    textbr1.setPos(320, curvey1.max() - 570)
185
186
    slidwind.addItem(textbr1) 
187
    arrowbr = pg.ArrowItem(angle=90)
188
    arrowbr.setStyle(headLen = 30)
189
    arrowbr.setParentItem(brslid)
190
    brslid.setPos(slidPosbr) 
191
192
    slidwind.hideAxis('left')
193
    slidwind.hideAxis('bottom')   
194
    ##########################
195
196
    rpeakx = [x for x in peaks[win] if x <= 1000]
197
    rpeaky = [float(data[win][y]) for y in rpeakx]
198
    chk = 1
199
    chkbr = 1
200
    for i in range(1,1001):
201
        ecg.append(float(data[win][i]))
202
    rpindex = len(rpeakx)
203
   
204
    def update():
205
        global i, win, rpindex, rpeakx, rpeaky, hr, br, hrslid, brslid, slidflaghr, slidflagbr, slidPoshr, slidPosbr, hrindex, chk, chkbr, popflag, trigflag, popwind
206
        
207
        rpeaks.clear()
208
        ecg.pop(0)
209
  
210
        if(len(rpeakx)!=0 and rpeakx[0] < 1):
211
            rpeakx.pop(0)
212
            rpeaky.pop(0)
213
        rpeakx = [x-1 for x in rpeakx]
214
        
215
        if(i+1<len(data[win])):
216
            i += 1
217
            if(rpindex < len(peaks[win]) and i == peaks[win][rpindex]):
218
                rpindex += 1
219
                rpeakx.append(1000)
220
                rpeaky.append(data[win][i])        
221
        else:
222
            rpindex = 0 
223
            win += 1
224
            i = 0
225
      
226
        if 100 <= hr <110:
227
            meterhr = -1
228
            slidflaghr = 1
229
        elif hr < 100:
230
            popflag = 1
231
            meterhr = -2
232
            slidflaghr = 1
233
        elif 150 < hr < 160:
234
            meterhr = 1
235
            slidflaghr = 1
236
        elif hr >= 160:
237
            popflag = 1
238
            meterhr = 2
239
            slidflaghr = 1  
240
        else:
241
            if(slidPoshr != 0.5):
242
                slidflaghr = 1
243
                meterhr = 0
244
        if br > 45:
245
            popflag = 1
246
            slidflagbr = 1
247
            meterbr = 2
248
249
        if popflag == 1 and trigflag == 1:
250
            trigflag = 0
251
            if hr >= 160:
252
                popwind.setText("Heart Rate High\nSeek medical attention if high heart rate persists")
253
            elif hr <= 110:
254
                popwind.setText("Heart Rate Low\nSeek medical attention if low heart rate persists")
255
            else:
256
                popwind.setText("Breathing Rate Abnormal\nSeek medical attention if following symptoms are displayed:\n1) Blueness\n2) Severe chest indrawing")
257
            
258
            popwind.show()
259
        
260
        if slidflaghr == 1 and chk == 1:
261
            
262
            slidDest, direct = slider(meterhr, slidPoshr)
263
            slidPoshr += direct * 0.002
264
            
265
            if(direct == -1):
266
                if slidPoshr <= slidDest:
267
                    slidflaghr = 0
268
                    chk = 0
269
            elif(direct == 1):
270
                if slidPoshr >= slidDest:
271
                    slidflaghr = 0
272
                    chk = 0
273
            hrslid.setPos(slidPoshr)    
274
275
        if slidflagbr == 1 and chkbr == 1:
276
            slidDestbr, directbr = slider(meterbr, slidPosbr)
277
            slidPosbr += directbr * 0.002
278
            if(directbr == -1):
279
                if slidPosbr <= slidDestbr:
280
                    slidflagbr = 0
281
                    chkbr = 0
282
            elif(directbr == 1):
283
                if slidPosbr >= slidDestbr:
284
                    slidflagbr = 0
285
                    chkbr = 0
286
            brslid.setPos(slidPosbr)  
287
288
        ecg.append(float(data[win][i]))
289
        rpkx = [x - 1 for x in rpeakx]
290
        rpky = rpeaky
291
     
292
        if i % 2500 == 0:
293
            
294
            hrindex += 1
295
            hr = all_hr[hrindex] - 15
296
            br = all_br[hrindex] + 31
297
            chk = 1
298
            chkbr = 1
299
            trigflag = 1
300
            
301
        hrval.setText('{} ' .format(hr))
302
        brval.setText('{} ' .format(br))
303
        popflag = 0
304
        
305
        if hr<100:
306
            hrval.setPos(95, -159.5253)
307
        else:
308
            hrval.setPos(60, -159.5253)
309
310
        brval.setPos(95, -159.5253)
311
        rpeaks.addPoints(x = rpkx, y = rpky)
312
        curve_ecg.setData(ecg)
313
314
    def slider(meter, slidPoshr):
315
316
        if meter == -2:
317
            slidDest = 0
318
            direct = -1
319
        elif meter == -1:
320
            slidDest = 0.25
321
            if slidPoshr>0.5:
322
                direct = -1
323
            elif slidPoshr<0.5:
324
                direct = 1
325
            direct = -1
326
        elif meter == 1:
327
            slidDest = 0.75
328
            if slidPoshr>0.5:
329
                direct = -1
330
            elif slidPoshr<0.5:
331
                direct = 1
332
        elif meter == 2:
333
            slidDest = 1
334
            direct = 1
335
        elif meter == 0:
336
            slidDest = 0.5
337
            if slidPoshr>0.5:
338
                direct = -1
339
            elif slidPoshr<0.5:
340
                direct = 1
341
342
        return slidDest, direct
343
        
344
    timer.timeout.connect(update)
345
    timer.start(5)
346
347
    if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'):
348
        QtGui.QApplication.instance().exec_()