Source code for sas.qtgui.Perspectives.Invariant.InvariantDetails
import sys
import os
from PyQt5 import QtCore
from PyQt5 import QtGui, QtWidgets
# local
from .UI.InvariantDetailsUI import Ui_Dialog
from .InvariantUtils import WIDGETS
# ERROR_COLOR = wx.Colour(255, 0, 0, 128)
# EXTRAPOLATION_COLOR = wx.Colour(169, 169, 168, 128)
# INVARIANT_COLOR = wx.Colour(67, 208, 128, 128)
[docs]class DetailsDialog(QtWidgets.QDialog, Ui_Dialog):
"""
This class stores some values resulting from invariant calculations.
Given the value of total invariant, this class can also
determine the percentage of invariants resulting from extrapolation.
"""
[docs] def __init__(self, parent):
super(DetailsDialog, self).__init__(parent)
self.setupUi(self)
DEFAULT_STYLE = """
QProgressBar{
border: 2px solid grey;
border-radius: 5px;
text-align: center
}
QProgressBar::chunk {
background-color: #b1daf9;
width: 10px;
margin: 1px;
}
"""
self.progressBarLowQ.setStyleSheet(DEFAULT_STYLE)
self.progressBarData.setStyleSheet(DEFAULT_STYLE)
self.progressBarHighQ.setStyleSheet(DEFAULT_STYLE)
self.progressBarLowQ.setMinimum(0)
self.progressBarLowQ.setMaximum(100)
self.progressBarData.setMinimum(0)
self.progressBarData.setMaximum(100)
self.progressBarHighQ.setMinimum(0)
self.progressBarHighQ.setMaximum(100)
# Modify font in order to display Angstrom symbol correctly
new_font = 'font-family: -apple-system, "Helvetica Neue", "Ubuntu";'
self.lblQLowQUnits.setStyleSheet(new_font)
self.lblQDataUnits.setStyleSheet(new_font)
self.lblQHighQUnits.setStyleSheet(new_font)
self.cmdOK.clicked.connect(self.accept)
self.warning_msg = "No Details on calculations available...\n"
# invariant total
self.qstar_total = None
self.qdata = None
self.qhigh = None
self.qlow = None
self._model = None
self.progress_low_qstar = 0.0
self.progress_high_qstar = 0.0
self.progress_data_qstar = 100.0
[docs] def setModel(self, model):
""" """
self._model = model
[docs] def showDialog(self):
""" Fill the dialog with values of calculated Q, progress bars"""
# Pull out data from the model
self.qstar_total = float(self._model.item(WIDGETS.W_INVARIANT).text())
# Reset progress counters
self.progress_low_qstar = 0.0
self.progress_high_qstar = 0.0
self.progress_data_qstar = 100.0
# Reset numerical values
self.txtQData.setText(None)
self.txtQDataErr.setText(None)
self.txtQLowQ.setText(None)
self.txtQLowQErr.setText(None)
self.txtQHighQ.setText(None)
self.txtQHighQErr.setText(None)
# Q* from data
self.qdata = float(self._model.item(WIDGETS.D_DATA_QSTAR).text())
self.txtQData.setText(str(self.qdata))
self.txtQDataErr.setText(self._model.item(WIDGETS.D_DATA_QSTAR_ERR).text())
try:
self.progress_data_qstar = (self.qdata/self.qstar_total)*100.0
except:
self.progress_data_qstar = 'error'
# Low-Q
if self._model.item(WIDGETS.W_ENABLE_LOWQ).text() == "true":
self.qlow = float(self._model.item(WIDGETS.D_LOW_QSTAR).text())
self.txtQLowQ.setText(str(self.qlow))
self.txtQLowQErr.setText(self._model.item(WIDGETS.D_LOW_QSTAR_ERR).text())
try:
self.progress_low_qstar = (self.qlow/self.qstar_total)*100.0
except:
self.progress_low_qstar = 'error'
# High-Q
if self._model.item(WIDGETS.W_ENABLE_HIGHQ).text() == "true":
self.qhigh = float(self._model.item(WIDGETS.D_HIGH_QSTAR).text())
self.txtQHighQ.setText(str(self.qhigh))
self.txtQHighQErr.setText(self._model.item(WIDGETS.D_HIGH_QSTAR_ERR).text())
try:
self.progress_high_qstar = (self.qhigh/self.qstar_total)*100.0
except:
self.progress_high_qstar = 'error'
# check values and display warning
if self.checkValues():
self.lblWarning.setText(self.checkValues())
# update progress bars
if self.progress_low_qstar == 'error':
self.progressBarLowQ.setValue(0)
else:
self.progressBarLowQ.setValue(self.progress_low_qstar)
self.progressBarLowQ.setFormat("%.2f %%" % self.progress_low_qstar)
if self.progress_high_qstar == 'error':
self.progressBarHighQ.setValue(0)
else:
self.progressBarHighQ.setValue(self.progress_high_qstar)
self.progressBarHighQ.setFormat("%.2f %%" % self.progress_high_qstar)
if self.progress_data_qstar == 'error':
self.progressBarData.setValue(0)
else:
self.progressBarData.setValue(self.progress_data_qstar)
self.progressBarData.setFormat("%.2f %%" % self.progress_data_qstar)
self.show()
[docs] def checkValues(self):
"""
Create a warning message to be displayed in panel
if problems with values
"""
if self.qstar_total is None:
warning_msg = "Invariant not calculated.\n"
return warning_msg
elif self.qstar_total == 0:
warning_msg = "Invariant is zero. \n " \
"The calculations are likely to be unreliable!\n"
return warning_msg
msg = ''
if self.progress_data_qstar == 'error':
msg += 'Error occurred when computing invariant from data.\n '
try:
if float(self.progress_data_qstar) > 100:
msg += "Invariant Q contribution is greater than 100% .\n"
except ValueError:
# Text message, skip msg update
pass
if self.progress_low_qstar == 'error':
try:
float(self.qlow)
except:
msg += "Error occurred when computing extrapolated invariant"
msg += " at low-Q region.\n"
elif self.progress_low_qstar is not None:
if self.progress_low_qstar >= 5:
msg += "Extrapolated contribution at Low Q is higher "
msg += "than 5% of the invariant.\n"
elif self.progress_low_qstar < 0:
msg += "Extrapolated contribution at Low Q < 0.\n"
elif self.progress_low_qstar > 100:
msg += "Extrapolated contribution at Low Q is greater "
msg += "than 100% .\n"
# High-Q
if self.progress_high_qstar == 'error':
try:
float(self.qhigh)
except:
msg += 'Error occurred when computing extrapolated'
msg += ' invariant at high-Q region.\n'
elif self.progress_high_qstar is not None:
if self.progress_high_qstar >= 5:
msg += "Extrapolated contribution at High Q is higher " \
"than 5% of the invariant.\n"
elif self.progress_high_qstar < 0:
msg += "Extrapolated contribution at High Q < 0.\n"
elif self.progress_high_qstar > 100:
msg += "Extrapolated contribution at High Q is greater " \
"than 100% .\n"
if (self.progress_low_qstar not in [None, "error"]) and \
(self.progress_high_qstar not in [None, "error"])\
and self.progress_low_qstar + self.progress_high_qstar >= 5:
msg += "The sum of all extrapolated contributions is higher " \
"than 5% of the invariant.\n"
if msg == '':
msg = "No Warnings to report\n"
return msg