--- a +++ b/Inference/PyQT_Plot.py @@ -0,0 +1,348 @@ +from pyqtgraph.Qt import QtGui, QtCore, QtWidgets +import pyqtgraph as pg +import numpy as np +import sys +import tkinter as tk + + +def create_dashboard(data, peaks,all_hr, all_br): + """[summary] + + Arguments: + data {numpy.ndarray} -- ECG plot + peaks {list} -- R peaks + all_hr {list} -- Heart rate per minute + all_br {list} -- Breathing rate per minute + """ + global i, rpindex, win, rpeakx, rpeaky, hr, br, hrslid, brslid, slidflaghr, slidflagbr, slidPoshr, slidPosbr, hrindex, chk, chkbr, popflag, trigflag, popwind + + class KeyPressWindow(pg.GraphicsLayoutWidget): + sigKeyPress = QtCore.pyqtSignal(object) + def keyPressEvent(self, ev): + self.scene().keyPressEvent(ev) + self.sigKeyPress.emit(ev) + + def keyPressed(evt): + if evt.key() == QtCore.Qt.Key_P: + timer.stop() + if evt.key() == QtCore.Qt.Key_S: + timer.start() + + timer = QtCore.QTimer() + app = QtGui.QApplication(sys.argv) + + mscreen = KeyPressWindow() + mscreen.sigKeyPress.connect(keyPressed) + mscreen.show() + mscreen.resize(tk.Tk().winfo_screenwidth(), tk.Tk().winfo_screenheight()) + + popwind = QtWidgets.QMessageBox() + popwind.setIcon(QtWidgets.QMessageBox.Critical) + popwind.setWindowTitle("WARNING/COURSE OF ACTION") + popwind.setFont(QtGui.QFont("sans-serif", 16)) + changingLabel = QtGui.QLabel() + + #########IDENTIFIERS################### + + rpindex = 0 + win = 37 + hrindex = 37 + slidPoshr = 0.5 + slidPosbr = 0.5 + popflag = 0 + trigflag = 1 + ecg = [] + slidflaghr = 0 + slidflagbr = 0 + hr = all_hr[hrindex] + br = all_br[hrindex] + ############ECG PLOT############# + + rpeaks = pg.ScatterPlotItem(size=10, pen=pg.mkPen(0.5), brush=pg.mkBrush(0, 0, 255, 120)) + ecgwind = mscreen.addPlot(row = 0, col = 0, colspan = 3) + ecgwind.hideAxis('left') + ecgwind.hideAxis('bottom') + plt_grid = pg.GridItem() + ecgbg = ecgwind.getViewBox() + ecgbg.setBackgroundColor((255, 255, 255)) + curve_ecg = ecgwind.plot( pen=pg.mkPen((0, 0, 0), width=1)) + ecgwind.addItem(curve_ecg) + ecgwind.addItem(rpeaks) + ecgwind.addItem(plt_grid) + + #####################################3 + + #####HEART RATE############# + curvex1 = np.linspace(-5, 5, 10) + curvey1 = np.sin(curvex1) / curvex1 + + hrwind = mscreen.addPlot(row = 1, col = 0) + hrwind.plot(x = curvex1, y = curvey1, pen=(255, 255, 255)) + + hrbg = hrwind.getViewBox() + hrbg.setBackgroundColor((255, 255, 255)) + + fileNamehr = '../images/HR.jpg' + imghr = pg.QtGui.QGraphicsPixmapItem(pg.QtGui.QPixmap(fileNamehr)) + imghr.scale(1, -1) + + hrwind.hideAxis('left') + hrwind.hideAxis('bottom') + hrwind.addItem(imghr) + + hrval = pg.TextItem(color = (0,0,0), anchor=(-0.3,0.5)) + fonthrval = changingLabel.font() + fonthrval.setPointSize(86) + hrval.setFont(fonthrval) + fonthrval.setPointSize(40) + + texthr = pg.TextItem(color = (0,0,0), anchor=(-0.3,0.5)) + fonthr = changingLabel.font() + fonthr.setPointSize(40) + texthr.setFont(fonthr) + texthr.setText("HR") + texthr.setPos(130, curvey1.max()/2 - 220) + + hrwind.addItem(hrval) + hrwind.addItem(texthr) + + ################################# + + #####BREATHING RATE############# + curvex2 = np.linspace(-5, 5, 10) + curvey2 = np.sin(curvex2) / curvex2 + + brwind = mscreen.addPlot(row = 1, col = 1) + brwind.plot(x = curvex2,y = curvey2, pen=(255, 255, 255)) + + brbg = brwind.getViewBox() + brbg.setBackgroundColor((255, 255, 255)) + + filebr = '../images/BR.jpg' + imgbr = pg.QtGui.QGraphicsPixmapItem(pg.QtGui.QPixmap(filebr)) + imgbr.scale(1, -1) + brwind.addItem(imgbr) + brwind.hideAxis('left') + brwind.hideAxis('bottom') + + brval = pg.TextItem(color = (0,0,0), anchor=(-0.3,0.5)) + font1 = changingLabel.font() + font1.setPointSize(86) + brval.setFont(font1) + + textbr = pg.TextItem(color = (0,0,0), anchor=(-0.3,0.5)) + fontbr = changingLabel.font() + fontbr.setPointSize(40) + textbr.setFont(fontbr) + textbr.setText("BR") + textbr.setPos(130, curvey2.max()/2 - 220) + + brwind.addItem(brval) + brwind.addItem(textbr) + ################################# + + + ###### SLIDER ############# + slidwind = mscreen.addPlot(row = 1, col = 2) + slidbg = slidwind.getViewBox() + slidbg.setBackgroundColor((255, 255, 255)) + curvex3 = np.linspace(0, 860, 2) + curvey3 = [-158 for x in curvex3] + + fileslider = '../images/Slider.jpg' + imgslid = pg.QtGui.QGraphicsPixmapItem(pg.QtGui.QPixmap(fileslider)) + imgslid.scale(1, -1) + slidwind.addItem(imgslid) + + linehr = slidwind.plot(x = curvex3,y = curvey3, pen=(255, 255, 255)) + hrslid = pg.CurvePoint(linehr) + slidwind.addItem(hrslid) + + texthr1 = pg.TextItem(color = (0,0,0), anchor=(-0.3,0.5)) + fonthr1 = changingLabel.font() + fonthr1.setPointSize(40) + texthr1.setFont(fonthr1) + texthr1.setText("HR") + texthr1.setPos(320, curvey1.max() - 270) + + slidwind.addItem(texthr1) + arrowhr = pg.ArrowItem(angle=90) + arrowhr.setStyle(headLen = 30) + arrowhr.setParentItem(hrslid) + hrslid.setPos(slidPoshr) + + curvey4 = [-465 for x in curvex3] + linebr = slidwind.plot(x = curvex3 ,y = curvey4 , pen=(255, 255, 255)) + brslid = pg.CurvePoint(linebr) + slidwind.addItem(brslid) + + textbr1 = pg.TextItem(color = (0,0,0), anchor=(-0.3,0.5)) + fontbr1 = changingLabel.font() + fontbr1.setPointSize(40) + textbr1.setFont(fontbr1) + textbr1.setText("BR") + textbr1.setPos(320, curvey1.max() - 570) + + slidwind.addItem(textbr1) + arrowbr = pg.ArrowItem(angle=90) + arrowbr.setStyle(headLen = 30) + arrowbr.setParentItem(brslid) + brslid.setPos(slidPosbr) + + slidwind.hideAxis('left') + slidwind.hideAxis('bottom') + ########################## + + rpeakx = [x for x in peaks[win] if x <= 1000] + rpeaky = [float(data[win][y]) for y in rpeakx] + chk = 1 + chkbr = 1 + for i in range(1,1001): + ecg.append(float(data[win][i])) + rpindex = len(rpeakx) + + def update(): + global i, win, rpindex, rpeakx, rpeaky, hr, br, hrslid, brslid, slidflaghr, slidflagbr, slidPoshr, slidPosbr, hrindex, chk, chkbr, popflag, trigflag, popwind + + rpeaks.clear() + ecg.pop(0) + + if(len(rpeakx)!=0 and rpeakx[0] < 1): + rpeakx.pop(0) + rpeaky.pop(0) + rpeakx = [x-1 for x in rpeakx] + + if(i+1<len(data[win])): + i += 1 + if(rpindex < len(peaks[win]) and i == peaks[win][rpindex]): + rpindex += 1 + rpeakx.append(1000) + rpeaky.append(data[win][i]) + else: + rpindex = 0 + win += 1 + i = 0 + + if 100 <= hr <110: + meterhr = -1 + slidflaghr = 1 + elif hr < 100: + popflag = 1 + meterhr = -2 + slidflaghr = 1 + elif 150 < hr < 160: + meterhr = 1 + slidflaghr = 1 + elif hr >= 160: + popflag = 1 + meterhr = 2 + slidflaghr = 1 + else: + if(slidPoshr != 0.5): + slidflaghr = 1 + meterhr = 0 + if br > 45: + popflag = 1 + slidflagbr = 1 + meterbr = 2 + + if popflag == 1 and trigflag == 1: + trigflag = 0 + if hr >= 160: + popwind.setText("Heart Rate High\nSeek medical attention if high heart rate persists") + elif hr <= 110: + popwind.setText("Heart Rate Low\nSeek medical attention if low heart rate persists") + else: + popwind.setText("Breathing Rate Abnormal\nSeek medical attention if following symptoms are displayed:\n1) Blueness\n2) Severe chest indrawing") + + popwind.show() + + if slidflaghr == 1 and chk == 1: + + slidDest, direct = slider(meterhr, slidPoshr) + slidPoshr += direct * 0.002 + + if(direct == -1): + if slidPoshr <= slidDest: + slidflaghr = 0 + chk = 0 + elif(direct == 1): + if slidPoshr >= slidDest: + slidflaghr = 0 + chk = 0 + hrslid.setPos(slidPoshr) + + if slidflagbr == 1 and chkbr == 1: + slidDestbr, directbr = slider(meterbr, slidPosbr) + slidPosbr += directbr * 0.002 + if(directbr == -1): + if slidPosbr <= slidDestbr: + slidflagbr = 0 + chkbr = 0 + elif(directbr == 1): + if slidPosbr >= slidDestbr: + slidflagbr = 0 + chkbr = 0 + brslid.setPos(slidPosbr) + + ecg.append(float(data[win][i])) + rpkx = [x - 1 for x in rpeakx] + rpky = rpeaky + + if i % 2500 == 0: + + hrindex += 1 + hr = all_hr[hrindex] - 15 + br = all_br[hrindex] + 31 + chk = 1 + chkbr = 1 + trigflag = 1 + + hrval.setText('{} ' .format(hr)) + brval.setText('{} ' .format(br)) + popflag = 0 + + if hr<100: + hrval.setPos(95, -159.5253) + else: + hrval.setPos(60, -159.5253) + + brval.setPos(95, -159.5253) + rpeaks.addPoints(x = rpkx, y = rpky) + curve_ecg.setData(ecg) + + def slider(meter, slidPoshr): + + if meter == -2: + slidDest = 0 + direct = -1 + elif meter == -1: + slidDest = 0.25 + if slidPoshr>0.5: + direct = -1 + elif slidPoshr<0.5: + direct = 1 + direct = -1 + elif meter == 1: + slidDest = 0.75 + if slidPoshr>0.5: + direct = -1 + elif slidPoshr<0.5: + direct = 1 + elif meter == 2: + slidDest = 1 + direct = 1 + elif meter == 0: + slidDest = 0.5 + if slidPoshr>0.5: + direct = -1 + elif slidPoshr<0.5: + direct = 1 + + return slidDest, direct + + timer.timeout.connect(update) + timer.start(5) + + if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'): + QtGui.QApplication.instance().exec_() \ No newline at end of file