Changeset 2aa960a in sasview


Ignore:
Timestamp:
Oct 25, 2017 9:01:37 AM (7 years ago)
Author:
Adam Washington <adam.washington@…>
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:
aae5f4c
Parents:
e7a0b2f (diff), f7d14a1 (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' of github.com:SasView/sasview into ESS_GUI

Location:
src/sas
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • src/sas/_config.py

    rb963b20 rf7d14a1  
    6565    try: 
    6666        module = load_module_from_path('sas.local_config', path) 
    67         logger.info("GuiManager loaded %s", path) 
     67        #logger.info("GuiManager loaded %s", path) 
    6868        return module 
    6969    except Exception as exc: 
    70         logger.critical("Error loading %s: %s", path, exc) 
     70        #logger.critical("Error loading %s: %s", path, exc) 
    7171        sys.exit() 
    7272 
     
    110110        try: 
    111111            module = load_module_from_path('sas.custom_config', path) 
    112             logger.info("GuiManager loaded %s", path) 
     112            #logger.info("GuiManager loaded %s", path) 
    113113            return module 
    114114        except Exception as exc: 
  • src/sas/qtgui/MainWindow/DataExplorer.py

    r1420066 r88e1f57  
    463463        Forces display of charts for the given filename 
    464464        """ 
    465         # Assure no multiple plots for the same ID 
    466465        plot_to_show = data_list[0] 
    467         if plot_to_show.id in PlotHelper.currentPlots(): 
    468             return 
    469  
    470         # Now query the model item for available plots 
     466 
     467        # passed plot is used ONLY to figure out its title, 
     468        # so all the charts related by it can be pulled from  
     469        # the data explorer indices. 
    471470        filename = plot_to_show.filename 
    472471        model = self.model if plot_to_show.is_data else self.theory_model 
     472 
     473        # Now query the model item for available plots 
    473474        plots = GuiUtils.plotsFromFilename(filename, model) 
     475        item = GuiUtils.itemFromFilename(filename, model) 
     476 
     477        new_plots = [] 
    474478        for plot in plots: 
    475479            plot_id = plot.id 
     
    477481                self.active_plots[plot_id].replacePlot(plot_id, plot) 
    478482            else: 
    479                 self.plotData([(None, plot)]) 
     483                # 'sophisticated' test to generate standalone plot for residuals 
     484                if 'esiduals' in plot.title: 
     485                    self.plotData([(item, plot)]) 
     486                else: 
     487                    new_plots.append((item, plot)) 
     488 
     489        if new_plots: 
     490            self.plotData(new_plots) 
    480491 
    481492    def addDataPlot2D(self, plot_set, item): 
     
    487498        plot2D.plot(plot_set) 
    488499        self.addPlot(plot2D) 
     500        self.active_plots[plot2D.data.id] = plot2D 
    489501        #============================================ 
    490502        # Experimental hook for silx charts 
     
    507519        # Call show on requested plots 
    508520        # All same-type charts in one plot 
    509         #if isinstance(plot_set, Data1D): 
    510         #    new_plot = Plotter(self) 
    511  
    512521        for item, plot_set in plots: 
    513522            if isinstance(plot_set, Data1D): 
     
    515524                    new_plot = Plotter(self) 
    516525                new_plot.plot(plot_set) 
     526                # active_plots may contain multiple charts 
     527                self.active_plots[plot_set.id] = new_plot 
    517528            elif isinstance(plot_set, Data2D): 
    518529                self.addDataPlot2D(plot_set, item) 
     
    556567 
    557568        # Update the active chart list 
    558         self.active_plots[new_plot.data.id] = new_plot 
     569        #self.active_plots[new_plot.data.id] = new_plot 
    559570 
    560571    def appendPlot(self): 
  • src/sas/qtgui/MainWindow/UnitTesting/DataExplorerTest.py

    rf4a1433 rf7d14a1  
    2525import sas.qtgui.Plotting.PlotHelper as PlotHelper 
    2626 
    27 #if not QApplication.instance(): 
    28 app = QApplication(sys.argv) 
     27if not QApplication.instance(): 
     28    app = QApplication(sys.argv) 
    2929 
    3030class DataExplorerTest(unittest.TestCase): 
     
    3737            def allowBatch(self): 
    3838                return False 
    39             def setData(self, data_item=None): 
     39            def setData(self, data_item=None, is_batch=False): 
    4040                return None 
    4141            def title(self): 
     
    170170 
    171171        # Populate the model 
    172         #filename = ["cyl_400_20.txt", "P123_D2O_10_percent.dat", "cyl_400_20.txt"] 
    173         filename = ["cyl_400_20.txt", "cyl_400_20.txt", "P123_D2O_10_percent.dat"] 
     172        filename = ["cyl_400_20.txt", "cyl_400_20.txt", "cyl_400_20.txt"] 
    174173        self.form.readData(filename) 
    175  
    176         self.form.show() 
    177         app.exec_() 
    178174 
    179175        # Assure the model contains three items 
  • 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): 
  • src/sas/qtgui/Perspectives/Fitting/FittingWidget.py

    ra95c44b rf7d14a1  
    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 
     
    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) 
  • src/sas/qtgui/Perspectives/Fitting/UnitTesting/FittingWidgetTest.py

    rc7358b2 rf7d14a1  
    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): 
     
    784784        self.assertEqual(self.widget.cbModel.currentText(), 'onion') 
    785785        self.assertTrue(self.widget.chkPolydispersity.isChecked()) 
     786        #Check if polidispersity tab is available 
     787        self.assertTrue(self.widget.tabFitting.isTabEnabled(3)) 
     788 
     789        #Check if magnetism box and tab are disabled when 1D data is loaded 
     790        self.assertFalse(self.widget.chkMagnetism.isEnabled()) 
     791        self.assertFalse(self.widget.tabFitting.isTabEnabled(4)) 
     792 
     793    def testReadFitPage2D(self): 
     794        """ 
     795        Read in the fitpage object and restore state 
     796        """ 
     797        # Set data 
     798 
     799        test_data = Data2D(image=[1.0, 2.0, 3.0], 
     800                           err_image=[0.01, 0.02, 0.03], 
     801                           qx_data=[0.1, 0.2, 0.3], 
     802                           qy_data=[0.1, 0.2, 0.3], 
     803                           xmin=0.1, xmax=0.3, ymin=0.1, ymax=0.3, 
     804                           mask=[True, True, True]) 
     805 
     806        # Force same data into logic 
     807        self.widget.logic.data = test_data 
     808        self.widget.data_is_loaded = True 
     809 
     810        #item = QtGui.QStandardItem() 
     811        #updateModelItem(item, [test_data], "test") 
     812        # Force same data into logic 
     813        #self.widget.logic.data = item 
     814        #self.widget.data_is_loaded = True 
     815 
     816        category_index = self.widget.cbCategory.findText("Cylinder") 
     817        self.widget.cbCategory.setCurrentIndex(category_index) 
     818 
     819        # Test no fitting params 
     820        self.widget.parameters_to_fit = ['scale'] 
     821 
     822        # Invoke the tested method 
     823        fp = self.widget.currentState() 
     824 
     825        # Prepare modified fit page 
     826        fp.current_model = 'cylinder' 
     827        fp.is_polydisperse = True 
     828        fp.is_magnetic = True 
     829        fp.is2D = True 
     830 
     831        # Read in modified state 
     832        self.widget.readFitPage(fp) 
     833 
     834        # Check if the widget got updated accordingly 
     835        self.assertEqual(self.widget.cbModel.currentText(), 'cylinder') 
     836        self.assertTrue(self.widget.chkPolydispersity.isChecked()) 
     837        self.assertTrue(self.widget.chkPolydispersity.isEnabled()) 
     838        #Check if polidispersity tab is available 
     839        self.assertTrue(self.widget.tabFitting.isTabEnabled(3)) 
     840 
     841        #Check if magnetism box and tab are disabled when 1D data is loaded 
     842        self.assertTrue(self.widget.chkMagnetism.isChecked()) 
     843        self.assertTrue(self.widget.chkMagnetism.isEnabled()) 
     844        self.assertTrue(self.widget.tabFitting.isTabEnabled(4)) 
    786845 
    787846    def testCurrentState(self): 
  • src/sas/qtgui/Perspectives/Fitting/ViewDelegate.py

    r16afe01 r7ffa5ee9  
    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): 
  • src/sas/qtgui/Utilities/GuiUtils.py

    rf0bb711 r88e1f57  
    313313    # Append the new row to the main item 
    314314    item.appendRow(object_item) 
     315 
     316def itemFromFilename(filename, model_item): 
     317    """ 
     318    Returns the model item text=filename in the model 
     319    """ 
     320    assert isinstance(model_item, QtGui.QStandardItemModel) 
     321    assert isinstance(filename, basestring) 
     322 
     323    # Iterate over model looking for named items 
     324    item = list(filter(lambda i: str(i.text()) == filename, 
     325                  [model_item.item(index) for index in range(model_item.rowCount())])) 
     326    return item[0] if len(item)>0 else None 
    315327 
    316328def plotsFromFilename(filename, model_item): 
Note: See TracChangeset for help on using the changeset viewer.