1 import os 2 import sys 3 import math 4 from PyQt5.QtCore import * 5 from PyQt5.QtWidgets import * 6 import numpy as np 7 import matplotlib 8 matplotlib.use('Qt5Agg') 9 10 from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas 11 from matplotlib.figure import Figure 12 13 importpath = '/Users/zhangruoxi/Documents/A1-代码/Python/Data_Processing/Hall_Measurement' 14 os.chdir(importpath) 15 import Correction as coc 16 17 datapath = '/Volumes/RUOXI/00-DataTransfer' 18 19 class DataTable(QDialog): 20 def __init__(self, parent=None, names=[], x_data=[], y_data=[]): 21 super(DataTable, self).__init__(parent) 22 self.setAttribute(Qt.WA_DeleteOnClose) 23 24 self.setFixedSize(400, 600) 25 self.table = QTableWidget(len(x_data),2) 26 self.table.setHorizontalHeaderLabels(names) 27 temp = 0 28 for data in x_data: 29 newItem = QTableWidgetItem('%.8e'%data) 30 self.table.setItem(temp,0,newItem) 31 temp+=1 32 temp = 0 33 for data in y_data: 34 newItem = QTableWidgetItem('%.8e'%data) 35 self.table.setItem(temp,1,newItem) 36 temp+=1 37 layout=QHBoxLayout() 38 layout.addWidget(self.table) 39 self.setLayout(layout) 40 41 class PlatueTable(QDialog): 42 def __init__(self, parent=None, names=(), data=()): 43 super(PlatueTable, self).__init__(parent) 44 self.setAttribute(Qt.WA_DeleteOnClose) 45 46 self.setFixedSize(800, 600) 47 self.table = QTableWidget(len(data), 5) 48 self.table.setHorizontalHeaderLabels(names) 49 temp = 0 50 for tempdata in data: 51 newItem = [] 52 [newItem.append(QTableWidgetItem('%.8e'%tempdata[x])) for x in range(0,5)] 53 newItem[3] = QTableWidgetItem('%d'%tempdata[3]) 54 temp1 = 0 55 for Item in newItem: 56 self.table.setItem(temp,temp1,Item) 57 temp1+=1 58 temp+=1 59 layout=QHBoxLayout() 60 layout.addWidget(self.table) 61 self.setLayout(layout) 62 63 class Figure_Canvas(FigureCanvas): 64 def __init__(self, parent=None, width=8, height=6, dpi=100): 65 fig = Figure(figsize=(width,height), dpi=100) 66 super(Figure_Canvas, self).__init__(fig) 67 self.setAttribute(Qt.WA_DeleteOnClose) 68 69 self.setParent(parent) 70 self.axes = fig.add_subplot(111) 71 72 def Plotdotline(self, x_point, y_data, fitcurve): 73 x_point = [float(x_point[x]) for x in range(0,len(x_point))] 74 y_data = [float(y_data[x]) for x in range(0,len(y_data))] 75 self.axes.plot(x_point,y_data,'bo') 76 y_fit = [] 77 if fitcurve != []: 78 for point in x_point: 79 y_fit.append(float(fitcurve[0])*point+float(fitcurve[1])) 80 self.axes.plot(x_point,y_fit,'r-') 81 82 class FigurePlot(QDialog): 83 def __init__(self, parent=None, x_data=[], y_data=[], fitcurve=[0,0], title=''): 84 super(FigurePlot, self).__init__(parent) 85 self.setAttribute(Qt.WA_DeleteOnClose) 86 87 self.graphicview = QGraphicsView() 88 dr = Figure_Canvas() 89 dr.Plotdotline(x_data, y_data, fitcurve) 90 graphicscene = QGraphicsScene() 91 graphicscene.addWidget(dr) 92 self.graphicview.setScene(graphicscene) 93 self.graphicview.setWindowTitle(title) 94 self.graphicview.show() 95 self.graphicview.setFixedSize(800,600) 96 97 class Form(QDialog): 98 def __init__(self, path="" , parent=None): 99 super(Form, self).__init__(parent) 100 self.setAttribute(Qt.WA_DeleteOnClose) 101 102 self.pathLabel = QLabel('Please Change File Path...') 103 self.path = datapath 104 self.pathbutton = QPushButton('Change Path') 105 106 fileLabel = QLabel("Choose A File:") 107 self.files = [] 108 self.filechoice = QComboBox() 109 110 self.datanames = [] 111 xcoordinateLabel = QLabel('Coordinate x:') 112 self.xcoordinate = QComboBox() 113 114 ycoordinateLabel = QLabel('Coordinate y:') 115 self.ycoordinate = QComboBox() 116 117 self.showdata = QPushButton("&Show") 118 119 spanLabel = QLabel('Platue Span:') 120 self.span = QSpinBox() 121 self.span.setRange(5,1000000) 122 self.span.setValue(20) 123 124 toleranceLabel = QLabel('Tolerance:') 125 self.tolerance = QDoubleSpinBox() 126 self.tolerance.setRange(0.00000001,0.1) 127 self.tolerance.setValue(0.0001) 128 self.tolerance.setDecimals(8) 129 130 platueminLable = QLabel('Min Platue:') 131 self.platuemin = QLineEdit('5/2') 132 self.platuemin.selectAll() 133 134 self.calcplatue = QPushButton('Platue') 135 136 self.fitting = QPushButton('Fit') 137 self.plotfitting = QPushButton('Plot') 138 self.clearfitting = QPushButton('Clear') 139 self.fittingresult = QTextBrowser() 140 141 layout = QGridLayout() 142 layout.addWidget(self.pathLabel, 0, 0, 1, 2) 143 layout.addWidget(self.pathbutton, 0, 2) 144 layout.addWidget(fileLabel, 1, 0) 145 layout.addWidget(self.filechoice, 2, 0, 1, 3) 146 layout.addWidget(xcoordinateLabel, 3, 0) 147 layout.addWidget(ycoordinateLabel, 3, 1) 148 layout.addWidget(self.xcoordinate, 4, 0) 149 layout.addWidget(self.ycoordinate, 4, 1) 150 layout.addWidget(self.showdata, 4, 2) 151 layout.addWidget(spanLabel, 5, 0) 152 layout.addWidget(toleranceLabel, 5, 1) 153 layout.addWidget(self.span, 6, 0) 154 layout.addWidget(self.tolerance, 6, 1) 155 layout.addWidget(self.calcplatue, 6, 2) 156 layout.addWidget(platueminLable, 7, 0) 157 layout.addWidget(self.platuemin, 7, 1, 1, 2) 158 159 fittinglayout = QVBoxLayout() 160 fittinglayout.addWidget(self.fittingresult) 161 162 layout.addWidget(self.fitting, 8, 0) 163 layout.addWidget(self.plotfitting, 8, 1) 164 layout.addWidget(self.clearfitting, 8, 2) 165 layout.addLayout(fittinglayout, 9, 0, 1, 3) 166 self.setLayout(layout) 167 self.setWindowTitle('Platue Fitting v1.0') 168 169 self.pathbutton.clicked.connect(self.changeFileDirectory) 170 171 self.filechoice.currentIndexChanged.connect(self.loadDataNames) 172 173 self.showdata.clicked.connect(self.showData) 174 175 self.calcplatue.clicked.connect(self.calcPlatue) 176 177 self.fitting.clicked.connect(self.Fit) 178 179 self.clearfitting.clicked.connect(self.Clear) 180 181 self.plotfitting.clicked.connect(self.Plot) 182 183 def changeFileDirectory(self): 184 try: 185 dialog = QFileDialog(self, 'Choose a path: ',self.path, '.') 186 dialog.setFileMode(QFileDialog.DirectoryOnly) 187 if dialog.exec() == QDialog.Accepted: 188 self.path = dialog.selectedFiles()[0] 189 self.pathLabel.setText("File Directory Imported") 190 self.files = coc.GetDataFiles(self.path) 191 self.filechoice.clear() 192 self.filechoice.addItems(self.files) 193 self.loadDataNames() 194 except Exception as e: 195 self.pathLabel.setText("File Directory Error: %s" %e) 196 197 def loadDataNames(self): 198 try: 199 self.xcoordinate.clear() 200 self.ycoordinate.clear() 201 self.datanames = coc.GetDataPosition(self.files[self.filechoice.currentIndex()])[2] 202 self.xcoordinate.addItems(self.datanames) 203 self.ycoordinate.addItems(self.datanames) 204 except Exception as e: 205 self.pathLabel.setText("Data Name Error: %s" %e) 206 207 def showData(self): 208 try: 209 dataset = coc.GetDataArray(self.files[self.filechoice.currentIndex()]) 210 x_data = dataset[self.datanames[self.xcoordinate.currentIndex()]].tolist() 211 y_data = dataset[self.datanames[self.ycoordinate.currentIndex()]].tolist() 212 names = [self.datanames[self.xcoordinate.currentIndex()],self.datanames[self.ycoordinate.currentIndex()]] 213 Table = DataTable(parent=self, names=names, x_data=x_data, y_data=y_data) 214 Table.show() 215 except Exception as e: 216 self.pathLabel.setText("Show Data Error: %s" %e) 217 218 def calcPlatue(self): 219 try: 220 dataset = coc.GetDataArray(self.files[self.filechoice.currentIndex()]) 221 x_data = dataset[self.datanames[self.xcoordinate.currentIndex()]].tolist() 222 y_data = dataset[self.datanames[self.ycoordinate.currentIndex()]].tolist() 223 names = (self.datanames[self.xcoordinate.currentIndex()],self.datanames[self.ycoordinate.currentIndex()], 'StdVariance','Span','Platue') 224 platuedata = coc.GetPlatue(x_data, y_data, self.span.value(), self.tolerance.value(), eval(self.platuemin.text())) 225 Table = PlatueTable(parent=self, names=names, data=platuedata) 226 Table.show() 227 except Exception as e: 228 self.pathLabel.setText("Platue Calc Error: %s" %e) 229 230 def Fit(self): 231 try: 232 dataset = coc.GetDataArray(self.files[self.filechoice.currentIndex()]) 233 x_data = dataset[self.datanames[self.xcoordinate.currentIndex()]].tolist() 234 y_data = dataset[self.datanames[self.ycoordinate.currentIndex()]].tolist() 235 rawfit = np.polyfit(x_data, y_data, 1) 236 rawfitstr = "%s * x + %s"%(rawfit[0],rawfit[1]) 237 self.fittingresult.append("Rawfitting:\n%s"%rawfitstr) 238 platuedata = coc.GetPlatue(x_data, y_data, self.span.value(), self.tolerance.value(), eval(self.platuemin.text())) 239 x_platue = [platuedata[x][1] for x in range(0,len(platuedata))] 240 y_platue = [platuedata[x][4] for x in range(0,len(platuedata))] 241 platuefit = np.polyfit(x_platue, y_platue, 1) 242 platuefitstr = "%s * x + %s"%(platuefit[0],platuefit[1]) 243 self.fittingresult.append("Platuefitting:\n%s"%platuefitstr) 244 except Exception as e: 245 self.fittingresult.append("Fitting Error: %s" %e) 246 247 def Clear(self): 248 self.fittingresult.clear() 249 250 def Plot(self): 251 try: 252 dataset = coc.GetDataArray(self.files[self.filechoice.currentIndex()]) 253 x_data = dataset[self.datanames[self.xcoordinate.currentIndex()]].tolist() 254 y_data = dataset[self.datanames[self.ycoordinate.currentIndex()]].tolist() 255 rawfit = np.polyfit(x_data, y_data, 1) 256 rawfitstr = "%s * x + %s"%(rawfit[0],rawfit[1]) 257 self.fittingresult.append("Rawfitting:\n%s"%rawfitstr) 258 fig1 = FigurePlot(self, x_data, y_data, rawfit, 'Raw Data Fitting') 259 platuedata = coc.GetPlatue(x_data, y_data, self.span.value(), self.tolerance.value(), eval(self.platuemin.text())) 260 x_platue = [platuedata[x][0] for x in range(0,len(platuedata))] 261 y_platue = [platuedata[x][1] for x in range(0,len(platuedata))] 262 platuefit = np.polyfit(x_platue, y_platue, 1) 263 platuefitstr = "%s * x + %s"%(platuefit[0],platuefit[1]) 264 self.fittingresult.append("Platuefitting:\n%s"%platuefitstr) 265 fig2 = FigurePlot(self, x_platue, y_platue, [], 'Platue Data') 266 except Exception as e: 267 self.fittingresult.append("Fitting Error: %s" %e) 268 269 app = QApplication(sys.argv) 270 form = Form() 271 form.show() 272 app.exec_()