Changeset 02c11b04 in sasview for src/sas/qtgui/Perspectives


Ignore:
Timestamp:
Oct 26, 2017 3:34:19 AM (7 years ago)
Author:
krzywon
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.
Message:

Merge branch 'ESS_GUI_OpenCL_Dialog' into ESS_GUI

Location:
src/sas/qtgui/Perspectives/Fitting
Files:
3 added
5 edited

Legend:

Unmodified
Added
Removed
  • TabularUnified src/sas/qtgui/Perspectives/Fitting/FittingPerspective.py

    r377ade1 r14fa542  
    1111from sas.qtgui.Perspectives.Fitting.FittingWidget import FittingWidget 
    1212from sas.qtgui.Perspectives.Fitting.FittingOptions import FittingOptions 
     13from sas.qtgui.Perspectives.Fitting.GPUOptions import GPUOptions 
    1314from sas.qtgui.Perspectives.Fitting import ModelUtilities 
    1415 
     
    6061        # Listen to GUI Manager signal updating fit options 
    6162        self.fit_options_widget.fit_option_changed.connect(self.onFittingOptionsChange) 
     63 
     64        # GPU Options 
     65        self.gpu_options_widget = GPUOptions(self) 
    6266 
    6367        self.menu_manager = ModelUtilities.ModelManager() 
  • TabularUnified src/sas/qtgui/Perspectives/Fitting/FittingUtilities.py

    ra95c44b rd0dfcb2  
    88from sas.qtgui.Plotting.PlotterData import Data1D 
    99from sas.qtgui.Plotting.PlotterData import Data2D 
     10 
     11model_header_captions = ['Parameter', 'Value', 'Min', 'Max', 'Units'] 
     12 
     13model_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 
     19poly_header_captions = ['Parameter', 'PD[ratio]', 'Min', 'Max', 'Npts', 'Nsigs', 
     20                        'Function', 'Filename'] 
     21 
     22poly_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 
     32error_tooltip = 'Error value for fitted parameter' 
     33header_error_caption = 'Error' 
    1034 
    1135def replaceShellName(param_name, value): 
     
    131155    Adds predefined headers to the model 
    132156    """ 
    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 
    144162def addErrorHeadersToModel(model): 
    145163    """ 
    146164    Adds predefined headers to the model 
    147165    """ 
    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 
    161174 
    162175def addPolyHeadersToModel(model): 
     
    164177    Adds predefined headers to the model 
    165178    """ 
    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 
    184184 
    185185def addErrorPolyHeadersToModel(model): 
     
    187187    Adds predefined headers to the model 
    188188    """ 
    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 
    209197 
    210198def addShellsToModel(parameters, model, index): 
  • TabularUnified src/sas/qtgui/Perspectives/Fitting/FittingWidget.py

    ra95c44b re00b76e  
    1313from PyQt4 import QtWebKit 
    1414 
     15from sasmodels import product 
    1516from sasmodels import generate 
    1617from sasmodels import modelinfo 
     
    5253 
    5354class 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): 
    5660        QtGui.QStandardItemModel.__init__(self,parent) 
    5761 
    5862    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        """ 
    6070        if role == QtCore.Qt.ToolTipRole: 
    6171            if orientation == QtCore.Qt.Horizontal: 
     
    136146    def data(self, value): 
    137147        """ 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. 
    138150        if isinstance(value, list): 
    139151            self.is_batch_fitting = True 
     
    149161 
    150162        # Update logics with data items 
     163        # Logics.data contains only a single Data1D/Data2D object 
    151164        self.logic.data = GuiUtils.dataFromItem(value[0]) 
    152165 
     
    154167        self.is2D = True if isinstance(self.logic.data, Data2D) else False 
    155168 
     169        # Let others know we're full of data now 
    156170        self.data_is_loaded = True 
    157171 
     
    333347        self.chk2DView.setVisible(False) 
    334348        self.chkMagnetism.setEnabled(self.is2D) 
     349        self.tabFitting.setTabEnabled(TAB_MAGNETISM, self.is2D) 
    335350        # Combo box or label for file name" 
    336351        if self.is_batch_fitting: 
     
    344359        # Similarly on other tabs 
    345360        self.options_widget.setEnablementOnDataLoad() 
     361 
     362        # Reload the model 
     363        self.onSelectModel() 
    346364 
    347365        # Smearing tab 
     
    626644            return 
    627645 
    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. 
    629647 
    630648        # Update the parameter value - note: this supports +/-inf as well 
     
    10381056        # Regardless of previous state, this should now be `plot show` functionality only 
    10391057        self.cmdPlot.setText("Show Plot") 
    1040         if not self.data_is_loaded: 
    1041             self.recalculatePlotData() 
     1058        # Force data recalculation so existing charts are updated 
     1059        self.recalculatePlotData() 
    10421060        self.showPlot() 
    10431061 
     
    12531271        structure_module = generate.load_kernel_module(structure_factor) 
    12541272        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) 
    12551276 
    12561277        new_rows = FittingUtilities.addSimpleParametersToModel(structure_parameters, self.is2D) 
  • TabularUnified src/sas/qtgui/Perspectives/Fitting/UnitTesting/FittingWidgetTest.py

    rc7358b2 r9ea43c82  
    2020from sas.qtgui.Plotting.PlotterData import Data2D 
    2121 
    22 if not QtGui.QApplication.instance(): 
    23     app = QtGui.QApplication(sys.argv) 
     22#if not QtGui.QApplication.instance(): 
     23app = QtGui.QApplication(sys.argv) 
    2424 
    2525class dummy_manager(object): 
     
    100100        delegate = fittingWindow.lstPoly.itemDelegate() 
    101101        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]) 
    103103        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]) 
    104137        self.assertIsInstance(delegate.combo_updated, QtCore.pyqtBoundSignal) 
    105138 
     
    784817        self.assertEqual(self.widget.cbModel.currentText(), 'onion') 
    785818        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)) 
    786878 
    787879    def testCurrentState(self): 
  • TabularUnified src/sas/qtgui/Perspectives/Fitting/ViewDelegate.py

    r16afe01 r02f1d12  
    128128 
    129129    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] 
    131131 
    132132    def columnDict(self): 
     
    219219 
    220220    def editableParameters(self): 
    221         return [self.mag_min, self.mag_max] 
     221        return [self.mag_value, self.mag_min, self.mag_max] 
    222222 
    223223    def addErrorColumn(self): 
Note: See TracChangeset for help on using the changeset viewer.