6 Commits

2 changed files with 939 additions and 964 deletions

291
base.py
View File

@@ -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
@@ -58,6 +57,7 @@ CENTRAL_WIDGET_MINIMUM_WIDTH = 1240
SLS_CENTRAL_WIDGET_MINIMUM_HEIGHT = 840
SLS_CENTRAL_WIDGET_MINIMUM_WIDTH = 940
class BaseWindow(QMainWindow):
""" BaseWindow
"""
@@ -82,8 +82,8 @@ class BaseWindow(QMainWindow):
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):
@@ -95,7 +95,7 @@ class BaseWindow(QMainWindow):
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
@@ -117,8 +117,8 @@ class BaseWindow(QMainWindow):
_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:
@@ -129,8 +129,8 @@ class BaseWindow(QMainWindow):
if os.access(_dirname, os.W_OK):
all_fig_data[canvas][idx].savefig(save_dest)
all_fig_data[canvas][idx].savefig(
save_dest)
elif not write_message_fired:
@@ -145,46 +145,41 @@ class BaseWindow(QMainWindow):
_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?
# 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,11 +188,11 @@ 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):
@@ -206,7 +201,7 @@ class BaseWindow(QMainWindow):
QApplication.processEvents(QEventLoop.ExcludeUserInputEvents, 5000)
self.all_data = self.parent.all_data
#Reanalysis data
# Reanalysis data
if self.all_data is not None:
try:
@@ -230,7 +225,7 @@ class BaseWindow(QMainWindow):
now_in_seconds = self.all_data['Processed data'][
'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'][
@@ -251,19 +246,19 @@ 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 = "Processed data saved to {}".format(
_mess = "Data saved to {}".format(
self.parent.hdf_filename)
self.parent.trigger_log_message.emit(
MsgSeverity.INFO.name, _pymodule, _line(), _mess,
@@ -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,9 +282,9 @@ 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):
@@ -301,7 +295,7 @@ class BaseWindow(QMainWindow):
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
@@ -325,7 +319,7 @@ class BaseWindow(QMainWindow):
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,14 +345,13 @@ 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={
messages: dict = {
"success": "Analysis completed", "fail":
"No data returned from analysis procedure"}):
@@ -379,13 +372,16 @@ class BaseWindow(QMainWindow):
def run(self):
"""Run thread
"""
print("RUN IN BASE CLASS", flush=True)
print("RUN ANLYSIS THREAD FROM WITHIN IN BASE CLASS", flush=True)
# 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:
if all_dict is not None:
self.trigger_thread_event.emit(all_dict)
mess = self.messages['success']
self.parent.trigger_log_message.emit(
@@ -395,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):
@@ -412,7 +407,6 @@ 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]))
@@ -420,7 +414,7 @@ class BaseWindow(QMainWindow):
self.settings = ReadJSON(self.appname)
#Read out current_logbook
# Read out current_logbook
self.cafe = PyCafe.CyCafe()
self.cyca = PyCafe.CyCa()
@@ -436,8 +430,8 @@ 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_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
@@ -498,16 +492,15 @@ class BaseWindow(QMainWindow):
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()
@@ -526,8 +519,8 @@ class BaseWindow(QMainWindow):
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(
@@ -556,7 +549,7 @@ class BaseWindow(QMainWindow):
self.settings.data["MsgSeverity"]["debug"])
}
#QSetttings
# QSetttings
self.restore_application_settings()
self.init_toolbar()
@@ -615,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():
@@ -659,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
@@ -704,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
"""
@@ -732,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")
@@ -802,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")
@@ -812,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
@@ -851,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")
@@ -868,8 +859,8 @@ class BaseWindow(QMainWindow):
painter.end()
return combinedIcon
# Actions
################# Actions
def add_actions(self, target, actions):
""" Add to toolbar
"""
@@ -884,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)
@@ -904,8 +895,6 @@ class BaseWindow(QMainWindow):
action.setCheckable(True)
return action
def verify_close_event(self):
""" Overrides QMainWindow method
"""
@@ -946,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)
@@ -1031,16 +1020,15 @@ 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()
@@ -1053,9 +1041,8 @@ class BaseWindow(QMainWindow):
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):
@@ -1063,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):
@@ -1091,7 +1077,6 @@ class BaseWindow(QMainWindow):
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,7 +1107,6 @@ class BaseWindow(QMainWindow):
QApplication.processEvents()
return False
if self.hdf_save_completed:
_mess = "Data previously saved to hdf:\n{0}".format(
self.hdf_filename)
@@ -1133,7 +1117,6 @@ class BaseWindow(QMainWindow):
return True
def add_to_hdf(self, dataH5=None, proc=True, raw=False):
""" Abstract method to be overwritten by user. Optional.
"""
@@ -1163,7 +1146,6 @@ class BaseWindow(QMainWindow):
)
QM.exec()
def add_pvs_to_hdf(self, dataH5, top_group="experiment", pv_list=None,
from_hdf=False):
@@ -1191,7 +1173,6 @@ class BaseWindow(QMainWindow):
{})
return isOK
if from_hdf:
return isOK
@@ -1217,14 +1198,12 @@ class BaseWindow(QMainWindow):
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'] = 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()
@@ -1235,7 +1214,7 @@ class BaseWindow(QMainWindow):
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()
@@ -1269,7 +1248,6 @@ class BaseWindow(QMainWindow):
MsgSeverity.WARN.name, _pymodule, _line(), _mess, {})
return isOK
@Slot()
def save_to_hdf_dialog(self):
""" This uses the widget interface to allow the user to enter
@@ -1291,7 +1269,6 @@ 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']
@@ -1299,7 +1276,6 @@ class BaseWindow(QMainWindow):
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:
@@ -1349,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
@@ -1420,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} " +
@@ -1431,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
@@ -1454,12 +1427,11 @@ class BaseWindow(QMainWindow):
)
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")
@@ -1509,7 +1481,6 @@ class BaseWindow(QMainWindow):
)
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()):
@@ -1529,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())
@@ -1563,15 +1532,15 @@ 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
for _status, _pv in zip(status_list, pv_names):
@@ -1614,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()
@@ -1673,7 +1642,7 @@ class BaseWindow(QMainWindow):
self.screenshot_titles.clear()
self.screenshot_items.clear()
############################### Init
# Init
def init_statusbar_wgt(self):
""" Configure statusbar
"""
@@ -1700,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)
@@ -1732,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
"""
@@ -1762,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
@@ -1817,7 +1786,6 @@ class BaseWindow(QMainWindow):
if not self.verify_analysis_preconditions():
return
self.analysis_thread = self.AnalysisThread(
self, self.analysis_procedure, self.input_parameters)
@@ -1827,11 +1795,9 @@ class BaseWindow(QMainWindow):
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
@@ -1855,7 +1821,6 @@ class BaseWindow(QMainWindow):
self.gui_frame.in_hdf_measurement_procedure()
QApplication.processEvents()
@Slot()
def hdf_thread_finished(self):
""" Reset widgets to intial pre-measurement state
@@ -1864,7 +1829,6 @@ class BaseWindow(QMainWindow):
QApplication.processEvents()
#print("Thread Finished")
@Slot(dict)
def receive_analysis_results(self, all_dict):
self.all_data = all_dict
@@ -1879,21 +1843,25 @@ class BaseWindow(QMainWindow):
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.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)
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:
@@ -1901,14 +1869,20 @@ class BaseWindow(QMainWindow):
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:
@@ -1932,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'''
@@ -1950,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
@@ -1979,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)
@@ -2014,7 +1987,6 @@ class BaseWindow(QMainWindow):
QApplication.processEvents()
time.sleep(0.0001)
def initialize_application(self, appname=_appname, delay=None,
facility=Facility.SwissFEL):
"""
@@ -2058,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))
@@ -2094,21 +2066,19 @@ class BaseWindow(QMainWindow):
font-size:20px; margin-right:22px;'>
This message will self-destruct in {1} seconds<br></p>
""".format(appname, round(delay)),
Qt.AlignmentFlag(Qt.AlignCenter|Qt.AlignTop))
width = 860 + (len(appname)-10)*15
Qt.AlignmentFlag(Qt.AlignCenter | Qt.AlignTop))
width = 860 + (len(appname) - 10) * 15
height = 220
self.splash_screen.resize(width, height)
#Maybe useful at some point
# Maybe useful at some point
#pSplashNotice = QCheckBox(self.splash_screen);
#pSplashNotice.setChecked(Qt.Checked)
# pSplashNotice.setChecked(Qt.Checked)
self.splash_progressbar = QProgressBar(self.splash_screen)
self.splash_timer = QTimer()
self.splash_screen.show()
# Custom progress bar stylesheet
progressbar_stylesheet = """
QProgressBar:horizontal {
@@ -2130,9 +2100,9 @@ class BaseWindow(QMainWindow):
def show_time():
now = time.time()
val = (now-start1)*100/delay
val = 5 * round(val/5)
int_seconds_remaining = int(delay - (now-start1))
val = (now - start1) * 100 / delay
val = 5 * round(val / 5)
int_seconds_remaining = int(delay - (now - start1))
seconds_remaining = '{:2d}'.format(int_seconds_remaining)
self.splash_progressbar.setValue(val)
self.processEvents()
@@ -2149,21 +2119,20 @@ class BaseWindow(QMainWindow):
""".format(self.splash_appname, seconds_remaining, sec_str)
self.splash_screen.showMessage(
mess, Qt.AlignmentFlag(Qt.AlignCenter|Qt.AlignTop))
mess, Qt.AlignmentFlag(Qt.AlignCenter | Qt.AlignTop))
self.processEvents()
#print(val, seconds_remaining)
self.splash_timer.timeout.connect(show_time)
self.splash_timer.start(200) #ms with 10 samples per sec.
self.splash_timer.start(200) # ms with 10 samples per sec.
return self.splash_screen
def initialize_finished(self, myapp):
self.splash_timer.stop()
self.splash_progressbar.setValue(100)
time.sleep(0.4)
#app.processEvents()
# app.processEvents()
self.splash_screen.showMessage(
"""
<br><p style='color:black; font-weight:bold;
@@ -2179,8 +2148,6 @@ class BaseWindow(QMainWindow):
Qt.AlignmentFlag(Qt.AlignCenter | Qt.AlignTop))
self.splash_screen.finish(myapp)
def check_status_list(self, pymodule: str = _pymodule,
operation: str = "channel access",
pv_list: list = None, status_list: list = None,
@@ -2199,7 +2166,6 @@ class BaseWindow(QMainWindow):
if stat is None:
status_list[i] = self.cafe.getStatus(pv)
brk = ("------------------------------------------------------" +
"------------------------------------------------------")
self.trigger_log_message.emit(
@@ -2229,15 +2195,14 @@ class BaseWindow(QMainWindow):
return status_list
def check_status(self, pymodule: str = _pymodule,
operation: str = "channel access",
pv: str = None, stat: int = None,
line: int =_line()):
line: int = _line()):
if not pv:
return
if stat == None:
if stat is None:
stat = self.cafe.getStatus(pv)
if stat != self.cyca.ICAFE_NORMAL:

File diff suppressed because it is too large Load Diff