Source code for sas.qtgui.Calculators.SlitSizeCalculator
"""
Slit Size Calculator Panel
"""
import os
import sys
import logging
from PyQt5 import QtCore
from PyQt5 import QtGui
from PyQt5 import QtWidgets
from sas.qtgui.UI import main_resources_rc
import sas.qtgui.Utilities.GuiUtils as GuiUtils
from .UI.SlitSizeCalculator import Ui_SlitSizeCalculator
from sas.sascalc.dataloader.loader import Loader
from sas.sascalc.calculator.slit_length_calculator import SlitlengthCalculator
[docs]class SlitSizeCalculator(QtWidgets.QDialog, Ui_SlitSizeCalculator):
"""
Provides the slit length calculator GUI.
"""
def __init__(self, parent=None):
super(SlitSizeCalculator, self).__init__()
self.setupUi(self)
# disable the context help icon
self.setWindowFlags(self.windowFlags() & ~QtCore.Qt.WindowContextHelpButtonHint)
self.setWindowTitle("Slit Size Calculator")
self._parent = parent
self.thickness = SlitlengthCalculator()
# signals
self.helpButton.clicked.connect(self.onHelp)
self.browseButton.clicked.connect(self.onBrowse)
self.closeButton.clicked.connect(self.onClose)
# no reason to have this widget resizable
self.setFixedSize(self.minimumSizeHint())
[docs] def onHelp(self):
"""
Bring up the Slit Size Calculator calculator Documentation whenever
the HELP button is clicked.
Calls DocumentationWindow with the path of the location within the
documentation tree (after /doc/ ....".
"""
location = "/user/qtgui/Calculators/slit_calculator_help.html"
self._parent.showHelp(location)
[docs] def onBrowse(self):
"""
Browse the file and calculate slit lenght upon loading
"""
path_str = self.chooseFile()
if not path_str:
return
loader = Loader()
try:
data = loader.load(path_str)
data = data[0]
# Can return multiple exceptions - gather them all under one umbrella and complain
except Exception as ex:
logging.error(ex)
return
self.data_file.setText(os.path.basename(path_str))
self.calculateSlitSize(data)
[docs] def chooseFile(self):
"""
Shows the Open file dialog and returns the chosen path(s)
"""
# Location is automatically saved - no need to keep track of the last dir
# But only with Qt built-in dialog (non-platform native)
path = QtWidgets.QFileDialog.getOpenFileName(self, "Choose a file", "",
"SAXSess 1D data (*.txt *.TXT *.dat *.DAT)",
None,
QtWidgets.QFileDialog.DontUseNativeDialog)[0]
return path
[docs] def onClose(self):
"""
close the window containing this panel
"""
self.close()
[docs] def clearResults(self):
"""
Clear the content of output LineEdits
"""
self.slit_length_out.setText("ERROR!")
self.unit_out.clear()
[docs] def calculateSlitSize(self, data=None):
"""
Computes slit lenght from given 1D data
"""
if data is None:
self.clearResults()
msg = "ERROR: Data hasn't been loaded correctly"
logging.error(msg)
return
if data.__class__.__name__ == 'Data2D':
self.clearResults()
msg = "Slit Length cannot be computed for 2D Data"
logging.error(msg)
return
#compute the slit size
try:
xdata = data.x
ydata = data.y
if xdata == [] or xdata is None or ydata == [] or ydata is None:
msg = "The current data is empty please check x and y"
logging.error(msg)
return
slit_length_calculator = SlitlengthCalculator()
slit_length_calculator.set_data(x=xdata, y=ydata)
slit_length = slit_length_calculator.calculate_slit_length()
except:
self.clearResults()
msg = "Slit Size Calculator: %s" % (sys.exc_info()[1])
logging.error(msg)
return
slit_length_str = "{:.5f}".format(slit_length)
self.slit_length_out.setText(slit_length_str)
#Display unit, which most likely needs to be 1/Ang but needs to be confirmed
self.unit_out.setText("[Unknown]")