diff --git a/base.py b/base.py
index 406cda2..70b3338 100644
--- a/base.py
+++ b/base.py
@@ -5,7 +5,6 @@ from collections import OrderedDict
from datetime import datetime
import getpass
import h5py
-import inspect
import logging
import numpy as np
import platform
@@ -54,10 +53,11 @@ PROGRESS_THREAD_ERROR = 4
PROGRESS_THREAD_END = 100
CENTRAL_WIDGET_MINIMUM_HEIGHT = 840
-CENTRAL_WIDGET_MINIMUM_WIDTH = 1240
+CENTRAL_WIDGET_MINIMUM_WIDTH = 1240
SLS_CENTRAL_WIDGET_MINIMUM_HEIGHT = 840
SLS_CENTRAL_WIDGET_MINIMUM_WIDTH = 940
+
class BaseWindow(QMainWindow):
""" BaseWindow
"""
@@ -75,116 +75,111 @@ class BaseWindow(QMainWindow):
QThread.__init__(self)
self.parent = parent
self.settings = self.parent.settings
-
+
self.folder_name = folder_name
self.time_in_seconds = time_in_seconds
self.reanalysis_time = reanalysis_time
self.all_data = self.parent.all_data
self.all_data_2 = self.parent.all_data_2
- #Causes QThread::wait: Thread tried to wait on itself
- #def __del__(self):
+ # Causes QThread::wait: Thread tried to wait on itself
+ # def __del__(self):
# self.wait()
def run(self):
attach_files = []
folder_name = self.folder_name
-
+
date_str = self.parent.add_date_to_path(
time_in_seconds=self.time_in_seconds,
reanalysis_time_in_seconds=self.reanalysis_time)
def extract_and_attach(i, nfig, name, all_fig_data):
- canvas = 'Canvas {0}'.format(i+1)
+ canvas = 'Canvas {0}'.format(i + 1)
name_base = name.replace(' ', '_').lower()
- write_message_fired = False
+ write_message_fired = False
if all_fig_data[canvas] is not None:
- nfig_canvas = len(all_fig_data[canvas])
+ nfig_canvas = len(all_fig_data[canvas])
nfig_canvas = min(nfig_canvas, nfig)
else:
nfig_canvas = nfig
-
+
for idx in range(0, nfig_canvas):
if all_fig_data[canvas] is not None:
name = name_base + "_{0}".format(
idx) if idx > 0 else name_base
-
- save_dest = (folder_name + date_str + '_' + name +
- '.png')
-
- _dirname = os.path.dirname(save_dest)
+
+ save_dest = (folder_name + date_str + '_' + name +
+ '.png')
+
+ _dirname = os.path.dirname(save_dest)
#print("DIRECTORY NAME IS ", _dirname)
- #print("exists?", os.path.exists(_dirname),
- #os.path.exists(save_dest))
-
+ # print("exists?", os.path.exists(_dirname),
+ # os.path.exists(save_dest))
+
if not os.path.isfile(save_dest):
- if all_fig_data[canvas][idx] is not None:
+ if all_fig_data[canvas][idx] is not None:
if not os.path.exists(_dirname):
-
- os.makedirs(_dirname)
-
- if os.access(_dirname, os.W_OK):
-
- all_fig_data[canvas][idx].savefig(save_dest)
-
- elif not write_message_fired:
-
- _mess = ("Do not have write permission " +
- "for directory {0} from this " +
+ os.makedirs(_dirname)
+
+ if os.access(_dirname, os.W_OK):
+
+ all_fig_data[canvas][idx].savefig(
+ save_dest)
+
+ elif not write_message_fired:
+
+ _mess = ("Do not have write permission " +
+ "for directory {0} from this " +
"host {1}. Images not saved and " +
"cannot be sent to elog").format(
- _dirname, os.uname()[1])
-
+ _dirname, os.uname()[1])
+
self.parent.trigger_log_message.emit(
MsgSeverity.WARN.name, _pymodule,
_line(), _mess, {})
write_message_fired = True
-
-
+
if not write_message_fired:
attach_files.append(save_dest)
-
-
-
try:
resultsSeq = self.settings.data["GUI"]["resultsSeq"]
titleSeq = self.settings.data["GUI"]["subResultsTabTitle"]
if self.all_data:
fig_data = self.all_data['Figure data']
- for i, (nfig, name) in enumerate(zip(resultsSeq, titleSeq)):
+ for i, (nfig, name) in enumerate(
+ zip(resultsSeq, titleSeq)):
print(i, nfig, name, flush=True)
print(fig_data, flush=True)
extract_and_attach(i, nfig, name, fig_data)
except KeyError as ex:
pass
-
try:
resultsSeq = self.settings.data["GUI2"]["resultsSeq"]
titleSeq = self.settings.data["GUI2"]["subResultsTabTitle"]
if self.all_data_2:
fig_data = self.all_data_2['Figure data']
- for i, (nfig, name) in enumerate(zip(resultsSeq, titleSeq)):
+ for i, (nfig, name) in enumerate(
+ zip(resultsSeq, titleSeq)):
extract_and_attach(i, nfig, name, fig_data)
except KeyError as ex:
pass
-
-
- #Not so nice.. send a signal instead?
- if attach_files:
+ # Not so nice.. send a signal instead?
+ if attach_files:
self.parent.attach_files = attach_files
print(attach_files, flush=True)
print("All files attached", flush=True)
else:
print("No files to attach", flush=True)
- time.sleep(0.1) #avoid race condition
+ time.sleep(0.1) # avoid race condition
class HDFSave(QThread):
"""Thread for hdf analysis
@@ -193,21 +188,21 @@ class BaseWindow(QMainWindow):
def __init__(self, parent, from_dialog):
QThread.__init__(self)
self.parent = parent
- self.from_dialog=from_dialog
+ self.from_dialog = from_dialog
- #Only a precaution, not experienced
- #Causes QThread::wait: Thread tried to wait on itself
- #def __del__(self):
+ # Only a precaution, not experienced
+ # Causes QThread::wait: Thread tried to wait on itself
+ # def __del__(self):
# self.wait()
def run(self):
"""Run hdf thread
"""
QApplication.processEvents(QEventLoop.ExcludeUserInputEvents, 5000)
-
+
self.all_data = self.parent.all_data
- #Reanalysis data
-
+ # Reanalysis data
+
if self.all_data is not None:
try:
if 'Time in seconds' in self.all_data['Ambient data']:
@@ -220,7 +215,7 @@ class BaseWindow(QMainWindow):
now_in_seconds = None
from_hdf = False
-
+
try:
if 'Reanalysis time in seconds' in self.all_data[
'Processed data']:
@@ -228,9 +223,9 @@ class BaseWindow(QMainWindow):
self.all_data['Processed data']['Reanalysis time'])
if from_hdf:
now_in_seconds = self.all_data['Processed data'][
- 'Reanalysis time in seconds']
+ 'Reanalysis time in seconds']
- #Double check
+ # Double check
if not from_hdf:
if 'from_hdf' in self.all_data['Processed data']:
from_hdf = bool(self.all_data['Processed data'][
@@ -238,11 +233,11 @@ class BaseWindow(QMainWindow):
except KeyError:
now_in_seconds = None
-
+
self.parent.from_hdf = from_hdf
- print("t", ts_in_seconds, now_in_seconds)
- print("from hdf5, dialog=====>", from_hdf, self.from_dialog)
+ print("t", ts_in_seconds, now_in_seconds)
+ print("from hdf5, dialog=====>", from_hdf, self.from_dialog)
if self.parent.hdf_filename is None or not self.from_dialog:
self.parent.set_new_hdf_filename(ts_in_seconds,
@@ -251,22 +246,22 @@ class BaseWindow(QMainWindow):
print("FILENAME ==", self.parent.hdf_filename, flush=True)
with h5py.File(self.parent.hdf_filename, 'w') as dataH5:
- #experiment
+ # experiment
if not from_hdf:
self.parent.add_pvs_to_hdf(
dataH5, pv_list=self.parent.pv_machine_list,
from_hdf=from_hdf)
-
- #general
- #if not from_hdf:
+
+ # general
+ # if not from_hdf:
self.parent.add_general_to_hdf(dataH5)
self.parent.add_to_hdf(dataH5, proc=True, raw=True)
self.parent.hdf_save_completed = True
-
+
_mess = "Data saved to {}".format(
self.parent.hdf_filename)
self.parent.trigger_log_message.emit(
- MsgSeverity.INFO.name, _pymodule, _line(), _mess,
+ MsgSeverity.INFO.name, _pymodule, _line(), _mess,
{})
except OSError as e:
_mess = "OSError in saving to file {0}: \n{1}".format(
@@ -275,7 +270,6 @@ class BaseWindow(QMainWindow):
MsgSeverity.ERROR.name, _pymodule, _line(), _mess, {})
self.parent.hdf_save_completed = False
-
class HDFThread(QThread):
"""Thread for hdf analysis
"""
@@ -288,20 +282,20 @@ class BaseWindow(QMainWindow):
self.all_data = all_data
self.hdf_filename_loaded = self.parent.hdf_filename_loaded
- #Only a precaution, not experienced
- #Causes QThread::wait: Thread tried to wait on itself
- #def __del__(self):
+ # Only a precaution, not experienced
+ # Causes QThread::wait: Thread tried to wait on itself
+ # def __del__(self):
# self.wait()
def run(self):
"""Run hdf thread
"""
-
+
if not hasattr(self.analysis_procedure, 'load_hdf_file'):
- mess = ("Analysis not configured for HDF analysis! " +
+ mess = ("Analysis not configured for HDF analysis! " +
"Missing method: load_hdf_file")
self.parent.trigger_log_message.emit(
- MsgSeverity.ERROR.name,_pymodule, _line(), mess, {})
+ MsgSeverity.ERROR.name, _pymodule, _line(), mess, {})
self.parent.trigger_progressbar.emit(PROGRESS_THREAD_END)
return
@@ -313,19 +307,19 @@ class BaseWindow(QMainWindow):
return
if not hasattr(self.analysis_procedure, 'reanalyze'):
- mess = ("Analysis not configured for HDF analysis! " +
- "Missing method: reanalyze")
- self.parent.trigger_log_message.emit(
- MsgSeverity.ERROR.name, _pymodule, _line(), mess, {})
- self.parent.trigger_progressbar.emit(PROGRESS_THREAD_END)
- return
+ mess = ("Analysis not configured for HDF analysis! " +
+ "Missing method: reanalyze")
+ self.parent.trigger_log_message.emit(
+ MsgSeverity.ERROR.name, _pymodule, _line(), mess, {})
+ self.parent.trigger_progressbar.emit(PROGRESS_THREAD_END)
+ return
try:
expt_dict = self.all_data['experiment']
except KeyError:
expt_dict = None
pass
- #Open hdf5file here and
+ # Open hdf5file here and
mess = "HDF file {} analysis proceeding...".format(
self.hdf_filename_loaded)
self.parent.trigger_log_message.emit(MsgSeverity.INFO.name,
@@ -351,15 +345,14 @@ class BaseWindow(QMainWindow):
self.parent.trigger_log_message.emit(
MsgSeverity.ERROR.name, _pymodule, _line(), mess, {})
-
class AnalysisThread(QThread):
"""Analysis thread
"""
trigger_thread_event = Signal(dict)
def __init__(self, parent, analysis_procedure, input_parameters,
- messages: dict={
- "success": "Analysis completed", "fail":
+ messages: dict = {
+ "success": "Analysis completed", "fail":
"No data returned from analysis procedure"}):
QThread.__init__(self)
@@ -380,14 +373,13 @@ class BaseWindow(QMainWindow):
"""Run thread
"""
print("RUN ANLYSIS THREAD FROM WITHIN IN BASE CLASS", flush=True)
-
- #Reset all_data fro parent
+
+ # Reset all_data fro parent
self.parent.all_data = None
-
+
all_dict = self.analysis_procedure.measure_and_analyze(
self.input_parameters)
-
-
+
# Emit results
if all_dict is not None:
self.trigger_thread_event.emit(all_dict)
@@ -399,7 +391,6 @@ class BaseWindow(QMainWindow):
self.parent.trigger_log_message.emit(
MsgSeverity.WARN.name, _pymodule, _line(), mess, {})
-
def __init__(self, parent=None, pymodule=None, appversion=None, title="",
user_mode=UserMode.OPERATION, facility=Facility.SwissFEL,
extended=True, has_optics=True, has_procedure=True):
@@ -416,15 +407,14 @@ class BaseWindow(QMainWindow):
self.user_mode = user_mode
self.appname, self.appext = self.pymodule.split(".")
-
print("=============================================")
print("Starting {0} at: {1}".format(self.appname, datetime.now()))
print("User: {0} Host: {1}".format(os.getlogin(), os.uname()[1]))
print("=============================================", flush=True)
- self.settings = ReadJSON(self.appname)
+ self.settings = ReadJSON(self.appname)
- #Read out current_logbook
+ # Read out current_logbook
self.cafe = PyCafe.CyCafe()
self.cyca = PyCafe.CyCa()
@@ -440,14 +430,14 @@ class BaseWindow(QMainWindow):
self.screenshot_items = []
self.filename = None
- self.hdf_filename_loaded = "NONE" #For loading into hdf dockwidget
- self.hdf_filename = None #For saving
- self.hdf_user_dict = {}
+ self.hdf_filename_loaded = "NONE" # For loading into hdf dockwidget
+ self.hdf_filename = None # For saving
+ self.hdf_user_dict = {}
self.hdf_dialog = None
self.from_hdf = False
self.daq_analysis_completed = False
-
+
self.setObjectName("MainWindow")
self.setWindowTitle(self.appname)
@@ -463,7 +453,7 @@ class BaseWindow(QMainWindow):
self.elog_add_date_to_dir = self.settings.data["Elog"]["addDateToDir"]
except KeyError:
self.elog_add_date_to_dir = True
-
+
self.screenshot_dest = self.settings.data["screenshot"]["destination"]
self.stdlog_dest = (self.settings.data["stdlog"]["destination"] +
self.appname + "-" + os.getlogin() + ".log")
@@ -500,18 +490,17 @@ class BaseWindow(QMainWindow):
print("KeyError in base.py, init:", error)
self.autopost_hdf = False
- self.hdf_save_completed = False if self.autopost_hdf else True
-
+ self.hdf_save_completed = False if self.autopost_hdf else True
- self.all_input_parameters = {} #gui
- self.all_input_labels = {} #gui
- self.all_expert_parameters = {} #gui
- self.all_expert_labels = {} #gui
+ self.all_input_parameters = {} # gui
+ self.all_input_labels = {} # gui
+ self.all_expert_parameters = {} # gui
+ self.all_expert_labels = {} # gui
- self.input_parameters = {} #analysis thread
+ self.input_parameters = {} # analysis thread
self.input_labels = {}
#self.input_value_dict = {}
- self.expert_parameters = {} #added to input_parameters
+ self.expert_parameters = {} # added to input_parameters
self.expert_labels = {}
self.read_input_parameters()
@@ -524,14 +513,14 @@ class BaseWindow(QMainWindow):
try:
from src.analysis import AnalysisProcedure
self.analysis_procedure = AnalysisProcedure(self)
- print("Base class has user supplied AnalysisProcedure class.",
+ print("Base class has user supplied AnalysisProcedure class.",
flush=True)
except ImportError as e:
print(("Base class without user supplied AnalysisProcedure class."
+ " import Error:"), e, flush=True)
- ##self.trigger_elog_entry.connect(self.receive_elog_notification)
- ##self.trigger_hdf_save.connect(self.save_to_hdf)
+ # self.trigger_elog_entry.connect(self.receive_elog_notification)
+ # self.trigger_hdf_save.connect(self.save_to_hdf)
self.msg_severity_qcolor = {
MsgSeverity.FATAL: QColor(
@@ -560,7 +549,7 @@ class BaseWindow(QMainWindow):
self.settings.data["MsgSeverity"]["debug"])
}
- #QSetttings
+ # QSetttings
self.restore_application_settings()
self.init_toolbar()
@@ -591,13 +580,13 @@ class BaseWindow(QMainWindow):
from pyqtacc.proscan.sendelogproscan import QSendToELOG
elif self.facility == Facility.ESS:
from pyqtacc.ess.guiheader import GUIHeader
- from pyqtacc.ess.sendelogess import QSendToELOG
+ from pyqtacc.ess.sendelogess import QSendToELOG
self.gui_header = GUIHeader(self, user_mode=self.user_mode,
extended=extended)
self.mainwindow_layout.addWidget(self.gui_header.header_wgt)
- self.gui_frame = GUIFrame(self, has_optics=self.has_optics,
+ self.gui_frame = GUIFrame(self, has_optics=self.has_optics,
has_procedure=has_procedure)
self.show_log_message = self.gui_frame.show_log_message
@@ -608,7 +597,7 @@ class BaseWindow(QMainWindow):
self.mainwindow_layout.addWidget(self.gui_frame.central_tab_widget)
self.mainwindow.setLayout(self.mainwindow_layout)
- if self.facility == Facility.SwissFEL:
+ if self.facility == Facility.SwissFEL:
self.mainwindow.setMinimumHeight(CENTRAL_WIDGET_MINIMUM_HEIGHT)
self.mainwindow.setMinimumWidth(CENTRAL_WIDGET_MINIMUM_WIDTH)
else:
@@ -619,7 +608,6 @@ class BaseWindow(QMainWindow):
self.show_log_message(MsgSeverity.INFO.name, _pymodule, _line(),
"Application configured")
-
def read_input_parameters(self):
for key, dictval in self.settings.data["Parameters"].items():
@@ -649,11 +637,11 @@ class BaseWindow(QMainWindow):
else:
for lvalue in self.settings.data[link_list[0]]:
val.append(lvalue)
-
+
if self.settings.data["Parameters"][key]["flag"]:
self.input_parameters[key] = val
self.all_input_parameters[key] = val
- #print("val=",val, key)
+ #print("val=",val, key)
except KeyError as e:
print("Key Error in base.py initialization:", e)
@@ -663,7 +651,6 @@ class BaseWindow(QMainWindow):
self.all_input_labels[key] = dictval["data"]["text"]
#print(key, self.settings.data["Parameters"][key]["flag"])
-
if "Expert" not in self.settings.data:
return
@@ -687,7 +674,7 @@ class BaseWindow(QMainWindow):
#print("lval", val)
else:
val = []
-
+
if isinstance(link_list[0], dict):
for inner_key in self.settings.data[
link_list[0]].keys():
@@ -695,7 +682,7 @@ class BaseWindow(QMainWindow):
else:
for lvalue in self.settings.data[link_list[0]]:
val.append(lvalue)
-
+
if self.settings.data["Expert"][key]["flag"]:
self.expert_parameters[key] = val
self.all_expert_parameters[key] = val
@@ -708,7 +695,6 @@ class BaseWindow(QMainWindow):
self.expert_labels[key] = dictval["data"]["text"]
self.all_expert_labels[key] = dictval["data"]["text"]
-
def init_toolbar(self):
""" Prepare toolbar
"""
@@ -736,7 +722,7 @@ class BaseWindow(QMainWindow):
#menu_daq = self.menu.addMenu("&DAQ")
#menu_daq_actions = []
#daq_toolbar = self.addToolBar("DAQ")
- #daq_toolbar.setObjectName("ViewToolBar")
+ # daq_toolbar.setObjectName("ViewToolBar")
help_toolbar = self.addToolBar("Help")
help_toolbar.setObjectName("HelpToolBar")
@@ -806,7 +792,7 @@ class BaseWindow(QMainWindow):
"Save&ALL", slot=self.write_to_destinations,
shortcut="Ctrl+Z", icon="save_all", tip="Save All")
- #toolbar
+ # toolbar
# Place ExitWidget on the far right
exit_toolbar = self.addToolBar("EXIT")
exit_toolbar.setObjectName("ExitToolBar")
@@ -816,20 +802,21 @@ class BaseWindow(QMainWindow):
exit_toolbar.addWidget(spacer_wgt)
#_qsize = exit_toolbar.iconSize()
#print("qsize", _qsize)
- true_list = [self.autopost_epics, self.autopost_hdf, self.autopost_elog]
-
+ true_list = [
+ self.autopost_epics,
+ self.autopost_hdf,
+ self.autopost_elog]
+
if true_list.count(True) > 1:
- exit_toolbar.setIconSize(QSize(true_list.count(True)*30+10, 24))
- #exit_toolbar.setIconSize(_qsize)
+ exit_toolbar.setIconSize(
+ QSize(true_list.count(True) * 30 + 10, 24))
+ # exit_toolbar.setIconSize(_qsize)
self.add_actions(exit_toolbar, (
save_all_action, "Space", None, "Space", quit_action))
else:
self.add_actions(exit_toolbar, (quit_action,))
-
-
-
- def combine_save_icons(self): #epics=False, hdf=False, elog=False):
+ def combine_save_icons(self): # epics=False, hdf=False, elog=False):
epics = self.autopost_epics
hdf = self.autopost_hdf
@@ -855,9 +842,9 @@ class BaseWindow(QMainWindow):
elif hdf:
startx2 = 20
startx3 = 150
- comboPixmap = QPixmap(130*true_list.count(True), 100) #420, 100
- #comboPixmap.fill(Qt.transparent)
- comboPixmap.fill(QColor("#dcdcdc")) #"#bcc6cc"
+ comboPixmap = QPixmap(130 * true_list.count(True), 100) # 420, 100
+ # comboPixmap.fill(Qt.transparent)
+ comboPixmap.fill(QColor("#dcdcdc")) # "#bcc6cc"
epicsImage = QPixmap(":/epics.png")
hdfImage = QPixmap(":/hdfS.png")
elogImage = QPixmap(":/elog.png")
@@ -872,8 +859,8 @@ class BaseWindow(QMainWindow):
painter.end()
return combinedIcon
+ # Actions
- ################# Actions
def add_actions(self, target, actions):
""" Add to toolbar
"""
@@ -888,7 +875,7 @@ class BaseWindow(QMainWindow):
target.addAction(action)
def create_action(self, text, slot=None, shortcut=None, icon=None, tip=None,
- checkable=False):# signal="triggered()"):
+ checkable=False): # signal="triggered()"):
""" Helper fn
"""
action = QAction(text, self)
@@ -908,8 +895,6 @@ class BaseWindow(QMainWindow):
action.setCheckable(True)
return action
-
-
def verify_close_event(self):
""" Overrides QMainWindow method
"""
@@ -950,13 +935,13 @@ class BaseWindow(QMainWindow):
def closeEvent(self, event):
""" Overrides QMainWindow method
"""
- #Close all dock widgets
- #self.removeDockWidget(self.hdf_dock_widget)
+ # Close all dock widgets
+ # self.removeDockWidget(self.hdf_dock_widget)
self.logger.info("Closing Application")
print("Closing Application", flush=True)
self.save_application_settings()
QApplication.processEvents()
- #print( ("Stopping Monitors. This may on occasion lead to " +
+ # print( ("Stopping Monitors. This may on occasion lead to " +
# "NO CYTHON CALLBACK MATCH FOUND notices"), flush=True)
self.cafe.monitorStopAll()
time.sleep(0.05)
@@ -1035,31 +1020,29 @@ class BaseWindow(QMainWindow):
qdialog.setLayout(layout)
qdialog.show()
-
- #def save_to_hdf_started(self):
+ # def save_to_hdf_started(self):
# QApplication.processEvents()
- #def save_to_hdf_finished(self):
+ # def save_to_hdf_finished(self):
# QApplication.processEvents()
@Slot()
def write_to_destinations(self):
- #disable signal
- #self.gui_frame.autopost_save.blockSignals(True)
+ # disable signal
+ # self.gui_frame.autopost_save.blockSignals(True)
QApplication.processEvents()
if self.autopost_epics:
self.save_to_epics()
-
+
QApplication.processEvents()
if self.autopost_hdf:
self.save_to_hdf()
-
+
QApplication.processEvents()
if self.autopost_elog:
self.send_to_elog()
QApplication.processEvents()
- #enable signal
- #self.gui_frame.autopost_save.blockSignals(False)
-
+ # enable signal
+ # self.gui_frame.autopost_save.blockSignals(False)
def set_new_hdf_filename(self, time_in_seconds=None,
reanalysis_time_in_seconds=None):
@@ -1067,7 +1050,6 @@ class BaseWindow(QMainWindow):
self.hdf_filename = (self.hdf_dest + self.add_date_to_path(
time_in_seconds, reanalysis_time_in_seconds) + ".h5")
-
def add_date_to_path(self, time_in_seconds=None,
reanalysis_time_in_seconds=None):
@@ -1089,13 +1071,12 @@ class BaseWindow(QMainWindow):
_month = when.strftime("%m")
_day = when.strftime("%d")
- if self.elog_add_date_to_dir:
+ if self.elog_add_date_to_dir:
return str(_year + "/" + _month + "/" + _day + "/" + self.appname +
"_" + _date_label)
else:
return str(self.appname + "_" + _date_label)
-
def verify_save_to_hdf(self):
""" To be called by user from save_to_hdf
A return of True tells the user to continue to next step
@@ -1122,11 +1103,10 @@ class BaseWindow(QMainWindow):
if not self.daq_analysis_completed:
QMessageBox.information(self, "HDF", (
("No data to save to hdf; no measurement undertaken!")),
- QMessageBox.Ok)
+ QMessageBox.Ok)
QApplication.processEvents()
return False
-
if self.hdf_save_completed:
_mess = "Data previously saved to hdf:\n{0}".format(
self.hdf_filename)
@@ -1135,14 +1115,12 @@ class BaseWindow(QMainWindow):
QApplication.processEvents()
return False
-
return True
-
- def add_to_hdf(self, dataH5=None, proc=True, raw=False):
+ def add_to_hdf(self, dataH5=None, proc=True, raw=False):
""" Abstract method to be overwritten by user. Optional.
"""
-
+
'''
QM = QMessageBox()
QM.setText(
@@ -1165,10 +1143,9 @@ class BaseWindow(QMainWindow):
"implemented in this application. \n" +
"If not required, consider removing the " +
"icon from the application/config file."))
- )
+ )
QM.exec()
-
def add_pvs_to_hdf(self, dataH5, top_group="experiment", pv_list=None,
from_hdf=False):
@@ -1189,14 +1166,13 @@ class BaseWindow(QMainWindow):
except TypeError as err:
isOK = False
_mess = ("Error in saving to HDF ['{0}']['{1}']. " +
- "{2}").format(top_group, dt_name, str(err))
+ "{2}").format(top_group, dt_name, str(err))
print(_mess, flush=True)
self.trigger_log_message.emit(
MsgSeverity.WARN.name, _pymodule, _line(), _mess,
- {})
+ {})
return isOK
-
-
+
if from_hdf:
return isOK
@@ -1216,31 +1192,29 @@ class BaseWindow(QMainWindow):
except TypeError as err:
isOK = False
_mess = ("Error in saving to HDF ['{0}']['{1}'] " +
- "{2}").format(dt_name, top_group, str(err))
+ "{2}").format(dt_name, top_group, str(err))
print(_mess, flush=True)
self.trigger_log_message.emit(
- MsgSeverity.WARN.name, _pymodule, _line(), _mess, {})
+ MsgSeverity.WARN.name, _pymodule, _line(), _mess, {})
return isOK
-
-
def add_general_to_hdf(self, dataH5):
isOK = True
user_dict = {}
-
- #user_dict['Comment'] is prefilled in get_data in savehdf.py
- #user_dict['Comment'] = self.hdf_dialog.user_dict[
+
+ #user_dict['Comment'] is prefilled in get_data in savehdf.py
+ # user_dict['Comment'] = self.hdf_dialog.user_dict[
# 'Comment'] if self.hdf_dialog is not None else str(
# "HDF file generated via Save All button")
#user_dict['Comment'] = self.hdf_dialog.comment.document().toPlainText()
if self.hdf_user_dict:
user_dict['Comment'] = self.hdf_user_dict['Comment']
else:
- user_dict['Comment'] = "HDF file generated via Save All button"
+ user_dict['Comment'] = "HDF file generated via Save All button"
user_dict['Author'] = self.author
user_dict['Application'] = self.pymodule
user_dict['Version'] = self.appversion
- #user_dict['Comment'] = comment if comment is not None else str(
+ # user_dict['Comment'] = comment if comment is not None else str(
# "HDF file generated via Save All button")
user_dict['Filepath'] = self.source_file
#user_dict['Process'] = os.getpid()
@@ -1271,9 +1245,8 @@ class BaseWindow(QMainWindow):
"{1}").format(key, str(err))
print(_mess, flush=True)
self.trigger_log_message.emit(
- MsgSeverity.WARN.name, _pymodule, _line(), _mess, {})
+ MsgSeverity.WARN.name, _pymodule, _line(), _mess, {})
return isOK
-
@Slot()
def save_to_hdf_dialog(self):
@@ -1287,7 +1260,7 @@ class BaseWindow(QMainWindow):
input_options = OrderedDict()
if self.all_data is not None:
-
+
ts_in_seconds = self.all_data['Ambient data']['Time in seconds']
now_in_seconds = None
if 'Reanalysis time in seconds' in self.all_data['Processed data']:
@@ -1296,17 +1269,15 @@ class BaseWindow(QMainWindow):
'Reanalysis time in seconds']
self.set_new_hdf_filename(ts_in_seconds, now_in_seconds)
-
input_options['Destination'] = self.hdf_filename
input_options['Time in seconds'] = self.all_data['Ambient data'][
'Time in seconds']
self.hdf_dialog = QSaveHDF(self, input_options=input_options,
from_dialog=True)
-
-
+
def verify_send_to_elog(self):
-
+
if self.analysis_thread is not None:
if self.analysis_thread.isRunning():
_mess = ("Measurement in progress. " +
@@ -1340,7 +1311,7 @@ class BaseWindow(QMainWindow):
""" Response to elog_action; normally overwritten
"""
if not self.verify_send_to_elog():
- return
+ return
'''
if self.analysis_thread is not None:
if self.analysis_thread.isRunning():
@@ -1354,20 +1325,18 @@ class BaseWindow(QMainWindow):
#_elog_sf = ElogSwissFEL()
_logbook = None
- _category_idx = 0 #_elog_sf.category.MEASUREMENT=1
- _domain_idx = 0 #_elog_sf.system.NONE
- _section_idx = 0 #_elog_sf.system.BEAMDYNAMICS=1
+ _category_idx = 0 # _elog_sf.category.MEASUREMENT=1
+ _domain_idx = 0 # _elog_sf.system.NONE
+ _section_idx = 0 # _elog_sf.system.BEAMDYNAMICS=1
_attach_files = []
_message = ""
-
QSendToELOG(self, logbook=_logbook, categoryIdx=_category_idx,
domainIdx=_domain_idx, sectionIdx=_section_idx,
title=self.title, message=_message,
attachFile=_attach_files)
QApplication.processEvents()
-
def initiate_cycling(self, pv_list=[]):
if not pv_list:
return False
@@ -1408,10 +1377,10 @@ class BaseWindow(QMainWindow):
operation='get', pymodule=_pymodule,
line=_line())
if "Cycling" in value_list:
- # _mess = ("Presently cycling quads. " +
- # "\nPlease try again in a few seconds")
- # QMessageBox.information(self, "Verification", _mess,
- # QMessageBox.Ok)
+ # _mess = ("Presently cycling quads. " +
+ # "\nPlease try again in a few seconds")
+ # QMessageBox.information(self, "Verification", _mess,
+ # QMessageBox.Ok)
return True
return False
@@ -1425,7 +1394,7 @@ class BaseWindow(QMainWindow):
while self.is_cycling(pv_cycle_quads):
time.sleep(0.005)
QApplication.processEvents()
- if time.time()-start > timeout:
+ if time.time() - start > timeout:
_mess = ("Timeout ({0}s) reached for Cycling. " +
"\nPlease check set points for " +
"\nDeflector: {1} " +
@@ -1436,7 +1405,6 @@ class BaseWindow(QMainWindow):
qm.warning(self, "Set Optics", _mess, QMessageBox.Ok)
break
-
@Slot()
def set_optics(self):
""" Abstract method to be overwritten by user
@@ -1445,7 +1413,7 @@ class BaseWindow(QMainWindow):
QM.setText(
str(NotImplementedError("set_optics method has not been " +
"implemented in this application. \n"))
- )
+ )
QM.exec()
@Slot()
@@ -1456,15 +1424,14 @@ class BaseWindow(QMainWindow):
QM.setText(
str(NotImplementedError("restore_optics method has not been " +
"implemented in this application. \n"))
- )
+ )
QM.exec()
-
def verify_save_to_epics(self):
""" To be called by user from save_to_epics
"""
if self.all_data:
- #Data from hdf analysis - do not save to epics
+ # Data from hdf analysis - do not save to epics
if 'Reanalysis time' in self.all_data['Processed data']:
if self.all_data['Processed data']['Reanalysis time']:
print("HDF RUN - data not written to epics")
@@ -1511,10 +1478,9 @@ class BaseWindow(QMainWindow):
"implemented in this application. \n" +
"If not required, consider removing the " +
"icon from the application/config file."))
- )
+ )
QM.exec()
-
def send_to_log_window(self, pv_list: list = [], status: int = 1,
status_list: list = [], operation: str = 'set/get',
pymodule=_pymodule, line: int = _line()):
@@ -1534,11 +1500,9 @@ class BaseWindow(QMainWindow):
"See Log window").format(ibad, len(status_list))
self.statusbar.showMessage(_mess)
-
def send_to_epics(self, pv_dict: dict = None, pv_names: list = None,
pv_values: list = None) -> (int, list):
-
if pv_dict is not None:
pv_values = []
pv_names = list(pv_dict.keys())
@@ -1568,14 +1532,14 @@ class BaseWindow(QMainWindow):
status = self.cyca.ICAFE_NORMAL
status_list = []
try:
- status, status_list = self.cafe.setCompoundList(pv_names, pv_values)
- except:
+ status, status_list = self.cafe.setCompoundList(
+ pv_names, pv_values)
+ except BaseException:
print("Exception raised in cafe.setCompoundList", flush=True)
status = self.cyca.ECAFE_BADTYPE
for pv, val in zip(pv_names, pv_values):
print("pv/val", pv, val, flush=True)
status_list.append(self.ECAFE_BADTYPE)
-
if status != self.cyca.ICAFE_NORMAL:
ibad = 0
@@ -1619,7 +1583,7 @@ class BaseWindow(QMainWindow):
self.printer.paperRect().y() +
self.printer.pageRect().height() / 2)
painter.scale(scale, scale)
- painter.translate(-w.width()/2, -w.height()/2)
+ painter.translate(-w.width() / 2, -w.height() / 2)
w.render(painter)
@Slot()
@@ -1678,7 +1642,7 @@ class BaseWindow(QMainWindow):
self.screenshot_titles.clear()
self.screenshot_items.clear()
- ############################### Init
+ # Init
def init_statusbar_wgt(self):
""" Configure statusbar
"""
@@ -1705,7 +1669,7 @@ class BaseWindow(QMainWindow):
layout="Hor")
self.hdf_dock_widget.setObjectName("hdfDockWidget")
self.hdf_dock_widget.setVisible(False)
- #hdfDockWidget.setFloating(True)
+ # hdfDockWidget.setFloating(True)
self.hdf_dock_widget.setContentsMargins(9, 9, 9, 9)
self.h5_groupbox.analyze_h5_widget.clicked.connect(
self.start_hdf_thread)
@@ -1737,7 +1701,7 @@ class BaseWindow(QMainWindow):
settings.setValue("BaseWindow/Geometry", (self.saveGeometry()))
settings.setValue("BaseWindow/State", (self.saveState()))
- #To be overloaded by user
+ # To be overloaded by user
def load_hdf_file(self):
""" load_hdf5 file into analysis dictionary
"""
@@ -1767,31 +1731,31 @@ class BaseWindow(QMainWindow):
_mess, QMessageBox.Ok)
return
- #self.hdf_thread_started()
+ # self.hdf_thread_started()
self.statusbar.showMessage("Loading {0}".format(
self.hdf_filename_loaded))
self.trigger_progressbar_str.emit(
5, "Loading HDF file for analysis")
- #Fill all data from HDF file
+ # Fill all data from HDF file
###hdf_all_data = self.load_hdf_file()
- ###if not hdf_all_data:
- ### self.hdf_thread_finished()
- ### return
+ # if not hdf_all_data:
+ # self.hdf_thread_finished()
+ # return
self.hdf_thread = self.HDFThread(
- self, self.analysis_procedure, all_data=None) #=hdf_all_data
+ self, self.analysis_procedure, all_data=None) # =hdf_all_data
self.hdf_thread.trigger_thread_event.connect(
self.receive_analysis_results)
- #procedure moved above
+ # procedure moved above
self.hdf_thread.started.connect(self.hdf_thread_started)
self.hdf_thread.finished.connect(self.hdf_thread_finished)
self.hdf_thread.start()
QApplication.processEvents()
+ # To be overloaded by user
- #To be overloaded by user
def verify_analysis_preconditions(self):
return True
@@ -1821,22 +1785,19 @@ class BaseWindow(QMainWindow):
if not self.verify_analysis_preconditions():
return
-
-
+
self.analysis_thread = self.AnalysisThread(
self, self.analysis_procedure, self.input_parameters)
-
+
self.analysis_thread.trigger_thread_event.connect(
self.receive_analysis_results)
self.analysis_thread.started.connect(self.analysis_thread_started)
self.analysis_thread.finished.connect(self.analysis_thread_finished)
-
self.analysis_thread.start()
QApplication.processEvents()
-
@Slot()
def analysis_thread_started(self):
""" Change state of widgets when measuring
@@ -1859,7 +1820,6 @@ class BaseWindow(QMainWindow):
"""
self.gui_frame.in_hdf_measurement_procedure()
QApplication.processEvents()
-
@Slot()
def hdf_thread_finished(self):
@@ -1869,64 +1829,73 @@ class BaseWindow(QMainWindow):
QApplication.processEvents()
#print("Thread Finished")
-
@Slot(dict)
def receive_analysis_results(self, all_dict):
self.all_data = all_dict
print("self.all_data", self.all_data.keys(), flush=True)
-
+
self.gui_frame.canvas_update(all_dict['Figure data'])
-
+
if self.gui_frame.results_output_wgt_dict:
#all_dict['Processed data']['Results']={}
- #all_dict['Processed data']['Results']['mean'] = 123.23
- #all_dict['Processed data']['Results']['SD'] = 0.23
+ #all_dict['Processed data']['Results']['mean'] = 123.23
+ #all_dict['Processed data']['Results']['SD'] = 0.23
try:
results_data = all_dict['Processed data']['Results']
self.gui_frame.send_to_results_output_wgt(results_data)
- except:
+ except BaseException:
pass
-
+
#print("IDX+++", self.gui_frame.central_tab_widget.indexOf('Emittance'), flush=True)
#print("IDX+++", self.gui_frame.level2_tab_wgt[0].indexOf('Plots'))
- #self.gui_frame.central_tab_widget.setCurrentIndex(1)
-
- self.gui_frame.results_tab_wgt.setCurrentIndex(0)
-
+ # self.gui_frame.central_tab_widget.setCurrentIndex(1)
+
+ self.gui_frame.results_tab_wgt.setCurrentIndex(0)
+
if "GUITree" in self.settings.data:
- #for j in range(len(self.gui_frame.level1_tab_wgt)):
+ # for j in range(len(self.gui_frame.level1_tab_wgt)):
j = self.gui_frame.central_tab_widget.currentIndex()
- for i in range(self.gui_frame.level1_tab_wgt[j].count()):
- print(j, i, self.gui_frame.level1_tab_wgt[j].tabText(i), flush=True)
+ for i in range(self.gui_frame.level1_tab_wgt[j].count()):
+ print(
+ j,
+ i,
+ self.gui_frame.level1_tab_wgt[j].tabText(i),
+ flush=True)
if self.gui_frame.level1_tab_wgt[j].tabText(i) == "Plots":
self.gui_frame.level1_tab_wgt[j].setCurrentIndex(i)
else:
pass
else:
-
+
for i in range(self.gui_frame.central_tab_widget.count()):
- print(i, self.gui_frame.central_tab_widget.tabText(i), flush=True)
+ print(
+ i,
+ self.gui_frame.central_tab_widget.tabText(i),
+ flush=True)
if self.gui_frame.central_tab_widget.tabText(i) == "Plots":
self.gui_frame.central_tab_widget.setCurrentIndex(i)
else:
pass
for i in range(self.gui_frame.measurement_tab_wgt.count()):
- print(i, self.gui_frame.measurement_tab_wgt.tabText(i), flush=True)
+ print(
+ i,
+ self.gui_frame.measurement_tab_wgt.tabText(i),
+ flush=True)
if self.gui_frame.measurement_tab_wgt.tabText(i) == "Plots":
self.gui_frame.measurement_tab_wgt.setCurrentIndex(i)
else:
- pass
+ pass
for i in range(self.gui_frame.results_tab_wgt.count()):
print(i, self.gui_frame.results_tab_wgt.tabText(i), flush=True)
if self.gui_frame.results_tab_wgt.tabText(i) == "Plots":
self.gui_frame.results_tab_wgt.setCurrentIndex(i)
else:
- pass
+ pass
- print("receive_analysis_results=========================>", flush=True)
+ print("receive_analysis_results=========================>", flush=True)
@Slot()
def receive_abort_analysis(self):
@@ -1937,10 +1906,9 @@ class BaseWindow(QMainWindow):
self.gui_frame.in_abort_procedure()
# Trigger abort signal to the analysis thread
self.analysis_procedure.trigger_abort.emit()
- #self.trigger_progressbar.emit(PROGRESS_THREAD_ABORTING)
+ # self.trigger_progressbar.emit(PROGRESS_THREAD_ABORTING)
QApplication.processEvents()
-
@Slot(str, str, int, str, dict)
def receive_log_message(self, severity, module, line, message, options={}):
'''Receive message from thread for routing to log window'''
@@ -1955,7 +1923,7 @@ class BaseWindow(QMainWindow):
'''Receives update of message'''
self.progressbar.setVisible(True)
try:
- if self.input_parameters["simulation"] :
+ if self.input_parameters["simulation"]:
self.progressbar_color = self.progressbar_simulation
except KeyError:
pass
@@ -1984,7 +1952,7 @@ class BaseWindow(QMainWindow):
mess = "Aborting measurement procedure"
self.show_log_message(
MsgSeverity.WARN.name, _pymodule, _line(), mess)
- #self.statusbar.showMessage(mess)
+ # self.statusbar.showMessage(mess)
elif value == PROGRESS_THREAD_ABORTED:
self.progressbar.setFormat("Procedure aborted")
self.progressbar.setObjectName(self.progressbar_abort)
@@ -2008,7 +1976,7 @@ class BaseWindow(QMainWindow):
self.progressbar.setObjectName(self.progressbar_color)
self.daq_analysis_completed = True
if self.autopost_hdf:
- self.hdf_save_completed = False
+ self.hdf_save_completed = False
QTimer.singleShot(2000, lambda: self.progressbar.setVisible(False))
else:
self.progressbar.setFormat(message)
@@ -2018,7 +1986,6 @@ class BaseWindow(QMainWindow):
self.progressbar.style().polish(self.progressbar)
QApplication.processEvents()
time.sleep(0.0001)
-
def initialize_application(self, appname=_appname, delay=None,
facility=Facility.SwissFEL):
@@ -2046,7 +2013,7 @@ class BaseWindow(QMainWindow):
print("FACILITY PROSCAN")
elif facility == Facility.ESS:
from pyqtacc.qrc_resources.facility.ess.pyrcc5 import qrc_resources
- print("FACILITY ESS")
+ print("FACILITY ESS")
else:
print("Unknown Facility; assuming SLS")
from pyqtacc.qrc_resources.facility.sls.pyrcc5 import qrc_resources
@@ -2063,10 +2030,10 @@ class BaseWindow(QMainWindow):
parser.add_argument("-f", "--facility")
parser.add_argument("-u", "--user")
#result, unknown = parser.parse_known_args(["--qss", ":/sfop.qss"])
- #result, unknown = parser.parse_known_args(["--qss", ":/sfop.qss",
- #"-c", "--facility", "--user"])
- #print(result)
- #print(unknown)
+ # result, unknown = parser.parse_known_args(["--qss", ":/sfop.qss",
+ # "-c", "--facility", "--user"])
+ # print(result)
+ # print(unknown)
result = parser.parse_args()
if result.qss:
print("qss file {0} supplied by user".format(result.qss))
@@ -2099,21 +2066,19 @@ class BaseWindow(QMainWindow):
font-size:20px; margin-right:22px;'>
This message will self-destruct in {1} seconds
", i, j, k, title3) - self.level2_tab_wgt[i][j].addTab(self.results_wgt_2, title3) + self.level2_tab_wgt[i][j].addTab( + self.results_wgt_2, title3) else: print("LEVEL2/3=============>", i, j, k, title3) - self.level2_tab_wgt[i][j].addTab(self.level3_wgt[i][j][k], title3) - - if not is_plot: - self.level1_tab_wgt[i].addTab(self.level2_wgt[i][j], title2) + self.level2_tab_wgt[i][j].addTab( + self.level3_wgt[i][j][k], title3) + + if not is_plot: + self.level1_tab_wgt[i].addTab( + self.level2_wgt[i][j], title2) else: - #if i == 1 and j==0: + # if i == 1 and j==0: # print("////", i, flush=True) - # self.level1_tab_wgt[i].addTab(self.results_wgt_2, title2) - #else: + # self.level1_tab_wgt[i].addTab( + # self.results_wgt_2, title2) + # else: # print("//=", i, flush=True) - + self.level1_tab_wgt[i].addTab(self.results_wgt, title2) - layout2 = QGridLayout() #self.level1_wgt[i]) + layout2 = QGridLayout() # self.level1_wgt[i]) layout2.addWidget(self.level2_tab_wgt[i][j]) - layout2.addWidget(QFrame()) #Add to stop streching of Measurement Tab - - layout2.setContentsMargins(_margin, _margin, _margin, _margin) + # Add to stop streching of Measurement Tab + layout2.addWidget(QFrame()) + + layout2.setContentsMargins( + _margin, _margin, _margin, _margin) self.level2_wgt[i][j].setLayout(layout2) - - - layout = QGridLayout() #self.level1_wgt[i]) + + layout = QGridLayout() # self.level1_wgt[i]) layout.addWidget(self.level1_tab_wgt[i], 1, 0, 1, 20) self.level1_wgt[i].setLayout(layout) layout.setContentsMargins(_margin, _margin, _margin, _margin) self.central_tab_widget.addTab(self.level1_wgt[i], title) - - - #***How to get to the widgets within the lowest level tabs*** + # ***How to get to the widgets within the lowest level tabs*** #lo = QHBoxLayout() - #lo.addWidget(QLabel('TEST')) - #self.gui_frame.level2_tab_wgt[1][0].widget(0).setLayout(lo) - #self.gui_frame.level3_wgt[1][0][0].setLayout(lo) - - #if "GUI" in self.settings.data: - #self.central_tab_widget.addTab( - ## self.level1_tab_wgt[1].addTab( - ## self.results_wgt, self.settings.data["GUI"]["resultsTabTitle"]) - + # lo.addWidget(QLabel('TEST')) + # self.gui_frame.level2_tab_wgt[1][0].widget(0).setLayout(lo) + # self.gui_frame.level3_wgt[1][0][0].setLayout(lo) + + # if "GUI" in self.settings.data: + # self.central_tab_widget.addTab( + # self.level1_tab_wgt[1].addTab( + # self.results_wgt, self.settings.data["GUI"]["resultsTabTitle"]) + self.central_tab_widget.addTab(self.log_wgt, "Log") self.operator_wgt = self.level3_wgt[0][0][0] self.expert_wgt = self.level3_wgt[0][0][1] self.measurement_tab_wgt = self.level2_tab_wgt[0][0] self.measurement_wgt = self.level2_wgt[0][0] - + def init_central_tab_widget(self): """ Add tabs to central widget """ self.central_tab_widget.setFont(self.font_gui) self.central_tab_widget.addTab(self.measurement_wgt, "Measurement") - - #if "GUITree" in self.settings.data: + + # if "GUITree" in self.settings.data: # tab = list(self.settings.data["GUITree"].keys())[0] # self.central_tab_widget.addTab(self.measurement_wgt, tab) @@ -421,31 +433,32 @@ class GUIFrame(QWidget): def init_measurement_tab_wgt(self): """ Add tabs to measurement widget """ - row_idx = 0 + row_idx = 0 column_idx = 0 no_rows = 1 no_columns = 1 try: - layout_parameters = self.settings.data["MeasurementGridLayout"] + layout_parameters = self.settings.data['MeasurementGridLayout'] row_idx = layout_parameters[0] column_idx = layout_parameters[1] no_rows = layout_parameters[2] no_columns = layout_parameters[3] except KeyError: pass - + self.measurement_tab_wgt.setFont(self.font_gui) - self.measurement_tab_wgt.addTab(self.operator_wgt, "Operator") - self.measurement_tab_wgt.addTab(self.expert_wgt, "Expert") + self.measurement_tab_wgt.addTab(self.operator_wgt, 'Operator') + self.measurement_tab_wgt.addTab(self.expert_wgt, 'Expert') self.measurement_layout.addWidget( self.measurement_tab_wgt, row_idx, column_idx, no_rows, no_columns) + def init_results_tab_wgt(self): """ Add canvas tabs for plots/results """ - + self.results_tab_wgt.setFont(self.font_gui) - + for i, (wgt, subtitle) in enumerate(zip(self.sub_results_wgt, self.results_tab_wgt_titles)): @@ -458,22 +471,21 @@ class GUIFrame(QWidget): wgt.setLayout(self.sub_results_layout[i]) top_layout.addWidget(wgt) - #top_layout.addWidget(QLabel("HERE")) + # top_layout.addWidget(QLabel("HERE")) top_widget.setLayout(top_layout) self.results_tab_wgt.addTab(top_widget, subtitle) - + self.results_layout.addWidget(self.results_tab_wgt) - - + def init_results_tab_wgt_2(self): """ Add canvas tabs for plots/results """ self.results_tab_wgt_2.setFont(self.font_gui) - + for i, (wgt, subtitle) in enumerate(zip(self.sub_results_wgt_2, self.results_tab_wgt_titles_2)): - + top_widget = QWidget(self.results_tab_wgt_2) top_layout = QVBoxLayout() self.sub_results_layout_2[i] = QVBoxLayout() @@ -482,21 +494,20 @@ class GUIFrame(QWidget): top_layout.addWidget(self.get_arrow_button_widget(i)) wgt.setLayout(self.sub_results_layout_2[i]) - + top_layout.addWidget(wgt) - #top_layout.addWidget(QLabel("THERE")) + # top_layout.addWidget(QLabel("THERE")) top_widget.setLayout(top_layout) self.results_tab_wgt_2.addTab(top_widget, subtitle) - + self.results_layout_2.addWidget(self.results_tab_wgt_2) - def show_log_message(self, severity=None, pymodule="", lineno=0, message="", options=None): """ Post to log window """ source = "{0}:{1:d} ".format(pymodule, lineno) - #datetime.utcnow() + # datetime.utcnow() message_to_send = datetime.now().strftime( "%Y-%m-%d %H:%M:%S.%f")[:-5] message_to_send += " " @@ -504,8 +515,8 @@ class GUIFrame(QWidget): message_to_send += severity.name elif severity in self.msg_severity_qcolor.keys(): message_to_send += str(severity) - elif str(severity) == "WARNING": - message_to_send += "WARN" + elif str(severity) == 'WARNING': + message_to_send += 'WARN' message_to_send += (" {" + source + message + "} ") if options: for k, v in options.items(): @@ -518,42 +529,42 @@ class GUIFrame(QWidget): self.log_wgt.item(0).setForeground( self.msg_severity_qcolor.get(severity, QColor(8, 8, 8))) + # Top level groups - #Top level groups def analysis_procedure_group(self): """ Procedure group box """ if 'V' in self.orientation_procedure.upper(): - _width = 208 - _height = 196 + _width = 208 + _height = 206 else: - _width = 508 + _width = 508 _height = 106 - group_box = QGroupBox("Procedure") - group_box.setObjectName("OUTER") + group_box = QGroupBox('Procedure') + group_box.setObjectName('OUTER') vbox = QVBoxLayout() vbox.addLayout(self.create_analysis_wgt()) vbox.setContentsMargins(9, 19, 9, 9) vbox.setSpacing(5) - vbox.setAlignment(Qt.AlignmentFlag(Qt.AlignTop|Qt.AlignHCenter)) + vbox.setAlignment(Qt.AlignmentFlag(Qt.AlignTop | Qt.AlignHCenter)) group_box.setMaximumWidth(_width) - group_box.setMinimumHeight(_height) + group_box.setFixedHeight(_height) group_box.setFont(self.font_gui) - group_box.setAlignment(Qt.AlignmentFlag(Qt.AlignTop|Qt.AlignHCenter)) + group_box.setAlignment(Qt.AlignmentFlag(Qt.AlignTop | Qt.AlignHCenter)) group_box.setLayout(vbox) return group_box def optics_groupbox(self): """ Optice set and restore group box """ - self.optics_group = QGroupBox("Optics") - self.optics_group.setObjectName("OUTER") + self.optics_group = QGroupBox('Optics') + self.optics_group.setObjectName('OUTER') self.optics_group.setMaximumWidth(208) self.optics_group.setMaximumHeight(220) self.optics_group.setFont(self.font_gui) self.optics_group.setAlignment( - Qt.AlignmentFlag(Qt.AlignTop|Qt.AlignHCenter)) + Qt.AlignmentFlag(Qt.AlignTop | Qt.AlignHCenter)) self.optics_group.setAlignment(Qt.AlignCenter) self.optics_group.setLayout(self.create_optics_layout()) self.optics_group.table = None @@ -563,48 +574,48 @@ class GUIFrame(QWidget): self.optics_group.cycle_quads = None return self.optics_group - def output_parameters_group(self, title="Results Output"): + def output_parameters_group(self, title='Results Output'): """ Generic group box for user supplied input """ self.output_parameters_wgt = QWidget() qtop = QVBoxLayout() self.output_parameters_group_box = QGroupBox(title) - self.output_parameters_group_box.setObjectName("OUTER") + self.output_parameters_group_box.setObjectName('OUTER') vbox = QVBoxLayout() vbox.setContentsMargins(9, 19, 9, 9) - vbox.setAlignment(Qt.AlignmentFlag(Qt.AlignTop|Qt.AlignHCenter)) + vbox.setAlignment(Qt.AlignmentFlag(Qt.AlignTop | Qt.AlignHCenter)) keys = self.settings.data["Results"].keys() max_str_len = 4 for key in keys: if len(key) > max_str_len: max_str_len = len(key) - + for key in keys: - ikey = self.settings.data["Results"][key] - + ikey = self.settings.data['Results'][key] + if ikey['flag']: - _widget = ikey["data"]["widget"].upper() - _text = ikey["data"]["text"] - _value = str(ikey["data"]["value"]) - _width = int(ikey["data"]["width"]) - if _widget == "QLINEEDIT": + _widget = ikey['data']['widget'].upper() + _text = ikey['data']["text"] + _value = str(ikey['data']['value']) + _width = int(ikey['data']['width']) + if _widget == 'QLINEEDIT': ql = QLabel(str(_text)) - _label_width = (ql.fontMetrics().averageCharWidth() * - max_str_len+2) + _label_width = (ql.fontMetrics().averageCharWidth() * + max_str_len + 2) ql.setMinimumWidth(_label_width) ql.setFixedHeight(self.widget_height) ql.setFont(self.font_pts10) - + wgt = QLineEdit() wgt.setFixedWidth(_width) - wgt.setObjectName("ReadRight") + wgt.setObjectName('ReadRight') wgt.setFixedHeight(self.widget_height) wgt.setFont(self.font_pts10) wgt.setAlignment(Qt.AlignRight) self.results_output_wgt_dict[key] = wgt if "NONE" not in _value.upper(): self.results_output_wgt_dict[key].setText(_value) - + hbox = QHBoxLayout() hbox.setContentsMargins(0, 0, 0, 0) hbox.addWidget(ql) @@ -615,11 +626,11 @@ class GUIFrame(QWidget): self.output_parameters_group_box.setContentsMargins(9, 19, 9, 9) self.output_parameters_group_box.setMinimumWidth(140) self.output_parameters_group_box.setMaximumWidth(300) - #self.output_parameters_group_box.setMaximumHeight(400) + # self.output_parameters_group_box.setMaximumHeight(400) self.output_parameters_group_box.setFont(self.font_gui) self.output_parameters_group_box.setAlignment( - Qt.AlignmentFlag(Qt.AlignTop|Qt.AlignHCenter)) - + Qt.AlignmentFlag(Qt.AlignTop | Qt.AlignHCenter)) + qf = QFrame() qf.setFixedHeight(35) self.output_parameters_group_box.setLayout(vbox) @@ -631,7 +642,6 @@ class GUIFrame(QWidget): def send_to_results_output_wgt(self, results_data): for key, value in results_data.items(): self.results_output_wgt_dict[key].setText(str(value)) - def input_parameters_group(self, title="Input Parameters"): """ Generic group box for user supplied input @@ -640,12 +650,12 @@ class GUIFrame(QWidget): group_box.setObjectName("OUTER") hbox = QVBoxLayout() hbox.setContentsMargins(9, 19, 9, 9) - hbox.setAlignment(Qt.AlignmentFlag(Qt.AlignTop|Qt.AlignHCenter)) + hbox.setAlignment(Qt.AlignmentFlag(Qt.AlignTop | Qt.AlignHCenter)) group_box.setContentsMargins(0, 0, 0, 0) group_box.setMinimumWidth(200) group_box.setMaximumHeight(400) group_box.setFont(self.font_gui) - group_box.setAlignment(Qt.AlignmentFlag(Qt.AlignTop|Qt.AlignHCenter)) + group_box.setAlignment(Qt.AlignmentFlag(Qt.AlignTop | Qt.AlignHCenter)) group_box.setLayout(hbox) return group_box @@ -661,7 +671,6 @@ class GUIFrame(QWidget): self.expert_parameters_group = self.input_parameters_group(title) return self.expert_parameters_group - def create_checkbox(self, top_key, key, text="", tip="", default_value=Qt.Unchecked): """ Generic check box @@ -670,26 +679,23 @@ class GUIFrame(QWidget): def on_checkbox_change(value): self.input_parameters[key] = bool(value) #print("CB fired") - #print(self.input_parameters[key]) - #print(self.input_parameters) - if key == "goodRegion": + # print(self.input_parameters[key]) + # print(self.input_parameters) + if key == 'goodRegion': self.good_region_group.setEnabled(value) - - - checkbox = QCheckBox(text) - + checkbox.setToolTip(tip) checkbox.setFont(self.font_gui) checkbox.stateChanged.connect(on_checkbox_change) - #checkbox.setFixedHeight(30) - #checkbox.setLayoutDirection(Qt.RightToLeft) + # checkbox.setFixedHeight(30) + # checkbox.setLayoutDirection(Qt.RightToLeft) checked_value = default_value if key in self.parent.input_parameters.keys(): - if "data" in self.settings.data[top_key][key].keys(): - if "value" in self.settings.data[top_key][key]["data"].keys(): - if self.settings.data[top_key][key]["data"]["value"]: + if 'data' in self.settings.data[top_key][key].keys(): + if 'value' in self.settings.data[top_key][key]['data'].keys(): + if self.settings.data[top_key][key]['data']['value']: checked_value = Qt.Checked else: checked_value = Qt.Unchecked @@ -705,7 +711,6 @@ class GUIFrame(QWidget): step=0.1, start_val=0.5, digits=1): """ Generic QDoubleSpinbox with buddy label """ - def callback(value): self.input_parameters[key] = round(value, digits) @@ -722,7 +727,7 @@ class GUIFrame(QWidget): wgt.setFont(self.font_pts10) wgt.setContentsMargins(5, 0, 0, 0) decimal = Decimal(str(step)) - wgt.setDecimals(abs(decimal.as_tuple().exponent)) #precision + wgt.setDecimals(abs(decimal.as_tuple().exponent)) # precision wgt.setRange(min_val, max_val) wgt.setSingleStep(step) fm = QFontMetricsF(wgt.font()) @@ -736,7 +741,6 @@ class GUIFrame(QWidget): return lab, wgt - def create_label_qspinbox(self, key, label="", min_val=0, max_val=100, step=1, start_val=5): """ Generic QSpinbox with buddy label @@ -745,7 +749,6 @@ class GUIFrame(QWidget): def cb(value): self.input_parameters[key] = value - widget_height = 24 suggested = "WWW" lab = QLabel(label) @@ -771,16 +774,15 @@ class GUIFrame(QWidget): return lab, wgt - def create_label_qcombobox(self, key, label="", values: list = [], - start_val: str =""): + start_val: str = ""): """ Generic QCombobox with buddy label """ def cb(new_text): self.input_parameters[key] = new_text #print( self.input_parameters) - + widget_height = 26 suggested = "WWW" lab = QLabel(label) @@ -796,7 +798,7 @@ class GUIFrame(QWidget): wgt.setFont(self.font_pts10) wgt.setContentsMargins(5, 0, 0, 0) wgt.currentTextChanged.connect(cb) - + start_idx = wgt.findText(start_val) start_idx = start_idx if start_idx > 0 else 0 wgt.setCurrentIndex(start_idx) @@ -830,18 +832,17 @@ class GUIFrame(QWidget): abort_tooltip) self.save_all_wgt = self.save_all_group() - + grid = QVBoxLayout() if 'V' in self.orientation_procedure.upper() \ else QHBoxLayout() - + grid.addWidget(self.start_wgt) grid.addWidget(self.abort_wgt) grid.addWidget(self.save_all_wgt) - grid.setAlignment(Qt.AlignmentFlag(Qt.AlignLeft|Qt.AlignTop)) + grid.setAlignment(Qt.AlignmentFlag(Qt.AlignLeft | Qt.AlignTop)) return grid - def create_optics_layout(self): vbox = QGridLayout() self.set_optics_btn = QPushButton("Set") @@ -862,7 +863,7 @@ class GUIFrame(QWidget): self.restore_optics_btn.setToolTip(_tip) self.target_optics = QLabel() - #self.target_optics.setText(_text) + # self.target_optics.setText(_text) self.target_optics.setFixedWidth(150) self.target_optics.setFixedHeight(40) self.target_optics.setStyleSheet("background-color:white;") @@ -890,19 +891,17 @@ class GUIFrame(QWidget): for table in self.table_wgt: table.init_value_button.setEnabled(False) table.restore_value_button.setEnabled(False) - + if self.output_parameters_wgt is not None: for wgt in self.results_output_wgt_dict.values(): wgt.setText("") - #self.output_parameters_wg.setEnabled(False) - + # self.output_parameters_wg.setEnabled(False) def in_abort_procedure(self): self.abort_wgt.setEnabled(False) self.start_wgt.setEnabled(False) self.start_wgt.setText("Aborting...") - def reset_procedure(self): self.abort_wgt.setVisible(False) @@ -918,7 +917,7 @@ class GUIFrame(QWidget): for table in self.table_wgt: table.init_value_button.setEnabled(True) table.restore_value_button.setEnabled(True) - #if self.output_parameters_wgt is not None: + # if self.output_parameters_wgt is not None: # self.output_parameters_wgt.setEnabled(True) def in_hdf_measurement_procedure(self): @@ -927,7 +926,6 @@ class GUIFrame(QWidget): self.start_wgt.setEnabled(False) self.start_wgt.setText("HDF analysis...") self.save_all_group_box.setEnabled(False) - def hdf_reset_procedure(self): self.parent.h5_groupbox.analyze_h5_widget.setEnabled(True) @@ -962,7 +960,7 @@ class GUIFrame(QWidget): start_wgt.setVisible(True) return start_wgt - def combine_save_icons(self): #epics=False, hdf=False, elog=False): + def combine_save_icons(self): # epics=False, hdf=False, elog=False): epics = self.autopost_epics hdf = self.autopost_hdf elog = self.autopost_elog @@ -987,7 +985,7 @@ class GUIFrame(QWidget): elif hdf: startx2 = 75 startx3 = 225 - comboPixmap = QPixmap(420, 100) #420, 100 + comboPixmap = QPixmap(420, 100) # 420, 100 comboPixmap.fill(Qt.transparent) epicsImage = QPixmap(":/epics.png") hdfImage = QPixmap(":/hdfS.png") @@ -1003,22 +1001,23 @@ class GUIFrame(QWidget): painter.end() return combinedIcon - def post_measurement_save_button(self): # epics=True, hdf=True, elog=True): - epics = self.autopost_epics #= epics - hdf = self.autopost_hdf #= hdf - elog = self.autopost_elog #= elog + # epics=True, hdf=True, elog=True): + def post_measurement_save_button(self): + epics = self.autopost_epics # = epics + hdf = self.autopost_hdf # = hdf + elog = self.autopost_elog # = elog widget_height = 40 true_list = [epics, hdf, elog] widget_width = max(75, 45 * true_list.count(True)) save_data_btn = QPushButton("") save_data_btn.setIconSize(QSize(100, 38)) save_data_btn.setIcon(self.combine_save_icons()) - #epics=epics, hdf=hdf, elog=elog)) + # epics=epics, hdf=hdf, elog=elog)) save_data_btn.setFixedHeight(widget_height) save_data_btn.setObjectName("WriteData") save_data_btn.clicked.connect(self.parent.write_to_destinations) save_data_btn.setFixedHeight(widget_height) - save_data_btn.setFixedWidth(widget_width) #80 for one + save_data_btn.setFixedWidth(widget_width) # 80 for one if epics and hdf and elog: choices = "epics/hdf5/elog" elif epics and hdf: @@ -1042,12 +1041,12 @@ class GUIFrame(QWidget): hbox = QVBoxLayout() hbox.addWidget(self.post_measurement_save_button()) hbox.setContentsMargins(9, 19, 9, 9) - hbox.setAlignment(Qt.AlignmnetFlag(Qt.AlignTop|Qt.AlignHCenter)) + hbox.setAlignment(Qt.AlignmnetFlag(Qt.AlignTop | Qt.AlignHCenter)) group_box.setContentsMargins(0, 0, 0, 0) group_box.setFixedWidth(208) group_box.setMaximumHeight(130) group_box.setFont(self.font_gui) - group_box.setAlignment(Qt.AlignmnetFlag(Qt.AlignTop|Qt.AlignHCenter)) + group_box.setAlignment(Qt.AlignmnetFlag(Qt.AlignTop | Qt.AlignHCenter)) group_box.setLayout(hbox) return group_box @@ -1063,35 +1062,34 @@ class GUIFrame(QWidget): self.save_all_group_box.setFixedHeight(60) self.save_all_group_box.setFont(self.font_gui) self.save_all_group_box.setAlignment( - Qt.AlignmentFlag(Qt.AlignTop|Qt.AlignHCenter)) + Qt.AlignmentFlag(Qt.AlignTop | Qt.AlignHCenter)) self.save_all_group_box.setLayout(hbox) return self.save_all_group_box - def image_parameters_group(self): self.pipeline_group_box = QGroupBox("Image Pipeline Expert") box = QHBoxLayout() box.setSpacing(10) try: - start_val_gr = self.settings.data["Expert"]["pipeline"]["data"][ + start_val_gr = self.settings.data['Expert']["pipeline"]['data'][ "goodRegion"] start_val_gr = Qt.Checked if start_val_gr else Qt.Unchecked except KeyError as ex: start_val_gr = Qt.Unchecked box.addWidget(self.create_checkbox( - top_key="Expert", key="goodRegion", text="Good region", + top_key='Expert', key="goodRegion", text="Good region", tip="Enables good region in pipeline", default_value=start_val_gr)) try: - start_val_sub = self.settings.data["Expert"]["pipeline"]["data"][ + start_val_sub = self.settings.data['Expert']["pipeline"]['data'][ "subtractBackground"] start_val_sub = Qt.Checked if start_val_sub else Qt.Unchecked except KeyError as ex: start_val_sub = Qt.Unchecked box.addWidget(self.create_checkbox( - top_key="Expert", key="subtractBackground", + top_key='Expert', key="subtractBackground", text="Subtract bkgrnd", tip="Enables background subtraction in pipeline", default_value=start_val_sub)) @@ -1102,17 +1100,17 @@ class GUIFrame(QWidget): self.good_region_group.setObjectName("INNER") try: - start_val_grThreshold = self.settings.data["Expert"]["pipeline"][ - "data"]["grThreshold"] + start_val_grThreshold = self.settings.data['Expert']["pipeline"][ + 'data']["grThreshold"] except KeyError as ex: start_val_grThreshold = 21 lab_thresh, thresh = self.create_label_qdoublespinbox( - key="grThreshold", label="Threshold:", + key="grThreshold", label="Threshold:", start_val=start_val_grThreshold) try: - start_val_grScale = self.settings.data["Expert"]["pipeline"][ - "data"]["grScale"] + start_val_grScale = self.settings.data['Expert']["pipeline"][ + 'data']["grScale"] except KeyError as ex: start_val_grScale = 6 lab_gfscale, gfscale = self.create_label_qspinbox( @@ -1125,29 +1123,28 @@ class GUIFrame(QWidget): layout.addWidget(gfscale, 1, 1) self.good_region_group.setLayout(layout) - self.slicing_group.setObjectName("INNER") try: - start_val_nslices = self.settings.data["Expert"]["pipeline"][ - "data"]["slices"] + start_val_nslices = self.settings.data['Expert']["pipeline"][ + 'data']["slices"] except KeyError as ex: start_val_nslices = 21 lab_slices, slices = self.create_label_qspinbox( key="slices", label="No. Slices:", start_val=start_val_nslices) try: - start_val_slicing_scale = self.settings.data["Expert"]["pipeline"][ - "data"]["slicingScale"] + start_val_slicing_scale = self.settings.data['Expert']["pipeline"][ + 'data']["slicingScale"] except KeyError as ex: start_val_slicing_scale = 5 lab_scale, scale = self.create_label_qspinbox( - key="slicingScale", label="Scale:", + key="slicingScale", label="Scale:", start_val=start_val_slicing_scale) try: - start_val_orientation = self.settings.data["Expert"]["pipeline"][ - "data"]["orientation"] + start_val_orientation = self.settings.data['Expert']["pipeline"][ + 'data']["orientation"] except KeyError as ex: start_val_orientation = "vertical" @@ -1162,43 +1159,37 @@ class GUIFrame(QWidget): layout.addWidget(lab_scale, 1, 0) layout.addWidget(scale, 1, 1) layout.addWidget(lab_orientation, 2, 0, 1, 2, Qt.AlignBottom) - layout.addWidget(self.slice_orientation, 3, 0, 1, 2, - Qt.AlignmentFlag(Qt.AlignTop|Qt.AlignRight)) + layout.addWidget(self.slice_orientation, 3, 0, 1, 2, + Qt.AlignmentFlag(Qt.AlignTop | Qt.AlignRight)) self.slicing_group.setLayout(layout) layout_top = QGridLayout() - #layout_top.addWidget(self.create_checkbox( - # top_key="Expert", key="pipelineCtrl", + # layout_top.addWidget(self.create_checkbox( + # top_key='Expert', key="pipelineCtrl", # text="Enable pipeline control from HLA", # tip="HLA to set pipeline parameters", # default_value=0), 0, 0, 1, 2) - layout_top.addLayout(box, 1, 0, 1, 2) layout_top.addWidget(self.good_region_group, 2, 0, 1, 1, - Qt.AlignmentFlag(Qt.AlignHCenter|Qt.AlignTop)) - layout_top.addWidget(self.slicing_group, 2, 1, 1, 1, - Qt.AlignmentFlag(Qt.AlignCenter|Qt.AlignTop)) + Qt.AlignmentFlag(Qt.AlignHCenter | Qt.AlignTop)) + layout_top.addWidget(self.slicing_group, 2, 1, 1, 1, + Qt.AlignmentFlag(Qt.AlignCenter | Qt.AlignTop)) layout_top.setHorizontalSpacing(8) self.pipeline_group_box.setLayout(layout_top) self.pipeline_group_box.setFixedHeight(200) - if "HLAPipelineCtrl" in self.parent.input_parameters: - self.pipeline_group_box.setEnabled( - self.parent.input_parameters["HLAPipelineCtrl"]) + if "HLAPipelineCtrl" in self.parent.input_parameters: + self.pipeline_group_box.setEnabled( + self.parent.input_parameters["HLAPipelineCtrl"]) return self.pipeline_group_box - - - - def checkbox_wgt(self, key: str = "", tooltip: str = "", object_name=None, hline="NONE"): def on_change(state): self.input_parameters[key] = bool(state) - widget = QWidget() layout = QGridLayout() @@ -1208,11 +1199,11 @@ class GUIFrame(QWidget): layout.addWidget(QHLine(), 0, 0, 1, 3) row_wgt = 1 try: - text = self.settings.data["Expert"][key]["data"]["text"] + text = self.settings.data['Expert'][key]['data']["text"] except KeyError as error: print(("KeyError in guiframe.py; Unknown key {0} " + "in def checkbox_wgt: {1}").format(key, error)) - text = key + text = key checkbox = QCheckBox(text) checkbox.setToolTip(tooltip) @@ -1220,17 +1211,17 @@ class GUIFrame(QWidget): if object_name: checkbox.setObjectName(object_name) - checkbox.setLayoutDirection(Qt.LeftToRight) #is default + checkbox.setLayoutDirection(Qt.LeftToRight) # is default checkbox.stateChanged.connect(on_change) checked_value = Qt.Unchecked - if "Expert" not in self.settings.data: + if 'Expert' not in self.settings.data: return widget - #if key in self.parent.input_parameters.keys(): - if key in self.settings.data["Expert"].keys(): - if "data" in self.settings.data["Expert"][key].keys(): - if "value" in self.settings.data["Expert"][key]["data"].keys(): - if self.settings.data["Expert"][key]["data"]["value"]: + # if key in self.parent.input_parameters.keys(): + if key in self.settings.data['Expert'].keys(): + if 'data' in self.settings.data['Expert'][key].keys(): + if 'value' in self.settings.data['Expert'][key]['data'].keys(): + if self.settings.data['Expert'][key]['data']['value']: checked_value = Qt.Checked checkbox.setCheckState(checked_value) @@ -1239,7 +1230,7 @@ class GUIFrame(QWidget): layout.addWidget(QFrame(), row_wgt, 1, 1, 2) if hline == "BOTTOM": - layout.addWidget(QHLine(), row_wgt+1, 0, 1, 3) + layout.addWidget(QHLine(), row_wgt + 1, 0, 1, 3) widget.setLayout(layout) return widget @@ -1256,7 +1247,8 @@ class GUIFrame(QWidget): def checkbox_keepImages(self, hline="None"): tooltip = ("Store plots/images on disk") - return self.checkbox_wgt(key="keepImages", tooltip=tooltip, hline=hline) + return self.checkbox_wgt( + key="keepImages", tooltip=tooltip, hline=hline) def checkbox_autoCycle(self, hline="None"): tooltip = ("Always cycle quads when setting to new values") @@ -1268,7 +1260,6 @@ class GUIFrame(QWidget): self.input_parameters["debug"] = False return self.checkbox_wgt(key="debug", tooltip=tooltip, hline=hline) - def checkbox_simulation(self, hline="NONE"): def on_change(state): if bool(state): @@ -1292,7 +1283,7 @@ class GUIFrame(QWidget): layout.addWidget(QHLine(), 0, 0, 1, 3) row_wgt = 1 try: - text = self.settings.data["Expert"]["simulation"]["data"]["text"] + text = self.settings.data['Expert']["simulation"]['data']["text"] except KeyError as error: print("KeyError in guiframe.py; def checkbox_simulation:", error) text = "Simulation" @@ -1302,16 +1293,16 @@ class GUIFrame(QWidget): self.simulation_checkbox.setToolTip( "Dry-run only; does not write to EPICS Process Variables") self.simulation_checkbox.setFont(self.font_gui) - + self.simulation_checkbox.stateChanged.connect(on_change) checked_value = Qt.Unchecked if "simulation" in self.parent.input_parameters.keys(): - if "data" in self.settings.data["Expert"]["simulation"].keys(): - if "value" in self.settings.data["Expert"]["simulation"][ - "data"].keys(): - if self.settings.data["Expert"]["simulation"]["data"][ - "value"]: + if 'data' in self.settings.data['Expert']["simulation"].keys(): + if 'value' in self.settings.data['Expert']["simulation"][ + 'data'].keys(): + if self.settings.data['Expert']["simulation"]['data'][ + 'value']: checked_value = Qt.Checked self.simulation_checkbox.setCheckState(checked_value) @@ -1319,17 +1310,16 @@ class GUIFrame(QWidget): layout.addWidget(self.simulation_checkbox, row_wgt, 0) layout.addWidget(QFrame(), row_wgt, 1, 1, 2) if hline == "BOTTOM": - layout.addWidget(QHLine(), row_wgt+1, 0, 1, 3) + layout.addWidget(QHLine(), row_wgt + 1, 0, 1, 3) widget.setLayout(layout) return widget - def get_arrow_button_widget(self, parent_idx=0): #Back/Forward Buttons START#### - arrow_button_widget = QWidget() #self.plot_widget[i]) + arrow_button_widget = QWidget() # self.plot_widget[i]) layout = QHBoxLayout() layout.setContentsMargins(0, 0, 0, 0) - layout.setAlignment(Qt.AlignmentFlag(Qt.AlignLeft|Qt.AlignTop)) + layout.setAlignment(Qt.AlignmentFlag(Qt.AlignLeft | Qt.AlignTop)) button_left = QToolButton(arrow_button_widget) button_left.setArrowType(Qt.LeftArrow) button_left.clicked.connect(self.on_toggle_left) @@ -1347,19 +1337,17 @@ class GUIFrame(QWidget): arrow_button_widget.setMaximumHeight(25) return arrow_button_widget - #Back/Forward Buttons Actions - def on_toggle_left(self): #(self, is_clicked) - #print(self.sender()) - #print(self.left_arrow_dict[self.sender()]) + # Back/Forward Buttons Actions + def on_toggle_left(self): # (self, is_clicked) + # print(self.sender()) + # print(self.left_arrow_dict[self.sender()]) self.next_figure(self.left_arrow_dict[self.sender()], -1) - - def on_toggle_right(self): #(self, is_clicked) - #print(self.sender()) - #print(self.right_arrow_dict[self.sender()]) + def on_toggle_right(self): # (self, is_clicked) + # print(self.sender()) + # print(self.right_arrow_dict[self.sender()]) self.next_figure(self.right_arrow_dict[self.sender()], 1) - def next_figure(self, det=0, idx=0): if det not in self.canvas_fig_dict: @@ -1393,40 +1381,38 @@ class GUIFrame(QWidget): self.nav[det].setVisible(True) self.nav[det].setStyleSheet("QToolBar { border: 0px }") - def canvas_update(self, fig_data, idx=0): - #place figures in a list - - self.parent.clear_screenshot() + # place figures in a list + + self.parent.clear_screenshot() self.multiple_figure_dict = fig_data - for i, key in enumerate(self.multiple_figure_dict.keys()): + for i, key in enumerate(self.multiple_figure_dict.keys()): self.canvas_fig_dict[i] = key - + print("UPDATE", flush=True) - #print(len(self.canvas), len(self.nav), len(self.sub_results_layout), + # print(len(self.canvas), len(self.nav), len(self.sub_results_layout), # len(self.multiple_figure_dict.keys(), flush=True)) - + for i, (canvas, nav, wgt, layout, key) in enumerate( zip(self.canvas, self.nav, self.sub_results_wgt, self.sub_results_layout, self.multiple_figure_dict.keys())): - + if canvas is not None: layout.removeWidget(canvas) canvas.deleteLater() if nav is not None: nav.deleteLater() - if self.multiple_figure_dict[key]: #'Figure 1']: - + if self.multiple_figure_dict[key]: # 'Figure 1']: + if not isinstance(self.multiple_figure_dict[key], list): temp_list = [] temp_list.append(self.multiple_figure_dict[key]) self.multiple_figure_dict[key] = temp_list - - + self.canvas[i] = FigureCanvasQTAgg( self.multiple_figure_dict[key][idx]) self.sub_results_layout[i].addWidget(self.canvas[i]) @@ -1437,50 +1423,48 @@ class GUIFrame(QWidget): #self.nav[i].setContentsMargins(0, 0, 0, 0) self.nav[i].setVisible(True) self.nav[i].setStyleSheet("QToolBar { border: 0px }") - + self.parent.add_screenshot(title=self.results_tab_wgt_titles[i], item=wgt) - + else: self.canvas[i] = None self.nav[i] = None - def canvas_update_2(self, fig_data, idx=0): - #place figures in a list - - #Only clear last result fro this canvas - #self.parent.clear_screenshot() - + # place figures in a list + + # Only clear last result fro this canvas + # self.parent.clear_screenshot() + self.multiple_figure_dict_2 = fig_data - for i, key in enumerate(self.multiple_figure_dict_2.keys()): + for i, key in enumerate(self.multiple_figure_dict_2.keys()): self.canvas_fig_dict_2[i] = key - + print("UPDATE==2", flush=True) - #print(len(self.canvas), len(self.nav), len(self.sub_results_layout), + # print(len(self.canvas), len(self.nav), len(self.sub_results_layout), # len(self.multiple_figure_dict.keys(), flush=True)) - + for i, (canvas, nav, wgt, layout, key) in enumerate( zip(self.canvas_2, self.nav_2, self.sub_results_wgt_2, self.sub_results_layout_2, self.multiple_figure_dict_2.keys())): - + if canvas is not None: layout.removeWidget(canvas) canvas.deleteLater() if nav is not None: nav.deleteLater() - if self.multiple_figure_dict_2[key]: #'Figure 1']: - + if self.multiple_figure_dict_2[key]: # 'Figure 1']: + if not isinstance(self.multiple_figure_dict_2[key], list): temp_list = [] temp_list.append(self.multiple_figure_dict_2[key]) self.multiple_figure_dict_2[key] = temp_list - - + self.canvas_2[i] = FigureCanvasQTAgg( self.multiple_figure_dict_2[key][idx]) self.sub_results_layout_2[i].addWidget(self.canvas_2[i]) @@ -1492,24 +1476,23 @@ class GUIFrame(QWidget): #self.nav[i].setContentsMargins(0, 0, 0, 0) self.nav_2[i].setVisible(True) self.nav_2[i].setStyleSheet("QToolBar { border: 0px }") - self.parent.clear_screenshot(self.results_tab_wgt_titles_2[i], - wgt) + self.parent.clear_screenshot(self.results_tab_wgt_titles_2[i], + wgt) self.parent.add_screenshot( title=self.results_tab_wgt_titles_2[i], item=wgt) - + else: self.canvas_2[i] = None self.nav_2[i] = None - - def prepare_qlineread(self, line, value): + def prepare_qlineread(self, line, value): line.setObjectName("Read") line.setFixedHeight(24) line.setText(str(value)) - line.setAlignment(Qt.AlignmentFlag(Qt.AlignRight|Qt.AlignBottom)) + line.setAlignment(Qt.AlignmentFlag(Qt.AlignRight | Qt.AlignBottom)) line.setStyleSheet("QLabel{text-align: right}") fm = QFontMetricsF(line.font()) - param_width = fm.maxWidth() * (len(str(value))*0.5) + 20 + param_width = fm.maxWidth() * (len(str(value)) * 0.5) + 20 line.setMaximumWidth(int(param_width)) def prepare_qlineedit(self, line, value, link, title, key): @@ -1519,31 +1502,30 @@ class GUIFrame(QWidget): is_int = False no_decimals = 0 try: - min_val = self.settings.data[link][title][key]["data"]["min"] + min_val = self.settings.data[link][title][key]['data']["min"] has_min = True if isinstance(min_val, float): is_float = True - d = abs(Decimal(str(min_val)).as_tuple().exponent) + d = abs(Decimal(str(min_val)).as_tuple().exponent) no_decimals = max(no_decimals, d) elif isinstance(min_val, int): is_int = True except KeyError: pass try: - max_val = self.settings.data[link][title][key]["data"]["max"] + max_val = self.settings.data[link][title][key]['data']["max"] has_max = True if isinstance(max_val, float): is_float = True d = abs(Decimal(str(max_val)).as_tuple().exponent) - no_decimals = max(no_decimals, d) + no_decimals = max(no_decimals, d) elif isinstance(max_val, int): is_int = True except KeyError: pass - validator = None - #QDoubleValidate only controls the number of digits + # QDoubleValidate only controls the number of digits if is_float: validator = QDoubleValidator() validator.setNotation(QDoubleValidator.StandardNotation) @@ -1558,98 +1540,98 @@ class GUIFrame(QWidget): if has_max: validator.setTop(max_val) validator_str += "to {}".format(max_val) - line.setToolTip(validator_str) + line.setToolTip(validator_str) line.setValidator(validator) line.setObjectName("Write") - line.setFixedHeight(24) + line.setFixedHeight(24) line.setText(str(value)) fm = QFontMetricsF(line.font()) - param_width = fm.maxWidth() * (len(str(value))*0.5) + 20 + param_width = fm.maxWidth() * (len(str(value)) * 0.5) + 20 line.setMaximumWidth(int(param_width)) return line - def prepare_qspinbox(self, line, value, link, title, key): - min_val = self.settings.data[link][title][key]["data"]["min"] - max_val = self.settings.data[link][title][key]["data"]["max"] - step = self.settings.data[link][title][key]["data"]["step"] + def prepare_qspinbox(self, line, value, link, title, key): + min_val = self.settings.data[link][title][key]['data']["min"] + max_val = self.settings.data[link][title][key]['data']["max"] + step = self.settings.data[link][title][key]['data']["step"] line.setObjectName("Write") line.setFixedHeight(24) line.setRange(min_val, max_val) line.setSingleStep(step) line.setValue(value) - line.setAlignment(Qt.AlignRight) #required + line.setAlignment(Qt.AlignRight) # required fm = QFontMetricsF(line.font()) param_width = fm.maxWidth() * (len(str(max_val)) + 0.2) line.setMaximumWidth(int(param_width)) - return line + return line - def prepare_qdoublespinbox(self, line, value, link, title, key): - min_val = self.settings.data[link][title][key]["data"]["min"] - max_val = self.settings.data[link][title][key]["data"]["max"] - step = self.settings.data[link][title][key]["data"]["step"] + def prepare_qdoublespinbox(self, line, value, link, title, key): + min_val = self.settings.data[link][title][key]['data']["min"] + max_val = self.settings.data[link][title][key]['data']["max"] + step = self.settings.data[link][title][key]['data']["step"] line.setObjectName("Write") line.setFixedHeight(24) decimal = Decimal(str(step)) - line.setDecimals(abs(decimal.as_tuple().exponent)) #precision + line.setDecimals(abs(decimal.as_tuple().exponent)) # precision line.setRange(min_val, max_val) line.setSingleStep(step) line.setValue(value) - line.setAlignment(Qt.AlignRight) #required + line.setAlignment(Qt.AlignRight) # required fm = QFontMetricsF(line.font()) param_width = fm.maxWidth() * (len(str(max_val))) line.setMaximumWidth(int(param_width)) - return line + return line - def prepare_qcombobox(self, line, value, link, title, key): + def prepare_qcombobox(self, line, value, link, title, key): line.clear() line.addItems(value) line.setFixedHeight(26) line.setObjectName("Write") value_for_width = max(value, key=len) fm = QFontMetricsF(line.font()) - param_width = fm.maxWidth() * (len(str(value_for_width)) * 0.5) + param_width = fm.maxWidth() * (len(str(value_for_width)) * 0.5) line.setFixedWidth(int(param_width)) - + return line - def prepare_qcheckbox(self, line, value, link, title, key): - + def prepare_qcheckbox(self, line, value, link, title, key): + line.setChecked(Qt.Checked if value else Qt.Unchecked) line.setMaximumWidth(320) line.setMinimumWidth(100) - line.setFixedHeight(28) + line.setFixedHeight(28) try: - orientation = self.settings.data[link][title][key]["data"][ + orientation = self.settings.data[link][title][key]['data'][ "orientation"] orientation = Qt.RightToLeft if "RightToLeft" in orientation \ - else Qt.LeftToRight - line.setLayoutDirection(orientation) + else Qt.LeftToRight + line.setLayoutDirection(orientation) except KeyError as ex: print(ex, flush=True) - pass + pass return line - def prepare_qradiobutton(self, value, link, title, key): + def prepare_qradiobutton(self, value, link, title, key): widget = QWidget() layout = QGridLayout() layout.setContentsMargins(5, 0, 5, 20) - widget.setMaximumWidth(int(len(value)*100)) - + widget.setMaximumWidth(int(len(value) * 100)) + target_list = value color_list = ["#894961", "teal", "darkblue"] width_list = [70, 70, 70] self.radiobutton = [None] * len(target_list) - for i, name in enumerate(target_list): + for i, name in enumerate(target_list): self.radiobutton[i] = QRadioButton(name) - full_width = len(target_list) + 1 + full_width = len(target_list) + 1 layout.addWidget(QHLine(), 0, 0, 1, full_width) layout.addWidget(QLabel( - self.settings.data[link][title][key]['data']['text']), 1, 0, 1, - full_width, Qt.AlignCenter) + self.settings.data[link][title][key]['data']['text']), 1, 0, 1, + full_width, Qt.AlignCenter) for i, (radio, target, color, width) in enumerate( zip(self.radiobutton, target_list, color_list, width_list)): @@ -1659,9 +1641,9 @@ class GUIFrame(QWidget): radio.val = target radio.title = title radio.key = key - + layout.addWidget(radio, 2, i, 1, 1, Qt.AlignCenter) - + layout.addWidget(QHLine(), 3, 0, 1, layout.columnCount()) layout.setSpacing(0) @@ -1682,13 +1664,13 @@ class GUIFrame(QWidget): _idx=0 try: - if key in self.settings.data["Expert"].keys(): - top_key = "Expert" - elif key in self.settings.data["Parameters"].keys(): - top_key = "Parameters" - _choice =self.settings.data[top_key][key]['data']['default'] + if key in self.settings.data['Expert'].keys(): + top_key = 'Expert' + elif key in self.settings.data['Parameters'].keys(): + top_key = 'Parameters' + _choice =self.settings.data[top_key][key]['data']['default'] _values = self.settings.data[top_key][key]['data']['value'] - if isinstance(_choice, (str, bytes)): + if isinstance(_choice, (str, bytes)): _idx = _values.index(_choice) elif isinstance(_choice, int): _idx = _choice if _choice < len(_values) else 0 @@ -1699,72 +1681,70 @@ class GUIFrame(QWidget): rblist[_idx].toggled.emit(True) return line ''' - + def qtab_wgt(self, key, irow, wgt_grid, stacked=False): - if key in self.settings.data["Expert"].keys(): - top_key = "Expert" - elif key in self.settings.data["Parameters"].keys(): - top_key = "Parameters" + if key in self.settings.data['Expert'].keys(): + top_key = 'Expert' + elif key in self.settings.data['Parameters'].keys(): + top_key = 'Parameters' def emboss(): - line.title = title - line.key = inner_key - line.val = value + line.title = title + line.key = inner_key + line.val = value def check_cb(new_value): - sender= self.sender() + sender = self.sender() self.parent.input_parameters[sender.title][sender.key] = new_value - - + def line_cb(new_value): - sender= self.sender() + sender = self.sender() self.parent.input_parameters[sender.title][sender.key] = new_value def on_radiobutton_change(new_value): sender = self.sender() - #print("rb callback ", new_value, sender.isChecked(), sender.val, flush=True) if sender.isChecked(): - self.parent.input_parameters[sender.title][sender.key] = sender.val + self.parent.input_parameters[sender.title][ + sender.key] = sender.val - def on_tab_change(new_idx): sender_tab = self.sender().qtab_widget_dict[new_idx].title meas_line.setText(sender_tab) try: - _color = self.settings.data[top_key][key]["data"]["color"][ - new_idx] + _color = self.settings.data[top_key][key]['data']["color"][ + new_idx] except KeyError as ex: _color = "black" except IndexError as ex: _color = "black" meas_line.setStyleSheet("color: {0}".format(_color)) - - for i in range (0, self.sender().count()): + + for i in range(0, self.sender().count()): if i == new_idx: try: self.sender().tabBar().setTabTextColor(new_idx, QColor(_color)) except AttributeError: - #May be a QStackedWidget which does not have tabBar + # May be a QStackedWidget which does not have tabBar pass - + else: try: self.sender().tabBar().setTabTextColor(i, QColor("black")) except AttributeError: - #May be a QStackedWidget which does not have tabBar - pass - + # May be a QStackedWidget which does not have tabBar + pass + self.parent.input_parameters[key] = sender_tab - + qtab_widget = QTabWidget() if not stacked else QStackedWidget() - qtab_widget_dict = {} + qtab_widget_dict = {} itab = 0 longest_title = "short" - link = self.settings.data[top_key][key]["data"]["link"] + link = self.settings.data[top_key][key]['data']["link"] for title, tab in self.settings.data[link].items(): lo = QGridLayout() @@ -1773,19 +1753,19 @@ class GUIFrame(QWidget): _irowspan = 1 tab_height = 0 if len(title) > len(longest_title): - longest_title = title + longest_title = title self.parent.input_parameters[title] = {} - + for inner_key, param in tab.items(): - tab_height +=32 - wgt_type = param["data"]["widget"] - text = param["data"]["text"] - - if "value" in param["data"]: - value = param["data"]["value"] - elif "link" in param["data"]: - link_list = param["data"]["link"] - + tab_height += 32 + wgt_type = param['data']['widget'] + text = param['data']["text"] + + if 'value' in param['data']: + value = param['data']['value'] + elif "link" in param['data']: + link_list = param['data']["link"] + if len(link_list) == 1: value = self.settings.data[link_list[0]] print("values", value, flush=True) @@ -1793,9 +1773,10 @@ class GUIFrame(QWidget): bottom_leaf = self.settings.data[link_list[0]] for link_item in link_list[1:]: bottom_leaf = bottom_leaf[link_item] - value = bottom_leaf - + value = bottom_leaf + label = None + def add_label(): label = QLabel(text) label.setFixedHeight(24) @@ -1814,10 +1795,10 @@ class GUIFrame(QWidget): line = QDoubleSpinBox() label = add_label() emboss() - self.prepare_qdoublespinbox(line, value, link, title, + self.prepare_qdoublespinbox(line, value, link, title, inner_key) line.valueChanged.connect(line_cb) - line.valueChanged.emit(value) + line.valueChanged.emit(value) elif "QLineEdit" in wgt_type: line = QLineEdit() label = add_label() @@ -1837,7 +1818,7 @@ class GUIFrame(QWidget): emboss() self.prepare_qcheckbox(line, value, link, title, inner_key) line.stateChanged.connect(check_cb) - line.stateChanged.emit(bool(value)) + line.stateChanged.emit(bool(value)) elif "QComboBox" in wgt_type: line = QComboBox() label = add_label() @@ -1846,36 +1827,36 @@ class GUIFrame(QWidget): line.currentTextChanged.connect(line_cb) line.setCurrentIndex(0) line.currentTextChanged.emit(value[0]) - elif "QRadioButton" in wgt_type: + elif "QRadioButton" in wgt_type: tab_height += 32 _irowspan = 2 - line = self.prepare_qradiobutton(value, link, title, + line = self.prepare_qradiobutton(value, link, title, inner_key) - #emboss() + # emboss() rblist = line.findChildren(QRadioButton) for rb in rblist: rb.toggled.connect(on_radiobutton_change) - if "startIdx" in param["data"]: - start_idx = param["data"]["startIdx"] + if "startIdx" in param['data']: + start_idx = param['data']["startIdx"] else: start_idx = 0 rblist[start_idx].setChecked(True) rblist[start_idx].toggled.emit(True) - - icol = 0 + + icol = 0 icolspan = 3 if label: lo.addWidget(label, _irow, icol, _irowspan, 1, - Qt.AlignmentFlag(Qt.AlignLeft|Qt.AlignVCenter)) + Qt.AlignmentFlag( + Qt.AlignLeft | Qt.AlignVCenter)) icol += 1 lo.addWidget(line, _irow, icol, _irowspan, icolspan, - Qt.AlignmentFlag(Qt.AlignLeft|Qt.AlignVCenter)) + Qt.AlignmentFlag(Qt.AlignLeft | Qt.AlignVCenter)) #print(title, tab) #print(key, line, icolumn, wgt_type, text, flush=True) _irow += 1 - - - qw.setLayout(lo) + + qw.setLayout(lo) qw.setFixedHeight(tab_height) qtab_widget_dict[itab] = qw qtab_widget_dict[itab].title = title @@ -1883,49 +1864,45 @@ class GUIFrame(QWidget): qtab_widget.addTab(qtab_widget_dict[itab], title) else: qtab_widget.addWidget(qtab_widget_dict[itab]) - + itab += 1 qtab_widget.qtab_widget_dict = qtab_widget_dict - meas_label = QLabel() meas_label.setFixedHeight(24) meas_label.setFont(self.font_pts10) meas_label.setContentsMargins(0, 0, 0, 0) - meas_label.setText(self.settings.data[top_key][key]["data"]["text"]) + meas_label.setText(self.settings.data[top_key][key]['data']["text"]) meas_line = QLineEdit() - meas_line.setObjectName("Read") - + meas_line.setObjectName("Read") + fm = QFontMetricsF(meas_line.font()) - param_width = fm.maxWidth() * len(longest_title) - meas_line.setMaximumWidth(int(param_width*0.5)) + param_width = fm.maxWidth() * len(longest_title) + meas_line.setMaximumWidth(int(param_width * 0.5)) qtab_widget.setContentsMargins(0, 0, 0, 0) qtab_widget.currentChanged.connect(on_tab_change) - _default_idx = self.settings.data[top_key][key]["data"]["value"] + _default_idx = self.settings.data[top_key][key]['data']['value'] qtab_widget.setCurrentIndex(_default_idx) qtab_widget.currentChanged.emit(_default_idx) - final_wgt = QWidget() final_lo = QGridLayout() - - final_wgt.setContentsMargins(0, 0, 0, 0) #0, 40, 0, 0 + + final_wgt.setContentsMargins(0, 0, 0, 0) # 0, 40, 0, 0 final_lo.addWidget(meas_label, 0, 0, 1, 2, - Qt.AlignmentFlag(Qt.AlignLeft|Qt.AlignVCenter)) + Qt.AlignmentFlag(Qt.AlignLeft | Qt.AlignVCenter)) final_lo.addWidget(meas_line, 0, 2, 1, 2, - Qt.AlignmentFlag(Qt.AlignLeft|Qt.AlignVCenter)) + Qt.AlignmentFlag(Qt.AlignLeft | Qt.AlignVCenter)) qHLine = QHLine() qHLine.setFixedHeight(10) final_lo.addWidget(qHLine, 1, 0, 1, 4) final_lo.addWidget(qtab_widget, 2, 0, 1, 4, - Qt.AlignmentFlag(Qt.AlignLeft|Qt.AlignVCenter)) - + Qt.AlignmentFlag(Qt.AlignLeft | Qt.AlignVCenter)) + final_wgt.setLayout(final_lo) - - - return final_wgt, qtab_widget # - + + return final_wgt, qtab_widget def pv_stacked_wgt(self, pvlist, title, default_value, key, object_name): """GUI Input Widget""" @@ -1938,20 +1915,19 @@ class GUIFrame(QWidget): self.cafe.setGetActionWhenMonitorPolicy( pv, self.cyca.GET_FROM_CACHE) - stack_list = [] + stack_list = [] for pv, head, val, obj in zip(pvlist, title, default_value, object_name): stack, radiobutton_list = self.pv_selector_wgt( title=head, key=key, pv=pv, manual_value=val) self.stack_radiolist_dict[stack] = radiobutton_list - + stack_list.append(stack) stack.setObjectName(obj) stack.style().polish(stack) stacked_widget.addWidget(stack) - - + stacked_widget.setMaximumHeight(320) self.stacked_wgt_dict[stacked_widget] = stack_list return stacked_widget @@ -1959,7 +1935,7 @@ class GUIFrame(QWidget): def pv_energy_stacked_wgt(self): pvlist = self.settings.data["EnergyStackedWgt"]["pvlist"] title = self.settings.data["EnergyStackedWgt"]["title"] - default_value = self.settings.data["EnergyStackedWgt"]["value"] + default_value = self.settings.data["EnergyStackedWgt"]['value'] key = self.settings.data["EnergyStackedWgt"]["key"] object_name = self.settings.data["EnergyStackedWgt"]["objectName"] self.energy_stacked_widget = self.pv_stacked_wgt( @@ -1973,11 +1949,10 @@ class GUIFrame(QWidget): return self.energy_stacked_widget - def pv_phase_stacked_wgt(self): pvlist = self.settings.data["PhaseStackedWgt"]["pvlist"] title = self.settings.data["PhaseStackedWgt"]["title"] - default_value = self.settings.data["PhaseStackedWgt"]["value"] + default_value = self.settings.data["PhaseStackedWgt"]['value'] key = self.settings.data["PhaseStackedWgt"]["key"] object_name = self.settings.data["PhaseStackedWgt"]["objectName"] self.phase_stacked_widget = self.pv_stacked_wgt( @@ -1991,7 +1966,6 @@ class GUIFrame(QWidget): return self.phase_stacked_widget - def pv_selector_wgt(self, title="Select", key="beamEnergy", pv=None, manual_value="", monitor=True, read=True, manual=True): group_box = QGroupBox(title) @@ -2004,33 +1978,32 @@ class GUIFrame(QWidget): radiobutton_list = [None] * len(radiobutton_title) pv_local = pv monitor_pv = None - + def cb_pv_selector(value): value_str = radio_buddy_text_dict[self.sender()].text() #print("cb_pv_selector", value_str) - #Find which group the radio button belongs to: - #Find which stack the group belongs to: - #Set this to the current stack? + # Find which group the radio button belongs to: + # Find which stack the group belongs to: + # Set this to the current stack? for k, v in self.stack_radiolist_dict.items(): if self.sender() in v: - #get groupbox from key + # get groupbox from key for k2, v2 in self.stacked_wgt_dict.items(): if k in v2: - self.current_stacked_wgt_dict[k2] = pv_local #self.sender() - #print("Current STACK FOUND") - + # self.sender() + self.current_stacked_wgt_dict[k2] = pv_local + #print("Current STACK FOUND") + self.radio_stack_dict[self.sender()] = value if not value_str: print("Fired on Initialization when not connected", value) print("sender", self.sender()) print("radio_buddy_text", radio_buddy_text_dict) - print("value", radio_buddy_text_dict[self.sender()].text()) + print('value', radio_buddy_text_dict[self.sender()].text()) self.input_parameters[key] = 0 return - - if hasattr(radio_buddy_text_dict[self.sender()], "pv_info"): dt = radio_buddy_text_dict[self.sender()].pv_info.dataType @@ -2039,9 +2012,6 @@ class GUIFrame(QWidget): self.cyca.CY_DBR_CHAR]: value_input = re.findall(r"-?\d+\.?\d*", value_str) - - - if dt in [self.cyca.CY_DBR_FLOAT, self.cyca.CY_DBR_DOUBLE]: self.input_parameters[key] = float(value_input[0]) elif dt in [self.cyca.CY_DBR_SHORT, self.cyca.CY_DBR_LONG]: @@ -2051,7 +2021,6 @@ class GUIFrame(QWidget): else: self.input_parameters[key] = value_str - for irow, (radio, flag) in enumerate(zip(radiobutton_list, radiobutton_flag)): radio = QRadioButton("") @@ -2066,22 +2035,22 @@ class GUIFrame(QWidget): ql = QLabel(radiobutton_title[0]) ql.setFont(self.font_pts10) ql.setFixedHeight(self.widget_height) - ql.setAlignment(Qt.AlignmentFlag(Qt.AlignLeft|Qt.AlignVCenter)) + ql.setAlignment(Qt.AlignmentFlag(Qt.AlignLeft | Qt.AlignVCenter)) grid.addWidget(ql, 0, 1) if manual: ql = QLabel(radiobutton_title[2]) ql.setFont(self.font_pts10) ql.setFixedHeight(self.widget_height) - ql.setAlignment(Qt.AlignmentFlag(Qt.AlignLeft|Qt.AlignVCenter)) + ql.setAlignment(Qt.AlignmentFlag(Qt.AlignLeft | Qt.AlignVCenter)) grid.addWidget(ql, 2, 1) def mon_cb(handle, pvname, pvdata): if monitor_pv is not None: monitor_pv.py_monitor_callback(handle, pvname, pvdata) - + if pvname in self.current_stacked_wgt_dict.values() and \ - radiobutton_list[0].isChecked(): # + radiobutton_list[0].isChecked(): self.input_parameters[key] = pvdata.value[0] if monitor: @@ -2089,7 +2058,7 @@ class GUIFrame(QWidget): show_units=True) monitor_pv.setAlignment( - Qt.AlignmentFlag(Qt.AlignLeft|Qt.AlignVCenter)) + Qt.AlignmentFlag(Qt.AlignLeft | Qt.AlignVCenter)) monitor_pv.setFont(self.font_pts10) monitor_pv.setFixedHeight(self.widget_height) monitor_pv.setFixedWidth(122) @@ -2098,7 +2067,9 @@ class GUIFrame(QWidget): if read: read_pv = CAQLabel(self, pv_name=pv, pv_within_daq_group=True, color_mode="static", show_units=True) - read_pv.setAlignment(Qt.AlignmentFlag(Qt.AlignLeft|Qt.AlignVCenter)) + read_pv.setAlignment( + Qt.AlignmentFlag( + Qt.AlignLeft | Qt.AlignVCenter)) read_pv.setFont(self.font_pts10) init_value = self.cafe.getCache(pv) @@ -2117,11 +2088,11 @@ class GUIFrame(QWidget): if init_value is not None: #value_str = read_pv.format_display_value(init_value) - #read_pv.setText(str(value_str)) - #print(len(read_pv.text())) + # read_pv.setText(str(value_str)) + # print(len(read_pv.text())) #val = re.findall(r'-?\d+\.?\d*', value_str) #print (val) - #val[0] = val[0] #add space that we stripped off + # val[0] = val[0] #add space that we stripped off read_pv.receive_monitor_update(init_value, pvdata.status, pvdata.alarmSeverity) @@ -2139,33 +2110,33 @@ class GUIFrame(QWidget): def update_manual_value(new_text): if radiobutton_list[2].isChecked(): - radiobutton_list[2].toggled.emit(True) + radiobutton_list[2].toggled.emit(True) if manual: manual_wgt = QLineEdit(str(manual_value)) manual_wgt.setObjectName("WriteCenter") manual_wgt.textChanged.connect(update_manual_value) manual_wgt.setAlignment( - Qt.AlignmentFlag(Qt.AlignLeft|Qt.AlignVCenter)) + Qt.AlignmentFlag(Qt.AlignLeft | Qt.AlignVCenter)) manual_wgt.setFixedHeight(self.widget_height) manual_wgt.setFixedWidth(74) grid.addWidget(manual_wgt, 2, 2) ql = QLabel(self.cafe.getUnits(pv)) ql.setFont(self.font_pts10) ql.setFixedHeight(self.widget_height) - ql.setAlignment(Qt.AlignmentFlag(Qt.AlignLeft|Qt.AlignVCenter)) + ql.setAlignment(Qt.AlignmentFlag(Qt.AlignLeft | Qt.AlignVCenter)) grid.addWidget(ql, 2, 3) - grid.setContentsMargins(5, 10, 5, 0) + grid.setContentsMargins(5, 10, 5, 0) #grid.setContentsMargins(9, 15, 9, 0) - grid.setAlignment(Qt.AlignmentFlag(Qt.AlignLeft|Qt.AlignVCenter)) + grid.setAlignment(Qt.AlignmentFlag(Qt.AlignLeft | Qt.AlignVCenter)) grid.setVerticalSpacing(2) grid.setHorizontalSpacing(4) group_box.setContentsMargins(0, 0, 0, 0) group_box.setMaximumWidth(280) group_box.setMaximumHeight(320) group_box.setFont(self.font_pts10) - group_box.setAlignment(Qt.AlignmentFlag(Qt.AlignTop|Qt.AlignHCenter)) + group_box.setAlignment(Qt.AlignmentFlag(Qt.AlignTop | Qt.AlignHCenter)) group_box.setLayout(grid) if monitor: @@ -2175,35 +2146,33 @@ class GUIFrame(QWidget): if manual: radio_buddy_text_dict[radiobutton_list[2]] = manual_wgt - idx = 0 #1 if read else 0 + idx = 0 # 1 if read else 0 #print("idx", idx) - #print(radio_buddy_text_dict) + # print(radio_buddy_text_dict) radiobutton_list[idx].setChecked(True) radiobutton_list[idx].toggled.emit(True) return group_box, radiobutton_list - def input_wgt_logging(self, irow, wgt_grid): - tooltip = "Select logging level, CRITICAL=50, DEBUG=10" - value = ['CRITICAL', 'ERROR', 'WARNING', 'INFO', 'DEBUG'] #NOTSET=0 - label = QLabel("Logging level:") + tooltip = 'Select logging level, CRITICAL=50, DEBUG=10' + value = ['CRITICAL', 'ERROR', 'WARNING', 'INFO', 'DEBUG'] # NOTSET=0 + label = QLabel('Logging level:') label.setFixedHeight(24) label.setFont(self.font_pts10) label.setContentsMargins(5, 0, 0, 0) label.setToolTip(tooltip) - return self.input_wgt_qcombobox(label, "loggingLevel", value, irow, + return self.input_wgt_qcombobox(label, 'loggingLevel', value, irow, wgt_grid) - def input_wgt_qcombobox(self, label, key, value, irow, wgt_grid): suggested = "WW" - if key in self.settings.data["Expert"].keys(): - top_key = "Expert" - elif key in self.settings.data["Parameters"].keys(): - top_key = "Parameters" + if key in self.settings.data['Expert'].keys(): + top_key = 'Expert' + elif key in self.settings.data['Parameters'].keys(): + top_key = 'Parameters' else: - top_key = "Expert" + top_key = 'Expert' def combo_cb(new_text): self.input_parameters[key] = new_text @@ -2223,7 +2192,6 @@ class GUIFrame(QWidget): param_width = max(fm.width(str(value_for_width)), fm.width(suggested)) line.setFixedWidth(int(param_width + 56)) line.setObjectName("Write") - if key in self.settings.data[top_key]: if "layout" in self.settings.data[top_key][key]['data']: @@ -2239,14 +2207,15 @@ class GUIFrame(QWidget): label.setAlignment(Qt.AlignBottom) else: box = QHBoxLayout() - label.setAlignment(Qt.AlignmentFlag(Qt.AlignLeft|Qt.AlignVCenter)) + label.setAlignment( + Qt.AlignmentFlag( + Qt.AlignLeft | Qt.AlignVCenter)) box.setAlignment(Qt.AlignCenter) box.addWidget(label) box.addWidget(line) - - - if self.grid_loc: + + if self.grid_loc: a = self.grid_loc[0] b = self.grid_loc[1] c = self.grid_loc[2] @@ -2257,10 +2226,10 @@ class GUIFrame(QWidget): c = 1 d = 3 - if 'loggingLevel' not in key: + if 'loggingLevel' not in key: wgt_grid.addLayout(box, a, b, c, d, - Qt.AlignmentFlag(Qt.AlignLeft|Qt.AlignVCenter)) - + Qt.AlignmentFlag(Qt.AlignLeft | Qt.AlignVCenter)) + return box if 'loggingLevel' in key else line def input_wgt_qradiobutton(self, key, value, irow, wgt_grid): @@ -2268,12 +2237,11 @@ class GUIFrame(QWidget): radio_button = self.sender() if radio_button.isChecked(): self.parent.input_parameters[key] = radio_button.target - #print("KEY================", key, self.parent.input_parameters[key], new_value) - if key in self.settings.data["Expert"].keys(): - top_key = "Expert" - elif key in self.settings.data["Parameters"].keys(): - top_key = "Parameters" + if key in self.settings.data['Expert'].keys(): + top_key = 'Expert' + elif key in self.settings.data['Parameters'].keys(): + top_key = 'Parameters' if 'forwardLink' in self.settings.data[top_key][key]['data']: link = self.settings.data[top_key][key]['data'][ @@ -2293,7 +2261,8 @@ class GUIFrame(QWidget): value_list[0]) elif self.settings.data[top_key][item]['data'][ 'widget'] in 'QLineEdit': - self.line_sender_dict[item].setText(str(value_list)) + self.line_sender_dict[item].setText( + str(value_list)) line = self.radio_buttons(key=key, options=value) line.setContentsMargins(0, 0, 0, 0) @@ -2303,7 +2272,7 @@ class GUIFrame(QWidget): for rb in rblist: rb.toggled.connect(on_radiobutton_change) - if self.grid_loc: + if self.grid_loc: a = self.grid_loc[0] b = self.grid_loc[1] c = self.grid_loc[2] @@ -2312,22 +2281,22 @@ class GUIFrame(QWidget): a = irow b = 0 c = 1 - d = 4 + d = 4 wgt_grid.addWidget(line, a, b, c, d, Qt.AlignLeft) - _idx=0 + _idx = 0 try: - if key in self.settings.data["Expert"].keys(): - top_key = "Expert" - elif key in self.settings.data["Parameters"].keys(): - top_key = "Parameters" - _choice =self.settings.data[top_key][key]['data']['default'] + if key in self.settings.data['Expert'].keys(): + top_key = 'Expert' + elif key in self.settings.data['Parameters'].keys(): + top_key = 'Parameters' + _choice = self.settings.data[top_key][key]['data']['default'] _values = self.settings.data[top_key][key]['data']['value'] - if isinstance(_choice, (str, bytes)): + if isinstance(_choice, (str, bytes)): _idx = _values.index(_choice) - elif isinstance(_choice, int): + elif isinstance(_choice, int): _idx = _choice if _choice < len(_values) else 0 except KeyError: pass @@ -2345,34 +2314,32 @@ class GUIFrame(QWidget): if self.pipeline_group_box is not None: self.pipeline_group_box.setEnabled(bool(new_value)) - line = QCheckBox(label_text) line.stateChanged.connect(check_cb) - #line.toggled.connect(check_cb) + # line.toggled.connect(check_cb) line.setChecked(Qt.Checked if value else Qt.Unchecked) - + line.setMaximumWidth(320) line.setMinimumWidth(100) line.setFixedHeight(28) - - - if key in self.settings.data["Expert"].keys(): - top_key = "Expert" - elif key in self.settings.data["Parameters"].keys(): - top_key = "Parameters" + + if key in self.settings.data['Expert'].keys(): + top_key = 'Expert' + elif key in self.settings.data['Parameters'].keys(): + top_key = 'Parameters' col_wdt = 4 try: - orientation = self.settings.data[top_key][key]["data"][ + orientation = self.settings.data[top_key][key]['data'][ "orientation"] orientation = Qt.RightToLeft if "RightToLeft" in orientation \ - else Qt.LeftToRight - line.setLayoutDirection(orientation) - col_wdt=3 + else Qt.LeftToRight + line.setLayoutDirection(orientation) + col_wdt = 3 except KeyError: pass - if self.grid_loc: + if self.grid_loc: a = self.grid_loc[0] b = self.grid_loc[1] c = self.grid_loc[2] @@ -2381,28 +2348,27 @@ class GUIFrame(QWidget): a = irow b = 0 c = 1 - d = col_wdt + d = col_wdt - wgt_grid.addWidget(line, a, b, c, d, Qt.AlignLeft | Qt.AlignVCenter) + wgt_grid.addWidget(line, a, b, c, d, Qt.AlignLeft | Qt.AlignVCenter) #line.stateChanged.emit(Qt.Checked if value else Qt.Unchecked) - + return line def input_wgt_qlabel(self, value, irow, wgt_grid): - #Read only has no callback + # Read only has no callback suggested = "WWWW" line = QLabel() - line.setText(str(value)) #"{0: 3.1f}".format(value)) + line.setText(str(value)) # "{0: 3.1f}".format(value)) line.setFixedHeight(24) - line.setAlignment(Qt.AlignmentFlag(Qt.AlignRight|Qt.AlignBottom)) + line.setAlignment(Qt.AlignmentFlag(Qt.AlignRight | Qt.AlignBottom)) line.setStyleSheet("QLabel{text-align: right}") fm = QFontMetricsF(line.font()) param_width = max(fm.width(str(value)), fm.width(suggested)) line.setMaximumWidth(int(param_width + 40)) - - if self.grid_loc: + if self.grid_loc: a = self.grid_loc[0] b = self.grid_loc[1] c = self.grid_loc[2] @@ -2411,9 +2377,8 @@ class GUIFrame(QWidget): a = irow b = 0 c = 1 - d = 4 - wgt_grid.addWidget(line, a, b, c, d) - + d = 4 + wgt_grid.addWidget(line, a, b, c, d) return line @@ -2424,17 +2389,17 @@ class GUIFrame(QWidget): suggested = "WW" line = QLineEdit() line.setObjectName("Read") - line.setText(str(value)) #"{0: 3.1f}".format(value)) + line.setText(str(value)) # "{0: 3.1f}".format(value)) line.setFixedHeight(26) line.textChanged.connect(line_cb) - #line.textEdited.connect(line_cb) + # line.textEdited.connect(line_cb) line.textChanged.emit(str(value)) - - line.setAlignment(Qt.AlignmentFlag(Qt.AlignRight|Qt.AlignBottom)) - line.setStyleSheet("QLabel{text-align: right}") - + + line.setAlignment(Qt.AlignmentFlag(Qt.AlignRight | Qt.AlignBottom)) + line.setStyleSheet('QLabel{text-align: right}') + try: - w =self.settings.data["Parameters"][key]["data"]["width"] + w = self.settings.data['Parameters'][key]['data']['width'] line.setFixedWidth(w) except KeyError: fm = QFontMetricsF(line.font()) @@ -2445,8 +2410,7 @@ class GUIFrame(QWidget): qframe_buffer = QFrame() qframe_buffer.setFixedWidth(3) - - if self.grid_loc: + if self.grid_loc: a = self.grid_loc[0] b = self.grid_loc[1] c = self.grid_loc[2] @@ -2455,19 +2419,19 @@ class GUIFrame(QWidget): a = irow b = 0 c = 1 - d = 1 + d = 1 wgt_grid.addWidget(label, a, b, c, d, - Qt.AlignmentFlag(Qt.AlignLeft|Qt.AlignVCenter)) - wgt_grid.addWidget(qframe_buffer, a, b+1, c, d, - Qt.AlignmentFlag(Qt.AlignLeft|Qt.AlignVCenter)) - wgt_grid.addWidget(line, a, b+2, c, d, - Qt.AlignmentFlag(Qt.AlignLeft|Qt.AlignVCenter)) + Qt.AlignmentFlag(Qt.AlignLeft | Qt.AlignVCenter)) + wgt_grid.addWidget(qframe_buffer, a, b + 1, c, d, + Qt.AlignmentFlag(Qt.AlignLeft | Qt.AlignVCenter)) + wgt_grid.addWidget(line, a, b + 2, c, d, + Qt.AlignmentFlag(Qt.AlignLeft | Qt.AlignVCenter)) return line def input_wgt_qlineedit(self, key, value, label, irow, wgt_grid): def line_cb(new_value): - self.parent.input_parameters[key] = new_value + self.parent.input_parameters[key] = new_value line = QLineEdit() line.setObjectName("Write") line.setFixedHeight(24) @@ -2477,8 +2441,8 @@ class GUIFrame(QWidget): param_width = fm.width(str(value)) extra_width = 22 if len(str(value)) < 16 else 26 line.setFixedWidth(int(param_width + extra_width)) - - if self.grid_loc: + + if self.grid_loc: a = self.grid_loc[0] b = self.grid_loc[1] c = self.grid_loc[2] @@ -2487,16 +2451,15 @@ class GUIFrame(QWidget): a = irow b = 0 c = 1 - d = 2 + d = 2 wgt_grid.addWidget(label, a, b, c, d, - Qt.AlignmentFlag(Qt.AlignLeft|Qt.AlignVCenter)) - wgt_grid.addWidget(line, a, b+2, c, d, - Qt.AlignmentFlag(Qt.AlignLeft|Qt.AlignVCenter)) + Qt.AlignmentFlag(Qt.AlignLeft | Qt.AlignVCenter)) + wgt_grid.addWidget(line, a, b + 2, c, d, + Qt.AlignmentFlag(Qt.AlignLeft | Qt.AlignVCenter)) return line - def input_wgt_qdoublespinbox(self, key, value, label, irow, wgt_grid): def line_cb(new_value): self.parent.input_parameters[key] = new_value @@ -2508,31 +2471,31 @@ class GUIFrame(QWidget): line.valueChanged.connect(line_cb) line.setValue(value) - if key in self.settings.data["Expert"].keys(): - top_key = "Expert" - elif key in self.settings.data["Parameters"].keys(): - top_key = "Parameters" + if key in self.settings.data['Expert'].keys(): + top_key = 'Expert' + elif key in self.settings.data['Parameters'].keys(): + top_key = 'Parameters' + + min_val = self.settings.data[top_key][key]['data']["min"] + max_val = self.settings.data[top_key][key]['data']["max"] + step = self.settings.data[top_key][key]['data']["step"] - min_val = self.settings.data[top_key][key]["data"]["min"] - max_val = self.settings.data[top_key][key]["data"]["max"] - step = self.settings.data[top_key][key]["data"]["step"] - try: - if 'tooltip' in self.settings.data[top_key][key]["data"]: - label.setToolTip(self.settings.data[top_key][key]["data"][ + if 'tooltip' in self.settings.data[top_key][key]['data']: + label.setToolTip(self.settings.data[top_key][key]['data'][ "tooltip"]) except KeyError: pass decimal = Decimal(str(step)) - line.setDecimals(abs(decimal.as_tuple().exponent)) #precision + line.setDecimals(abs(decimal.as_tuple().exponent)) # precision line.setRange(min_val, max_val) line.setSingleStep(step) fm = QFontMetricsF(line.font()) param_width = max(fm.width(str(decimal)), fm.width(suggested)) line.setMaximumWidth(int(param_width + 40)) - - if self.grid_loc: + + if self.grid_loc: a = self.grid_loc[0] b = self.grid_loc[1] c = self.grid_loc[2] @@ -2541,15 +2504,14 @@ class GUIFrame(QWidget): a = irow b = 0 c = 1 - d = 2 + d = 2 wgt_grid.addWidget(label, a, b, c, d, - Qt.AlignmentFlag(Qt.AlignLeft | Qt.AlignVCenter)) - wgt_grid.addWidget(line, a, b+2, c, d, + Qt.AlignmentFlag(Qt.AlignLeft | Qt.AlignVCenter)) + wgt_grid.addWidget(line, a, b + 2, c, d, Qt.AlignmentFlag(Qt.AlignLeft | Qt.AlignVCenter)) return line - def input_wgt_qspinbox(self, key, value, label, irow, wgt_grid): def line_cb(new_value): self.parent.input_parameters[key] = new_value @@ -2560,23 +2522,22 @@ class GUIFrame(QWidget): line.setFixedHeight(24) line.valueChanged.connect(line_cb) line.setValue(value) - if key in self.settings.data["Expert"].keys(): - top_key = "Expert" - elif key in self.settings.data["Parameters"].keys(): - top_key = "Parameters" - - min_val = self.settings.data[top_key][key]["data"]["min"] - max_val = self.settings.data[top_key][key]["data"]["max"] - step = self.settings.data[top_key][key]["data"]["step"] + if key in self.settings.data['Expert'].keys(): + top_key = 'Expert' + elif key in self.settings.data['Parameters'].keys(): + top_key = 'Parameters' + min_val = self.settings.data[top_key][key]['data']["min"] + max_val = self.settings.data[top_key][key]['data']["max"] + step = self.settings.data[top_key][key]['data']["step"] line.setRange(min_val, max_val) line.setSingleStep(step) fm = QFontMetricsF(line.font()) param_width = max(fm.width(str(max_val)), fm.width(suggested)) line.setMaximumWidth(int(param_width + 40)) - - if self.grid_loc: + + if self.grid_loc: a = self.grid_loc[0] b = self.grid_loc[1] c = self.grid_loc[2] @@ -2585,11 +2546,11 @@ class GUIFrame(QWidget): a = irow b = 0 c = 1 - d = 2 + d = 2 wgt_grid.addWidget(label, a, b, c, d, - Qt.AlignmentFlag(Qt.AlignLeft | Qt.AlignVCenter)) - wgt_grid.addWidget(line, a, b+2, c, d, + Qt.AlignmentFlag(Qt.AlignLeft | Qt.AlignVCenter)) + wgt_grid.addWidget(line, a, b + 2, c, d, Qt.AlignmentFlag(Qt.AlignLeft | Qt.AlignVCenter)) return line @@ -2601,7 +2562,7 @@ class GUIFrame(QWidget): qframe_bottom = QFrame() qframe_bottom.setFixedHeight(3) - if self.grid_loc: + if self.grid_loc: a = self.grid_loc[0] b = self.grid_loc[1] c = self.grid_loc[2] @@ -2613,13 +2574,11 @@ class GUIFrame(QWidget): d = 4 wgt_grid.addWidget(qframe_top, a, b, c, d, - Qt.AlignmentFlag(Qt.AlignLeft | Qt.AlignVCenter)) - wgt_grid.addWidget(stacked_wgt, a+1, b, c+3, d, Qt.AlignmentFlag(Qt.AlignLeft | Qt.AlignVCenter)) - wgt_grid.addWidget(qframe_bottom, a+2, b, c, d, - Qt.AlignmentFlag(Qt.AlignLeft | Qt.AlignVCenter)) - - + wgt_grid.addWidget(stacked_wgt, a + 1, b, c + 3, d, + Qt.AlignmentFlag(Qt.AlignLeft | Qt.AlignVCenter)) + wgt_grid.addWidget(qframe_bottom, a + 2, b, c, d, + Qt.AlignmentFlag(Qt.AlignLeft | Qt.AlignVCenter)) return stacked_wgt @@ -2630,8 +2589,7 @@ class GUIFrame(QWidget): qframe_bottom = QFrame() qframe_bottom.setFixedHeight(3) - - if self.grid_loc: + if self.grid_loc: a = self.grid_loc[0] b = self.grid_loc[1] c = self.grid_loc[2] @@ -2641,23 +2599,21 @@ class GUIFrame(QWidget): b = 0 c = 1 d = 4 - wgt_grid.addWidget(qframe_top, a, b, c, d, Qt.AlignmentFlag(Qt.AlignLeft | Qt.AlignVCenter)) - wgt_grid.addWidget(stacked_wgt, a+1, b, c+3, d, + wgt_grid.addWidget(stacked_wgt, a + 1, b, c + 3, d, Qt.AlignmentFlag(Qt.AlignLeft | Qt.AlignVCenter)) - wgt_grid.addWidget(qframe_bottom, a+2, b, c, d, + wgt_grid.addWidget(qframe_bottom, a + 2, b, c, d, Qt.AlignmentFlag(Qt.AlignLeft | Qt.AlignVCenter)) - return stacked_wgt def input_wgt_qhline(self, irow, wgt_grid): qHLine = QHLine() qHLine.setFixedHeight(10) - - if self.grid_loc: + + if self.grid_loc: a = self.grid_loc[0] b = self.grid_loc[1] c = self.grid_loc[2] @@ -2668,16 +2624,15 @@ class GUIFrame(QWidget): c = 1 d = 4 wgt_grid.addWidget(qHLine, a, b, c, d) - def input_wgt_qvline(self, irow, wgt_grid): qVLine = QVLine() - + qVLine.setFixedWidth(20) - + qVLine.setFixedHeight(int(17 * wgt_grid.rowCount())) - - if self.grid_loc: + + if self.grid_loc: a = self.grid_loc[0] b = self.grid_loc[1] c = self.grid_loc[2] @@ -2690,12 +2645,11 @@ class GUIFrame(QWidget): wgt_grid.addWidget(qVLine, a, b, c, d) - def input_wgt_frame(self, irow, wgt_grid): qFrame = QFrame() qFrame.setFixedHeight(10) - - if self.grid_loc: + + if self.grid_loc: a = self.grid_loc[0] b = self.grid_loc[1] c = self.grid_loc[2] @@ -2707,7 +2661,6 @@ class GUIFrame(QWidget): d = 4 wgt_grid.addWidget(qHLine, a, b, c, d) - def input_wgt(self, buddy, label, key, value, irow=0, wgt_grid=None,): if wgt_grid is None: @@ -2722,7 +2675,7 @@ class GUIFrame(QWidget): line = None qtab = None - #Add callbacksand actions + # Add callbacksand actions if buddy == "QComboBox".upper(): line = self.input_wgt_qcombobox(label, key, value, irow, wgt_grid) @@ -2757,7 +2710,7 @@ class GUIFrame(QWidget): self.input_wgt_qhline(irow, wgt_grid) elif buddy == "QVLine".upper(): - self.input_wgt_qvline(irow, wgt_grid) + self.input_wgt_qvline(irow, wgt_grid) elif buddy == "QFrame".upper(): self.input_wgt_qframe(irow, wgt_grid) @@ -2765,8 +2718,8 @@ class GUIFrame(QWidget): elif buddy == "QTabWidget".upper(): #print("buddy/label", buddy, label, key, value, flush=True) line, qtab = self.qtab_wgt(key, irow, wgt_grid) - - if self.grid_loc: + + if self.grid_loc: a = self.grid_loc[0] b = self.grid_loc[1] c = self.grid_loc[2] @@ -2776,14 +2729,14 @@ class GUIFrame(QWidget): b = 0 c = 1 d = 4 - + wgt_grid.addWidget(line, a, b, c, d, Qt.AlignLeft | Qt.AlignVCenter) elif buddy == "QStackedWidget".upper(): #print("buddy/label", buddy, label, key, value, flush=True) line, qtab = self.qtab_wgt(key, irow, wgt_grid, stacked=True) - - if self.grid_loc: + + if self.grid_loc: a = self.grid_loc[0] b = self.grid_loc[1] c = self.grid_loc[2] @@ -2793,14 +2746,14 @@ class GUIFrame(QWidget): b = 0 c = 1 d = 4 - + wgt_grid.addWidget(line, a, b, c, d, - Qt.AlignLeft | Qt.AlignVCenter) + Qt.AlignLeft | Qt.AlignVCenter) else: wgt_list = ["QCheckBox", "QComboBox", "QDoubleSpinBox", "QFrame", "QHLine", "QLabel", "QLineEdit", "QLineRead", "QRadioButton", "QSpinBox", "QStackedWiodget", - "QTabWidget","QVLine", "QPhaseStackedWidget", + "QTabWidget", "QVLine", "QPhaseStackedWidget", "QEnergyStackedWidget"] print("Widget {0} is not Supported".format(buddy)) print("Supported widgets are: {0}".format(wgt_list)) @@ -2811,37 +2764,35 @@ class GUIFrame(QWidget): elif line is not None: self.line_sender_dict[key] = line - - def enter_input_parameters(self): - #"undulator": {"flag": 0, "data" : - #{"widget": "None", "text" : "Target:", "value" : "Aramis"}}, - #"deflector": {"flag": 1, "data" : - #{"widget": "QComboBox", "text" : "RF Tranverse Deflector:", - # "forwardLink": ["RFDeflector"]}}, - #profileMonitor": {"flag": 1, "data" : - #{"widget": "QComboBox", "text" : "Profile Monitor:", - # "link": ["RFDeflector", "SINDI01", "profileMonitor"] - #json input "Parameters" key + # "undulator": {"flag": 0, 'data' : + # {'widget': "None", "text" : "Target:", 'value' : "Aramis"}}, + # "deflector": {"flag": 1, 'data' : + # {'widget': "QComboBox", "text" : "RF Tranverse Deflector:", + # "forwardLink": ["RFDeflector"]}}, + # profileMonitor": {"flag": 1, 'data' : + # {'widget': "QComboBox", "text" : "Profile Monitor:", + # "link": ["RFDeflector", "SINDI01", "profileMonitor"] + # json input 'Parameters' key # All key values added to self.input_parameters - #flag 1: add to self.input_parameters for analysis thread - #widget None: does not add widget into container - #text: Will add label to a widget - #forwardLink: Will substitute for target and execute - #link: Will substitute for target - #operator + # flag 1: add to self.input_parameters for analysis thread + # widget None: does not add widget into container + # text: Will add label to a widget + # forwardLink: Will substitute for target and execute + # link: Will substitute for target + # operator self.operator_parameters_group = self.operator_parameters_groupbox() if self.facility == Facility.SwissFEL: try: - if self.settings.data["Parameters"]["undulator"]["flag"]: + if self.settings.data['Parameters']["undulator"]["flag"]: self.operator_parameters_group.layout().addWidget( self.parent.gui_header.operator_group_header()) except KeyError: pass def draw_widget(buddy): - flag = self.settings.data["Parameters"][key]["flag"] + flag = self.settings.data['Parameters'][key]["flag"] if buddy == "NONE": return False elif buddy not in ["QHLINE", "QVLINE", "QFRAME"] and not flag: @@ -2850,65 +2801,64 @@ class GUIFrame(QWidget): ##in_j = 0 - for (key, val), label in zip(self.all_input_parameters.items(), - self.all_input_labels.values()): + for (key, val), label in zip(self.all_input_parameters.items(), + self.all_input_labels.values()): buddy = self.settings.data[ - "Parameters"][key]["data"]["widget"].upper() + 'Parameters'][key]['data']['widget'].upper() j = self.input_wgt_grid.rowCount() - ##if j > 4: + # if j > 4: ## self.input_wgt_grid_column = 6 ## in_j += 1 - ##else: + # else: ## in_j = j - #if buddy != "NONE": + # if buddy != "NONE": self.grid_loc = None if "useGrid" in self.settings.data: if self.settings.data["useGrid"]: - if 'grid' in self.settings.data["Parameters"][key]["data"]: + if 'grid' in self.settings.data['Parameters'][key]['data']: self.grid_loc = self.settings.data[ - "Parameters"][key]["data"]["grid"] - + 'Parameters'][key]['data']["grid"] if draw_widget(buddy): self.input_wgt(buddy=buddy, label=label, key=key, value=val, irow=j, wgt_grid=self.input_wgt_grid) - ##if j == 4: + # if j == 4: ## in_j = 1 - ##self.input_wgt_grid.setHorizontalSpacing(10) + # self.input_wgt_grid.setHorizontalSpacing(10) self.operator_parameters_group.layout().addLayout(self.input_wgt_grid) - self.operator_parameters_group.setMinimumHeight(INPUT_PARAMETERS_HEIGHT) + self.operator_parameters_group.setMinimumHeight( + INPUT_PARAMETERS_HEIGHT) - lo = QGridLayout() lo.setContentsMargins(9, 19, 9, 9) lo.addWidget(self.operator_parameters_group, 0, 0, 4, 1, alignment=Qt.AlignTop) - #if random.randint(1, 10) > 9: + # if random.randint(1, 10) > 9: # lo.addWidget(self.create_analysis_wgt(), 0, 1) - #else: + # else: if self.has_optics: lo.addWidget(self.optics_groupbox(), 0, 1) row_count = 1 else: row_count = 0 - if self.has_procedure: + if self.has_procedure and self.destination_procedure != 'Expert': if 'V' in self.orientation_procedure.upper(): lo.addWidget( self.analysis_procedure_group(), row_count, 1, 1, 1) else: lo.addWidget( self.analysis_procedure_group(), lo.rowCount(), 0, 1, 1) - - #Centers input parameters group box - lo.setAlignment(Qt.AlignmentFlag(Qt.AlignHCenter|Qt.AlignTop)) + + # Centers input parameters group box + lo.setAlignment(Qt.AlignmentFlag(Qt.AlignHCenter | Qt.AlignTop)) lo.setHorizontalSpacing(20) lo.setVerticalSpacing(10) + self.operator_wgt.setLayout(lo) - - - #expert + + # expert self.expert_parameters_group = self.expert_parameters_groupbox() for (key, val), label in zip(self.all_expert_parameters.items(), @@ -2917,31 +2867,30 @@ class GUIFrame(QWidget): self.grid_loc = None if "useGrid" in self.settings.data: if self.settings.data["useGrid"]: - if 'grid' in self.settings.data["Expert"][key]["data"]: + if 'grid' in self.settings.data['Expert'][key]['data']: self.grid_loc = self.settings.data[ - "Expert"][key]["data"]["grid"] + 'Expert'][key]['data']["grid"] buddy = self.settings.data[ - "Expert"][key]["data"]["widget"].upper() + 'Expert'][key]['data']['widget'].upper() j = self.expert_wgt_grid.rowCount() if buddy != "NONE": self.input_wgt(buddy=buddy, label=label, key=key, value=val, irow=j, wgt_grid=self.expert_wgt_grid) - #Add expert parameters to input_parameters + # Add expert parameters to input_parameters self.input_parameters.update(self.expert_parameters) - #Need to emit radio button here as input_parameters is - #overwritten by sel.expoert_parameters - #which give a list [Gasusian and FWMH] + # Need to emit radio button here as input_parameters is + # overwritten by sel.expoert_parameters + # which give a list [Gasusian and FWMH] if self.radiobutton: - self.radiobutton[0].toggled.emit(True) + self.radiobutton[0].toggled.emit(True) if self.expert_wgt_grid: self.expert_parameters_group.layout().addLayout( self.expert_wgt_grid) - if "pipeline" in self.parent.input_parameters.keys(): self.expert_parameters_group.layout().addWidget( self.image_parameters_group()) @@ -2981,17 +2930,15 @@ class GUIFrame(QWidget): if "debug" in self.parent.input_parameters.keys(): hbox2.addWidget(self.checkbox_debug(hline="None")) - if "simulation" in self.parent.input_parameters.keys(): hbox2.addWidget(self.checkbox_simulation(hline="None")) self.expert_parameters_group.layout().addLayout(hbox2) - self.expert_parameters_group.layout().addLayout( self.input_wgt_logging(self.expert_wgt_grid.rowCount(), - self.expert_wgt_grid)) + self.expert_wgt_grid)) self.expert_parameters_group.layout().addWidget(QHLine()) @@ -3001,20 +2948,34 @@ class GUIFrame(QWidget): lo.setContentsMargins(9, 19, 9, 9) lo.addWidget(self.expert_parameters_group, 0, 0, 1, 1, alignment=Qt.AlignTop) - lo.setAlignment(Qt.AlignmentFlag(Qt.AlignHCenter|Qt.AlignTop)) + + if self.has_procedure and self.destination_procedure == 'Expert': + if 'V' in self.orientation_procedure.upper(): + lo.addWidget( + self.analysis_procedure_group(), row_count, 1, 1, 1, + alignment=Qt.AlignTop) + else: + lo.addWidget( + self.analysis_procedure_group(), lo.rowCount(), 0, 1, 1, + alignment=Qt.AlignTop) + + # Centers input parameters group box + lo.setAlignment(Qt.AlignmentFlag(Qt.AlignHCenter | Qt.AlignTop)) lo.setHorizontalSpacing(20) + lo.setVerticalSpacing(10) + self.expert_wgt.setLayout(lo) - #test - def radio_buttons(self, key="", options: list = [], start_idx=0): + # test + def radio_buttons(self, key="", options: list = [], start_idx=0): widget = QWidget() layout = QGridLayout() layout.setContentsMargins(5, 0, 5, 0) widget.setMaximumWidth(220) - #self.setLayout(layout) + # self.setLayout(layout) target_list = options - color_list = ["#894961", "teal", "darkblue"] + color_list = ['#894961', 'teal', 'darkblue'] self.radiobutton = [None] * len(options) for i, title in enumerate(options): @@ -3022,18 +2983,18 @@ class GUIFrame(QWidget): width_list = [70, 70, 70] - if key in self.settings.data["Expert"].keys(): - top_key = "Expert" - elif key in self.settings.data["Parameters"].keys(): - top_key = "Parameters" + if key in self.settings.data['Expert'].keys(): + top_key = 'Expert' + elif key in self.settings.data['Parameters'].keys(): + top_key = 'Parameters' _width = 1 - _full_width = _width * len(options) + 1 + _full_width = _width * len(options) + 1 layout.addWidget(QHLine(), 0, 0, 1, _full_width) layout.addWidget(QLabel( - self.settings.data[top_key][key]['data']['text']), 1, 0, 1, 1, - Qt.AlignCenter) + self.settings.data[top_key][key]['data']['text']), 1, 0, 1, 1, + Qt.AlignCenter) for i, (radio, target, color, width) in enumerate( zip(self.radiobutton, target_list, color_list, width_list)): @@ -3041,9 +3002,14 @@ class GUIFrame(QWidget): radio.setFont(self.font_pts10) radio.setStyleSheet("color : {0};".format(color)) radio.target = target - - layout.addWidget(radio, 1, _width*i+1, 1, _width, Qt.AlignCenter) - + + layout.addWidget( + radio, + 1, + _width * i + 1, + 1, + _width, + Qt.AlignCenter) layout.addWidget(QHLine(), 2, 0, 1, layout.columnCount()) @@ -3051,7 +3017,6 @@ class GUIFrame(QWidget): return widget - def create_table_wgt(self, pv_list: list): return CAQTableWidget(self, pv_list=pv_list, init_column=True, notify_freq_hz=5, notify_unison=True) @@ -3064,19 +3029,19 @@ class GUIFrame(QWidget): #print("PM", self.line_sender_dict['profileMonitor'].currentText()) #key = self.line_sender_dict['profileMonitor'].currentText() - #cannot enumerate self.branches!! + # cannot enumerate self.branches!! for i, table in enumerate(self.table_wgt): - branch_key = self.branches[i]['key'] #branch['key'] + branch_key = self.branches[i]['key'] # branch['key'] key = self.line_sender_dict[branch_key].currentText() #print(branch_key, key, i, tab_idx) - #if key in self.branches[i]['lastLine'][key]: + # if key in self.branches[i]['lastLine'][key]: # print("i/idx", i, tab_idx, # self.branches[i]['lastLine'][key]) - #else: + # else: # self.branches[i]['lastLine'][key] = [' ',' '] - #print(self.branches[i]['tagged']) + # print(self.branches[i]['tagged']) if i == tab_idx: if key in self.branches[i]['tagged']: table.paint_rows(reset=True, last_row=[' ', ' ']) @@ -3095,14 +3060,14 @@ class GUIFrame(QWidget): self.table_layout = QGridLayout() self.table_layout.setAlignment( - Qt.AlignmentFlag(Qt.AlignHCenter|Qt.AlignTop)) + Qt.AlignmentFlag(Qt.AlignHCenter | Qt.AlignTop)) self.table_tab_wgt = QTabWidget() self.table_tab_wgt.setFixedWidth(600) self.table_tab_wgt.tabBar().setShape(QTabBar.TriangularNorth) - #self.table_tab_wgt.tabBar().setDrawBase(False) + # self.table_tab_wgt.tabBar().setDrawBase(False) - #Initialization has to loop + # Initialization has to loop self.table_wgt = [None] * len(pv_dict) for i, tab_text in enumerate(pv_dict.keys()): @@ -3114,7 +3079,6 @@ class GUIFrame(QWidget): self.table_tab_wgt.addTab(self.table_wgt[i], tab_text) color = self.branches[i]['tabTextColor'] self.table_tab_wgt.tabBar().setTabTextColor(i, QColor(color)) - self.table_tab_wgt.currentChanged.connect(on_table_tab_changed) self.table_layout.addWidget(self.table_tab_wgt, 0, 0) @@ -3123,6 +3087,4 @@ class GUIFrame(QWidget): self.table_tab_wgt.currentChanged.emit(0) - return self.table_layout #tab_wgt - - + return self.table_layout # tab_wgt