Changeset 02c11b04 in sasview for src/sas/qtgui/Perspectives
- Timestamp:
- Oct 26, 2017 1:34:19 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:
- 9e54199
- Parents:
- 9ea43c82 (diff), f629e62f (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/Fitting
- Files:
-
- 3 added
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
src/sas/qtgui/Perspectives/Fitting/FittingPerspective.py
r377ade1 r14fa542 11 11 from sas.qtgui.Perspectives.Fitting.FittingWidget import FittingWidget 12 12 from sas.qtgui.Perspectives.Fitting.FittingOptions import FittingOptions 13 from sas.qtgui.Perspectives.Fitting.GPUOptions import GPUOptions 13 14 from sas.qtgui.Perspectives.Fitting import ModelUtilities 14 15 … … 60 61 # Listen to GUI Manager signal updating fit options 61 62 self.fit_options_widget.fit_option_changed.connect(self.onFittingOptionsChange) 63 64 # GPU Options 65 self.gpu_options_widget = GPUOptions(self) 62 66 63 67 self.menu_manager = ModelUtilities.ModelManager() -
src/sas/qtgui/Perspectives/Fitting/FittingUtilities.py
ra95c44b rd0dfcb2 8 8 from sas.qtgui.Plotting.PlotterData import Data1D 9 9 from sas.qtgui.Plotting.PlotterData import Data2D 10 11 model_header_captions = ['Parameter', 'Value', 'Min', 'Max', 'Units'] 12 13 model_header_tooltips = ['Select parameter for fitting', 14 'Enter parameter value', 15 'Enter minimum value for parameter', 16 'Enter maximum value for parameter', 17 'Unit of the parameter'] 18 19 poly_header_captions = ['Parameter', 'PD[ratio]', 'Min', 'Max', 'Npts', 'Nsigs', 20 'Function', 'Filename'] 21 22 poly_header_tooltips = ['Select parameter for fitting', 23 'Enter polydispersity ratio (STD/mean). ' 24 'STD: standard deviation from the mean value', 25 'Enter minimum value for parameter', 26 'Enter maximum value for parameter', 27 'Enter number of points for parameter', 28 'Enter number of sigmas parameter', 29 'Select distribution function', 30 'Select filename with user-definable distribution'] 31 32 error_tooltip = 'Error value for fitted parameter' 33 header_error_caption = 'Error' 10 34 11 35 def replaceShellName(param_name, value): … … 131 155 Adds predefined headers to the model 132 156 """ 133 model.setHeaderData(0, QtCore.Qt.Horizontal, QtCore.QVariant("Parameter")) 134 model.setHeaderData(1, QtCore.Qt.Horizontal, QtCore.QVariant("Value")) 135 model.setHeaderData(2, QtCore.Qt.Horizontal, QtCore.QVariant("Min")) 136 model.setHeaderData(3, QtCore.Qt.Horizontal, QtCore.QVariant("Max")) 137 model.setHeaderData(4, QtCore.Qt.Horizontal, QtCore.QVariant("Units")) 138 139 model.header_tooltips = ['Select parameter for fitting', 140 'Enter parameter value', 141 'Enter minimum value for parameter', 142 'Enter maximum value for parameter', 143 'Unit of the parameter'] 157 for i, item in enumerate(model_header_captions): 158 model.setHeaderData(i, QtCore.Qt.Horizontal, QtCore.QVariant(item)) 159 160 model.header_tooltips = model_header_tooltips 161 144 162 def addErrorHeadersToModel(model): 145 163 """ 146 164 Adds predefined headers to the model 147 165 """ 148 model.setHeaderData(0, QtCore.Qt.Horizontal, QtCore.QVariant("Parameter")) 149 model.setHeaderData(1, QtCore.Qt.Horizontal, QtCore.QVariant("Value")) 150 model.setHeaderData(2, QtCore.Qt.Horizontal, QtCore.QVariant("Error")) 151 model.setHeaderData(3, QtCore.Qt.Horizontal, QtCore.QVariant("Min")) 152 model.setHeaderData(4, QtCore.Qt.Horizontal, QtCore.QVariant("Max")) 153 model.setHeaderData(5, QtCore.Qt.Horizontal, QtCore.QVariant("Units")) 154 155 model.header_tooltips = ['Select parameter for fitting', 156 'Enter parameter value', 157 'Error value for fitted parameter', 158 'Enter minimum value for parameter', 159 'Enter maximum value for parameter', 160 'Unit of the parameter'] 166 model_header_error_captions = model_header_captions 167 model_header_error_captions.insert(2, header_error_caption) 168 for i, item in enumerate(model_header_error_captions): 169 model.setHeaderData(i, QtCore.Qt.Horizontal, QtCore.QVariant(item)) 170 171 model_header_error_tooltips = model_header_tooltips 172 model_header_error_tooltips.insert(2, error_tooltip) 173 model.header_tooltips = model_header_error_tooltips 161 174 162 175 def addPolyHeadersToModel(model): … … 164 177 Adds predefined headers to the model 165 178 """ 166 model.setHeaderData(0, QtCore.Qt.Horizontal, QtCore.QVariant("Parameter")) 167 model.setHeaderData(1, QtCore.Qt.Horizontal, QtCore.QVariant("PD[ratio]")) 168 model.setHeaderData(2, QtCore.Qt.Horizontal, QtCore.QVariant("Min")) 169 model.setHeaderData(3, QtCore.Qt.Horizontal, QtCore.QVariant("Max")) 170 model.setHeaderData(4, QtCore.Qt.Horizontal, QtCore.QVariant("Npts")) 171 model.setHeaderData(5, QtCore.Qt.Horizontal, QtCore.QVariant("Nsigs")) 172 model.setHeaderData(6, QtCore.Qt.Horizontal, QtCore.QVariant("Function")) 173 model.setHeaderData(7, QtCore.Qt.Horizontal, QtCore.QVariant("Filename")) 174 175 model.header_tooltips = ['Select parameter for fitting', 176 'Enter polydispersity ratio (STD/mean). ' 177 'STD: standard deviation from the mean value', 178 'Enter minimum value for parameter', 179 'Enter maximum value for parameter', 180 'Enter number of points for parameter', 181 'Enter number of sigmas parameter', 182 'Select distribution function', 183 'Select filename with user-definable distribution'] 179 for i, item in enumerate(poly_header_captions): 180 model.setHeaderData(i, QtCore.Qt.Horizontal, QtCore.QVariant(item)) 181 182 model.header_tooltips = poly_header_tooltips 183 184 184 185 185 def addErrorPolyHeadersToModel(model): … … 187 187 Adds predefined headers to the model 188 188 """ 189 model.setHeaderData(0, QtCore.Qt.Horizontal, QtCore.QVariant("Parameter")) 190 model.setHeaderData(1, QtCore.Qt.Horizontal, QtCore.QVariant("PD[ratio]")) 191 model.setHeaderData(2, QtCore.Qt.Horizontal, QtCore.QVariant("Error")) 192 model.setHeaderData(3, QtCore.Qt.Horizontal, QtCore.QVariant("Min")) 193 model.setHeaderData(4, QtCore.Qt.Horizontal, QtCore.QVariant("Max")) 194 model.setHeaderData(5, QtCore.Qt.Horizontal, QtCore.QVariant("Npts")) 195 model.setHeaderData(6, QtCore.Qt.Horizontal, QtCore.QVariant("Nsigs")) 196 model.setHeaderData(7, QtCore.Qt.Horizontal, QtCore.QVariant("Function")) 197 model.setHeaderData(8, QtCore.Qt.Horizontal, QtCore.QVariant("Filename")) 198 199 model.header_tooltips = ['Select parameter for fitting', 200 'Enter polydispersity ratio (STD/mean). ' 201 'STD: standard deviation from the mean value', 202 'Error value for fitted parameter', 203 'Enter minimum value for parameter', 204 'Enter maximum value for parameter', 205 'Enter number of points for parameter', 206 'Enter number of sigmas parameter', 207 'Select distribution function', 208 'Select filename with user-definable distribution'] 189 poly_header_error_captions = poly_header_captions 190 poly_header_error_captions.insert(2, header_error_caption) 191 for i, item in enumerate(poly_header_error_captions): 192 model.setHeaderData(i, QtCore.Qt.Horizontal, QtCore.QVariant(item)) 193 194 poly_header_error_tooltips = poly_header_tooltips 195 poly_header_error_tooltips.insert(2, error_tooltip) 196 model.header_tooltips = poly_header_error_tooltips 209 197 210 198 def addShellsToModel(parameters, model, index): -
src/sas/qtgui/Perspectives/Fitting/FittingWidget.py
ra95c44b re00b76e 13 13 from PyQt4 import QtWebKit 14 14 15 from sasmodels import product 15 16 from sasmodels import generate 16 17 from sasmodels import modelinfo … … 52 53 53 54 class ToolTippedItemModel(QtGui.QStandardItemModel): 54 55 def __init__(self, parent = None): 55 """ 56 Subclass from QStandardItemModel to allow displaying tooltips in 57 QTableView model. 58 """ 59 def __init__(self, parent=None): 56 60 QtGui.QStandardItemModel.__init__(self,parent) 57 61 58 62 def headerData(self, section, orientation, role): 59 63 """ 64 Displays tooltip for each column's header 65 :param section: 66 :param orientation: 67 :param role: 68 :return: 69 """ 60 70 if role == QtCore.Qt.ToolTipRole: 61 71 if orientation == QtCore.Qt.Horizontal: … … 136 146 def data(self, value): 137 147 """ data setter """ 148 # Value is either a list of indices for batch fitting or a simple index 149 # for standard fitting. Assure we have a list, regardless. 138 150 if isinstance(value, list): 139 151 self.is_batch_fitting = True … … 149 161 150 162 # Update logics with data items 163 # Logics.data contains only a single Data1D/Data2D object 151 164 self.logic.data = GuiUtils.dataFromItem(value[0]) 152 165 … … 154 167 self.is2D = True if isinstance(self.logic.data, Data2D) else False 155 168 169 # Let others know we're full of data now 156 170 self.data_is_loaded = True 157 171 … … 333 347 self.chk2DView.setVisible(False) 334 348 self.chkMagnetism.setEnabled(self.is2D) 349 self.tabFitting.setTabEnabled(TAB_MAGNETISM, self.is2D) 335 350 # Combo box or label for file name" 336 351 if self.is_batch_fitting: … … 344 359 # Similarly on other tabs 345 360 self.options_widget.setEnablementOnDataLoad() 361 362 # Reload the model 363 self.onSelectModel() 346 364 347 365 # Smearing tab … … 626 644 return 627 645 628 property_index = self._magnet_model.headerData( 1, model_column).toInt()[0]-1 # Value, min, max, etc.646 property_index = self._magnet_model.headerData(0, 1, model_column).toInt()[0]-1 # Value, min, max, etc. 629 647 630 648 # Update the parameter value - note: this supports +/-inf as well … … 1038 1056 # Regardless of previous state, this should now be `plot show` functionality only 1039 1057 self.cmdPlot.setText("Show Plot") 1040 if not self.data_is_loaded:1041 1058 # Force data recalculation so existing charts are updated 1059 self.recalculatePlotData() 1042 1060 self.showPlot() 1043 1061 … … 1253 1271 structure_module = generate.load_kernel_module(structure_factor) 1254 1272 structure_parameters = modelinfo.make_parameter_table(getattr(structure_module, 'parameters', [])) 1273 structure_kernel = self.models[structure_factor]() 1274 1275 self.kernel_module._model_info = product.make_product_info(self.kernel_module._model_info, structure_kernel._model_info) 1255 1276 1256 1277 new_rows = FittingUtilities.addSimpleParametersToModel(structure_parameters, self.is2D) -
src/sas/qtgui/Perspectives/Fitting/UnitTesting/FittingWidgetTest.py
rc7358b2 r9ea43c82 20 20 from sas.qtgui.Plotting.PlotterData import Data2D 21 21 22 if not QtGui.QApplication.instance():23 22 #if not QtGui.QApplication.instance(): 23 app = QtGui.QApplication(sys.argv) 24 24 25 25 class dummy_manager(object): … … 100 100 delegate = fittingWindow.lstPoly.itemDelegate() 101 101 self.assertEqual(len(delegate.POLYDISPERSE_FUNCTIONS), 5) 102 self.assertEqual(delegate.editableParameters(), [ 2, 3, 4, 5])102 self.assertEqual(delegate.editableParameters(), [1, 2, 3, 4, 5]) 103 103 self.assertEqual(delegate.poly_function, 6) 104 self.assertIsInstance(delegate.combo_updated, QtCore.pyqtBoundSignal) 105 106 def testSelectMagnetism(self): 107 """ 108 Test if models have been loaded properly 109 """ 110 fittingWindow = self.widget 111 112 self.assertIsInstance(fittingWindow.lstMagnetic.itemDelegate(), QtGui.QStyledItemDelegate) 113 #Test loading from json categories 114 fittingWindow.SASModelToQModel("cylinder") 115 mag_index = fittingWindow.lstMagnetic.model().index(0,0) 116 self.assertEqual(str(mag_index.data().toString()), "up:frac_i") 117 mag_index = fittingWindow.lstMagnetic.model().index(1,0) 118 self.assertEqual(str(mag_index.data().toString()), "up:frac_f") 119 mag_index = fittingWindow.lstMagnetic.model().index(2,0) 120 self.assertEqual(str(mag_index.data().toString()), "up:angle") 121 mag_index = fittingWindow.lstMagnetic.model().index(3,0) 122 self.assertEqual(str(mag_index.data().toString()), "M0:sld") 123 mag_index = fittingWindow.lstMagnetic.model().index(4,0) 124 self.assertEqual(str(mag_index.data().toString()), "mtheta:sld") 125 mag_index = fittingWindow.lstMagnetic.model().index(5,0) 126 self.assertEqual(str(mag_index.data().toString()), "mphi:sld") 127 mag_index = fittingWindow.lstMagnetic.model().index(6,0) 128 self.assertEqual(str(mag_index.data().toString()), "M0:sld_solvent") 129 mag_index = fittingWindow.lstMagnetic.model().index(7,0) 130 self.assertEqual(str(mag_index.data().toString()), "mtheta:sld_solvent") 131 mag_index = fittingWindow.lstMagnetic.model().index(8,0) 132 self.assertEqual(str(mag_index.data().toString()), "mphi:sld_solvent") 133 134 # test the delegate a bit 135 delegate = fittingWindow.lstMagnetic.itemDelegate() 136 self.assertEqual(delegate.editableParameters(), [1, 2, 3]) 104 137 self.assertIsInstance(delegate.combo_updated, QtCore.pyqtBoundSignal) 105 138 … … 784 817 self.assertEqual(self.widget.cbModel.currentText(), 'onion') 785 818 self.assertTrue(self.widget.chkPolydispersity.isChecked()) 819 #Check if polidispersity tab is available 820 self.assertTrue(self.widget.tabFitting.isTabEnabled(3)) 821 822 #Check if magnetism box and tab are disabled when 1D data is loaded 823 self.assertFalse(self.widget.chkMagnetism.isEnabled()) 824 self.assertFalse(self.widget.tabFitting.isTabEnabled(4)) 825 826 def testReadFitPage2D(self): 827 """ 828 Read in the fitpage object and restore state 829 """ 830 # Set data 831 832 test_data = Data2D(image=[1.0, 2.0, 3.0], 833 err_image=[0.01, 0.02, 0.03], 834 qx_data=[0.1, 0.2, 0.3], 835 qy_data=[0.1, 0.2, 0.3], 836 xmin=0.1, xmax=0.3, ymin=0.1, ymax=0.3, 837 mask=[True, True, True]) 838 839 # Force same data into logic 840 self.widget.logic.data = test_data 841 self.widget.data_is_loaded = True 842 843 #item = QtGui.QStandardItem() 844 #updateModelItem(item, [test_data], "test") 845 # Force same data into logic 846 #self.widget.logic.data = item 847 #self.widget.data_is_loaded = True 848 849 category_index = self.widget.cbCategory.findText("Cylinder") 850 self.widget.cbCategory.setCurrentIndex(category_index) 851 852 # Test no fitting params 853 self.widget.parameters_to_fit = ['scale'] 854 855 # Invoke the tested method 856 fp = self.widget.currentState() 857 858 # Prepare modified fit page 859 fp.current_model = 'cylinder' 860 fp.is_polydisperse = True 861 fp.is_magnetic = True 862 fp.is2D = True 863 864 # Read in modified state 865 self.widget.readFitPage(fp) 866 867 # Check if the widget got updated accordingly 868 self.assertEqual(self.widget.cbModel.currentText(), 'cylinder') 869 self.assertTrue(self.widget.chkPolydispersity.isChecked()) 870 self.assertTrue(self.widget.chkPolydispersity.isEnabled()) 871 #Check if polidispersity tab is available 872 self.assertTrue(self.widget.tabFitting.isTabEnabled(3)) 873 874 #Check if magnetism box and tab are disabled when 1D data is loaded 875 self.assertTrue(self.widget.chkMagnetism.isChecked()) 876 self.assertTrue(self.widget.chkMagnetism.isEnabled()) 877 self.assertTrue(self.widget.tabFitting.isTabEnabled(4)) 786 878 787 879 def testCurrentState(self): -
src/sas/qtgui/Perspectives/Fitting/ViewDelegate.py
r16afe01 r02f1d12 128 128 129 129 def editableParameters(self): 130 return [self.poly_ min, self.poly_max, self.poly_npts, self.poly_nsigs]130 return [self.poly_pd, self.poly_min, self.poly_max, self.poly_npts, self.poly_nsigs] 131 131 132 132 def columnDict(self): … … 219 219 220 220 def editableParameters(self): 221 return [self.mag_ min, self.mag_max]221 return [self.mag_value, self.mag_min, self.mag_max] 222 222 223 223 def addErrorColumn(self):
Note: See TracChangeset
for help on using the changeset viewer.