diff --git a/Automation/Abstract_window.py b/Automation/Abstract_window.py index 7a034ef..901e43c 100644 --- a/Automation/Abstract_window.py +++ b/Automation/Abstract_window.py @@ -44,4 +44,4 @@ class AbstractWindow(QMainWindow): def about_click(self): print('About') - # TODO \ No newline at end of file + # TODO diff --git a/Automation/Analisis_data.py b/Automation/Analisis_data.py index c1f6b79..f54960c 100644 --- a/Automation/Analisis_data.py +++ b/Automation/Analisis_data.py @@ -10,17 +10,20 @@ import numpy as np import matplotlib.pyplot as plt from scipy.optimize import curve_fit + class Data: - def __init__(self, x=[], y=[], xlabel='', ylabel='', caption='', xerr=None, - yerr=None, through_0=0, data_filename='', color=None, + def __init__(self, x=[], y=[], xlabel='', ylabel='', caption='', xerr=None, + yerr=None, through_0=0, data_filename='', color=None, centering=None, size=15, coefficient=[0.9, 1.1], saving=None): self.x = x self.y = y self.xlabel = xlabel self.ylabel = ylabel self.caption = caption - self.xerr=xerr - self.yerr=yerr + self.cap_point = None + self.line_point = None + self.xerr = xerr + self.yerr = yerr self.make_errors(xerr, yerr) self.through_0 = through_0 if not color: @@ -30,49 +33,57 @@ class Data: self.centering = centering self.size = size self.coefficient = coefficient - self.data_filename=data_filename - self.saving=saving - + self.data_filename = data_filename + self.saving = saving + def make_errors(self, xerr=None, yerr=None): - if not xerr: xerr=self.xerr - if not yerr: yerr=self.yerr - if not xerr: xerr=0 - if not yerr: yerr=0 + if not xerr: + xerr = self.xerr + if not yerr: + yerr = self.yerr + if not xerr: + xerr = 0 + if not yerr: + yerr = 0 if not yerr or type(yerr) == float or type(yerr) == int: self.yerr = [yerr for _ in self.y] - else: + else: self.yerr = yerr if not xerr or type(xerr) == float or type(xerr) == int: self.xerr = [xerr for _ in self.x] - else: + else: self.xerr = xerr - + def read_csv(self): with open(self.data_filename) as file: reader = list(csv.reader(file)) data = np.array(reader) - dic=[] + dic = [] for i in range(len(data[0])): micro_data = [] for j in range(len(data)): micro_data.append(data[j][i]) dic.append(micro_data) - data=dic + data = dic dic = {} for i in range(len(data)): dic[data[i][0]] = np.array(data[i][1:]).astype(np.float) data = dic - self.data=data + self.data = data def make_point_grafic(self): self.make_errors() + if self.cap_point: + cap = self.cap_point + else: + cap = self.caption if self.xerr[1] != 0 or self.yerr[1] != 0: plt.errorbar(self.x, self.y, yerr=self.yerr, xerr=self.xerr, linewidth=4, - linestyle='', label=self.caption, color=self.color[0], + linestyle='', label=cap, color=self.color[0], ecolor=self.color[0], elinewidth=1, capsize=3.4, capthick=1.4) else: - plt.scatter(self.x, self.y, linewidth=0.005, label=self.caption, + plt.scatter(self.x, self.y, linewidth=0.005, label=cap, color=self.color[0], edgecolor='black', s=self.size) if not self.centering: @@ -98,20 +109,26 @@ class Data: xmax = max(self.x)*self.coefficient[1] else: xmax = max(self.x)*self.coefficient[0] + + if self.line_point: + cap = self.line_point + else: + cap = self.caption x = np.arange(xmin, xmax, (xmax-xmin)/10000) - plt.plot(x, k*x+b, label=self.caption, linewidth=2.4, + plt.plot(x, k*x+b, label=cap, linewidth=2.4, linestyle='-', color=self.color[1]) - def make_grafic(self, named_by_points=True): + def make_grafic(self, named_by_points=True): + plt.figure(dpi=500, figsize=(8, 5)) self.make_errors() if named_by_points: - cap_point = self.caption - line_point = None + self.cap_point = self.caption + self.line_point = None else: - line_point = self.caption - cap_point = None + self.line_point = self.caption + self.cap_point = None self.make_point_grafic() - + k, b, sigma = self.approx() sigma[0] = abs(k*((sigma[0]/k)**2+(np.mean(self.yerr)/np.mean(self.y))**2 + (np.mean(self.xerr)/np.mean(self.x))**2)**0.5) diff --git a/Automation/Main.py b/Automation/Main.py index abd2e01..c046f3c 100644 --- a/Automation/Main.py +++ b/Automation/Main.py @@ -2,38 +2,19 @@ import os import sys import csv import time -from PyQt6 import QtCore -from PyQt6.QtGui import QAction, QIcon, QPixmap -from PyQt6.QtWidgets import (QHBoxLayout, - QApplication, - QCheckBox, - QComboBox, - QDateEdit, - QDateTimeEdit, - QDial, - QDoubleSpinBox, - QFontComboBox, - QLabel, - QLCDNumber, +from PyQt6.QtGui import QIcon +from PyQt6.QtWidgets import (QApplication, QLineEdit, - QMainWindow, - QProgressBar, QPushButton, - QRadioButton, - QSlider, - QSpinBox, - QTimeEdit, - QVBoxLayout, QWidget, QTableWidget, QGridLayout, - QMenu, QTableWidgetItem, QHeaderView, - QTextBrowser, ) from Abstract_window import AbstractWindow -from Main_experiment_window import * +from Main_experiment_window import (MainExperimentDataWindow, + MainExperimentChartWindow) class Start: @@ -82,7 +63,7 @@ class StartWindow(AbstractWindow): self.lineEdit = QLineEdit(placeholderText='Введите фамилию') self.lineEdit.returnPressed.connect(self.enter_name) - self.flow = QPushButton('измерение потока') + self.flow = QPushButton('градуировка электромагнита') self.flow.clicked.connect(self.flow_click) self.flow.setEnabled(False) self.main = QPushButton('основной эксперимент') @@ -118,35 +99,41 @@ class StartWindow(AbstractWindow): class FlowWindow(AbstractWindow): def __init__(self, parent): super().__init__() + + self.setWindowTitle('Градуировка электромагнита') self.parent = parent - self.parent = parent + + # make csv file + self.parent.flow_dataname = 'Induction_data.csv' + head_1 = 'B,mTl' + head_2 = 'U,mV' + head_3 = 't,ms' + with open(os.path.join(self.parent.folder, self.parent.flow_dataname), 'w') as file: + wr = csv.writer(file) + wr.writerow([head_1, head_2, head_3]) + self.centralwidget = QWidget() self.resize(1400, 800) self.setCentralWidget(self.centralwidget) - grid_layout = QGridLayout(self.centralwidget) + self.grid_layout = QGridLayout(self.centralwidget) self.start = QPushButton('Старт') self.start.clicked.connect(self.start_clicked) self.start.setEnabled(True) + + self.next = QPushButton(self) + self.next.setIcon(QIcon('arrow.png')) + self.next.setEnabled(False) + self.next.clicked.connect(self.next_clicked) self.lineEdit = QLineEdit(placeholderText='Индукция B, мТл') self.lineEdit.returnPressed.connect(self.enter_value) self.lineEdit.setReadOnly(True) - self.parent.flow_dataname = 'Induction_data.csv' - head_1 = 'B,mTl' - head_2 = 'U,mV' - head_3 = 't,s' - with open(os.path.join(self.parent.folder, self.parent.flow_dataname), 'w') as file: - wr = csv.writer(file) - wr.writerow([head_1, head_2, head_3]) - self.table = QTableWidget(self) # Create a self.table self.table.setColumnCount(3) # Set three columns self.table.setRowCount(0) - self.table.setHorizontalHeaderLabels([head_1, head_2, head_3]) - header = self.table.horizontalHeader() header.setSectionResizeMode(0, QHeaderView.ResizeMode.Stretch) header.setSectionResizeMode(1, QHeaderView.ResizeMode.Stretch) @@ -156,21 +143,14 @@ class FlowWindow(AbstractWindow): self.table.setItem(0, 2, QTableWidgetItem("Text in column 3")) self.table.resizeColumnsToContents() - self.next = QPushButton(self) - self.next.setIcon(QIcon('arrow.png')) - self.next.setEnabled(False) - self.next.clicked.connect(self.next_clicked) - - grid_layout.addWidget(self.start, 0, 0) - grid_layout.addWidget(self.lineEdit, 1, 0) - grid_layout.addWidget(self.table, 1, 3) - grid_layout.addWidget(self.next, 2, 0) - - + self.grid_layout.addWidget(self.start, 0, 0) + self.grid_layout.addWidget(self.lineEdit, 1, 0) + self.grid_layout.addWidget(self.table, 1, 3) + self.grid_layout.addWidget(self.next, 2, 0) + def next_clicked(self): self.parent.number = 20 self.parent.change_number() - def start_clicked(self): self.start.setEnabled(False) diff --git a/Automation/Main_experiment_window.py b/Automation/Main_experiment_window.py index ae2a150..bb63cca 100644 --- a/Automation/Main_experiment_window.py +++ b/Automation/Main_experiment_window.py @@ -10,37 +10,19 @@ import csv import time from PyQt6 import QtCore from PyQt6.QtGui import QIcon, QPixmap -from PyQt6.QtWidgets import (QHBoxLayout, - QApplication, - QCheckBox, - QComboBox, - QDateEdit, - QDateTimeEdit, - QDial, - QDoubleSpinBox, - QFontComboBox, - QLabel, - QLCDNumber, +from PyQt6.QtWidgets import (QLabel, QLineEdit, - QMainWindow, - QProgressBar, QPushButton, - QRadioButton, - QSlider, - QSpinBox, - QTimeEdit, - QVBoxLayout, QWidget, QTableWidget, QGridLayout, - QMenu, QTableWidgetItem, QHeaderView, - QTextBrowser, - ) + QTextBrowser) from Analisis_data import Data from Abstract_window import AbstractWindow + class ThreadData(QtCore.QThread): signal = QtCore.pyqtSignal(str) @@ -58,11 +40,9 @@ class ThreadData(QtCore.QThread): class MainExperimentDataWindow(AbstractWindow): def __init__(self, parent): - # TODO : clean code super().__init__() self.setWindowTitle('Основной эксперимент. Получение данных') - self.start_time = round(time.time()*1000) self.parent = parent self.data_thread = ThreadData(self) self.resize(1400, 800) @@ -71,13 +51,14 @@ class MainExperimentDataWindow(AbstractWindow): self.parent.dataname = 'data.csv' head_1 = 'I_0,mA' head_2 = 'U_34,mV' - head_3 = 't,s' + head_3 = 't,ms' with open(os.path.join(self.parent.folder, self.parent.dataname), 'w') as file: wr = csv.writer(file) wr.writerow([head_1, head_2, head_3]) self.centralwidget = QWidget() self.setCentralWidget(self.centralwidget) + self.grid_layout = QGridLayout(self.centralwidget) self.start = QPushButton('Старт') self.start.clicked.connect(self.start_clicked) @@ -92,34 +73,26 @@ class MainExperimentDataWindow(AbstractWindow): self.next.setEnabled(False) self.next.clicked.connect(self.next_clicked) - grid_layout = QGridLayout(self.centralwidget) + self.lineEdit = QLineEdit(placeholderText='Введите что-то') + self.lineEdit.returnPressed.connect(self.enter_smth) - self.table = QTableWidget(self) # Create a self.table - self.table.setColumnCount(3) # Set three columns + # make table + self.table = QTableWidget(self) + self.table.setColumnCount(3) self.table.setRowCount(0) - self.table.setHorizontalHeaderLabels([head_1, head_2, head_3]) - header = self.table.horizontalHeader() header.setSectionResizeMode(0, QHeaderView.ResizeMode.Stretch) header.setSectionResizeMode(1, QHeaderView.ResizeMode.Stretch) header.setSectionResizeMode(2, QHeaderView.ResizeMode.Stretch) - self.table.setItem(0, 0, QTableWidgetItem("Text in column 1")) - self.table.setItem(0, 1, QTableWidgetItem("Text in column 2")) - self.table.setItem(0, 2, QTableWidgetItem("Text in column 3")) self.table.resizeColumnsToContents() - self.lineEdit = QLineEdit(placeholderText='Введите что-то') - self.lineEdit.returnPressed.connect(self.enter_smth) - # Adding the table to the grid - grid_layout.addWidget(self.table, 0, 0, -1, 1) - grid_layout.addWidget(self.lineEdit, 0, 2, -1, -1) - grid_layout.addWidget(self.next, 2, 2, -1, -1) - grid_layout.addWidget(self.start, 1, 2) - grid_layout.addWidget(self.stop, 1, 3) - - self.parent.draw() + self.grid_layout.addWidget(self.table, 0, 0, -1, 1) + self.grid_layout.addWidget(self.lineEdit, 0, 2, -1, -1) + self.grid_layout.addWidget(self.next, 2, 2, -1, -1) + self.grid_layout.addWidget(self.start, 1, 2) + self.grid_layout.addWidget(self.stop, 1, 3) def enter_smth(self): # TODO @@ -134,19 +107,6 @@ class MainExperimentDataWindow(AbstractWindow): if not self.data_thread.isRunning(): self.data_thread.start() - def no_data(self): - current_time = round(time.time()*1000) - v = str((current_time-self.start_time)/60) - a = v - t = str(current_time-self.start_time) - with open(os.path.join(self.parent.folder, self.parent.dataname), 'a') as file: - wr = csv.writer(file) - wr.writerow([v, a, str(current_time-self.start_time)]) - self.table.insertRow(self.table.rowCount()) - self.table.setItem(self.table.rowCount()-1, 0, QTableWidgetItem(v)) - self.table.setItem(self.table.rowCount()-1, 1, QTableWidgetItem(a)) - self.table.setItem(self.table.rowCount()-1, 2, QTableWidgetItem(t)) - def stop_clicked(self): self.data_thread.running = False self.stop.setEnabled(False) @@ -156,6 +116,22 @@ class MainExperimentDataWindow(AbstractWindow): self.parent.number = 21 self.parent.change_number() + def no_data(self): + current_time = round(time.time()*1000) + v = str((current_time-self.start_time)/60) + a = v + t = str(current_time-self.start_time) + self.save_data(v, a, t) + + def save_data(self, v, a, t): + with open(os.path.join(self.parent.folder, self.parent.dataname), 'a') as file: + wr = csv.writer(file) + wr.writerow([v, a, t]) + self.table.insertRow(self.table.rowCount()) + self.table.setItem(self.table.rowCount()-1, 0, QTableWidgetItem(v)) + self.table.setItem(self.table.rowCount()-1, 1, QTableWidgetItem(a)) + self.table.setItem(self.table.rowCount()-1, 2, QTableWidgetItem(t)) + def take_data(self): # measure voltage and current volt_name = os.path.join('/dev', 'usbtmc1') @@ -173,31 +149,34 @@ class MainExperimentDataWindow(AbstractWindow): a = f_amp.read(15) f_volt.close() f_amp.close() + current_time = round(time.time()*1000) - with open(os.path.join(self.parent.folder, self.parent.dataname), 'a') as file: - wr = csv.writer(file) - wr.writerow([v, a, str(current_time-self.start_time)]) + t = str(current_time-self.start_time) + self.save_data(v, a, t) + class MainExperimentChartWindow(AbstractWindow): def __init__(self, parent): super().__init__() + self.setWindowTitle('Основной эксперимент. Обработка данных') self.parent = parent self.parent.chartname = 'Chart' - self.parent.data = Data(data_filename=os.path.join(self.parent.folder, self.parent.dataname), + self.parent.data = Data(data_filename=os.path.join(self.parent.folder, self.parent.dataname), saving=os.path.join(self.parent.folder, self.parent.chartname)) self.parent.data.read_csv() - self.parent.data.x=self.parent.data.data['I_0,mA'] - self.parent.data.y=self.parent.data.data['U_34,mV'] + self.parent.data.x = self.parent.data.data['I_0,mA'] + self.parent.data.y = self.parent.data.data['U_34,mV'] self.parent.data.make_grafic() - + self.setWindowTitle('Основной эксперимент. Обработка данных') self.resize(1400, 800) self.centralwidget = QWidget() self.setCentralWidget(self.centralwidget) - pixmap = QPixmap(os.path.join(self.parent.folder, self.parent.chartname)) + pixmap = QPixmap(os.path.join( + self.parent.folder, self.parent.chartname)) self.label = QLabel(self) self.label.setPixmap(pixmap) self.label.resize(pixmap.width(), pixmap.height()) @@ -208,4 +187,3 @@ class MainExperimentChartWindow(AbstractWindow): self.hbox_layout = QGridLayout(self.centralwidget) self.hbox_layout.addWidget(self.label, 0, 0) self.hbox_layout.addWidget(self.text, 0, 1) - diff --git a/Automation/__pycache__/Abstract_window.cpython-39.pyc b/Automation/__pycache__/Abstract_window.cpython-39.pyc index f2060b3..ae91601 100644 Binary files a/Automation/__pycache__/Abstract_window.cpython-39.pyc and b/Automation/__pycache__/Abstract_window.cpython-39.pyc differ diff --git a/Automation/__pycache__/Analisis_data.cpython-39.pyc b/Automation/__pycache__/Analisis_data.cpython-39.pyc index bfae543..5c8f757 100644 Binary files a/Automation/__pycache__/Analisis_data.cpython-39.pyc and b/Automation/__pycache__/Analisis_data.cpython-39.pyc differ diff --git a/Automation/__pycache__/Main_experiment_window.cpython-39.pyc b/Automation/__pycache__/Main_experiment_window.cpython-39.pyc index d8944de..dee3633 100644 Binary files a/Automation/__pycache__/Main_experiment_window.cpython-39.pyc and b/Automation/__pycache__/Main_experiment_window.cpython-39.pyc differ diff --git a/Automation/j/Chart.png b/Automation/j/Chart.png index 1e52bf3..a6d3d93 100644 Binary files a/Automation/j/Chart.png and b/Automation/j/Chart.png differ diff --git a/Automation/j/Induction_data.csv b/Automation/j/Induction_data.csv index 6bb7a9f..6c63d70 100644 --- a/Automation/j/Induction_data.csv +++ b/Automation/j/Induction_data.csv @@ -1 +1,11 @@ -"B,mTl","U,mV","t,s" +"B,mTl","U,mV","t,ms" +80,45.18333333333333,2711 +90,70.75,4245 +90,85.66666666666667,5140 +90,99.33333333333333,5960 +90,111.96666666666667,6718 +90,124.51666666666667,7471 +90,136.53333333333333,8192 +90,148.96666666666667,8938 +90,164.7,9882 +90,177.73333333333332,10664 diff --git a/Automation/j/data.csv b/Automation/j/data.csv index 990d77a..a995eb2 100644 --- a/Automation/j/data.csv +++ b/Automation/j/data.csv @@ -1,2 +1,2 @@ -"I_0,mA","U_34,mV","t,s" -0.016666666666666666,0.016666666666666666,1 +"I_0,mA","U_34,mV","t,ms" +0.0,0.0,0