Changeset 3c6ecd9 in sasview for src/sas/qtgui/Perspectives/Inversion
- Timestamp:
- May 7, 2018 6:47:21 AM (7 years ago)
- Branches:
- ESS_GUI, ESS_GUI_Docs, ESS_GUI_batch_fitting, ESS_GUI_bumps_abstraction, ESS_GUI_iss1116, ESS_GUI_iss879, ESS_GUI_iss959, ESS_GUI_opencl, ESS_GUI_ordering, ESS_GUI_sync_sascalc
- Children:
- 42787fb
- Parents:
- b0ba43e (diff), 80468f6 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent. - Location:
- src/sas/qtgui/Perspectives/Inversion
- Files:
-
- 3 added
- 9 edited
- 1 moved
Legend:
- Unmodified
- Added
- Removed
-
src/sas/qtgui/Perspectives/Inversion/InversionPerspective.py
rb0ba43e r3c6ecd9 376 376 Open the P(r) Inversion help browser 377 377 """ 378 tree_location = "/user/ sasgui/perspectives/pr/pr_help.html"378 tree_location = "/user/qtgui/Perspectives/Inversion/pr_help.html" 379 379 380 380 # Actual file anchor will depend on the combo box index -
src/sas/qtgui/Perspectives/Inversion/media/pr_help.rst
- Property mode changed from 100644 to 100755
-
src/sas/qtgui/Perspectives/Inversion/DMaxExplorerWidget.py
rf4480f0 rb0ba43e 8 8 9 9 # global 10 import sys11 import os12 10 import logging 13 11 import numpy as np … … 42 40 super(DmaxWindow, self).__init__() 43 41 self.setupUi(self) 42 self.parent = parent 44 43 45 44 self.setWindowTitle("Dââ Explorer") … … 50 49 51 50 self.plot = PlotterWidget(self, self) 52 self.hasPlot = None51 self.hasPlot = False 53 52 self.verticalLayout.insertWidget(0, self.plot) 54 53 55 54 # Let's choose the Standard Item Model. 56 55 self.model = QtGui.QStandardItemModel(self) 57 self.mapper = None56 self.mapper = QtWidgets.QDataWidgetMapper(self) 58 57 59 58 # Add validators on line edits 60 59 self.setupValidators() 61 60 62 # #Connect buttons to slots.63 # #Needs to be done early so default values propagate properly.61 # Connect buttons to slots. 62 # Needs to be done early so default values propagate properly. 64 63 self.setupSlots() 65 64 … … 82 81 83 82 def setupModel(self): 83 self.model.blockSignals(True) 84 84 self.model.setItem(W.NPTS, QtGui.QStandardItem(str(self.nfunc))) 85 self.model.blockSignals(False) 86 self.model.blockSignals(True) 85 87 self.model.setItem(W.DMIN, QtGui.QStandardItem("{:.1f}".format(0.9*self.pr_state.d_max))) 88 self.model.blockSignals(False) 89 self.model.blockSignals(True) 86 90 self.model.setItem(W.DMAX, QtGui.QStandardItem("{:.1f}".format(1.1*self.pr_state.d_max))) 91 self.model.blockSignals(False) 92 self.model.blockSignals(True) 87 93 self.model.setItem(W.VARIABLE, QtGui.QStandardItem( "ϲ/dof")) 94 self.model.blockSignals(False) 88 95 89 96 def setupMapper(self): 90 self.mapper = QtWidgets.QDataWidgetMapper(self)91 97 self.mapper.setOrientation(QtCore.Qt.Vertical) 92 98 self.mapper.setModel(self.model) … … 111 117 chi2 = [] 112 118 113 xs = np.linspace(float(self.model.item(W.DMIN).text()), 114 float(self.model.item(W.DMAX).text()), 115 float(self.model.item(W.NPTS).text())) 119 try: 120 dmin = float(self.model.item(W.DMIN).text()) 121 dmax = float(self.model.item(W.DMAX).text()) 122 npts = float(self.model.item(W.NPTS).text()) 123 xs = np.linspace(dmin, dmax, npts) 124 except ValueError as e: 125 msg = ("An input value is not correctly formatted. Please check {}" 126 .format(e.message)) 127 logger.error(msg) 116 128 117 129 original = self.pr_state.d_max … … 132 144 msg = "ExploreDialog: inversion failed " 133 145 msg += "for D_max=%s\n%s" % (str(x), ex) 134 print(msg)135 146 logger.error(msg) 136 147 … … 142 153 msg = "ExploreDialog: inversion failed " 143 154 msg += "for D_max=%s\n%s" % (str(x), ex) 144 print(msg)145 155 logger.error(msg) 146 156 … … 151 161 if plotter == "ϲ/dof": 152 162 ys = chi2 153 y_label = "\ chi^2/dof"163 y_label = "\\chi^2/dof" 154 164 y_unit = "a.u." 155 165 elif plotter == "I(Q=0)": 156 166 ys = iq0 157 167 y_label = "I(q=0)" 158 y_unit = "\ AA^{-1}"168 y_unit = "\\AA^{-1}" 159 169 elif plotter == "Rg": 160 170 ys = rg 161 171 y_label = "R_g" 162 y_unit = "\ AA"172 y_unit = "\\AA" 163 173 elif plotter == "Oscillation parameter": 164 174 ys = osc … … 168 178 ys = bck 169 179 y_label = "Bckg" 170 y_unit = "\ AA^{-1}"180 y_unit = "\\AA^{-1}" 171 181 elif plotter == "Positive Fraction": 172 182 ys = pos … … 175 185 else: 176 186 ys = pos_err 177 y_label = "P^{+}_{1\ sigma}"187 y_label = "P^{+}_{1\\sigma}" 178 188 y_unit = "a.u." 179 189 … … 188 198 data._yunit = y_unit 189 199 self.plot.plot(data=data, marker="-") 200 201 def closeEvent(self, event): 202 """Override close event""" 203 self.parent.dmaxWindow = None 204 event.accept() -
src/sas/qtgui/Perspectives/Inversion/InversionLogic.py
- Property mode changed from 100755 to 100644
rfa81e94 r6da860a 1 1 import math 2 import pylab2 import logging 3 3 import numpy as np 4 4 … … 12 12 GROUP_ID_IQ_DATA = r"$I_{obs}(q)$" 13 13 GROUP_ID_PR_FIT = r"$P_{fit}(r)$" 14 PR_PLOT_PTS = 51 15 16 logger = logging.getLogger(__name__) 14 17 15 18 … … 19 22 No QStandardModelIndex here. 20 23 """ 21 22 # TODO: Add way to change this value23 _pr_n_pts = 5124 24 25 25 def __init__(self, data=None): … … 37 37 """ data setter """ 38 38 self._data = value 39 self.data_is_loaded = True39 self.data_is_loaded = (self._data is not None) 40 40 41 41 def isLoadedData(self): … … 63 63 maxq = pr.q_max 64 64 65 x = pylab.arange(minq, maxq, maxq / 301.0)65 x = np.arange(minq, maxq, maxq / 301.0) 66 66 y = np.zeros(len(x)) 67 67 err = np.zeros(len(x)) … … 73 73 except: 74 74 err[i] = 1.0 75 print(("Error getting error", value, x[i]))75 logger.log(("Error getting error", value, x[i])) 76 76 77 77 new_plot = Data1D(x, y) … … 89 89 # If we have used slit smearing, plot the smeared I(q) too 90 90 if pr.slit_width > 0 or pr.slit_height > 0: 91 x = pylab.arange(minq, maxq, maxq / 301.0)91 x = np.arange(minq, maxq, maxq / 301.0) 92 92 y = np.zeros(len(x)) 93 93 err = np.zeros(len(x)) … … 99 99 except: 100 100 err[i] = 1.0 101 print(("Error getting error", value, x[i]))101 logger.log(("Error getting error", value, x[i])) 102 102 103 103 new_plot = Data1D(x, y) … … 113 113 return new_plot 114 114 115 def update1DPlot(self, plot, out, pr, q=None):116 """117 Create a new 1D data instance based on fitting results118 """119 120 qtemp = pr.x121 if q is not None:122 qtemp = q123 124 # Make a plot125 maxq = max(qtemp)126 127 minq = min(qtemp)128 129 # Check for user min/max130 if pr.q_min is not None and maxq >= pr.q_min >= minq:131 minq = pr.q_min132 if pr.q_max is not None and maxq >= pr.q_max >= minq:133 maxq = pr.q_max134 135 x = pylab.arange(minq, maxq, maxq / 301.0)136 y = np.zeros(len(x))137 err = np.zeros(len(x))138 for i in range(len(x)):139 value = pr.iq(out, x[i])140 y[i] = value141 try:142 err[i] = math.sqrt(math.fabs(value))143 except:144 err[i] = 1.0145 print(("Error getting error", value, x[i]))146 147 plot.x = x148 plot.y = y149 150 # If we have used slit smearing, plot the smeared I(q) too151 if pr.slit_width > 0 or pr.slit_height > 0:152 x = pylab.arange(minq, maxq, maxq / 301.0)153 y = np.zeros(len(x))154 err = np.zeros(len(x))155 for i in range(len(x)):156 value = pr.iq_smeared(pr.out, x[i])157 y[i] = value158 try:159 err[i] = math.sqrt(math.fabs(value))160 except:161 err[i] = 1.0162 print(("Error getting error", value, x[i]))163 164 plot.x = x165 plot.y = y166 167 return plot168 169 115 def newPRPlot(self, out, pr, cov=None): 170 116 """ 171 117 """ 172 118 # Show P(r) 173 x = pylab.arange(0.0, pr.d_max, pr.d_max / self._pr_n_pts)119 x = np.arange(0.0, pr.d_max, pr.d_max / PR_PLOT_PTS) 174 120 175 121 y = np.zeros(len(x)) … … 193 139 y[i] = value 194 140 195 # if self._normalize_output == True:196 # y = y / total197 # dy = dy / total198 # elif self._scale_output_unity == True:199 # y = y / pmax200 # dy = dy / pmax201 202 141 if cov2 is None: 203 142 new_plot = Data1D(x, y) … … 209 148 new_plot.title = "P(r) fit" 210 149 new_plot.id = PR_FIT_LABEL 211 # Make sure that the plot is linear 212 new_plot.xtransform = "x" 213 new_plot.ytransform = "y" 150 new_plot.scale = "linear" 214 151 new_plot.group_id = GROUP_ID_PR_FIT 215 152 216 153 return new_plot 217 218 def updatePRPlot(self, plot, out, pr, cov=None):219 x = pylab.arange(0.0, pr.d_max, pr.d_max / self._pr_n_pts)220 221 y = np.zeros(len(x))222 dy = np.zeros(len(x))223 224 total = 0.0225 pmax = 0.0226 cov2 = np.ascontiguousarray(cov)227 228 for i in range(len(x)):229 if cov2 is None:230 value = pr.pr(out, x[i])231 else:232 (value, dy[i]) = pr.pr_err(out, cov2, x[i])233 total += value * pr.d_max / len(x)234 235 # keep track of the maximum P(r) value236 if value > pmax:237 pmax = value238 239 y[i] = value240 241 # if self._normalize_output == True:242 # y = y / total243 # dy = dy / total244 # elif self._scale_output_unity == True:245 # y = y / pmax246 # dy = dy / pmax247 plot.x = x248 plot.y = y249 250 if cov2 is not None:251 plot.dy = dy252 253 return plot254 154 255 155 def computeDataRange(self): -
src/sas/qtgui/Perspectives/Inversion/InversionUtils.py
- Property mode changed from 100755 to 100644
-
src/sas/qtgui/Perspectives/Inversion/Thread.py
- Property mode changed from 100755 to 100644
-
src/sas/qtgui/Perspectives/Inversion/UI/TabbedInversionUI.ui
- Property mode changed from 100755 to 100644
r8f83719f r72ecbdf2 317 317 <widget class="QLabel" name="label_22"> 318 318 <property name="text"> 319 <string > </string>319 <string/> 320 320 </property> 321 321 </widget> … … 754 754 </item> 755 755 <item> 756 <widget class="QPushButton" name="stopButton"> 757 <property name="text"> 758 <string>Stop P(r)</string> 759 </property> 760 </widget> 761 </item> 762 <item> 756 763 <spacer name="horizontalSpacer"> 757 764 <property name="orientation"> -
src/sas/qtgui/Perspectives/Inversion/UI/__init__.py
- Property mode changed from 100755 to 100644
-
src/sas/qtgui/Perspectives/Inversion/UnitTesting/InversionPerspectiveTest.py
r50bfab0 r72ecbdf2 1 import sys1 import time 2 2 import unittest 3 import logging4 3 from unittest.mock import MagicMock 5 4 6 5 from PyQt5 import QtGui, QtWidgets 7 from PyQt5.QtTest import QTest 8 from PyQt5 import QtCore 9 10 import sas.qtgui.path_prepare 6 7 from sas.qtgui.Utilities.GuiUtils import * 11 8 from sas.qtgui.Perspectives.Inversion.InversionPerspective import InversionWindow 12 from sas. sascalc.dataloader.loader import Loader9 from sas.qtgui.Perspectives.Inversion.InversionUtils import WIDGETS 13 10 from sas.qtgui.Plotting.PlotterData import Data1D 14 11 15 from sas.qtgui.MainWindow.DataManager import DataManager16 import sas.qtgui.Utilities.LocalConfig17 12 import sas.qtgui.Utilities.GuiUtils as GuiUtils 18 13 … … 20 15 app = QtWidgets.QApplication(sys.argv) 21 16 17 18 class dummy_manager(object): 19 HELP_DIRECTORY_LOCATION = "html" 20 communicate = Communicate() 21 22 def communicator(self): 23 return self.communicate 24 25 22 26 class InversionTest(unittest.TestCase): 23 '''Test the Inversion Interface''' 27 """ Test the Inversion Perspective GUI """ 28 24 29 def setUp(self): 25 '''Create the InversionWindow''' 26 self.widget = InversionWindow(None) 30 """ Create the InversionWindow """ 31 self.widget = InversionWindow(dummy_manager()) 32 self.widget.show() 33 self.fakeData1 = GuiUtils.HashableStandardItem("A") 34 self.fakeData2 = GuiUtils.HashableStandardItem("B") 35 reference_data1 = Data1D(x=[0.1, 0.2], y=[0.0, 0.0], dy=[0.0, 0.0]) 36 reference_data1.filename = "Test A" 37 reference_data2 = Data1D(x=[0.1, 0.2], y=[0.0, 0.0], dy=[0.0, 0.0]) 38 reference_data2.filename = "Test B" 39 GuiUtils.updateModelItem(self.fakeData1, reference_data1) 40 GuiUtils.updateModelItem(self.fakeData2, reference_data2) 27 41 28 42 def tearDown(self): 29 '''Destroy the InversionWindow''' 43 """ Destroy the InversionWindow """ 44 self.widget.setClosable(False) 30 45 self.widget.close() 31 46 self.widget = None 32 47 33 def testDefaults(self): 34 '''Test the GUI in its default state''' 48 def removeAllData(self): 49 """ Cleanup method to restore widget to its base state """ 50 if len(self.widget.dataList) > 0: 51 remove_me = list(self.widget._dataList.keys()) 52 self.widget.removeData(remove_me) 53 54 def baseGUIState(self): 55 """ Testing base state of Inversion """ 56 # base class information 35 57 self.assertIsInstance(self.widget, QtWidgets.QWidget) 36 58 self.assertEqual(self.widget.windowTitle(), "P(r) Inversion Perspective") 37 self.assertEqual(self.widget.model.columnCount(), 1) 38 self.assertEqual(self.widget.model.rowCount(), 22) 39 self.assertFalse(self.widget.calculateAllButton.isEnabled()) 40 self.assertFalse(self.widget.calculateThisButton.isEnabled()) 59 self.assertFalse(self.widget.isClosable()) 60 self.assertFalse(self.widget.isCalculating) 61 # mapper 41 62 self.assertIsInstance(self.widget.mapper, QtWidgets.QDataWidgetMapper) 42 # make sure the model is assigned and at least the data is mapped43 self.assertEqual(self.widget.mapper.model(), self.widget.model)44 63 self.assertNotEqual(self.widget.mapper.mappedSection(self.widget.dataList), -1) 45 46 64 # validators 47 65 self.assertIsInstance(self.widget.noOfTermsInput.validator(), QtGui.QIntValidator) … … 52 70 self.assertIsInstance(self.widget.slitHeightInput.validator(), QtGui.QDoubleValidator) 53 71 self.assertIsInstance(self.widget.slitWidthInput.validator(), QtGui.QDoubleValidator) 54 55 72 # model 56 73 self.assertEqual(self.widget.model.rowCount(), 22) 57 58 def testSetData(self): 59 ''' Check if sending data works as expected''' 60 # Create dummy data 61 item1 = GuiUtils.HashableStandardItem("A") 62 item2 = GuiUtils.HashableStandardItem("B") 63 reference_data = Data1D(x=[0.1, 0.2], y=[0.0, 0.0], dy=[0.0, 0.0]) 64 GuiUtils.updateModelItem(item1, [reference_data]) 65 GuiUtils.updateModelItem(item2, [reference_data]) 66 self.widget.performEstimate = MagicMock() 67 self.widget.setData([item1, item2]) 68 69 # Test the globals 70 self.assertEqual(len(self.widget._data_list), 2) 71 self.assertEqual(len(self.widget.data_plot_list), 2) 72 self.assertEqual(len(self.widget.pr_plot_list), 2) 73 self.assertEqual(self.widget.dataList.count(), 2) 74 75 # See that the buttons are now enabled 76 self.assertTrue(self.widget.calculateAllButton.isEnabled()) 74 self.assertEqual(self.widget.model.columnCount(), 1) 75 self.assertEqual(self.widget.mapper.model(), self.widget.model) 76 # buttons 77 self.assertFalse(self.widget.calculateThisButton.isEnabled()) 78 self.assertFalse(self.widget.removeButton.isEnabled()) 79 self.assertTrue(self.widget.stopButton.isEnabled()) 80 self.assertFalse(self.widget.stopButton.isVisible()) 81 self.assertFalse(self.widget.regConstantSuggestionButton.isEnabled()) 82 self.assertFalse(self.widget.noOfTermsSuggestionButton.isEnabled()) 83 self.assertFalse(self.widget.explorerButton.isEnabled()) 84 self.assertTrue(self.widget.helpButton.isEnabled()) 85 # extra windows and charts 86 self.assertIsNone(self.widget.dmaxWindow) 87 self.assertIsNone(self.widget.prPlot) 88 self.assertIsNone(self.widget.dataPlot) 89 # threads 90 self.assertIsNone(self.widget.calcThread) 91 self.assertIsNone(self.widget.estimationThread) 92 self.assertIsNone(self.widget.estimationThreadNT) 93 94 def baseBatchState(self): 95 """ Testing the base batch fitting state """ 96 self.assertTrue(self.widget.allowBatch()) 97 self.assertFalse(self.widget.isBatch) 98 self.assertIsNone(self.widget.batchResultsWindow) 99 self.assertFalse(self.widget.calculateAllButton.isEnabled()) 100 self.assertEqual(len(self.widget.batchResults), 0) 101 self.assertEqual(len(self.widget.batchComplete), 0) 102 self.widget.closeBatchResults() 103 self.assertIsNone(self.widget.batchResultsWindow) 104 105 def zeroDataSetState(self): 106 """ Testing the base data state of the GUI """ 107 # data variables 108 self.assertIsNone(self.widget._data) 109 self.assertEqual(len(self.widget._dataList), 0) 110 self.assertEqual(self.widget.nTermsSuggested, 10) 111 # inputs 112 self.assertEqual(len(self.widget.dataList), 0) 113 self.assertEqual(self.widget.backgroundInput.text(), "0.0") 114 self.assertEqual(self.widget.minQInput.text(), "") 115 self.assertEqual(self.widget.maxQInput.text(), "") 116 self.assertEqual(self.widget.regularizationConstantInput.text(), "0.0001") 117 self.assertEqual(self.widget.noOfTermsInput.text(), "10") 118 self.assertEqual(self.widget.maxDistanceInput.text(), "140.0") 119 120 def oneDataSetState(self): 121 """ Testing the base data state of the GUI """ 122 # Test the globals after first sent 123 self.assertEqual(len(self.widget._dataList), 1) 124 self.assertEqual(self.widget.dataList.count(), 1) 125 # See that the buttons are now enabled properly 126 self.widget.enableButtons() 127 self.assertFalse(self.widget.calculateAllButton.isEnabled()) 77 128 self.assertTrue(self.widget.calculateThisButton.isEnabled()) 78 129 self.assertTrue(self.widget.removeButton.isEnabled()) 79 130 self.assertTrue(self.widget.explorerButton.isEnabled()) 80 131 81 def notestRemoveData(self): 82 ''' Test data removal from widget ''' 83 # Create dummy data 84 item1 = GuiUtils.HashableStandardItem("A") 85 item2 = GuiUtils.HashableStandardItem("B") 86 reference_data1 = Data1D(x=[0.1, 0.2], y=[0.0, 0.0], dy=[0.0, 0.0]) 87 reference_data2 = Data1D(x=[0.1, 0.2], y=[0.0, 0.0], dy=[0.0, 0.0]) 88 GuiUtils.updateModelItem(item1, [reference_data1]) 89 GuiUtils.updateModelItem(item2, [reference_data2]) 90 self.widget.performEstimate = MagicMock() 91 self.widget.setData([item1, item2]) 92 132 def twoDataSetState(self): 133 """ Testing the base data state of the GUI """ 134 # Test the globals after first sent 135 self.assertEqual(len(self.widget._dataList), 2) 136 self.assertEqual(self.widget.dataList.count(), 2) 137 # See that the buttons are now enabled properly 138 self.widget.enableButtons() 139 self.assertTrue(self.widget.calculateThisButton.isEnabled()) 140 self.assertTrue(self.widget.calculateAllButton.isEnabled()) 141 self.assertTrue(self.widget.removeButton.isEnabled()) 142 self.assertTrue(self.widget.explorerButton.isEnabled()) 143 144 def testDefaults(self): 145 """ Test the GUI in its default state """ 146 self.baseGUIState() 147 self.zeroDataSetState() 148 self.baseBatchState() 149 self.removeAllData() 150 151 def testAllowBatch(self): 152 """ Batch P(r) Tests """ 153 self.baseBatchState() 154 self.widget.setData([self.fakeData1]) 155 self.oneDataSetState() 156 self.widget.setData([self.fakeData2]) 157 self.twoDataSetState() 158 self.widget.calculateAllButton.click() 159 self.assertTrue(self.widget.isCalculating) 160 self.assertTrue(self.widget.isBatch) 161 self.assertTrue(self.widget.stopButton.isVisible()) 162 self.assertTrue(self.widget.stopButton.isEnabled()) 163 self.assertIsNotNone(self.widget.batchResultsWindow) 164 self.assertTrue(self.widget.batchResultsWindow.cmdHelp.isEnabled()) 165 self.assertEqual(self.widget.batchResultsWindow.tblParams.columnCount(), 9) 166 self.assertEqual(self.widget.batchResultsWindow.tblParams.rowCount(), 2) 167 # Test stop button 168 self.widget.stopButton.click() 169 self.assertTrue(self.widget.batchResultsWindow.isVisible()) 170 self.assertFalse(self.widget.stopButton.isVisible()) 171 self.assertTrue(self.widget.stopButton.isEnabled()) 172 self.assertFalse(self.widget.isBatch) 173 self.assertFalse(self.widget.isCalculating) 174 self.widget.batchResultsWindow.close() 175 self.assertIsNone(self.widget.batchResultsWindow) 176 # Last test 177 self.removeAllData() 178 self.baseBatchState() 179 180 def testSetData(self): 181 """ Check if sending data works as expected """ 182 self.zeroDataSetState() 183 self.widget.setData([self.fakeData1]) 184 self.oneDataSetState() 185 self.widget.setData([self.fakeData1]) 186 self.oneDataSetState() 187 self.widget.setData([self.fakeData2]) 188 self.twoDataSetState() 189 self.removeAllData() 190 self.zeroDataSetState() 191 self.removeAllData() 192 193 def testRemoveData(self): 194 """ Test data removal from widget """ 195 self.widget.setData([self.fakeData1, self.fakeData2]) 196 self.twoDataSetState() 93 197 # Remove data 0 94 198 self.widget.removeData() 95 96 # Test the globals 97 self.assertEqual(len(self.widget._data_list), 1) 98 self.assertEqual(len(self.widget.data_plot_list), 1) 99 self.assertEqual(len(self.widget.pr_plot_list), 1) 100 self.assertEqual(self.widget.dataList.count(), 1) 101 102 103 def testAllowBatch(self): 104 ''' Batch is allowed for this perspective''' 105 self.assertTrue(self.widget.allowBatch()) 106 107 def notestModelChanged(self): 108 ''' test the model update ''' 109 # unfinished functionality 110 pass 111 112 def notestHelp(self): 113 ''' test help widget show ''' 114 # unfinished functionality 115 pass 116 117 def testOpenExplorerWindow(self): 118 ''' open Dx window ''' 119 self.widget.openExplorerWindow() 120 self.assertTrue(self.widget.dmaxWindow.isVisible()) 199 self.oneDataSetState() 200 self.removeAllData() 201 202 def testClose(self): 203 """ Test methods related to closing the window """ 204 self.assertFalse(self.widget.isClosable()) 205 self.widget.close() 206 self.assertTrue(self.widget.isMinimized()) 207 self.assertIsNone(self.widget.dmaxWindow) 208 self.assertIsNone(self.widget.batchResultsWindow) 209 self.widget.setClosable(False) 210 self.assertFalse(self.widget.isClosable()) 211 self.widget.close() 212 self.assertTrue(self.widget.isMinimized()) 213 self.widget.setClosable(True) 214 self.assertTrue(self.widget.isClosable()) 215 self.widget.setClosable() 216 self.assertTrue(self.widget.isClosable()) 217 self.removeAllData() 121 218 122 219 def testGetNFunc(self): 123 ''' test nfunc getter '''220 """ test nfunc getter """ 124 221 # Float 125 222 self.widget.noOfTermsInput.setText("10.0") … … 132 229 self.widget.noOfTermsInput.setText("") 133 230 n = self.widget.getNFunc() 134 self.assertEqual(cm.output, ['ERROR: root:Incorrect number of terms specified: '])231 self.assertEqual(cm.output, ['ERROR:sas.qtgui.Perspectives.Inversion.InversionPerspective:Incorrect number of terms specified: ']) 135 232 self.assertEqual(self.widget.getNFunc(), 10) 136 233 # string … … 138 235 self.widget.noOfTermsInput.setText("Nordvest Pizza") 139 236 n = self.widget.getNFunc() 140 self.assertEqual(cm.output, ['ERROR: root:Incorrect number of terms specified: Nordvest Pizza'])237 self.assertEqual(cm.output, ['ERROR:sas.qtgui.Perspectives.Inversion.InversionPerspective:Incorrect number of terms specified: Nordvest Pizza']) 141 238 self.assertEqual(self.widget.getNFunc(), 10) 239 self.removeAllData() 142 240 143 241 def testSetCurrentData(self): 144 ''' test current data setter ''' 145 # Create dummy data 146 item1 = GuiUtils.HashableStandardItem("A") 147 item2 = GuiUtils.HashableStandardItem("B") 148 reference_data1 = Data1D(x=[0.1, 0.2], y=[0.0, 0.0], dy=[0.0, 0.0]) 149 reference_data2 = Data1D(x=[0.1, 0.2], y=[0.0, 0.0], dy=[0.0, 0.0]) 150 GuiUtils.updateModelItem(item1, [reference_data1]) 151 GuiUtils.updateModelItem(item2, [reference_data2]) 152 self.widget.performEstimate = MagicMock() 153 self.widget.setData([item1, item2]) 242 """ test current data setter """ 243 self.widget.setData([self.fakeData1, self.fakeData2]) 154 244 155 245 # Check that the current data is reference2 156 self.assertEqual(self.widget._data, item2) 157 246 self.assertEqual(self.widget._data, self.fakeData2) 158 247 # Set the ref to none 159 248 self.widget.setCurrentData(None) 160 self.assertEqual(self.widget._data, item2) 161 249 self.assertEqual(self.widget._data, self.fakeData2) 162 250 # Set the ref to wrong type 163 251 with self.assertRaises(AttributeError): 164 252 self.widget.setCurrentData("Afandi Kebab") 165 166 # Set the reference to ref2 167 self.widget.setCurrentData(item1) 168 self.assertEqual(self.widget._data, item1) 253 # Set the reference to ref1 254 self.widget.setCurrentData(self.fakeData1) 255 self.assertEqual(self.widget._data, self.fakeData1) 256 self.removeAllData() 257 258 def testModelChanged(self): 259 """ Test setting the input and the model and vice-versa """ 260 # Initial values 261 self.assertEqual(self.widget._calculator.get_dmax(), 140.0) 262 self.assertEqual(self.widget._calculator.get_qmax(), -1.0) 263 self.assertEqual(self.widget._calculator.get_qmin(), -1.0) 264 self.assertEqual(self.widget._calculator.slit_height, 0.0) 265 self.assertEqual(self.widget._calculator.slit_width, 0.0) 266 self.assertEqual(self.widget._calculator.alpha, 0.0001) 267 # Set new values 268 self.widget.maxDistanceInput.setText("1.0") 269 self.widget.maxQInput.setText("3.0") 270 self.widget.minQInput.setText("5.0") 271 self.widget.slitHeightInput.setText("7.0") 272 self.widget.slitWidthInput.setText("9.0") 273 self.widget.regularizationConstantInput.setText("11.0") 274 # Check new values 275 self.assertEqual(self.widget._calculator.get_dmax(), 1.0) 276 self.assertEqual(self.widget._calculator.get_qmax(), 3.0) 277 self.assertEqual(self.widget._calculator.get_qmin(), 5.0) 278 self.assertEqual(self.widget._calculator.slit_height, 7.0) 279 self.assertEqual(self.widget._calculator.slit_width, 9.0) 280 self.assertEqual(self.widget._calculator.alpha, 11.0) 281 # Change model directly 282 self.widget.model.setItem(WIDGETS.W_MAX_DIST, QtGui.QStandardItem("2.0")) 283 self.widget.model.setItem(WIDGETS.W_QMIN, QtGui.QStandardItem("4.0")) 284 self.widget.model.setItem(WIDGETS.W_QMAX, QtGui.QStandardItem("6.0")) 285 self.widget.model.setItem(WIDGETS.W_SLIT_HEIGHT, QtGui.QStandardItem("8.0")) 286 self.widget.model.setItem(WIDGETS.W_SLIT_WIDTH, QtGui.QStandardItem("10.0")) 287 self.widget.model.setItem(WIDGETS.W_REGULARIZATION, QtGui.QStandardItem("12.0")) 288 # Check values 289 self.assertEqual(self.widget._calculator.get_dmax(), 2.0) 290 self.assertEqual(self.widget._calculator.get_qmin(), 4.0) 291 self.assertEqual(self.widget._calculator.get_qmax(), 6.0) 292 self.assertEqual(self.widget._calculator.slit_height, 8.0) 293 self.assertEqual(self.widget._calculator.slit_width, 10.0) 294 self.assertEqual(self.widget._calculator.alpha, 12.0) 295 self.removeAllData() 296 297 def testOpenExplorerWindow(self): 298 """ open Dx window """ 299 self.assertIsNone(self.widget.dmaxWindow) 300 self.assertFalse(self.widget.explorerButton.isEnabled()) 301 self.widget.openExplorerWindow() 302 self.assertIsNotNone(self.widget.dmaxWindow) 303 self.assertTrue(self.widget.dmaxWindow.isVisible()) 304 self.assertTrue(self.widget.dmaxWindow.windowTitle() == "Dââ Explorer") 305 169 306 170 307 if __name__ == "__main__": -
src/sas/qtgui/Perspectives/Inversion/__init__.py
- Property mode changed from 100755 to 100644
Note: See TracChangeset
for help on using the changeset viewer.