import multiprocessing
import sys
from pathlib import Path
from importlib.metadata import PackageNotFoundError, version
from PyQt6 import QtCore, QtGui, QtWidgets
from PyQt6.QtCore import Qt
# Local module and scripts
from pyccapt.control.core import device_checks, runtime
from pyccapt.control.devices import camera as camera_device
from pyccapt.control.gui import main_parameters, process_coordinator
from pyccapt.control.gui import (
gui_baking,
gui_gates,
gui_laser_control,
gui_pumps_vacuum,
gui_stage_control,
)
[docs]
class Ui_PyCCAPT(object):
def __init__(self, variables, conf, x_plot, y_plot, t_plot, main_v_dc_plot):
"""
Constructor for the PyCCAPT UI class.
Args:
variables (object): Global experiment variables.
conf (dict): Configuration settings.
parent: Parent widget (optional).
Returns:
None
"""
self.conf = conf
self.variables = variables
self.emitter = SignalEmitter()
self.flag_super_user = False
self.vdc_hold_old = False
self.x_plot = x_plot
self.y_plot = y_plot
self.t_plot = t_plot
self.main_v_dc_plot = main_v_dc_plot
self.experiment_running = False
self.experimetn_finished_event = multiprocessing.Event()
self.camera_closed_event = multiprocessing.Event()
self.visualization_closed_event = multiprocessing.Event()
self.camera_win_front = multiprocessing.Event()
self.visualization_win_front = multiprocessing.Event()
self.process_coordinator = process_coordinator.ProcessCoordinator()
self.camera_process = None
self.camera_available = False
self.camera_status_message = ""
[docs]
def setupUi(self, PyCCAPT):
PyCCAPT.setObjectName("PyCCAPT")
PyCCAPT.resize(901, 800)
self.centralwidget = QtWidgets.QWidget(parent=PyCCAPT)
self.centralwidget.setObjectName("centralwidget")
self.gridLayout_7 = QtWidgets.QGridLayout(self.centralwidget)
self.gridLayout_7.setObjectName("gridLayout_7")
self.gridLayout_6 = QtWidgets.QGridLayout()
self.gridLayout_6.setObjectName("gridLayout_6")
self.horizontalLayout = QtWidgets.QHBoxLayout()
self.horizontalLayout.setObjectName("horizontalLayout")
self.gates_control = QtWidgets.QPushButton(parent=self.centralwidget)
self.gates_control.setMinimumSize(QtCore.QSize(0, 40))
self.gates_control.setStyleSheet("QPushButton{\n"
" background: rgb(85, 170, 255)\n"
" }\n"
" ")
self.gates_control.setObjectName("gates_control")
self.horizontalLayout.addWidget(self.gates_control)
self.pumps_vaccum = QtWidgets.QPushButton(parent=self.centralwidget)
self.pumps_vaccum.setMinimumSize(QtCore.QSize(0, 40))
self.pumps_vaccum.setStyleSheet("QPushButton{\n"
" background: rgb(85, 170, 255)\n"
" }\n"
" ")
self.pumps_vaccum.setObjectName("pumps_vaccum")
self.horizontalLayout.addWidget(self.pumps_vaccum)
self.camears = QtWidgets.QPushButton(parent=self.centralwidget)
self.camears.setMinimumSize(QtCore.QSize(0, 40))
self.camears.setStyleSheet("QPushButton{\n"
" background: rgb(85, 170, 255)\n"
" }\n"
" ")
self.camears.setObjectName("camears")
self.horizontalLayout.addWidget(self.camears)
self.laser_control = QtWidgets.QPushButton(parent=self.centralwidget)
self.laser_control.setMinimumSize(QtCore.QSize(0, 40))
self.laser_control.setSizeIncrement(QtCore.QSize(0, 0))
self.laser_control.setStyleSheet("QPushButton{\n"
" background: rgb(85, 170, 255)\n"
" }\n"
" ")
self.laser_control.setObjectName("laser_control")
self.horizontalLayout.addWidget(self.laser_control)
self.stage_control = QtWidgets.QPushButton(parent=self.centralwidget)
self.stage_control.setMinimumSize(QtCore.QSize(0, 40))
self.stage_control.setSizeIncrement(QtCore.QSize(0, 0))
self.stage_control.setStyleSheet("QPushButton{\n"
" background: rgb(85, 170, 255)\n"
" }\n"
" ")
self.stage_control.setObjectName("stage_control")
self.horizontalLayout.addWidget(self.stage_control)
self.visualization = QtWidgets.QPushButton(parent=self.centralwidget)
self.visualization.setMinimumSize(QtCore.QSize(0, 40))
self.visualization.setSizeIncrement(QtCore.QSize(0, 0))
self.visualization.setStyleSheet("QPushButton{\n"
" background: rgb(85, 170, 255)\n"
" }\n"
" ")
self.visualization.setObjectName("visualization")
self.horizontalLayout.addWidget(self.visualization)
self.baking = QtWidgets.QPushButton(parent=self.centralwidget)
self.baking.setMinimumSize(QtCore.QSize(0, 40))
self.baking.setSizeIncrement(QtCore.QSize(0, 0))
self.baking.setStyleSheet("QPushButton{\n"
" background: rgb(85, 170, 255)\n"
" }\n"
" ")
self.baking.setObjectName("baking")
self.horizontalLayout.addWidget(self.baking)
self.gridLayout_6.addLayout(self.horizontalLayout, 0, 0, 1, 2)
self.verticalLayout = QtWidgets.QVBoxLayout()
self.verticalLayout.setObjectName("verticalLayout")
self.gridLayout_4 = QtWidgets.QGridLayout()
self.gridLayout_4.setObjectName("gridLayout_4")
self.label_173 = QtWidgets.QLabel(parent=self.centralwidget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Minimum)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.label_173.sizePolicy().hasHeightForWidth())
self.label_173.setSizePolicy(sizePolicy)
font = QtGui.QFont()
font.setBold(True)
self.label_173.setFont(font)
self.label_173.setObjectName("label_173")
self.gridLayout_4.addWidget(self.label_173, 0, 0, 1, 1)
self.parameters_source = QtWidgets.QComboBox(parent=self.centralwidget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Minimum)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.parameters_source.sizePolicy().hasHeightForWidth())
self.parameters_source.setSizePolicy(sizePolicy)
self.parameters_source.setMinimumSize(QtCore.QSize(0, 20))
self.parameters_source.setStyleSheet("QComboBox{\n"
" background: rgb(223,223,233)\n"
" }\n"
" ")
self.parameters_source.setObjectName("parameters_source")
self.parameters_source.addItem("")
self.parameters_source.addItem("")
self.gridLayout_4.addWidget(self.parameters_source, 0, 1, 1, 1)
self.label_183 = QtWidgets.QLabel(parent=self.centralwidget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Minimum)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.label_183.sizePolicy().hasHeightForWidth())
self.label_183.setSizePolicy(sizePolicy)
self.label_183.setObjectName("label_183")
self.gridLayout_4.addWidget(self.label_183, 1, 0, 1, 1)
self.ex_number = QtWidgets.QLineEdit(parent=self.centralwidget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Minimum)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.ex_number.sizePolicy().hasHeightForWidth())
self.ex_number.setSizePolicy(sizePolicy)
self.ex_number.setMinimumSize(QtCore.QSize(0, 20))
self.ex_number.setStyleSheet("QLineEdit{\n"
" background: rgb(223,223,233)\n"
" }\n"
" ")
self.ex_number.setObjectName("ex_number")
self.gridLayout_4.addWidget(self.ex_number, 1, 1, 1, 1)
self.label_174 = QtWidgets.QLabel(parent=self.centralwidget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Minimum)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.label_174.sizePolicy().hasHeightForWidth())
self.label_174.setSizePolicy(sizePolicy)
self.label_174.setObjectName("label_174")
self.gridLayout_4.addWidget(self.label_174, 2, 0, 1, 1)
self.ex_user = QtWidgets.QLineEdit(parent=self.centralwidget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Minimum)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.ex_user.sizePolicy().hasHeightForWidth())
self.ex_user.setSizePolicy(sizePolicy)
self.ex_user.setMinimumSize(QtCore.QSize(0, 20))
self.ex_user.setStyleSheet("QLineEdit{\n"
" background: rgb(223,223,233)\n"
" }\n"
" ")
self.ex_user.setObjectName("ex_user")
self.gridLayout_4.addWidget(self.ex_user, 2, 1, 1, 1)
self.label_175 = QtWidgets.QLabel(parent=self.centralwidget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Minimum)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.label_175.sizePolicy().hasHeightForWidth())
self.label_175.setSizePolicy(sizePolicy)
self.label_175.setObjectName("label_175")
self.gridLayout_4.addWidget(self.label_175, 3, 0, 1, 1)
self.ex_name = QtWidgets.QLineEdit(parent=self.centralwidget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Minimum)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.ex_name.sizePolicy().hasHeightForWidth())
self.ex_name.setSizePolicy(sizePolicy)
self.ex_name.setMinimumSize(QtCore.QSize(0, 20))
self.ex_name.setMaximumSize(QtCore.QSize(16777215, 100))
self.ex_name.setStyleSheet("QLineEdit{\n"
" background: rgb(223,223,233)\n"
" }\n"
" ")
self.ex_name.setObjectName("ex_name")
self.gridLayout_4.addWidget(self.ex_name, 3, 1, 1, 1)
self.label_190 = QtWidgets.QLabel(parent=self.centralwidget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Minimum)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.label_190.sizePolicy().hasHeightForWidth())
self.label_190.setSizePolicy(sizePolicy)
self.label_190.setObjectName("label_190")
self.gridLayout_4.addWidget(self.label_190, 4, 0, 1, 1)
self.email = QtWidgets.QLineEdit(parent=self.centralwidget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Minimum)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.email.sizePolicy().hasHeightForWidth())
self.email.setSizePolicy(sizePolicy)
self.email.setMinimumSize(QtCore.QSize(0, 20))
self.email.setStyleSheet("QLineEdit{\n"
" background: rgb(223,223,233)\n"
" }\n"
" ")
self.email.setText("")
self.email.setObjectName("email")
self.gridLayout_4.addWidget(self.email, 4, 1, 1, 1)
self.label_200 = QtWidgets.QLabel(parent=self.centralwidget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Minimum)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.label_200.sizePolicy().hasHeightForWidth())
self.label_200.setSizePolicy(sizePolicy)
self.label_200.setObjectName("label_200")
self.gridLayout_4.addWidget(self.label_200, 5, 0, 1, 1)
self.electrode = QtWidgets.QComboBox(parent=self.centralwidget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Minimum)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.electrode.sizePolicy().hasHeightForWidth())
self.electrode.setSizePolicy(sizePolicy)
self.electrode.setMinimumSize(QtCore.QSize(0, 20))
self.electrode.setStyleSheet("QComboBox{\n"
" background: rgb(223,223,233)\n"
" }\n"
" ")
self.electrode.setObjectName("electrode")
self.electrode.addItem("")
self.electrode.setItemText(0, "")
self.electrode.addItem("")
self.electrode.setItemText(1, "")
self.gridLayout_4.addWidget(self.electrode, 5, 1, 1, 1)
self.verticalLayout.addLayout(self.gridLayout_4)
self.line = QtWidgets.QFrame(parent=self.centralwidget)
self.line.setFrameShape(QtWidgets.QFrame.Shape.HLine)
self.line.setFrameShadow(QtWidgets.QFrame.Shadow.Sunken)
self.line.setObjectName("line")
self.verticalLayout.addWidget(self.line)
self.gridLayout_3 = QtWidgets.QGridLayout()
self.gridLayout_3.setObjectName("gridLayout_3")
self.label = QtWidgets.QLabel(parent=self.centralwidget)
self.label.setObjectName("label")
self.gridLayout_3.addWidget(self.label, 0, 1, 1, 1)
self.max_ions = QtWidgets.QLineEdit(parent=self.centralwidget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Minimum)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.max_ions.sizePolicy().hasHeightForWidth())
self.max_ions.setSizePolicy(sizePolicy)
self.max_ions.setMinimumSize(QtCore.QSize(0, 20))
self.max_ions.setStyleSheet("QLineEdit{\n"
" background: rgb(223,223,233)\n"
" }\n"
" ")
self.max_ions.setObjectName("max_ions")
self.gridLayout_3.addWidget(self.max_ions, 1, 3, 1, 1)
self.criteria_ions = QtWidgets.QCheckBox(parent=self.centralwidget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Minimum)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.criteria_ions.sizePolicy().hasHeightForWidth())
self.criteria_ions.setSizePolicy(sizePolicy)
font = QtGui.QFont()
font.setItalic(False)
self.criteria_ions.setFont(font)
self.criteria_ions.setMouseTracking(True)
self.criteria_ions.setStyleSheet("")
self.criteria_ions.setText("")
self.criteria_ions.setChecked(True)
self.criteria_ions.setObjectName("criteria_ions")
self.gridLayout_3.addWidget(self.criteria_ions, 1, 2, 1, 1)
self.label_2 = QtWidgets.QLabel(parent=self.centralwidget)
self.label_2.setObjectName("label_2")
self.gridLayout_3.addWidget(self.label_2, 1, 1, 1, 1)
self.label_3 = QtWidgets.QLabel(parent=self.centralwidget)
self.label_3.setObjectName("label_3")
self.gridLayout_3.addWidget(self.label_3, 2, 1, 1, 1)
self.label_176 = QtWidgets.QLabel(parent=self.centralwidget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Minimum)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.label_176.sizePolicy().hasHeightForWidth())
self.label_176.setSizePolicy(sizePolicy)
self.label_176.setObjectName("label_176")
self.gridLayout_3.addWidget(self.label_176, 0, 0, 1, 1)
self.set_min_voltage = QtWidgets.QPushButton(parent=self.centralwidget)
self.set_min_voltage.setMinimumSize(QtCore.QSize(0, 20))
self.set_min_voltage.setObjectName("set_min_voltage")
self.gridLayout_3.addWidget(self.set_min_voltage, 3, 1, 1, 2)
self.ex_time = QtWidgets.QLineEdit(parent=self.centralwidget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Minimum)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.ex_time.sizePolicy().hasHeightForWidth())
self.ex_time.setSizePolicy(sizePolicy)
self.ex_time.setMinimumSize(QtCore.QSize(0, 20))
self.ex_time.setStyleSheet("QLineEdit{\n"
" background: rgb(223,223,233)\n"
" }\n"
" ")
self.ex_time.setObjectName("ex_time")
self.gridLayout_3.addWidget(self.ex_time, 0, 3, 1, 1)
self.label_179 = QtWidgets.QLabel(parent=self.centralwidget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Minimum)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.label_179.sizePolicy().hasHeightForWidth())
self.label_179.setSizePolicy(sizePolicy)
self.label_179.setObjectName("label_179")
self.gridLayout_3.addWidget(self.label_179, 3, 0, 1, 1)
self.vdc_max = QtWidgets.QLineEdit(parent=self.centralwidget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Minimum)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.vdc_max.sizePolicy().hasHeightForWidth())
self.vdc_max.setSizePolicy(sizePolicy)
self.vdc_max.setMinimumSize(QtCore.QSize(0, 20))
self.vdc_max.setStyleSheet("QLineEdit{\n"
" background: rgb(223,223,233)\n"
" }\n"
" ")
self.vdc_max.setObjectName("vdc_max")
self.gridLayout_3.addWidget(self.vdc_max, 2, 3, 1, 1)
self.label_180 = QtWidgets.QLabel(parent=self.centralwidget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Minimum)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.label_180.sizePolicy().hasHeightForWidth())
self.label_180.setSizePolicy(sizePolicy)
self.label_180.setObjectName("label_180")
self.gridLayout_3.addWidget(self.label_180, 2, 0, 1, 1)
self.criteria_time = QtWidgets.QCheckBox(parent=self.centralwidget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Minimum)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.criteria_time.sizePolicy().hasHeightForWidth())
self.criteria_time.setSizePolicy(sizePolicy)
font = QtGui.QFont()
font.setItalic(False)
self.criteria_time.setFont(font)
self.criteria_time.setMouseTracking(True)
self.criteria_time.setStyleSheet("")
self.criteria_time.setText("")
self.criteria_time.setChecked(True)
self.criteria_time.setObjectName("criteria_time")
self.gridLayout_3.addWidget(self.criteria_time, 0, 2, 1, 1)
self.label_177 = QtWidgets.QLabel(parent=self.centralwidget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Minimum)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.label_177.sizePolicy().hasHeightForWidth())
self.label_177.setSizePolicy(sizePolicy)
self.label_177.setObjectName("label_177")
self.gridLayout_3.addWidget(self.label_177, 1, 0, 1, 1)
self.criteria_vdc = QtWidgets.QCheckBox(parent=self.centralwidget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Minimum)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.criteria_vdc.sizePolicy().hasHeightForWidth())
self.criteria_vdc.setSizePolicy(sizePolicy)
font = QtGui.QFont()
font.setItalic(False)
self.criteria_vdc.setFont(font)
self.criteria_vdc.setMouseTracking(True)
self.criteria_vdc.setStyleSheet("")
self.criteria_vdc.setText("")
self.criteria_vdc.setChecked(True)
self.criteria_vdc.setObjectName("criteria_vdc")
self.gridLayout_3.addWidget(self.criteria_vdc, 2, 2, 1, 1)
self.vdc_min = QtWidgets.QLineEdit(parent=self.centralwidget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Minimum)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.vdc_min.sizePolicy().hasHeightForWidth())
self.vdc_min.setSizePolicy(sizePolicy)
self.vdc_min.setMinimumSize(QtCore.QSize(0, 20))
self.vdc_min.setStyleSheet("QLineEdit{\n"
" background: rgb(223,223,233)\n"
" }\n"
" ")
self.vdc_min.setObjectName("vdc_min")
self.gridLayout_3.addWidget(self.vdc_min, 3, 3, 1, 1)
self.verticalLayout.addLayout(self.gridLayout_3)
self.line_2 = QtWidgets.QFrame(parent=self.centralwidget)
self.line_2.setFrameShape(QtWidgets.QFrame.Shape.HLine)
self.line_2.setFrameShadow(QtWidgets.QFrame.Shadow.Sunken)
self.line_2.setObjectName("line_2")
self.verticalLayout.addWidget(self.line_2)
self.gridLayout_2 = QtWidgets.QGridLayout()
self.gridLayout_2.setObjectName("gridLayout_2")
self.label_199 = QtWidgets.QLabel(parent=self.centralwidget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Minimum)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.label_199.sizePolicy().hasHeightForWidth())
self.label_199.setSizePolicy(sizePolicy)
self.label_199.setObjectName("label_199")
self.gridLayout_2.addWidget(self.label_199, 0, 0, 1, 1)
self.pulse_mode = QtWidgets.QComboBox(parent=self.centralwidget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Minimum)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.pulse_mode.sizePolicy().hasHeightForWidth())
self.pulse_mode.setSizePolicy(sizePolicy)
self.pulse_mode.setMinimumSize(QtCore.QSize(0, 20))
self.pulse_mode.setStyleSheet("QComboBox{\n"
" background: rgb(223,223,233)\n"
" }\n"
" ")
self.pulse_mode.setObjectName("pulse_mode")
self.pulse_mode.addItem("")
self.pulse_mode.addItem("")
self.pulse_mode.addItem("")
self.gridLayout_2.addWidget(self.pulse_mode, 0, 1, 1, 1)
self.label_186 = QtWidgets.QLabel(parent=self.centralwidget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Minimum)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.label_186.sizePolicy().hasHeightForWidth())
self.label_186.setSizePolicy(sizePolicy)
self.label_186.setObjectName("label_186")
self.gridLayout_2.addWidget(self.label_186, 1, 0, 1, 1)
self.pulse_fraction = QtWidgets.QLineEdit(parent=self.centralwidget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Minimum)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.pulse_fraction.sizePolicy().hasHeightForWidth())
self.pulse_fraction.setSizePolicy(sizePolicy)
self.pulse_fraction.setMinimumSize(QtCore.QSize(0, 20))
self.pulse_fraction.setStyleSheet("QLineEdit{\n"
" background: rgb(223,223,233)\n"
" }\n"
" ")
self.pulse_fraction.setObjectName("pulse_fraction")
self.gridLayout_2.addWidget(self.pulse_fraction, 1, 1, 1, 1)
self.label_187 = QtWidgets.QLabel(parent=self.centralwidget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Minimum)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.label_187.sizePolicy().hasHeightForWidth())
self.label_187.setSizePolicy(sizePolicy)
self.label_187.setObjectName("label_187")
self.gridLayout_2.addWidget(self.label_187, 2, 0, 1, 1)
self.pulse_frequency = QtWidgets.QLineEdit(parent=self.centralwidget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Minimum)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.pulse_frequency.sizePolicy().hasHeightForWidth())
self.pulse_frequency.setSizePolicy(sizePolicy)
self.pulse_frequency.setMinimumSize(QtCore.QSize(0, 20))
self.pulse_frequency.setStyleSheet("QLineEdit{\n"
" background: rgb(223,223,233)\n"
" }\n"
" ")
self.pulse_frequency.setObjectName("pulse_frequency")
self.gridLayout_2.addWidget(self.pulse_frequency, 2, 1, 1, 1)
self.label_188 = QtWidgets.QLabel(parent=self.centralwidget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Minimum)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.label_188.sizePolicy().hasHeightForWidth())
self.label_188.setSizePolicy(sizePolicy)
self.label_188.setObjectName("label_188")
self.gridLayout_2.addWidget(self.label_188, 3, 0, 1, 1)
self.detection_rate_init = QtWidgets.QLineEdit(parent=self.centralwidget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Minimum)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.detection_rate_init.sizePolicy().hasHeightForWidth())
self.detection_rate_init.setSizePolicy(sizePolicy)
self.detection_rate_init.setMinimumSize(QtCore.QSize(0, 20))
self.detection_rate_init.setStyleSheet("QLineEdit{\n"
" background: rgb(223,223,233)\n"
" }\n"
" ")
self.detection_rate_init.setObjectName("detection_rate_init")
self.gridLayout_2.addWidget(self.detection_rate_init, 3, 1, 1, 1)
self.verticalLayout.addLayout(self.gridLayout_2)
self.line_4 = QtWidgets.QFrame(parent=self.centralwidget)
self.line_4.setFrameShape(QtWidgets.QFrame.Shape.HLine)
self.line_4.setFrameShadow(QtWidgets.QFrame.Shadow.Sunken)
self.line_4.setObjectName("line_4")
self.verticalLayout.addWidget(self.line_4)
self.line_3 = QtWidgets.QFrame(parent=self.centralwidget)
self.line_3.setFrameShape(QtWidgets.QFrame.Shape.HLine)
self.line_3.setFrameShadow(QtWidgets.QFrame.Shadow.Sunken)
self.line_3.setObjectName("line_3")
self.verticalLayout.addWidget(self.line_3)
self.gridLayout = QtWidgets.QGridLayout()
self.gridLayout.setObjectName("gridLayout")
self.label_192 = QtWidgets.QLabel(parent=self.centralwidget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Minimum)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.label_192.sizePolicy().hasHeightForWidth())
self.label_192.setSizePolicy(sizePolicy)
self.label_192.setObjectName("label_192")
self.gridLayout.addWidget(self.label_192, 0, 0, 1, 1)
self.counter_source = QtWidgets.QComboBox(parent=self.centralwidget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Minimum)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.counter_source.sizePolicy().hasHeightForWidth())
self.counter_source.setSizePolicy(sizePolicy)
self.counter_source.setMinimumSize(QtCore.QSize(0, 20))
self.counter_source.setStyleSheet("QComboBox{\n"
" background: rgb(223,223,233)\n"
" }\n"
" ")
self.counter_source.setObjectName("counter_source")
self.counter_source.addItem("")
self.counter_source.addItem("")
self.gridLayout.addWidget(self.counter_source, 0, 1, 1, 1)
self.label_191 = QtWidgets.QLabel(parent=self.centralwidget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Minimum)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.label_191.sizePolicy().hasHeightForWidth())
self.label_191.setSizePolicy(sizePolicy)
self.label_191.setObjectName("label_191")
self.gridLayout.addWidget(self.label_191, 1, 0, 1, 1)
self.control_algorithm = QtWidgets.QComboBox(parent=self.centralwidget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Minimum)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.control_algorithm.sizePolicy().hasHeightForWidth())
self.control_algorithm.setSizePolicy(sizePolicy)
self.control_algorithm.setMinimumSize(QtCore.QSize(0, 20))
self.control_algorithm.setStyleSheet("QComboBox{\n"
" background: rgb(223,223,233)\n"
" }\n"
" ")
self.control_algorithm.setObjectName("control_algorithm")
self.control_algorithm.addItem("")
self.control_algorithm.addItem("")
self.control_algorithm.addItem("")
self.gridLayout.addWidget(self.control_algorithm, 1, 1, 1, 1)
self.label_178 = QtWidgets.QLabel(parent=self.centralwidget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Minimum)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.label_178.sizePolicy().hasHeightForWidth())
self.label_178.setSizePolicy(sizePolicy)
self.label_178.setObjectName("label_178")
self.gridLayout.addWidget(self.label_178, 2, 0, 1, 1)
self.ex_freq = QtWidgets.QLineEdit(parent=self.centralwidget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Minimum)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.ex_freq.sizePolicy().hasHeightForWidth())
self.ex_freq.setSizePolicy(sizePolicy)
self.ex_freq.setMinimumSize(QtCore.QSize(0, 20))
self.ex_freq.setStyleSheet("QLineEdit{\n"
" background: rgb(223,223,233)\n"
" }\n"
" ")
self.ex_freq.setObjectName("ex_freq")
self.gridLayout.addWidget(self.ex_freq, 2, 1, 1, 1)
self.label_184 = QtWidgets.QLabel(parent=self.centralwidget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Minimum)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.label_184.sizePolicy().hasHeightForWidth())
self.label_184.setSizePolicy(sizePolicy)
self.label_184.setObjectName("label_184")
self.gridLayout.addWidget(self.label_184, 3, 0, 1, 1)
self.vp_min = QtWidgets.QLineEdit(parent=self.centralwidget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Minimum)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.vp_min.sizePolicy().hasHeightForWidth())
self.vp_min.setSizePolicy(sizePolicy)
self.vp_min.setMinimumSize(QtCore.QSize(0, 20))
self.vp_min.setStyleSheet("QLineEdit{\n"
" background: rgb(223,223,233)\n"
" }\n"
" ")
self.vp_min.setObjectName("vp_min")
self.gridLayout.addWidget(self.vp_min, 3, 1, 1, 1)
self.label_185 = QtWidgets.QLabel(parent=self.centralwidget)
self.label_185.setObjectName("label_185")
self.gridLayout.addWidget(self.label_185, 4, 0, 1, 1)
self.vp_max = QtWidgets.QLineEdit(parent=self.centralwidget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Minimum)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.vp_max.sizePolicy().hasHeightForWidth())
self.vp_max.setSizePolicy(sizePolicy)
self.vp_max.setMinimumSize(QtCore.QSize(0, 20))
self.vp_max.setStyleSheet("QLineEdit{\n"
" background: rgb(223,223,233)\n"
" }\n"
" ")
self.vp_max.setObjectName("vp_max")
self.gridLayout.addWidget(self.vp_max, 4, 1, 1, 1)
self.label_181 = QtWidgets.QLabel(parent=self.centralwidget)
self.label_181.setObjectName("label_181")
self.gridLayout.addWidget(self.label_181, 5, 0, 1, 1)
self.vdc_steps_up = QtWidgets.QLineEdit(parent=self.centralwidget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Minimum)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.vdc_steps_up.sizePolicy().hasHeightForWidth())
self.vdc_steps_up.setSizePolicy(sizePolicy)
self.vdc_steps_up.setMinimumSize(QtCore.QSize(0, 20))
self.vdc_steps_up.setStyleSheet("QLineEdit{\n"
" background: rgb(223,223,233)\n"
" }\n"
" ")
self.vdc_steps_up.setObjectName("vdc_steps_up")
self.gridLayout.addWidget(self.vdc_steps_up, 5, 1, 1, 1)
self.label_182 = QtWidgets.QLabel(parent=self.centralwidget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Minimum)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.label_182.sizePolicy().hasHeightForWidth())
self.label_182.setSizePolicy(sizePolicy)
self.label_182.setObjectName("label_182")
self.gridLayout.addWidget(self.label_182, 6, 0, 1, 1)
self.vdc_steps_down = QtWidgets.QLineEdit(parent=self.centralwidget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Minimum)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.vdc_steps_down.sizePolicy().hasHeightForWidth())
self.vdc_steps_down.setSizePolicy(sizePolicy)
self.vdc_steps_down.setMinimumSize(QtCore.QSize(0, 20))
self.vdc_steps_down.setStyleSheet("QLineEdit{\n"
" background: rgb(223,223,233)\n"
" }\n"
" ")
self.vdc_steps_down.setObjectName("vdc_steps_down")
self.gridLayout.addWidget(self.vdc_steps_down, 6, 1, 1, 1)
self.verticalLayout.addLayout(self.gridLayout)
self.gridLayout_6.addLayout(self.verticalLayout, 1, 0, 2, 1)
self.verticalLayout_2 = QtWidgets.QVBoxLayout()
self.verticalLayout_2.setObjectName("verticalLayout_2")
self.gridLayout_5 = QtWidgets.QGridLayout()
self.gridLayout_5.setObjectName("gridLayout_5")
self.label_193 = QtWidgets.QLabel(parent=self.centralwidget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Minimum)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.label_193.sizePolicy().hasHeightForWidth())
self.label_193.setSizePolicy(sizePolicy)
font = QtGui.QFont()
font.setBold(True)
self.label_193.setFont(font)
self.label_193.setObjectName("label_193")
self.gridLayout_5.addWidget(self.label_193, 0, 0, 1, 1)
self.superuser = QtWidgets.QPushButton(parent=self.centralwidget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Fixed, QtWidgets.QSizePolicy.Policy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.superuser.sizePolicy().hasHeightForWidth())
self.superuser.setSizePolicy(sizePolicy)
self.superuser.setMinimumSize(QtCore.QSize(0, 25))
self.superuser.setStyleSheet("QPushButton{\n"
" background: rgb(193, 193, 193)\n"
" }\n"
" ")
self.superuser.setObjectName("superuser")
self.gridLayout_5.addWidget(self.superuser, 0, 1, 1, 1)
self.label_194 = QtWidgets.QLabel(parent=self.centralwidget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Minimum)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.label_194.sizePolicy().hasHeightForWidth())
self.label_194.setSizePolicy(sizePolicy)
self.label_194.setObjectName("label_194")
self.gridLayout_5.addWidget(self.label_194, 1, 0, 1, 1)
self.elapsed_time = QtWidgets.QLineEdit(parent=self.centralwidget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Minimum)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.elapsed_time.sizePolicy().hasHeightForWidth())
self.elapsed_time.setSizePolicy(sizePolicy)
self.elapsed_time.setMinimumSize(QtCore.QSize(0, 20))
self.elapsed_time.setStyleSheet("QLineEdit{\n"
" background: rgb(223,223,233)\n"
" }\n"
" ")
self.elapsed_time.setText("")
self.elapsed_time.setObjectName("elapsed_time")
self.gridLayout_5.addWidget(self.elapsed_time, 1, 1, 1, 1)
self.label_195 = QtWidgets.QLabel(parent=self.centralwidget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Minimum)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.label_195.sizePolicy().hasHeightForWidth())
self.label_195.setSizePolicy(sizePolicy)
self.label_195.setObjectName("label_195")
self.gridLayout_5.addWidget(self.label_195, 2, 0, 1, 1)
self.total_ions = QtWidgets.QLineEdit(parent=self.centralwidget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Minimum)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.total_ions.sizePolicy().hasHeightForWidth())
self.total_ions.setSizePolicy(sizePolicy)
self.total_ions.setMinimumSize(QtCore.QSize(0, 20))
self.total_ions.setStyleSheet("QLineEdit{\n"
" background: rgb(223,223,233)\n"
" }\n"
" ")
self.total_ions.setText("")
self.total_ions.setObjectName("total_ions")
self.gridLayout_5.addWidget(self.total_ions, 2, 1, 1, 1)
self.label_196 = QtWidgets.QLabel(parent=self.centralwidget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Minimum)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.label_196.sizePolicy().hasHeightForWidth())
self.label_196.setSizePolicy(sizePolicy)
self.label_196.setObjectName("label_196")
self.gridLayout_5.addWidget(self.label_196, 3, 0, 1, 1)
self.speciemen_voltage = QtWidgets.QLineEdit(parent=self.centralwidget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Minimum)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.speciemen_voltage.sizePolicy().hasHeightForWidth())
self.speciemen_voltage.setSizePolicy(sizePolicy)
self.speciemen_voltage.setMinimumSize(QtCore.QSize(0, 20))
self.speciemen_voltage.setStyleSheet("QLineEdit{\n"
" background: rgb(223,223,233)\n"
" }\n"
" ")
self.speciemen_voltage.setText("")
self.speciemen_voltage.setObjectName("speciemen_voltage")
self.gridLayout_5.addWidget(self.speciemen_voltage, 3, 1, 1, 1)
self.label_197 = QtWidgets.QLabel(parent=self.centralwidget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Minimum)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.label_197.sizePolicy().hasHeightForWidth())
self.label_197.setSizePolicy(sizePolicy)
self.label_197.setObjectName("label_197")
self.gridLayout_5.addWidget(self.label_197, 4, 0, 1, 1)
self.pulse_voltage = QtWidgets.QLineEdit(parent=self.centralwidget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Minimum)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.pulse_voltage.sizePolicy().hasHeightForWidth())
self.pulse_voltage.setSizePolicy(sizePolicy)
self.pulse_voltage.setMinimumSize(QtCore.QSize(0, 20))
self.pulse_voltage.setStyleSheet("QLineEdit{\n"
" background: rgb(223,223,233)\n"
" }\n"
" ")
self.pulse_voltage.setText("")
self.pulse_voltage.setObjectName("pulse_voltage")
self.gridLayout_5.addWidget(self.pulse_voltage, 4, 1, 1, 1)
self.label_198 = QtWidgets.QLabel(parent=self.centralwidget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Minimum)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.label_198.sizePolicy().hasHeightForWidth())
self.label_198.setSizePolicy(sizePolicy)
self.label_198.setObjectName("label_198")
self.gridLayout_5.addWidget(self.label_198, 5, 0, 1, 1)
self.detection_rate = QtWidgets.QLineEdit(parent=self.centralwidget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Minimum)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.detection_rate.sizePolicy().hasHeightForWidth())
self.detection_rate.setSizePolicy(sizePolicy)
self.detection_rate.setMinimumSize(QtCore.QSize(0, 20))
self.detection_rate.setStyleSheet("QLineEdit{\n"
" background: rgb(223,223,233)\n"
" }\n"
" ")
self.detection_rate.setText("")
self.detection_rate.setObjectName("detection_rate")
self.gridLayout_5.addWidget(self.detection_rate, 5, 1, 1, 1)
self.verticalLayout_2.addLayout(self.gridLayout_5)
spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Policy.Minimum,
QtWidgets.QSizePolicy.Policy.Expanding)
self.verticalLayout_2.addItem(spacerItem)
self.text_line = QtWidgets.QTextEdit(parent=self.centralwidget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Preferred,
QtWidgets.QSizePolicy.Policy.Preferred)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.text_line.sizePolicy().hasHeightForWidth())
self.text_line.setSizePolicy(sizePolicy)
self.text_line.setMinimumSize(QtCore.QSize(0, 400))
self.text_line.setStyleSheet("QWidget{\n"
" border: 2px solid gray;\n"
" border-radius: 10px;\n"
" padding: 0 8px;\n"
" background: rgb(223,223,233)\n"
" }\n"
" ")
self.text_line.setObjectName("text_line")
self.verticalLayout_2.addWidget(self.text_line)
self.gridLayout_6.addLayout(self.verticalLayout_2, 1, 1, 1, 1)
self.start_button = QtWidgets.QPushButton(parent=self.centralwidget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Fixed, QtWidgets.QSizePolicy.Policy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.start_button.sizePolicy().hasHeightForWidth())
self.start_button.setSizePolicy(sizePolicy)
self.start_button.setMinimumSize(QtCore.QSize(0, 25))
self.start_button.setStyleSheet("QPushButton{\n"
" background: rgb(193, 193, 193)\n"
" }\n"
" ")
self.start_button.setObjectName("start_button")
self.gridLayout_6.addWidget(self.start_button, 2, 2, 2, 1)
self.Error = QtWidgets.QLabel(parent=self.centralwidget)
self.Error.setMinimumSize(QtCore.QSize(700, 30))
font = QtGui.QFont()
font.setPointSize(10)
font.setBold(True)
font.setStrikeOut(False)
self.Error.setFont(font)
self.Error.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter)
self.Error.setWordWrap(True)
self.Error.setTextInteractionFlags(QtCore.Qt.TextInteractionFlag.LinksAccessibleByMouse)
self.Error.setObjectName("Error")
self.gridLayout_6.addWidget(self.Error, 3, 0, 2, 2)
self.stop_button = QtWidgets.QPushButton(parent=self.centralwidget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Fixed, QtWidgets.QSizePolicy.Policy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.stop_button.sizePolicy().hasHeightForWidth())
self.stop_button.setSizePolicy(sizePolicy)
self.stop_button.setMinimumSize(QtCore.QSize(0, 25))
self.stop_button.setStyleSheet("QPushButton{\n"
" background: rgb(193, 193, 193)\n"
" }\n"
" ")
self.stop_button.setObjectName("stop_button")
self.gridLayout_6.addWidget(self.stop_button, 4, 2, 1, 1)
self.gridLayout_7.addLayout(self.gridLayout_6, 0, 0, 1, 1)
PyCCAPT.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(parent=PyCCAPT)
self.menubar.setGeometry(QtCore.QRect(0, 0, 901, 22))
self.menubar.setObjectName("menubar")
self.menuFile = QtWidgets.QMenu(parent=self.menubar)
self.menuFile.setObjectName("menuFile")
self.menuEdit = QtWidgets.QMenu(parent=self.menubar)
self.menuEdit.setObjectName("menuEdit")
self.menuHelp = QtWidgets.QMenu(parent=self.menubar)
self.menuHelp.setObjectName("menuHelp")
self.menuSettings = QtWidgets.QMenu(parent=self.menubar)
self.menuSettings.setObjectName("menuSettings")
self.menuView = QtWidgets.QMenu(parent=self.menubar)
self.menuView.setObjectName("menuView")
PyCCAPT.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(parent=PyCCAPT)
self.statusbar.setObjectName("statusbar")
PyCCAPT.setStatusBar(self.statusbar)
self.actionExit = QtGui.QAction(parent=PyCCAPT)
self.actionExit.setObjectName("actionExit")
self.actiontake_sceernshot = QtGui.QAction(parent=PyCCAPT)
self.actiontake_sceernshot.setObjectName("actiontake_sceernshot")
self.actionAbout = QtGui.QAction(parent=PyCCAPT)
self.actionAbout.setObjectName("actionAbout")
self.menuFile.addAction(self.actionExit)
self.menuEdit.addAction(self.actiontake_sceernshot)
self.menuHelp.addAction(self.actionAbout)
self.menubar.addAction(self.menuFile.menuAction())
self.menubar.addAction(self.menuEdit.menuAction())
self.menubar.addAction(self.menuView.menuAction())
self.menubar.addAction(self.menuSettings.menuAction())
self.menubar.addAction(self.menuHelp.menuAction())
self.retranslateUi(PyCCAPT)
QtCore.QMetaObject.connectSlotsByName(PyCCAPT)
PyCCAPT.setTabOrder(self.gates_control, self.pumps_vaccum)
PyCCAPT.setTabOrder(self.pumps_vaccum, self.camears)
PyCCAPT.setTabOrder(self.camears, self.laser_control)
PyCCAPT.setTabOrder(self.laser_control, self.stage_control)
PyCCAPT.setTabOrder(self.stage_control, self.visualization)
PyCCAPT.setTabOrder(self.visualization, self.baking)
PyCCAPT.setTabOrder(self.baking, self.parameters_source)
PyCCAPT.setTabOrder(self.parameters_source, self.ex_number)
PyCCAPT.setTabOrder(self.ex_number, self.ex_user)
PyCCAPT.setTabOrder(self.ex_user, self.ex_name)
PyCCAPT.setTabOrder(self.ex_name, self.email)
PyCCAPT.setTabOrder(self.email, self.electrode)
PyCCAPT.setTabOrder(self.electrode, self.criteria_time)
PyCCAPT.setTabOrder(self.criteria_time, self.ex_time)
PyCCAPT.setTabOrder(self.ex_time, self.criteria_ions)
PyCCAPT.setTabOrder(self.criteria_ions, self.max_ions)
PyCCAPT.setTabOrder(self.max_ions, self.criteria_vdc)
PyCCAPT.setTabOrder(self.criteria_vdc, self.vdc_max)
PyCCAPT.setTabOrder(self.vdc_max, self.set_min_voltage)
PyCCAPT.setTabOrder(self.set_min_voltage, self.vdc_min)
PyCCAPT.setTabOrder(self.vdc_min, self.pulse_mode)
PyCCAPT.setTabOrder(self.pulse_mode, self.pulse_fraction)
PyCCAPT.setTabOrder(self.pulse_fraction, self.pulse_frequency)
PyCCAPT.setTabOrder(self.pulse_frequency, self.detection_rate_init)
PyCCAPT.setTabOrder(self.detection_rate_init, self.counter_source)
PyCCAPT.setTabOrder(self.counter_source, self.control_algorithm)
PyCCAPT.setTabOrder(self.control_algorithm, self.ex_freq)
PyCCAPT.setTabOrder(self.ex_freq, self.vp_min)
PyCCAPT.setTabOrder(self.vp_min, self.vp_max)
PyCCAPT.setTabOrder(self.vp_max, self.vdc_steps_up)
PyCCAPT.setTabOrder(self.vdc_steps_up, self.vdc_steps_down)
PyCCAPT.setTabOrder(self.vdc_steps_down, self.superuser)
PyCCAPT.setTabOrder(self.superuser, self.elapsed_time)
PyCCAPT.setTabOrder(self.elapsed_time, self.total_ions)
PyCCAPT.setTabOrder(self.total_ions, self.speciemen_voltage)
PyCCAPT.setTabOrder(self.speciemen_voltage, self.pulse_voltage)
PyCCAPT.setTabOrder(self.pulse_voltage, self.detection_rate)
PyCCAPT.setTabOrder(self.detection_rate, self.text_line)
PyCCAPT.setTabOrder(self.text_line, self.start_button)
PyCCAPT.setTabOrder(self.start_button, self.stop_button)
###
self.actionAbout.triggered.connect(self.about)
self.actionExit.triggered.connect(PyCCAPT.close)
self.actiontake_sceernshot.triggered.connect(self.take_screenshot)
self.camears.clicked.connect(self.open_cameras_win)
self.gates_control.clicked.connect(self.open_gates_win)
self.laser_control.clicked.connect(self.open_laser_control_win)
self.stage_control.clicked.connect(self.open_stage_control_win)
self.pumps_vaccum.clicked.connect(self.open_pumps_vacuum_win)
self.visualization.clicked.connect(self.open_visualization_win)
self.baking.clicked.connect(self.open_baking_win)
# Create a QTimer to hide the warning message after 8 seconds
self.timer = QtCore.QTimer()
self.timer.timeout.connect(self.hideMessage)
self.camera_close_check_timer = QtCore.QTimer()
self.camera_close_check_timer.timeout.connect(self.check_closed_events)
QtWidgets.QApplication.instance().aboutToQuit.connect(self.cleanup)
self.statistics_timer = QtCore.QTimer()
self.statistics_timer.timeout.connect(self.statistics_update)
self.timer_stop_exp = QtCore.QTimer()
self.timer_stop_exp.timeout.connect(self.on_stop_experiment_worker) # timer to stop the experiment
###
self.setup_parameters_changes()
self.parameters_source.currentIndexChanged.connect(self.setup_parameters_changes)
self.ex_user.editingFinished.connect(self.setup_parameters_changes)
self.ex_name.editingFinished.connect(self.setup_parameters_changes)
self.electrode.currentIndexChanged.connect(self.setup_parameters_changes)
self.ex_time.editingFinished.connect(self.setup_parameters_changes)
self.max_ions.editingFinished.connect(self.setup_parameters_changes)
self.ex_freq.editingFinished.connect(self.setup_parameters_changes)
self.vdc_min.editingFinished.connect(self.setup_parameters_changes)
self.vdc_max.editingFinished.connect(self.setup_parameters_changes)
self.vdc_steps_up.editingFinished.connect(self.setup_parameters_changes)
self.vdc_steps_down.editingFinished.connect(self.setup_parameters_changes)
self.vp_min.editingFinished.connect(self.setup_parameters_changes)
self.vp_max.editingFinished.connect(self.setup_parameters_changes)
self.pulse_fraction.editingFinished.connect(self.setup_parameters_changes)
self.pulse_frequency.editingFinished.connect(self.setup_parameters_changes)
self.detection_rate_init.editingFinished.connect(self.setup_parameters_changes)
self.email.editingFinished.connect(self.setup_parameters_changes)
self.counter_source.currentIndexChanged.connect(self.setup_parameters_changes)
self.control_algorithm.currentIndexChanged.connect(self.setup_parameters_changes)
self.pulse_mode.currentIndexChanged.connect(self.setup_parameters_changes)
self.parameters_source.currentIndexChanged.connect(self.setup_parameters_changes)
self.criteria_vdc.stateChanged.connect(self.setup_parameters_changes)
self.criteria_time.stateChanged.connect(self.setup_parameters_changes)
self.criteria_ions.stateChanged.connect(self.setup_parameters_changes)
###
self.start_button.clicked.connect(self.start_experiment_clicked)
self.stop_button.clicked.connect(self.stop_experiment_clicked)
self.set_min_voltage.clicked.connect(self.set_min_voltage_clicked)
self.superuser.clicked.connect(self.super_user_access)
self.emitter.elapsed_time.connect(self.update_elapsed_time)
self.emitter.total_ions.connect(self.update_total_ions)
self.emitter.speciemen_voltage.connect(self.update_speciemen_voltage)
self.emitter.pulse_voltage.connect(self.update_pulse_voltage)
self.emitter.detection_rate.connect(self.update_detection_rate)
self.result_list = []
self.camera_close_check_timer.start(500) # check every 500 ms
self.statistics_timer.start(333) # check every 333 ms
# initialize the wins
self.wins_init()
self.original_button_style = self.superuser.styleSheet()
counter_path = runtime.ensure_counter_file()
try:
self.variables.counter = int(counter_path.read_text(encoding="utf-8").splitlines()[0].strip())
except (IndexError, ValueError):
counter_path.write_text("1", encoding="utf-8")
self.variables.counter = 1
self.ex_number.setEnabled(False)
self.ex_number.setText(str(self.variables.counter))
self.load_electrode_items(str(runtime.project_path("control", "electrode.toml")))
[docs]
def retranslateUi(self, PyCCAPT):
"""
Retranslate the UI with the selected language
Args:
PyCCAPT: Main window
Return:
None
"""
_translate = QtCore.QCoreApplication.translate
###
# PyCCAPT.setWindowTitle(_translate("PyCCAPT", "OXCART"))
_translate = QtCore.QCoreApplication.translate
PyCCAPT.setWindowTitle(_translate("PyCCAPT", "PyCCAPT APT Experiment Control"))
PyCCAPT.setWindowIcon(QtGui.QIcon(str(runtime.project_path("files", "logo.png"))))
###
self.gates_control.setText(_translate("PyCCAPT", "Gates Control"))
self.pumps_vaccum.setText(_translate("PyCCAPT", "Pumps & Vacuum"))
self.camears.setText(_translate("PyCCAPT", "Cameras & Alingment"))
self.laser_control.setText(_translate("PyCCAPT", "Laser Control"))
self.stage_control.setText(_translate("PyCCAPT", "Stage Control"))
self.visualization.setText(_translate("PyCCAPT", "Visualization"))
self.baking.setText(_translate("PyCCAPT", "Baking"))
self.label_173.setText(_translate("PyCCAPT", "Setup Parameters"))
self.parameters_source.setItemText(0, _translate("PyCCAPT", "TextBox"))
self.parameters_source.setItemText(1, _translate("PyCCAPT", "TextLine"))
self.label_183.setText(_translate("PyCCAPT", "Experiment Number"))
self.ex_number.setText(_translate("PyCCAPT", "1"))
self.label_174.setText(_translate("PyCCAPT", "Experiment User"))
self.ex_user.setText(_translate("PyCCAPT", "user"))
self.label_175.setText(_translate("PyCCAPT", "Experiment Name"))
self.ex_name.setText(_translate("PyCCAPT", "test"))
self.label_190.setText(_translate("PyCCAPT", "Email"))
self.label_200.setText(_translate("PyCCAPT", "Electrode"))
self.label.setText(_translate("PyCCAPT", "Stop at"))
self.max_ions.setText(_translate("PyCCAPT", "40000"))
self.label_2.setText(_translate("PyCCAPT", "Stop at"))
self.label_3.setText(_translate("PyCCAPT", "Stop at"))
self.label_176.setText(_translate("PyCCAPT", "Max. Experiment Time (s)"))
self.set_min_voltage.setText(_translate("PyCCAPT", "Set"))
self.ex_time.setText(_translate("PyCCAPT", "900"))
self.label_179.setText(_translate("PyCCAPT", "DC Min. Voltage (V)"))
self.vdc_max.setText(_translate("PyCCAPT", "4000"))
self.label_180.setText(_translate("PyCCAPT", "DC Max. Voltage (V)"))
self.label_177.setText(_translate("PyCCAPT", "Max. Number of Ions"))
self.vdc_min.setText(_translate("PyCCAPT", "500"))
self.label_199.setText(_translate("PyCCAPT", "Pulse Mode"))
self.pulse_mode.setItemText(0, _translate("PyCCAPT", "Voltage"))
self.pulse_mode.setItemText(1, _translate("PyCCAPT", "Laser"))
self.pulse_mode.setItemText(2, _translate("PyCCAPT", "VoltageLaser"))
self.label_186.setText(_translate("PyCCAPT", "Pulse Fraction (%)"))
self.pulse_fraction.setText(_translate("PyCCAPT", "20"))
self.label_187.setText(_translate("PyCCAPT", "Pulse Frequency (KHz)"))
self.pulse_frequency.setText(_translate("PyCCAPT", "200"))
self.label_188.setText(_translate("PyCCAPT", "Detection Rate (%)"))
self.detection_rate_init.setText(_translate("PyCCAPT", "1"))
self.label_192.setText(_translate("PyCCAPT", "Detection Mode"))
self.counter_source.setItemText(0, _translate("PyCCAPT", "TDC"))
self.counter_source.setItemText(1, _translate("PyCCAPT", "Digitizer"))
self.label_191.setText(_translate("PyCCAPT", "Control Algorithm"))
self.control_algorithm.setItemText(0, _translate("PyCCAPT", "Proportional"))
self.control_algorithm.setItemText(1, _translate("PyCCAPT", "PID"))
self.control_algorithm.setItemText(2, _translate("PyCCAPT", "PID aggressive"))
self.label_178.setText(_translate("PyCCAPT", "Control Refresh Freq.(Hz)"))
self.ex_freq.setText(_translate("PyCCAPT", "5"))
self.label_184.setText(_translate("PyCCAPT", "Pulse Min. Voltage (V)"))
self.vp_min.setText(_translate("PyCCAPT", "328"))
self.label_185.setText(_translate("PyCCAPT", "Pulse Max. Voltage (V)"))
self.vp_max.setText(_translate("PyCCAPT", "3281"))
self.label_181.setText(_translate("PyCCAPT", "K_p Upwards"))
self.vdc_steps_up.setText(_translate("PyCCAPT", "1"))
self.label_182.setText(_translate("PyCCAPT", "K_p Downwards"))
self.vdc_steps_down.setText(_translate("PyCCAPT", "1"))
self.label_193.setText(_translate("PyCCAPT", "Run Statistics"))
self.superuser.setText(_translate("PyCCAPT", "Override Access"))
self.label_194.setText(_translate("PyCCAPT", "Elapsed Time (s)"))
self.label_195.setText(_translate("PyCCAPT", "Total Ions"))
self.label_196.setText(_translate("PyCCAPT", "DC Voltage (V)"))
self.label_197.setText(_translate("PyCCAPT", "Pulse Voltage (V)"))
self.label_198.setText(_translate("PyCCAPT", "Detection Rate (%)"))
self.text_line.setHtml(_translate("PyCCAPT",
"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
"<html><head><meta name=\"qrichtext\" content=\"1\" /><meta charset=\"utf-8\" /><style type=\"text/css\">\n"
"p, li { white-space: pre-wrap; }\n"
"</style></head><body style=\" font-family:\'Segoe UI\'; font-size:9pt; font-weight:400; font-style:normal;\">\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'JetBrains Mono,monospace\'; font-size:8pt; color:#000000;\">{ex_user=user1;</span><span style=\" font-family:\'MS Shell Dlg 2\'; font-size:7.875pt;\">ex_name=test1;</span> </p>\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'MS Shell Dlg 2\'; font-size:7.875pt;\">ex_time=90;max_ions=2000;ex_freq=10;</span> </p>\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'MS Shell Dlg 2\'; font-size:7.875pt;\">vdc_min=500;vdc_max=4000;vdc_steps_up=1;</span> </p>\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'MS Shell Dlg 2\'; font-size:7.875pt;\">vdc_steps_down=1;</span><span style=\" font-family:\'JetBrains Mono,monospace\'; font-size:8pt; color:#000000;\">control_algorithm=PID;</span><span style=\" font-family:\'MS Shell Dlg 2\'; font-size:7.875pt;\">vp_min=328;</span> </p>\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'MS Shell Dlg 2\'; font-size:7.875pt;\">vp_max=3281;pulse_fraction=20;pulse_frequency=200;</span> </p>\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'MS Shell Dlg 2\'; font-size:7.875pt;\">detection_rate_init=1;hit_displayed=20000;email=;counter_source=TDC</span><span style=\" font-family:\'JetBrains Mono,monospace\'; font-size:8pt; color:#000000;\">;</span> </p>\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'JetBrains Mono,monospace\'; font-size:8pt; color:#000000;\">criteria_time=True;criteria_ions=False;</span> </p>\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'JetBrains Mono,monospace\'; font-size:8pt; color:#000000;\">criteria_vdc=False}</span> </p>\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'JetBrains Mono,monospace\'; font-size:8pt; color:#000000;\">{ex_user=user2;ex_name=test2;ex_time=100;</span> </p>\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'JetBrains Mono,monospace\'; font-size:8pt; color:#000000;\">max_ions=3000;ex_freq=5;vdc_min=1000;</span> </p>\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'JetBrains Mono,monospace\'; font-size:8pt; color:#000000;\">vdc_max=3000;vdc_steps_up=0.5;vdc_steps_down=0.5;</span> </p>\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'JetBrains Mono,monospace\'; font-size:8pt; color:#000000;\">control_algorithm=proportional;vp_min=400;vp_max=2000;</span> </p>\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'JetBrains Mono,monospace\'; font-size:8pt; color:#000000;\">pulse_fraction=15;pulse_frequency=200;detection_rate_init=2;</span> </p>\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'JetBrains Mono,monospace\'; font-size:8pt; color:#000000;\">hit_displayed=40000;email=;counter_source=DRS;</span> </p>\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'JetBrains Mono,monospace\'; font-size:8pt; color:#000000;\">criteria_time=False;criteria_ions=False;criteria_vdc=True}</span> </p></body></html>"))
self.start_button.setText(_translate("PyCCAPT", "Start"))
self.Error.setText(_translate("PyCCAPT", "<html><head/><body><p><br/></p></body></html>"))
self.stop_button.setText(_translate("PyCCAPT", "Stop"))
self.menuFile.setTitle(_translate("PyCCAPT", "File"))
self.menuEdit.setTitle(_translate("PyCCAPT", "Edit"))
self.menuHelp.setTitle(_translate("PyCCAPT", "Help"))
self.menuSettings.setTitle(_translate("PyCCAPT", "Settings"))
self.menuView.setTitle(_translate("PyCCAPT", "View"))
self.actionExit.setText(_translate("PyCCAPT", "Exit"))
self.actiontake_sceernshot.setText(_translate("PyCCAPT", "take sceernshot"))
self.actionAbout.setText(_translate("PyCCAPT", "About PyCCAPT"))
[docs]
def super_user_access(self):
"""
The function for override access
Args:
None
Returns:
None
"""
if not self.flag_super_user:
warning = QtWidgets.QMessageBox(parent=self.centralwidget)
warning.setIcon(QtWidgets.QMessageBox.Icon.Warning)
warning.setWindowTitle("Confirm Access Override")
warning.setText("Access Override can bypass device and gate safety checks.")
warning.setInformativeText("Only continue if you understand the risk of running with missing hardware.")
warning.setStandardButtons(
QtWidgets.QMessageBox.StandardButton.Yes | QtWidgets.QMessageBox.StandardButton.No
)
warning.setDefaultButton(QtWidgets.QMessageBox.StandardButton.No)
if warning.exec() != QtWidgets.QMessageBox.StandardButton.Yes:
self.error_message("Access Override was canceled.")
self.timer.start(8000)
return
self.flag_super_user = True
self.superuser.setStyleSheet("QPushButton{\n"
"background: rgb(0, 255, 26)\n"
"}")
self.error_message("!!! Override Access Granted !!!")
elif self.flag_super_user:
self.flag_super_user = False
self.superuser.setStyleSheet(self.original_button_style)
self.error_message("!!! Override Access deactivated !!!")
self.timer.start(8000)
[docs]
def load_electrode_items(self, file_path):
items = main_parameters.load_electrode_items(file_path)
self.electrode.clear()
self.electrode.addItems(items)
[docs]
def update_elapsed_time(self, value):
"""
Update the speciemen voltage
Args:
value (float): The speciemen voltage
Return:
None
"""
self.elapsed_time.setText(str("{:.3f}".format(value)))
[docs]
def update_total_ions(self, value):
"""
Update the speciemen voltage
Args:
value (float): The speciemen voltage
Return:
None
"""
self.total_ions.setText(str(value))
[docs]
def update_speciemen_voltage(self, value):
"""
Update the speciemen voltage
Args:
value (float): The speciemen voltage
Return:
None
"""
self.speciemen_voltage.setText(str("{:.3f}".format(value)))
[docs]
def update_pulse_voltage(self, value):
"""
Update the pulse voltage
Args:
value (float): The pulse voltage
Return:
None
"""
self.pulse_voltage.setText(str("{:.3f}".format(value)))
[docs]
def update_detection_rate(self, value):
"""
Update the detection rate
Args:
value (float): The detection rate
Return:
None
"""
self.detection_rate.setText(str("{:.3f}".format(value)))
[docs]
def read_text_lines(self, ):
"""
Read the text lines and convert them to a dictionary
Args:
None
Return:
None
"""
self.result_list = main_parameters.parse_textline_experiments(self.text_line.toPlainText())
self.variables.number_of_experiment_in_text_line = len(self.result_list)
if self.variables.index_experiment_in_text_line < len(self.result_list):
index_line = self.variables.index_experiment_in_text_line
main_parameters.apply_textline_item(
self.variables,
self.conf,
self.result_list[index_line],
self.error_message,
)
[docs]
def setup_parameters_changes(self):
"""
Function to set up parameters changes
Args:
None
Return:
None
"""
try:
if self.parameters_source.currentText() == 'TextLine':
self.read_text_lines()
return
values = main_parameters.FormValues(
user_name=self.ex_user.text(),
ex_name=self.ex_name.text(),
electrode=self.electrode.currentText(),
ex_time=self.ex_time.text(),
ex_freq=self.ex_freq.text(),
max_ions=self.max_ions.text(),
vdc_min=self.vdc_min.text(),
vdc_max=self.vdc_max.text(),
detection_rate_init=self.detection_rate_init.text(),
pulse_fraction=self.pulse_fraction.text(),
email=self.email.text(),
vdc_steps_up=self.vdc_steps_up.text(),
vdc_steps_down=self.vdc_steps_down.text(),
control_algorithm=str(self.control_algorithm.currentText()),
pulse_mode=str(self.pulse_mode.currentText()),
vp_min=self.vp_min.text(),
vp_max=self.vp_max.text(),
pulse_frequency=self.pulse_frequency.text(),
counter_source=str(self.counter_source.currentText()),
criteria_time=self.criteria_time.isChecked(),
criteria_ions=self.criteria_ions.isChecked(),
criteria_vdc=self.criteria_vdc.isChecked(),
)
corrections = main_parameters.apply_form_values(
self.variables,
self.conf,
values,
self.error_message,
)
if "pulse_fraction" in corrections:
self.pulse_fraction.setText(corrections["pulse_fraction"])
if "vp_max" in corrections:
self.vp_max.setText(corrections["vp_max"])
if "vdc_max" in corrections:
self.vdc_max.setText(corrections["vdc_max"])
if "pulse_frequency" in corrections:
self.pulse_frequency.setText(corrections["pulse_frequency"])
except (ValueError, main_parameters.ParameterError):
self.error_message("Please enter a valid number")
[docs]
def start_experiment_clicked(self):
"""
Start the experiment worker thread
Args:
None
Return:
None
"""
if not self.variables.flag_main_gate or self.flag_super_user:
self.start_experiment_worker()
else:
self.error_message("Please close the main gate or activate the Access Override")
[docs]
def statistics_update(self):
"""
Update the statistics
Args:
None
Return:
None
"""
self.emitter.elapsed_time.emit(self.variables.elapsed_time)
self.emitter.total_ions.emit(self.variables.total_ions)
self.emitter.speciemen_voltage.emit(self.variables.specimen_voltage)
self.emitter.pulse_voltage.emit(self.variables.pulse_voltage)
self.emitter.detection_rate.emit(self.variables.detection_rate_current)
if not self.variables.start_flag and self.variables.stop_flag:
self.stop_experiment_clicked()
if self.variables.vdc_hold != self.vdc_hold_old:
self.dc_hold_clicked()
self.vdc_hold_old = self.variables.vdc_hold
[docs]
def stop_experiment_clicked(self):
"""
Stop the experiment worker thread
Args:
None
Return:
None
"""
if not self.start_button.isEnabled():
self.statistics_timer.stop()
self.variables.stop_flag = True # Set the STOP flag
self.stop_button.setEnabled(False) # Disable the stop button
self.timer_stop_exp.start(1000) # Start the timer to run stop actions after 8 seconds
[docs]
def start_experiment_worker(self):
"""
Start the experiment worker thread
Args:
None
Return:
None
"""
self.variables.start_flag = True
self.variables.stop_flag = False
self.variables.plot_clear_flag = True
self.variables.clear_index_save_image = True
self.variables.access_override_enabled = self.flag_super_user
issues = device_checks.collect_startup_device_issues(
self.conf,
self.variables,
pulse_mode=self.variables.pulse_mode,
)
self.variables.override_disabled_devices = [issue.device for issue in issues] if self.flag_super_user else []
if issues:
if self.flag_super_user:
details = "; ".join(f"{item.device}: {item.reason}" for item in issues)
warning_message = (
"Override active. Experiment is starting with unavailable enabled devices. "
"Review the terminal log for the full device list."
)
print(
"Override active. Device check found unavailable enabled devices: "
f"{details}. Experiment will continue and skip unavailable hardware where possible."
)
self.error_message(warning_message)
else:
message = device_checks.format_startup_device_issue_message(issues)
print(message)
self.error_message(message)
self.variables.start_flag = False
self.variables.stop_flag = False
return
try:
self.experiment_process = self.process_coordinator.start_experiment(
self.variables,
self.conf,
self.experimetn_finished_event,
self.x_plot,
self.y_plot,
self.t_plot,
self.main_v_dc_plot,
)
except Exception as exc:
message = (
"Experiment process could not start: "
f"{exc.__class__.__name__}: {exc}"
)
print(message)
self.error_message(message)
self.variables.start_flag = False
self.variables.stop_flag = False
return
self.start_button.setEnabled(False)
self.counter_source.setEnabled(False)
self.pulse_mode.setEnabled(False)
self.parameters_source.setEnabled(False)
self.pulse_fraction.setEnabled(False)
self.ex_freq.setEnabled(False)
self.ex_name.setEnabled(False)
self.electrode.setEnabled(False)
self.control_algorithm.setEnabled(False)
self.variables.elapsed_time = 0.0
self.variables.total_ions = 0
self.variables.specimen_voltage = 0.0
self.variables.pulse_voltage = 0.0
self.variables.detection_rate_current = 0.0
self.statistics_timer.start()
[docs]
def about(self):
"""
Show the about window
Args:
None
Return:
None
"""
# Get the PyCCAPT version from your setup file
# Replace 'your_version_here' with the actual way you extract the version
pyccapt_version = 'your_version_here'
# Create the about dialog
about_win = QtWidgets.QDialog()
about_win.setWindowTitle("PyCCAPT APT Experiment Control")
about_win.setWindowIcon(QtGui.QIcon(str(runtime.project_path("files", "logo.png"))))
# Add version information
package_version = get_package_version('pyccapt')
version_label = QtWidgets.QLabel(f"PyCCAPT Control Software Version {package_version}")
version_label.setAlignment(Qt.AlignmentFlag.AlignCenter)
# Add link to documentation
documentation_label = QtWidgets.QLabel('For documentation, please visit: <a '
'href="https://pyccapt.readthedocs.io/en/latest">Documentation</a>')
documentation_label.setOpenExternalLinks(True)
documentation_label.setAlignment(Qt.AlignmentFlag.AlignCenter)
license_label = QtWidgets.QLabel(f"License: GPLv3")
license_label.setAlignment(Qt.AlignmentFlag.AlignCenter)
# Create a button to close the about dialog
ok_button = QtWidgets.QPushButton("OK", about_win)
ok_button.clicked.connect(about_win.accept)
# Create a layout for the QDialog
layout = QtWidgets.QVBoxLayout(about_win)
layout.addWidget(version_label)
layout.addWidget(documentation_label)
layout.addWidget(ok_button)
# Show the about dialog
about_win.exec()
[docs]
def take_screenshot(self):
"""
Take a screenshot of the GUI
Args:
None
Return:
None
"""
screen = QtWidgets.QApplication.primaryScreen()
w = self.centralwidget
screenshot = screen.grabWindow(w.winId())
try:
screenshot.save(str(Path(self.variables.path) / "screenshot.png"), 'png')
except Exception:
pass
[docs]
def on_stop_experiment_worker(self):
"""
Enable the start and stop buttons after experiment is finished
Args:
None
Return:
None
"""
self.emitter.total_ions.emit(self.variables.total_ions) # Update the total ions
if self.variables.flag_end_experiment:
self.start_button.setEnabled(True)
self.stop_button.setEnabled(True)
self.counter_source.setEnabled(True) # Enable the counter source
self.pulse_mode.setEnabled(True) # Enable the pulse mode
self.parameters_source.setEnabled(True) # Enable the parameters source
self.pulse_fraction.setEnabled(True) # Enable the pulse fraction
self.ex_freq.setEnabled(True)
self.ex_name.setEnabled(True)
self.electrode.setEnabled(True)
self.control_algorithm.setEnabled(True)
self.ex_number.setText(str(self.variables.counter))
self.experiment_process.join(1)
print('experiment_process joined')
# for getting screenshot of GUI
screen = QtWidgets.QApplication.primaryScreen()
w = self.centralwidget
screenshot = screen.grabWindow(w.winId())
# with self.variables.lock_setup_parameters:
screenshot.save(str(Path(self.variables.path) / "screenshot.png"), 'png')
self.variables.flag_cameras_take_screenshot = True
# with self.variables.lock_statistics:
if self.variables.index_experiment_in_text_line < len(
self.result_list): # Do next experiment in case of TextLine
self.variables.index_experiment_in_text_line += 1
self.start_experiment_worker()
else:
self.variables.index_line = 0
self.variables.flag_end_experiment = False
self.variables.flag_stop_tdc = False
self.timer_stop_exp.stop()
[docs]
def reset_heatmap_clicked(self):
"""
Reset the heatmap
Args:
None
Return:
None
"""
# with self.variables.lock_setup_parameters:
if not self.variables.reset_heatmap:
self.variables.reset_heatmap = True
[docs]
def dc_hold_clicked(self):
"""
Hold the DC voltage
Args:
None
Return:
None
"""
if self.variables.vdc_hold:
self.pulse_mode.setEnabled(True) # Disable the pulse mode
elif not self.variables.vdc_hold:
self.pulse_mode.setEnabled(False) # Enable the pulse mode
[docs]
def set_min_voltage_clicked(self):
"""
Set the minimum voltage
Args:
None
Return:
None
"""
if self.variables.vdc_hold:
self.variables.flag_new_min_voltage = True
else:
self.error_message("Hold the DC voltage first")
[docs]
def wins_init(self):
available_ports = device_checks.list_available_serial_ports()
serial_issues = device_checks.collect_configured_serial_port_issues(
self.conf,
available_ports=available_ports,
)
if serial_issues:
message = device_checks.format_serial_port_issue_message(
serial_issues,
available_ports=available_ports,
)
print(message)
self.error_message(message)
if str(self.conf.get("camera", "off")).strip().lower() == "on":
self.camera_available, self.camera_status_message = camera_device.check_camera_availability()
else:
self.camera_available = False
self.camera_status_message = "Camera support is disabled in config.toml."
if self.camera_available:
self.camera_process = self.process_coordinator.start_camera(
self.variables,
self.conf,
self.camera_closed_event,
self.camera_win_front,
)
else:
self.camears.setEnabled(False)
self.camears.setToolTip(self.camera_status_message)
if self.camera_status_message and str(self.conf.get("camera", "off")).strip().lower() == "on":
print(self.camera_status_message)
if not serial_issues:
self.error_message(self.camera_status_message)
# GUI gate
self.gui_gates = gui_gates.Ui_Gates(self.variables, self.conf)
self.Gates = gui_gates.GatesWindow(self.gui_gates, flags=QtCore.Qt.WindowType.Tool)
self.Gates.setWindowStyleFusion()
self.gui_gates.setupUi(self.Gates)
self.Gates.closed.connect(lambda: self.reset_button_color(self.gates_control))
# GUI Pumps and Vacuum
self.SignalEmitter_Pumps_Vacuum = gui_pumps_vacuum.SignalEmitter()
self.gui_pumps_vacuum = gui_pumps_vacuum.Ui_Pumps_Vacuum(self.variables, self.conf,
self.SignalEmitter_Pumps_Vacuum)
self.Pumps_vacuum = gui_pumps_vacuum.PumpsVacuumWindow(self.gui_pumps_vacuum,
self.SignalEmitter_Pumps_Vacuum,
flags=Qt.WindowType.Tool)
self.Pumps_vacuum.setWindowStyleFusion()
self.gui_pumps_vacuum.setupUi(self.Pumps_vacuum)
self.Pumps_vacuum.closed.connect(lambda: self.reset_button_color(self.pumps_vaccum))
self.variables.flag_pumps_vacuum_start = True
# GUI Laser Control
self.gui_laser_control = gui_laser_control.Ui_Laser_Control(self.variables, self.conf)
self.Laser_control = gui_laser_control.LaserControlWindow(self.gui_laser_control,
flags=Qt.WindowType.Tool)
self.gui_laser_control.setupUi(self.Laser_control)
self.Laser_control.closed.connect(lambda: self.reset_button_color(self.laser_control))
# GUI Stage Control
self.gui_stage_control = gui_stage_control.Ui_Stage_Control(self.variables, self.conf)
self.Stage_control = gui_stage_control.StageControlWindow(self.gui_stage_control,
flags=Qt.WindowType.Tool)
self.Stage_control.setWindowStyleFusion()
self.gui_stage_control.setupUi(self.Stage_control)
self.Stage_control.closed.connect(lambda: self.reset_button_color(self.stage_control))
# GUI Visualization
self.visualization_process = self.process_coordinator.start_visualization(
self.variables,
self.conf,
self.visualization_closed_event,
self.visualization_win_front,
self.x_plot,
self.y_plot,
self.t_plot,
self.main_v_dc_plot,
)
def _show_sub_window(self, window, button):
if window.isVisible():
window.raise_()
window.activateWindow()
else:
window.show()
window.raise_()
window.activateWindow()
button.setStyleSheet("background-color: green")
[docs]
def open_cameras_win(self):
"""
Open the Cameras window
Args:
None
Return:
None
"""
if not self.camera_available:
self.error_message(self.camera_status_message or "No cameras are available on this system.")
return
self.variables.flag_camera_win_show = True
self.camera_win_front.set()
self.camears.setStyleSheet("background-color: green")
[docs]
def check_closed_events(self):
"""
Check if the camera window is closed
Args:
None
Return:
None
"""
if self.camera_closed_event.is_set():
# Change the color of the push button when the camera window is closed
self.reset_button_color(self.camears)
self.camera_closed_event.clear()
if self.experimetn_finished_event.is_set():
self.experimetn_finished_event.clear()
self.on_stop_experiment_worker()
if self.visualization_closed_event.is_set():
# Change the color of the push button when the camera window is closed
self.reset_button_color(self.visualization)
self.visualization_closed_event.clear()
[docs]
def open_gates_win(self):
"""
Open the Gates window
Args:
None
Return:
None
"""
if hasattr(self, 'Gates') and self.Gates.isVisible():
self._show_sub_window(self.Gates, self.gates_control)
else:
self._show_sub_window(self.Gates, self.gates_control)
[docs]
def open_pumps_vacuum_win(self, ):
"""
Open the Pumps and Vacuum window
Args:
None
Return:
None
"""
if hasattr(self, 'Pumps_vacuum') and self.Pumps_vacuum.isVisible():
self._show_sub_window(self.Pumps_vacuum, self.pumps_vaccum)
else:
self._show_sub_window(self.Pumps_vacuum, self.pumps_vaccum)
[docs]
def open_laser_control_win(self):
"""
Open laser control window
Args:
None
Return:
None
"""
if hasattr(self, 'Laser_control') and self.Laser_control.isVisible():
self._show_sub_window(self.Laser_control, self.laser_control)
else:
self._show_sub_window(self.Laser_control, self.laser_control)
[docs]
def open_stage_control_win(self):
"""
Open stage control window
Args:
None
Return:
None
"""
if hasattr(self, 'Stage_control') and self.Stage_control.isVisible():
self._show_sub_window(self.Stage_control, self.stage_control)
else:
self._show_sub_window(self.Stage_control, self.stage_control)
[docs]
def open_visualization_win(self, ):
"""
Open visualization window
Args:
None
Return:
None
"""
self.variables.flag_visualization_win_show = True
self.visualization_win_front.set()
self.visualization.setStyleSheet("background-color: green")
[docs]
def open_baking_win(self):
"""
Open baking window
Args:
None
Return:
None
"""
if not hasattr(self, 'Baking'):
self.gui_baking = gui_baking.Ui_Baking(self.variables, self.conf, self.SignalEmitter_Pumps_Vacuum)
self.Baking = gui_baking.BakingWindow(self.gui_baking, flags=Qt.WindowType.Tool)
self.Baking.setWindowStyleFusion()
self.gui_baking.setupUi(self.Baking)
self.Baking.closed.connect(lambda: self.reset_button_color(self.baking))
if self.Baking.isVisible():
self._show_sub_window(self.Baking, self.baking)
else:
self._show_sub_window(self.Baking, self.baking)
[docs]
def error_message(self, message):
"""
Display an error message and start a timer to hide it after 8 seconds
Args:
message (str): Error message to display
Return:
None
"""
_translate = QtCore.QCoreApplication.translate
self.Error.setText(_translate("OXCART",
"<html><head/><body><p><span style=\" color:#ff0000;\">"
+ message + "</span></p></body></html>"))
self.timer.start(8000)
[docs]
def hideMessage(self, ):
"""
Hide the message and stop the timer
Args:
None
Return:
None
"""
# Hide the message and stop the timer
_translate = QtCore.QCoreApplication.translate
self.Error.setText(_translate("OXCART",
"<html><head/><body><p><span style=\" "
"color:#ff0000;\"></span></p></body></html>"))
self.timer.stop()
[docs]
def cleanup(self, ):
"""
Cleanup function to terminate the camera process
Args:
None
Return:
None
"""
if hasattr(self, "gui_baking"):
self.gui_baking.stop()
if hasattr(self, "gui_pumps_vacuum"):
self.gui_pumps_vacuum.stop()
if hasattr(self, "SignalEmitter_Pumps_Vacuum"):
self.SignalEmitter_Pumps_Vacuum.bool_flag_while_loop.emit(False)
if hasattr(self, "experiment_process") and self.experiment_process.is_alive():
self.experiment_process.terminate()
if self.camera_process is not None and self.camera_process.is_alive():
self.camera_process.terminate()
if hasattr(self, 'visualization_process') and self.visualization_process.is_alive():
self.visualization_process.terminate()
if hasattr(self, 'gui_pumps_vacuum') and hasattr(self.gui_pumps_vacuum, 'gauges_thread'):
self.gui_pumps_vacuum.gauges_thread.join(2)
[docs]
def closeEvent(self, event):
reply = QtWidgets.QMessageBox.question(self, 'Close Confirmation',
"Are you sure you want to close the PyCCAPT?",
QtWidgets.QMessageBox.StandardButton.Yes | QtWidgets.QMessageBox.StandardButton.No,
QtWidgets.QMessageBox.StandardButton.No)
if reply == QtWidgets.QMessageBox.StandardButton.Yes:
event.accept()
else:
event.ignore()
[docs]
class SignalEmitter(QtCore.QObject):
elapsed_time = QtCore.pyqtSignal(float)
total_ions = QtCore.pyqtSignal(int)
speciemen_voltage = QtCore.pyqtSignal(float)
pulse_voltage = QtCore.pyqtSignal(float)
detection_rate = QtCore.pyqtSignal(float)
[docs]
def get_package_version(package_name):
try:
return version(package_name)
except PackageNotFoundError:
return None
[docs]
class MyPyCCAPT(QtWidgets.QMainWindow):
def __init__(self, variables, conf, x_plot, y_plot, t_plot, main_v_dc_plot):
super(MyPyCCAPT, self).__init__()
self.ui = Ui_PyCCAPT(variables, conf, x_plot, y_plot, t_plot, main_v_dc_plot)
self.ui.setupUi(self)
[docs]
def closeEvent(self, event):
reply = QtWidgets.QMessageBox.question(
self,
'Close Confirmation',
"Are you sure you want to close the PyCCAPT?",
QtWidgets.QMessageBox.StandardButton.Yes | QtWidgets.QMessageBox.StandardButton.No,
QtWidgets.QMessageBox.StandardButton.No
)
if reply == QtWidgets.QMessageBox.StandardButton.Yes:
self.ui.cleanup()
event.accept()
else:
event.ignore()
if __name__ == "__main__":
try:
conf, project_root = runtime.load_project_config()
except Exception as exc:
print('Can not load the configuration file')
print(exc)
sys.exit()
shared = runtime.create_shared_context(conf)
shared.variables.log_path = str(project_root)
app = QtWidgets.QApplication(sys.argv)
app.setStyle('Fusion')
window = MyPyCCAPT(
shared.variables,
conf,
shared.x_plot,
shared.y_plot,
shared.t_plot,
shared.main_v_dc_plot,
)
window.show()
sys.exit(app.exec())