Changes in / [0101c9f:5a2bb75] in sasview


Ignore:
Location:
src/sas/qtgui
Files:
1 deleted
8 edited

Legend:

Unmodified
Added
Removed
  • src/sas/qtgui/MainWindow/DataExplorer.py

    r339e22b rfd7ef36  
    4242        # Main model for keeping loaded data 
    4343        self.model = QtGui.QStandardItemModel(self) 
     44 
    4445        # Secondary model for keeping frozen data sets 
    4546        self.theory_model = QtGui.QStandardItemModel(self) 
     
    9798        self.communicator.plotUpdateSignal.connect(self.updatePlot) 
    9899        self.communicator.maskEditorSignal.connect(self.showEditDataMask) 
    99         self.communicator.extMaskEditorSignal.connect(self.extShowEditDataMask) 
    100100 
    101101        self.cbgraph.editTextChanged.connect(self.enableGraphCombo) 
     
    560560        # Now query the model item for available plots 
    561561        plots = GuiUtils.plotsFromFilename(filename, model) 
     562        ids_keys = list(self.active_plots.keys()) 
     563        ids_vals = [val.data.id for val in self.active_plots.values()] 
    562564 
    563565        new_plots = [] 
    564566        for item, plot in plots.items(): 
    565             if not self.updatePlot(plot): 
     567            plot_id = plot.id 
     568            if plot_id in ids_keys: 
     569                self.active_plots[plot_id].replacePlot(plot_id, plot) 
     570            elif plot_id in ids_vals: 
     571                list(self.active_plots.values())[ids_vals.index(plot_id)].replacePlot(plot_id, plot) 
     572            else: 
    566573                # Don't plot intermediate results, e.g. P(Q), S(Q) 
    567                 match = GuiUtils.theory_plot_ID_pattern.match(plot.id) 
     574                match = GuiUtils.theory_plot_ID_pattern.match(plot_id) 
    568575                # 2nd match group contains the identifier for the intermediate result, if present (e.g. "[P(Q)]") 
    569576                if match and match.groups()[1] != None: 
     
    699706                self.active_plots[plot_set.id] = old_plot 
    700707 
    701     def updatePlot(self, data): 
    702         """ 
    703         Modify existing plot for immediate response and returns True. 
    704         Returns false, if the plot does not exist already. 
    705         """ 
    706         try: # there might be a list or a single value being passed 
    707             data = data[0] 
    708         except TypeError: 
    709             pass 
     708    def updatePlot(self, new_data): 
     709        """ 
     710        Modify existing plot for immediate response 
     711        """ 
     712        data = new_data[0] 
    710713        assert type(data).__name__ in ['Data1D', 'Data2D'] 
    711714 
     
    716719        if data_id in ids_keys: 
    717720            self.active_plots[data_id].replacePlot(data_id, data) 
    718             return True 
    719721        elif data_id in ids_vals: 
    720722            list(self.active_plots.values())[ids_vals.index(data_id)].replacePlot(data_id, data) 
    721             return True 
    722         return False 
    723723 
    724724    def chooseFiles(self): 
     
    10591059        self.new_plot.show() 
    10601060 
    1061     def extShowEditDataMask(self): 
    1062         self.showEditDataMask() 
    1063  
    10641061    def showEditDataMask(self, data=None): 
    10651062        """ 
    10661063        Mask Editor for 2D plots 
    10671064        """ 
    1068         try: 
    1069             if data is None or not isinstance(data, Data2D): 
    1070                 index = self.current_view.selectedIndexes()[0] 
    1071                 proxy = self.current_view.model() 
    1072                 model = proxy.sourceModel() 
    1073                 model_item = model.itemFromIndex(proxy.mapToSource(index)) 
    1074  
    1075                 data = GuiUtils.dataFromItem(model_item) 
    1076  
    1077             if data is None or not isinstance(data, Data2D): 
    1078                 msg = QtWidgets.QMessageBox() 
    1079                 msg.setIcon(QtWidgets.QMessageBox.Information) 
    1080                 msg.setText("Error: cannot apply mask. \ 
    1081                                 Please select a 2D dataset.") 
    1082                 msg.setStandardButtons(QtWidgets.QMessageBox.Cancel) 
    1083                 msg.exec_() 
    1084                 return 
    1085         except: 
    1086             msg = QtWidgets.QMessageBox() 
    1087             msg.setIcon(QtWidgets.QMessageBox.Information) 
    1088             msg.setText("Error: No dataset selected. \ 
    1089                             Please select a 2D dataset.") 
    1090             msg.setStandardButtons(QtWidgets.QMessageBox.Cancel) 
    1091             msg.exec_() 
    1092             return 
     1065        if data is None or not isinstance(data, Data2D): 
     1066            index = self.current_view.selectedIndexes()[0] 
     1067            proxy = self.current_view.model() 
     1068            model = proxy.sourceModel() 
     1069            model_item = model.itemFromIndex(proxy.mapToSource(index)) 
     1070 
     1071            data = GuiUtils.dataFromItem(model_item) 
    10931072 
    10941073        mask_editor = MaskEditor(self, data) 
  • src/sas/qtgui/MainWindow/GuiManager.py

    r339e22b rf84d793  
    422422        self._workspace.actionExcel.triggered.connect(self.actionExcel) 
    423423        self._workspace.actionLatex.triggered.connect(self.actionLatex) 
     424 
    424425        # View 
    425426        self._workspace.actionShow_Grid_Window.triggered.connect(self.actionShow_Grid_Window) 
     
    451452        self._workspace.actionManage_Custom_Models.triggered.connect(self.actionManage_Custom_Models) 
    452453        self._workspace.actionAddMult_Models.triggered.connect(self.actionAddMult_Models) 
    453         self._workspace.actionEditMask.triggered.connect(self.actionEditMask) 
    454  
    455454        # Window 
    456455        self._workspace.actionCascade.triggered.connect(self.actionCascade) 
     
    782781        self.add_mult_editor.show() 
    783782 
    784     def actionEditMask(self): 
    785  
    786         self.communicate.extMaskEditorSignal.emit() 
    787  
    788783    #============ ANALYSIS ================= 
    789784    def actionFitting(self): 
  • src/sas/qtgui/MainWindow/UI/MainWindowUI.ui

    r339e22b rdda8f16  
    113113    <addaction name="actionManage_Custom_Models"/> 
    114114    <addaction name="actionAddMult_Models"/> 
    115     <addaction name="separator"/> 
    116     <addaction name="EditMask"/> 
    117115   </widget> 
    118116   <widget class="QMenu" name="menuWindow"> 
     
    415413   </property> 
    416414  </action> 
    417     <action name="EditMask"> 
    418    <property name="text"> 
    419     <string>Edit Mask</string> 
    420    </property> 
    421   </action> 
    422415  <action name="actionCascade"> 
    423416   <property name="text"> 
  • src/sas/qtgui/Perspectives/Fitting/FittingUtilities.py

    r70f4458 rb764ae5  
    88from sas.qtgui.Plotting.PlotterData import Data1D 
    99from sas.qtgui.Plotting.PlotterData import Data2D 
    10  
    11 from sas.qtgui.Perspectives.Fitting.AssociatedComboBox import AssociatedComboBox 
    1210 
    1311model_header_captions = ['Parameter', 'Value', 'Min', 'Max', 'Units'] 
     
    6361    return (param_name, param_length) 
    6462 
    65 def createFixedChoiceComboBox(param, item_row): 
    66     """ 
    67     Determines whether param is a fixed-choice parameter, modifies items in item_row appropriately and returns a combo 
    68     box containing the fixed choices. Returns None if param is not fixed-choice. 
    69      
    70     item_row is a list of QStandardItem objects for insertion into the parameter table.  
    71     """ 
    72  
    73     # Determine whether this is a fixed-choice parameter. There are lots of conditionals, simply because the 
    74     # implementation is not yet concrete; there are several possible indicators that the parameter is fixed-choice. 
    75     # TODO: (when the sasmodels implementation is concrete, clean this up) 
    76     choices = None 
    77     if isinstance(param.choices, (list, tuple)) and len(param.choices) > 0: 
    78         # The choices property is concrete in sasmodels, probably will use this 
    79         choices = param.choices 
    80     elif isinstance(param.units, (list, tuple)): 
    81         choices = [str(x) for x in param.units] 
    82  
    83     cbox = None 
    84     if choices is not None: 
    85         # Use combo box for input, if it is fixed-choice 
    86         cbox = AssociatedComboBox(item_row[1], idx_as_value=True) 
    87         cbox.addItems(choices) 
    88         item_row[2].setEditable(False) 
    89         item_row[3].setEditable(False) 
    90  
    91     return cbox 
    92  
    93 def addParametersToModel(parameters, kernel_module, is2D, model=None, view=None): 
    94     """ 
    95     Update local ModelModel with sasmodel parameters. 
    96     Actually appends to model, if model and view params are not None. 
    97     Always returns list of lists of QStandardItems. 
     63def addParametersToModel(parameters, kernel_module, is2D): 
     64    """ 
     65    Update local ModelModel with sasmodel parameters 
    9866    """ 
    9967    multishell_parameters = getIterParams(parameters) 
     
    10472    else: 
    10573        params = parameters.iq_parameters 
    106  
    107     rows = [] 
     74    item = [] 
    10875    for param in params: 
    10976        # don't include shell parameters 
    11077        if param.name == multishell_param_name: 
    11178            continue 
    112  
    11379        # Modify parameter name from <param>[n] to <param>1 
    11480        item_name = param.name 
    11581        if param in multishell_parameters: 
    11682            continue 
     83        #    item_name = replaceShellName(param.name, 1) 
    11784 
    11885        item1 = QtGui.QStandardItem(item_name) 
    11986        item1.setCheckable(True) 
    12087        item1.setEditable(False) 
    121  
     88        # item_err = QtGui.QStandardItem() 
    12289        # check for polydisp params 
    12390        if param.polydisperse: 
     
    12693            item1_1 = QtGui.QStandardItem("Distribution") 
    12794            item1_1.setEditable(False) 
    128  
    12995            # Find param in volume_params 
    13096            for p in parameters.form_volume_parameters: 
     
    13399                width = kernel_module.getParam(p.name+'.width') 
    134100                ptype = kernel_module.getParam(p.name+'.type') 
     101 
    135102                item1_2 = QtGui.QStandardItem(str(width)) 
    136103                item1_2.setEditable(False) 
     
    143110                poly_item.appendRow([item1_1, item1_2, item1_3, item1_4, item1_5]) 
    144111                break 
    145  
    146112            # Add the polydisp item as a child 
    147113            item1.appendRow([poly_item]) 
    148  
    149114        # Param values 
    150115        item2 = QtGui.QStandardItem(str(param.default)) 
     116        # TODO: the error column. 
     117        # Either add a proxy model or a custom view delegate 
     118        #item_err = QtGui.QStandardItem() 
    151119        item3 = QtGui.QStandardItem(str(param.limits[0])) 
    152120        item4 = QtGui.QStandardItem(str(param.limits[1])) 
    153         item5 = QtGui.QStandardItem(str(param.units)) 
     121        item5 = QtGui.QStandardItem(param.units) 
    154122        item5.setEditable(False) 
    155  
    156         # Check if fixed-choice (returns combobox, if so, also makes some items uneditable) 
    157         row = [item1, item2, item3, item4, item5] 
    158         cbox = createFixedChoiceComboBox(param, row) 
    159  
    160         # Append to the model and use the combobox, if required 
    161         if None not in (model, view): 
    162             model.appendRow(row) 
    163             if cbox: 
    164                 view.setIndexWidget(item2.index(), cbox) 
    165         rows.append(row) 
    166  
    167     return rows 
    168  
    169 def addSimpleParametersToModel(parameters, is2D, parameters_original=None, model=None, view=None): 
    170     """ 
    171     Update local ModelModel with sasmodel parameters (non-dispersed, non-magnetic) 
    172     Actually appends to model, if model and view params are not None. 
    173     Always returns list of lists of QStandardItems. 
    174  
    175     parameters_original: list of parameters before any tagging on their IDs, e.g. for product model (so that those are 
    176     the display names; see below) 
     123        item.append([item1, item2, item3, item4, item5]) 
     124    return item 
     125 
     126def addSimpleParametersToModel(parameters, is2D): 
     127    """ 
     128    Update local ModelModel with sasmodel parameters 
    177129    """ 
    178130    if is2D: 
     
    180132    else: 
    181133        params = parameters.iq_parameters 
    182  
    183     if parameters_original: 
    184         # 'parameters_original' contains the parameters as they are to be DISPLAYED, while 'parameters' 
    185         # contains the parameters as they were renamed; this is for handling name collisions in product model. 
    186         # The 'real name' of the parameter will be stored in the item's user data. 
    187         if is2D: 
    188             params_orig = [p for p in parameters_original.kernel_parameters if p.type != 'magnetic'] 
    189         else: 
    190             params_orig = parameters_original.iq_parameters 
    191     else: 
    192         # no difference in names anyway 
    193         params_orig = params 
    194  
    195     rows = [] 
    196     for param, param_orig in zip(params, params_orig): 
     134    item = [] 
     135    for param in params: 
    197136        # Create the top level, checkable item 
    198         item_name = param_orig.name 
     137        item_name = param.name 
    199138        item1 = QtGui.QStandardItem(item_name) 
    200         item1.setData(param.name, QtCore.Qt.UserRole) 
    201139        item1.setCheckable(True) 
    202140        item1.setEditable(False) 
    203  
    204141        # Param values 
    205142        # TODO: add delegate for validation of cells 
    206143        item2 = QtGui.QStandardItem(str(param.default)) 
    207         item3 = QtGui.QStandardItem(str(param.limits[0])) 
    208         item4 = QtGui.QStandardItem(str(param.limits[1])) 
    209         item5 = QtGui.QStandardItem(str(param.units)) 
    210         item5.setEditable(False) 
    211  
    212         # Check if fixed-choice (returns combobox, if so, also makes some items uneditable) 
    213         row = [item1, item2, item3, item4, item5] 
    214         cbox = createFixedChoiceComboBox(param, row) 
    215  
    216         # Append to the model and use the combobox, if required 
    217         if None not in (model, view): 
    218             model.appendRow(row) 
    219             if cbox: 
    220                 view.setIndexWidget(item2.index(), cbox) 
    221         rows.append(row) 
    222  
    223     return rows 
     144        item4 = QtGui.QStandardItem(str(param.limits[0])) 
     145        item5 = QtGui.QStandardItem(str(param.limits[1])) 
     146        item6 = QtGui.QStandardItem(param.units) 
     147        item6.setEditable(False) 
     148        item.append([item1, item2, item4, item5, item6]) 
     149    return item 
    224150 
    225151def markParameterDisabled(model, row): 
     
    256182    model.appendRow(item_list) 
    257183 
    258 def addHeadingRowToModel(model, name): 
    259     """adds a non-interactive top-level row to the model""" 
    260     header_row = [QtGui.QStandardItem() for i in range(5)] 
    261     header_row[0].setText(name) 
    262  
    263     font = header_row[0].font() 
    264     font.setBold(True) 
    265     header_row[0].setFont(font) 
    266  
    267     for item in header_row: 
    268         item.setEditable(False) 
    269         item.setCheckable(False) 
    270         item.setSelectable(False) 
    271  
    272     model.appendRow(header_row) 
    273  
    274184def addHeadersToModel(model): 
    275185    """ 
     
    317227    model.header_tooltips = copy.copy(poly_header_error_tooltips) 
    318228 
    319 def addShellsToModel(parameters, model, index, row_num=None, view=None): 
    320     """ 
    321     Find out multishell parameters and update the model with the requested number of them. 
    322     Inserts them after the row at row_num, if not None; otherwise, appends to end. 
    323     If view param is not None, supports fixed-choice params. 
    324     Returns a list of lists of QStandardItem objects. 
     229def addShellsToModel(parameters, model, index): 
     230    """ 
     231    Find out multishell parameters and update the model with the requested number of them 
    325232    """ 
    326233    multishell_parameters = getIterParams(parameters) 
    327234 
    328     rows = [] 
    329235    for i in range(index): 
    330236        for par in multishell_parameters: 
     
    344250                    item1_3 = QtGui.QStandardItem(str(p.limits[0])) 
    345251                    item1_4 = QtGui.QStandardItem(str(p.limits[1])) 
    346                     item1_5 = QtGui.QStandardItem(str(p.units)) 
     252                    item1_5 = QtGui.QStandardItem(p.units) 
    347253                    poly_item.appendRow([item1_1, item1_2, item1_3, item1_4, item1_5]) 
    348254                    break 
     
    352258            item3 = QtGui.QStandardItem(str(par.limits[0])) 
    353259            item4 = QtGui.QStandardItem(str(par.limits[1])) 
    354             item5 = QtGui.QStandardItem(str(par.units)) 
    355             item5.setEditable(False) 
    356  
    357             # Check if fixed-choice (returns combobox, if so, also makes some items uneditable) 
    358             row = [item1, item2, item3, item4, item5] 
    359             cbox = createFixedChoiceComboBox(par, row) 
    360  
    361             # Always add to the model 
    362             if row_num is None: 
    363                 model.appendRow(row) 
    364             else: 
    365                 model.insertRow(row_num, row) 
    366                 row_num += 1 
    367  
    368             # Apply combobox if required 
    369             if None not in (view, cbox): 
    370                 view.setIndexWidget(item2.index(), cbox) 
    371  
    372             rows.append(row) 
    373  
    374     return rows 
     260            item5 = QtGui.QStandardItem(par.units) 
     261            model.appendRow([item1, item2, item3, item4, item5]) 
    375262 
    376263def calculateChi2(reference_data, current_data): 
  • src/sas/qtgui/Perspectives/Fitting/FittingWidget.py

    r339e22b r5a2bb75  
    4848from sas.qtgui.Perspectives.Fitting.ReportPageLogic import ReportPageLogic 
    4949 
     50 
    5051TAB_MAGNETISM = 4 
    5152TAB_POLY = 3 
     
    187188 
    188189        # Overwrite data type descriptor 
    189  
    190190        self.is2D = True if isinstance(self.logic.data, Data2D) else False 
    191191 
     
    219219        # Utility variable to enable unselectable option in category combobox 
    220220        self._previous_category_index = 0 
    221         # Utility variables for multishell display 
    222         self._n_shells_row = 0 
    223         self._num_shell_params = 0 
     221        # Utility variable for multishell display 
     222        self._last_model_row = 0 
    224223        # Dictionary of {model name: model class} for the current category 
    225224        self.models = {} 
     
    248247        # copy of current kernel model 
    249248        self.kernel_module_copy = None 
    250  
    251         # dictionaries of current params 
    252         self.poly_params = {} 
    253         self.magnet_params = {} 
    254249 
    255250        # Page id for fitting 
     
    677672        Return list of all parameters for the current model 
    678673        """ 
    679         return [self._model_model.item(row).text() 
    680                 for row in range(self._model_model.rowCount()) 
    681                 if self.isCheckable(row)] 
     674        return [self._model_model.item(row).text() for row in range(self._model_model.rowCount())] 
    682675 
    683676    def modifyViewOnRow(self, row, font=None, brush=None): 
     
    707700        assert isinstance(constraint, Constraint) 
    708701        assert 0 <= row <= self._model_model.rowCount() 
    709         assert self.isCheckable(row) 
    710702 
    711703        item = QtGui.QStandardItem() 
     
    728720        max_col = self.lstParams.itemDelegate().param_max 
    729721        for row in self.selectedParameters(): 
    730             assert(self.isCheckable(row)) 
    731722            param = self._model_model.item(row, 0).text() 
    732723            value = self._model_model.item(row, 1).text() 
     
    771762        max_col = self.lstParams.itemDelegate().param_max 
    772763        for row in range(self._model_model.rowCount()): 
    773             if not self.isCheckable(row): 
    774                 continue 
    775764            if not self.rowHasConstraint(row): 
    776765                continue 
     
    801790        For the given row, return its constraint, if any 
    802791        """ 
    803         if self.isCheckable(row): 
     792        try: 
    804793            item = self._model_model.item(row, 1) 
    805             try: 
    806                 return item.child(0).data() 
    807             except AttributeError: 
    808                 # return none when no constraints 
    809                 pass 
    810         return None 
     794            return item.child(0).data() 
     795        except AttributeError: 
     796            # return none when no constraints 
     797            return None 
    811798 
    812799    def rowHasConstraint(self, row): 
     
    814801        Finds out if row of the main model has a constraint child 
    815802        """ 
    816         if self.isCheckable(row): 
    817             item = self._model_model.item(row, 1) 
    818             if item.hasChildren(): 
    819                 c = item.child(0).data() 
    820                 if isinstance(c, Constraint): 
    821                     return True 
     803        item = self._model_model.item(row, 1) 
     804        if item.hasChildren(): 
     805            c = item.child(0).data() 
     806            if isinstance(c, Constraint): 
     807                return True 
    822808        return False 
    823809 
     
    826812        Finds out if row of the main model has an active constraint child 
    827813        """ 
    828         if self.isCheckable(row): 
    829             item = self._model_model.item(row, 1) 
    830             if item.hasChildren(): 
    831                 c = item.child(0).data() 
    832                 if isinstance(c, Constraint) and c.active: 
    833                     return True 
     814        item = self._model_model.item(row, 1) 
     815        if item.hasChildren(): 
     816            c = item.child(0).data() 
     817            if isinstance(c, Constraint) and c.active: 
     818                return True 
    834819        return False 
    835820 
     
    838823        Finds out if row of the main model has an active, nontrivial constraint child 
    839824        """ 
    840         if self.isCheckable(row): 
    841             item = self._model_model.item(row, 1) 
    842             if item.hasChildren(): 
    843                 c = item.child(0).data() 
    844                 if isinstance(c, Constraint) and c.func and c.active: 
    845                     return True 
     825        item = self._model_model.item(row, 1) 
     826        if item.hasChildren(): 
     827            c = item.child(0).data() 
     828            if isinstance(c, Constraint) and c.func and c.active: 
     829                return True 
    846830        return False 
    847831 
     
    12021186            # Update the sasmodel 
    12031187            # PD[ratio] -> width, npts -> npts, nsigs -> nsigmas 
    1204             #self.kernel_module.setParam(parameter_name + '.' + delegate.columnDict()[model_column], value) 
    1205             key = parameter_name + '.' + delegate.columnDict()[model_column] 
    1206             self.poly_params[key] = value 
     1188            self.kernel_module.setParam(parameter_name + '.' + delegate.columnDict()[model_column], value) 
    12071189 
    12081190            # Update plot 
     
    12131195            row = self.getRowFromName(parameter_name) 
    12141196            param_item = self._model_model.item(row) 
    1215             self._model_model.blockSignals(True) 
    12161197            param_item.child(0).child(0, model_column).setText(item.text()) 
    1217             self._model_model.blockSignals(False) 
    12181198 
    12191199    def onMagnetModelChange(self, item): 
     
    12441224            # Unparsable field 
    12451225            return 
    1246         delegate = self.lstMagnetic.itemDelegate() 
    1247  
    1248         if model_column > 1: 
    1249             if model_column == delegate.mag_min: 
    1250                 pos = 1 
    1251             elif model_column == delegate.mag_max: 
    1252                 pos = 2 
    1253             elif model_column == delegate.mag_unit: 
    1254                 pos = 0 
    1255             else: 
    1256                 raise AttributeError("Wrong column in magnetism table.") 
    1257             # min/max to be changed in self.kernel_module.details[parameter_name] = ['Ang', 0.0, inf] 
    1258             self.kernel_module.details[parameter_name][pos] = value 
    1259         else: 
    1260             self.magnet_params[parameter_name] = value 
    1261             #self.kernel_module.setParam(parameter_name) = value 
    1262             # Force the chart update when actual parameters changed 
     1226 
     1227        property_index = self._magnet_model.headerData(1, model_column)-1 # Value, min, max, etc. 
     1228 
     1229        # Update the parameter value - note: this supports +/-inf as well 
     1230        self.kernel_module.params[parameter_name] = value 
     1231 
     1232        # min/max to be changed in self.kernel_module.details[parameter_name] = ['Ang', 0.0, inf] 
     1233        self.kernel_module.details[parameter_name][property_index] = value 
     1234 
     1235        # Force the chart update when actual parameters changed 
     1236        if model_column == 1: 
    12631237            self.recalculatePlotData() 
    12641238 
     
    15071481        # update charts 
    15081482        self.onPlot() 
    1509         #self.recalculatePlotData() 
    1510  
    15111483 
    15121484        # Read only value - we can get away by just printing it here 
     
    15231495        # Data going in 
    15241496        data = self.logic.data 
    1525         model = copy.deepcopy(self.kernel_module) 
     1497        model = self.kernel_module 
    15261498        qmin = self.q_range_min 
    15271499        qmax = self.q_range_max 
    1528         # add polydisperse/magnet parameters if asked 
    1529         self.updateKernelModelWithExtraParams(model) 
    15301500 
    15311501        params_to_fit = self.main_params_to_fit 
     
    15911561            # internal so can use closure for param_dict 
    15921562            param_name = str(self._model_model.item(row, 0).text()) 
    1593             if not self.isCheckable(row) or param_name not in list(param_dict.keys()): 
     1563            if param_name not in list(param_dict.keys()): 
    15941564                return 
    15951565            # modify the param value 
    15961566            param_repr = GuiUtils.formatNumber(param_dict[param_name][0], high=True) 
    15971567            self._model_model.item(row, 1).setText(param_repr) 
    1598             self.kernel_module.setParam(param_name, param_dict[param_name][0]) 
    15991568            if self.has_error_column: 
    16001569                error_repr = GuiUtils.formatNumber(param_dict[param_name][1], high=True) 
     
    16041573            # Utility function for updateof polydispersity part of the main model 
    16051574            param_name = str(self._model_model.item(row, 0).text())+'.width' 
    1606             if not self.isCheckable(row) or param_name not in list(param_dict.keys()): 
     1575            if param_name not in list(param_dict.keys()): 
    16071576                return 
    16081577            # modify the param value 
     
    16381607            poly_item.insertColumn(2, [QtGui.QStandardItem("")]) 
    16391608 
     1609        # block signals temporarily, so we don't end up 
     1610        # updating charts with every single model change on the end of fitting 
     1611        self._model_model.blockSignals(True) 
     1612 
    16401613        if not self.has_error_column: 
    16411614            # create top-level error column 
     
    16441617            self.iterateOverModel(createErrorColumn) 
    16451618 
     1619            # we need to enable signals for this, otherwise the final column mysteriously disappears (don't ask, I don't 
     1620            # know) 
     1621            self._model_model.blockSignals(False) 
    16461622            self._model_model.insertColumn(2, error_column) 
     1623            self._model_model.blockSignals(True) 
    16471624 
    16481625            FittingUtilities.addErrorHeadersToModel(self._model_model) 
     
    16531630            self.has_error_column = True 
    16541631 
    1655         # block signals temporarily, so we don't end up 
    1656         # updating charts with every single model change on the end of fitting 
    1657         self._model_model.itemChanged.disconnect() 
    16581632        self.iterateOverModel(updateFittedValues) 
    16591633        self.iterateOverModel(updatePolyValues) 
    1660         self._model_model.itemChanged.connect(self.onMainParamsChange) 
     1634 
     1635        self._model_model.blockSignals(False) 
    16611636 
    16621637        # Adjust the table cells width. 
     
    16931668            param_repr = GuiUtils.formatNumber(param_dict[param_name][0], high=True) 
    16941669            self._poly_model.item(row_i, 1).setText(param_repr) 
    1695             self.kernel_module.setParam(param_name, param_dict[param_name][0]) 
    16961670            if self.has_poly_error_column: 
    16971671                error_repr = GuiUtils.formatNumber(param_dict[param_name][1], high=True) 
    16981672                self._poly_model.item(row_i, 2).setText(error_repr) 
     1673 
    16991674 
    17001675        def createErrorColumn(row_i): 
     
    17171692        # block signals temporarily, so we don't end up 
    17181693        # updating charts with every single model change on the end of fitting 
    1719         self._poly_model.itemChanged.disconnect() 
     1694        self._poly_model.blockSignals(True) 
    17201695        self.iterateOverPolyModel(updateFittedValues) 
    1721         self._poly_model.itemChanged.connect(self.onPolyModelChange) 
     1696        self._poly_model.blockSignals(False) 
    17221697 
    17231698        if self.has_poly_error_column: 
     
    17291704 
    17301705        # switch off reponse to model change 
     1706        self._poly_model.blockSignals(True) 
    17311707        self._poly_model.insertColumn(2, error_column) 
     1708        self._poly_model.blockSignals(False) 
    17321709        FittingUtilities.addErrorPolyHeadersToModel(self._poly_model) 
    17331710 
     
    17621739            param_repr = GuiUtils.formatNumber(param_dict[param_name][0], high=True) 
    17631740            self._magnet_model.item(row, 1).setText(param_repr) 
    1764             self.kernel_module.setParam(param_name, param_dict[param_name][0]) 
    17651741            if self.has_magnet_error_column: 
    17661742                error_repr = GuiUtils.formatNumber(param_dict[param_name][1], high=True) 
     
    17821758        # block signals temporarily, so we don't end up 
    17831759        # updating charts with every single model change on the end of fitting 
    1784         self._magnet_model.itemChanged.disconnect() 
     1760        self._magnet_model.blockSignals(True) 
    17851761        self.iterateOverMagnetModel(updateFittedValues) 
    1786         self._magnet_model.itemChanged.connect(self.onMagnetModelChange) 
     1762        self._magnet_model.blockSignals(False) 
    17871763 
    17881764        if self.has_magnet_error_column: 
     
    17941770 
    17951771        # switch off reponse to model change 
     1772        self._magnet_model.blockSignals(True) 
    17961773        self._magnet_model.insertColumn(2, error_column) 
     1774        self._magnet_model.blockSignals(False) 
    17971775        FittingUtilities.addErrorHeadersToModel(self._magnet_model) 
    17981776 
     
    18061784        self.cmdPlot.setText("Show Plot") 
    18071785        # Force data recalculation so existing charts are updated 
     1786        self.recalculatePlotData() 
    18081787        self.showPlot() 
    1809         self.recalculatePlotData() 
    18101788 
    18111789    def onSmearingOptionsUpdate(self): 
     
    19721950        # Crete/overwrite model items 
    19731951        self._model_model.clear() 
    1974         self._poly_model.clear() 
    1975         self._magnet_model.clear() 
    1976  
    1977         if model_name is None: 
    1978             if structure_factor not in (None, "None"): 
    1979                 # S(Q) on its own, treat the same as a form factor 
    1980                 self.kernel_module = None 
    1981                 self.fromStructureFactorToQModel(structure_factor) 
    1982             else: 
    1983                 # No models selected 
    1984                 return 
     1952 
     1953        # First, add parameters from the main model 
     1954        if model_name is not None: 
     1955            self.fromModelToQModel(model_name) 
     1956 
     1957        # Then, add structure factor derived parameters 
     1958        if structure_factor is not None and structure_factor != "None": 
     1959            if model_name is None: 
     1960                # Instantiate the current sasmodel for SF-only models 
     1961                self.kernel_module = self.models[structure_factor]() 
     1962            self.fromStructureFactorToQModel(structure_factor) 
    19851963        else: 
    1986             self.fromModelToQModel(model_name) 
    1987             self.addExtraShells() 
    1988  
    19891964            # Allow the SF combobox visibility for the given sasmodel 
    19901965            self.enableStructureFactorControl(structure_factor) 
    1991          
    1992             # Add S(Q) 
    19931966            if self.cbStructureFactor.isEnabled(): 
    19941967                structure_factor = self.cbStructureFactor.currentText() 
    19951968                self.fromStructureFactorToQModel(structure_factor) 
    19961969 
    1997             # Add polydispersity to the model 
    1998             self.poly_params = {} 
    1999             self.setPolyModel() 
    2000             # Add magnetic parameters to the model 
    2001             self.magnet_params = {} 
    2002             self.setMagneticModel() 
     1970        # Then, add multishells 
     1971        if model_name is not None: 
     1972            # Multishell models need additional treatment 
     1973            self.addExtraShells() 
     1974 
     1975        # Add polydispersity to the model 
     1976        self.setPolyModel() 
     1977        # Add magnetic parameters to the model 
     1978        self.setMagneticModel() 
    20031979 
    20041980        # Adjust the table cells width 
     
    20732049        self.shell_names = self.shellNamesList() 
    20742050 
    2075         # Add heading row 
    2076         FittingUtilities.addHeadingRowToModel(self._model_model, model_name) 
    2077  
    20782051        # Update the QModel 
    2079         FittingUtilities.addParametersToModel( 
    2080                 self.model_parameters, 
    2081                 self.kernel_module, 
    2082                 self.is2D, 
    2083                 self._model_model, 
    2084                 self.lstParams) 
     2052        new_rows = FittingUtilities.addParametersToModel(self.model_parameters, self.kernel_module, self.is2D) 
     2053 
     2054        for row in new_rows: 
     2055            self._model_model.appendRow(row) 
     2056        # Update the counter used for multishell display 
     2057        self._last_model_row = self._model_model.rowCount() 
    20852058 
    20862059    def fromStructureFactorToQModel(self, structure_factor): 
     
    20902063        if structure_factor is None or structure_factor=="None": 
    20912064            return 
    2092  
    2093         if self.kernel_module is None: 
    2094             # Structure factor is the only selected model; build it and show all its params 
    2095             self.kernel_module = self.models[structure_factor]() 
    2096             s_params = self.kernel_module._model_info.parameters 
    2097             s_params_orig = s_params 
    2098  
    2099         else: 
    2100             s_kernel = self.models[structure_factor]() 
    2101             p_kernel = self.kernel_module 
    2102  
    2103             p_pars_len = len(p_kernel._model_info.parameters.kernel_parameters) 
    2104             s_pars_len = len(s_kernel._model_info.parameters.kernel_parameters) 
    2105  
    2106             self.kernel_module = MultiplicationModel(p_kernel, s_kernel) 
    2107             all_params = self.kernel_module._model_info.parameters.kernel_parameters 
    2108             all_param_names = [param.name for param in all_params] 
    2109  
    2110             # S(Q) params from the product model are not necessarily the same as those from the S(Q) model; any 
    2111             # conflicting names with P(Q) params will cause a rename 
    2112  
    2113             if "radius_effective_mode" in all_param_names: 
    2114                 # Show all parameters 
    2115                 s_params = modelinfo.ParameterTable(all_params[p_pars_len:p_pars_len+s_pars_len]) 
    2116                 s_params_orig = modelinfo.ParameterTable(s_kernel._model_info.parameters.kernel_parameters) 
    2117             else: 
    2118                 # Ensure radius_effective is not displayed 
    2119                 s_params_orig = modelinfo.ParameterTable(s_kernel._model_info.parameters.kernel_parameters[1:]) 
    2120                 if "radius_effective" in all_param_names: 
    2121                     s_params = modelinfo.ParameterTable(all_params[p_pars_len+1:p_pars_len+s_pars_len]) 
    2122                 else: 
    2123                     s_params = modelinfo.ParameterTable(all_params[p_pars_len:p_pars_len+s_pars_len-1]) 
    2124  
    2125         # Add heading row 
    2126         FittingUtilities.addHeadingRowToModel(self._model_model, structure_factor) 
    2127  
    2128         # Get new rows for QModel 
    2129         # Any renamed parameters are stored as data in the relevant item, for later handling 
    2130         FittingUtilities.addSimpleParametersToModel( 
    2131                 s_params, 
    2132                 self.is2D, 
    2133                 s_params_orig, 
    2134                 self._model_model, 
    2135                 self.lstParams) 
     2065        structure_module = generate.load_kernel_module(structure_factor) 
     2066        structure_parameters = modelinfo.make_parameter_table(getattr(structure_module, 'parameters', [])) 
     2067 
     2068        structure_kernel = self.models[structure_factor]() 
     2069        form_kernel = self.kernel_module 
     2070 
     2071        self.kernel_module = MultiplicationModel(form_kernel, structure_kernel) 
     2072 
     2073        new_rows = FittingUtilities.addSimpleParametersToModel(structure_parameters, self.is2D) 
     2074        for row in new_rows: 
     2075            self._model_model.appendRow(row) 
     2076            # disable fitting of parameters not listed in self.kernel_module (probably radius_effective) 
     2077            if row[0].text() not in self.kernel_module.params.keys(): 
     2078                row_num = self._model_model.rowCount() - 1 
     2079                FittingUtilities.markParameterDisabled(self._model_model, row_num) 
     2080 
     2081        # Update the counter used for multishell display 
     2082        self._last_model_row = self._model_model.rowCount() 
    21362083 
    21372084    def haveParamsToFit(self): 
     
    21592106        model_row = item.row() 
    21602107        name_index = self._model_model.index(model_row, 0) 
    2161         name_item = self._model_model.itemFromIndex(name_index) 
    21622108 
    21632109        # Extract changed value. 
     
    21682114            return 
    21692115 
    2170         # if the item has user data, this is the actual parameter name (e.g. to handle duplicate names) 
    2171         if name_item.data(QtCore.Qt.UserRole): 
    2172             parameter_name = str(name_item.data(QtCore.Qt.UserRole)) 
    2173         else: 
    2174             parameter_name = str(self._model_model.data(name_index)) 
     2116        parameter_name = str(self._model_model.data(name_index)) # sld, background etc. 
    21752117 
    21762118        # Update the parameter value - note: this supports +/-inf as well 
     
    22952237        return self.completed1D if isinstance(self.data, Data1D) else self.completed2D 
    22962238 
    2297     def updateKernelModelWithExtraParams(self, model=None): 
    2298         """ 
    2299         Updates kernel model 'model' with extra parameters from 
    2300         the polydisp and magnetism tab, if the tabs are enabled 
    2301         """ 
    2302         if model is None: return 
    2303         if not hasattr(model, 'setParam'): return 
    2304  
    2305         # add polydisperse parameters if asked 
    2306         if self.chkPolydispersity.isChecked(): 
    2307             for key, value in self.poly_params.items(): 
    2308                 model.setParam(key, value) 
    2309         # add magnetic params if asked 
    2310         if self.chkMagnetism.isChecked(): 
    2311             for key, value in self.magnet_params.items(): 
    2312                 model.setParam(key, value) 
    2313  
    23142239    def calculateQGridForModelExt(self, data=None, model=None, completefn=None, use_threads=True): 
    23152240        """ 
     
    23192244            data = self.data 
    23202245        if model is None: 
    2321             model = copy.deepcopy(self.kernel_module) 
    2322             self.updateKernelModelWithExtraParams(model) 
    2323  
     2246            model = self.kernel_module 
    23242247        if completefn is None: 
    23252248            completefn = self.methodCompleteForData() 
     
    24062329            new_plots.append(sq_data) 
    24072330 
    2408         for plot in new_plots: 
    2409             self.communicate.plotUpdateSignal.emit([plot]) 
    2410  
    2411     def complete2D(self, return_data): 
    2412         """ 
    2413         Plot the current 2D data 
    2414         """ 
    2415         fitted_data = self.logic.new2DPlot(return_data) 
    2416         residuals = self.calculateResiduals(fitted_data) 
    2417         self.model_data = fitted_data 
    2418         new_plots = [fitted_data] 
    2419         if residuals is not None: 
    2420             new_plots.append(residuals) 
    2421  
    24222331        # Update/generate plots 
    24232332        for plot in new_plots: 
    24242333            self.communicate.plotUpdateSignal.emit([plot]) 
     2334 
     2335    def complete2D(self, return_data): 
     2336        """ 
     2337        Plot the current 2D data 
     2338        """ 
     2339        fitted_data = self.logic.new2DPlot(return_data) 
     2340        self.calculateResiduals(fitted_data) 
     2341        self.model_data = fitted_data 
    24252342 
    24262343    def calculateResiduals(self, fitted_data): 
     
    25532470        _, min, max = self.kernel_module.details[param_name] 
    25542471 
    2555         # Update local param dict 
    2556         self.poly_params[param_name + '.width'] = width 
    2557         self.poly_params[param_name + '.npts'] = npts 
    2558         self.poly_params[param_name + '.nsigmas'] = nsigs 
    2559  
    25602472        # Construct a row with polydisp. related variable. 
    25612473        # This will get added to the polydisp. model 
     
    26052517        def updateFunctionCaption(row): 
    26062518            # Utility function for update of polydispersity function name in the main model 
    2607             if not self.isCheckable(row): 
    2608                 return 
    2609             self._model_model.blockSignals(True) 
    26102519            param_name = str(self._model_model.item(row, 0).text()) 
    2611             self._model_model.blockSignals(False) 
    26122520            if param_name !=  param.name: 
    26132521                return 
    26142522            # Modify the param value 
    2615             self._model_model.blockSignals(True) 
    26162523            if self.has_error_column: 
    26172524                # err column changes the indexing 
     
    26192526            else: 
    26202527                self._model_model.item(row, 0).child(0).child(0,4).setText(combo_string) 
    2621             self._model_model.blockSignals(False) 
    26222528 
    26232529        if combo_string == 'array': 
     
    27382644                        param.units] 
    27392645 
    2740         self.magnet_params[param.name] = param.default 
    2741  
    27422646        FittingUtilities.addCheckedListToModel(model, checked_list) 
    27432647 
     
    27792683 
    27802684        self.lstParams.setIndexWidget(shell_index, func) 
    2781         self._n_shells_row = shell_row - 1 
     2685        self._last_model_row = self._model_model.rowCount() 
    27822686 
    27832687        # Set the index to the state-kept value 
     
    27902694        """ 
    27912695        # Find row location of the combobox 
    2792         first_row = self._n_shells_row + 1 
    2793         remove_rows = self._num_shell_params 
     2696        last_row = self._last_model_row 
     2697        remove_rows = self._model_model.rowCount() - last_row 
    27942698 
    27952699        if remove_rows > 1: 
    2796             self._model_model.removeRows(first_row, remove_rows) 
    2797  
    2798         new_rows = FittingUtilities.addShellsToModel( 
    2799                 self.model_parameters, 
    2800                 self._model_model, 
    2801                 index, 
    2802                 first_row, 
    2803                 self.lstParams) 
    2804  
    2805         self._num_shell_params = len(new_rows) 
     2700            self._model_model.removeRows(last_row, remove_rows) 
     2701 
     2702        FittingUtilities.addShellsToModel(self.model_parameters, self._model_model, index) 
    28062703        self.current_shell_displayed = index 
    28072704 
     
    33163213        self._poly_model.blockSignals(False) 
    33173214 
    3318  
    3319  
  • src/sas/qtgui/Perspectives/Fitting/UnitTesting/FittingWidgetTest.py

    r3fbd77b r605d944  
    256256        self.widget.cbStructureFactor.setCurrentIndex(structure_index) 
    257257 
    258         # We have 3 more param rows now (radius_effective is removed), and a new heading 
     258        # We have 4 more rows now 
    259259        self.assertEqual(self.widget._model_model.rowCount(), rowcount+4) 
    260260 
     
    276276        last_index = self.widget.cbStructureFactor.count() 
    277277        self.widget.cbStructureFactor.setCurrentIndex(last_index-1) 
    278         # Do we have all the rows (incl. radius_effective & heading row)? 
    279         self.assertEqual(self.widget._model_model.rowCount(), 5) 
     278        # Do we have all the rows? 
     279        self.assertEqual(self.widget._model_model.rowCount(), 4) 
    280280 
    281281        # Are the command buttons properly enabled? 
     
    445445        self.assertEqual(self.widget.kernel_module.details['radius_bell'][1], 1.0) 
    446446 
    447         #self.widget.show() 
    448         #QtWidgets.QApplication.exec_() 
    449  
    450447        # Change the number of points 
    451         self.assertEqual(self.widget.poly_params['radius_bell.npts'], 35) 
     448        self.assertEqual(self.widget.kernel_module.getParam('radius_bell.npts'), 35) 
    452449        self.widget._poly_model.item(0,4).setText("22") 
    453         self.assertEqual(self.widget.poly_params['radius_bell.npts'], 22) 
     450        self.assertEqual(self.widget.kernel_module.getParam('radius_bell.npts'), 22) 
    454451        # try something stupid 
    455452        self.widget._poly_model.item(0,4).setText("butt") 
    456453        # see that this didn't annoy the control at all 
    457         self.assertEqual(self.widget.poly_params['radius_bell.npts'], 22) 
     454        self.assertEqual(self.widget.kernel_module.getParam('radius_bell.npts'), 22) 
    458455 
    459456        # Change the number of sigmas 
    460         self.assertEqual(self.widget.poly_params['radius_bell.nsigmas'], 3) 
     457        self.assertEqual(self.widget.kernel_module.getParam('radius_bell.nsigmas'), 3) 
    461458        self.widget._poly_model.item(0,5).setText("222") 
    462         self.assertEqual(self.widget.poly_params['radius_bell.nsigmas'], 222) 
     459        self.assertEqual(self.widget.kernel_module.getParam('radius_bell.nsigmas'), 222) 
    463460        # try something stupid again 
    464461        self.widget._poly_model.item(0,4).setText("beer") 
    465462        # no efect 
    466         self.assertEqual(self.widget.poly_params['radius_bell.nsigmas'], 222) 
     463        self.assertEqual(self.widget.kernel_module.getParam('radius_bell.nsigmas'), 222) 
    467464 
    468465    def testOnPolyComboIndexChange(self): 
     
    485482        self.widget.onPolyComboIndexChange('rectangle', 0) 
    486483        # check values 
    487         self.assertEqual(self.widget.poly_params['radius_bell.npts'], 35) 
    488         self.assertAlmostEqual(self.widget.poly_params['radius_bell.nsigmas'], 1.73205, 5) 
     484        self.assertEqual(self.widget.kernel_module.getParam('radius_bell.npts'), 35) 
     485        self.assertAlmostEqual(self.widget.kernel_module.getParam('radius_bell.nsigmas'), 1.73205, 5) 
    489486        # Change the index 
    490487        self.widget.onPolyComboIndexChange('lognormal', 0) 
    491488        # check values 
    492         self.assertEqual(self.widget.poly_params['radius_bell.npts'], 80) 
    493         self.assertEqual(self.widget.poly_params['radius_bell.nsigmas'], 8) 
     489        self.assertEqual(self.widget.kernel_module.getParam('radius_bell.npts'), 80) 
     490        self.assertEqual(self.widget.kernel_module.getParam('radius_bell.nsigmas'), 8) 
    494491        # Change the index 
    495492        self.widget.onPolyComboIndexChange('schulz', 0) 
    496493        # check values 
    497         self.assertEqual(self.widget.poly_params['radius_bell.npts'], 80) 
    498         self.assertEqual(self.widget.poly_params['radius_bell.nsigmas'], 8) 
     494        self.assertEqual(self.widget.kernel_module.getParam('radius_bell.npts'), 80) 
     495        self.assertEqual(self.widget.kernel_module.getParam('radius_bell.nsigmas'), 8) 
    499496 
    500497        # mock up file load 
     
    509506        Test opening of the load file dialog for 'array' polydisp. function 
    510507        """ 
    511  
    512         # open a non-existent file 
    513508        filename = os.path.join("UnitTesting", "testdata_noexist.txt") 
    514         with self.assertRaises(OSError, msg="testdata_noexist.txt should be a non-existent file"): 
    515             os.stat(filename) 
    516509        QtWidgets.QFileDialog.getOpenFileName = MagicMock(return_value=(filename,'')) 
    517510        self.widget.show() 
     
    529522 
    530523        # good file 
    531         # TODO: this depends on the working directory being src/sas/qtgui, 
    532         # TODO: which isn't convenient if you want to run this test suite 
    533         # TODO: individually 
    534524        filename = os.path.join("UnitTesting", "testdata.txt") 
    535         try: 
    536             os.stat(filename) 
    537         except OSError: 
    538             self.assertTrue(False, "testdata.txt does not exist") 
    539525        QtWidgets.QFileDialog.getOpenFileName = MagicMock(return_value=(filename,'')) 
    540526 
     
    602588 
    603589        # Assure we have the combobox available 
    604         cbox_row = self.widget._n_shells_row 
    605         func_index = self.widget._model_model.index(cbox_row, 1) 
     590        last_row = self.widget._last_model_row 
     591        func_index = self.widget._model_model.index(last_row-1, 1) 
    606592        self.assertIsInstance(self.widget.lstParams.indexWidget(func_index), QtWidgets.QComboBox) 
    607  
    608         # get number of rows before changing shell count 
    609         last_row = self.widget._model_model.rowCount() 
    610593 
    611594        # Change the combo box index 
     
    10411024 
    10421025         # Check the model 
    1043         self.assertEqual(self.widget._model_model.rowCount(), 7) 
     1026        self.assertEqual(self.widget._model_model.rowCount(), 6) 
    10441027        self.assertEqual(self.widget._model_model.columnCount(), 5) 
    10451028 
     
    11571140        # two rows selected 
    11581141        index1 = self.widget.lstParams.model().index(1, 0, QtCore.QModelIndex()) 
    1159         index2 = self.widget.lstParams.model().index(3, 0, QtCore.QModelIndex()) 
     1142        index2 = self.widget.lstParams.model().index(2, 0, QtCore.QModelIndex()) 
    11601143        selection_model = self.widget.lstParams.selectionModel() 
    11611144        selection_model.select(index1, selection_model.Select | selection_model.Rows) 
     
    11931176        # several random parameters 
    11941177        self.assertEqual(self.widget.getRowFromName('scale'), 0) 
    1195         self.assertEqual(self.widget.getRowFromName('length'), 6) 
     1178        self.assertEqual(self.widget.getRowFromName('length'), 5) 
    11961179 
    11971180    def testGetParamNames(self): 
     
    12301213        # Create a constraint object 
    12311214        const = Constraint(parent=None, value=7.0) 
    1232         row = 3 
     1215        row = 2 
    12331216 
    12341217        spy = QtSignalSpy(self.widget, self.widget.constraintAddedSignal) 
     
    12491232        # assign complex constraint now 
    12501233        const = Constraint(parent=None, param='radius', func='5*sld') 
    1251         row = 5 
     1234        row = 4 
    12521235        # call the method tested 
    12531236        self.widget.addConstraintToRow(constraint=const, row=row) 
     
    13081291        self.widget.cbModel.setCurrentIndex(model_index) 
    13091292 
     1293        # select two rows 
    13101294        row1 = 1 
    1311         row2 = 5 
    1312  
    1313         param1 = "background" 
    1314         param2 = "radius" 
    1315  
    1316         #default_value1 = "0.001" 
    1317         default_value2 = "20" 
    1318  
    1319         # select two rows 
     1295        row2 = 4 
    13201296        index1 = self.widget.lstParams.model().index(row1, 0, QtCore.QModelIndex()) 
    13211297        index2 = self.widget.lstParams.model().index(row2, 0, QtCore.QModelIndex()) 
     
    13341310 
    13351311        # delete one of the constraints 
    1336         self.widget.deleteConstraintOnParameter(param=param1) 
     1312        self.widget.deleteConstraintOnParameter(param='background') 
    13371313 
    13381314        # see that the other constraint is still present 
    1339         cons = self.widget.getConstraintForRow(row2) 
    1340         self.assertEqual(cons.param, param2) 
    1341         self.assertEqual(cons.value, default_value2) 
     1315        cons = self.widget.getConstraintForRow(4) # 4 = radius 
     1316        self.assertEqual(cons.param, "radius") 
     1317        self.assertEqual(cons.value, "20") 
    13421318 
    13431319        # kill the other constraint 
     
    13451321 
    13461322        # see that the other constraint is still present 
    1347         self.assertEqual(self.widget.getConstraintsForModel(), [(param2, None)]) 
     1323        self.assertEqual(self.widget.getConstraintsForModel(), [('radius', None)]) 
    13481324 
    13491325    def testGetConstraintForRow(self): 
     
    13651341        self.widget.cbModel.setCurrentIndex(model_index) 
    13661342 
     1343        # select two rows 
    13671344        row1 = 1 
    1368         row2 = 5 
    1369  
    1370         # select two rows 
     1345        row2 = 4 
    13711346        index1 = self.widget.lstParams.model().index(row1, 0, QtCore.QModelIndex()) 
    13721347        index2 = self.widget.lstParams.model().index(row2, 0, QtCore.QModelIndex()) 
     
    13781353        self.widget.addSimpleConstraint() 
    13791354 
    1380         con_list = [False, True, False, False, False, True, False] 
     1355        con_list = [False, True, False, False, True, False] 
    13811356        new_list = [] 
    13821357        for row in range(self.widget._model_model.rowCount()): 
     
    13961371        self.widget.cbModel.setCurrentIndex(model_index) 
    13971372 
     1373        # select two rows 
    13981374        row1 = 1 
    1399         row2 = 5 
    1400  
    1401         # select two rows 
     1375        row2 = 4 
    14021376        index1 = self.widget.lstParams.model().index(row1, 0, QtCore.QModelIndex()) 
    14031377        index2 = self.widget.lstParams.model().index(row2, 0, QtCore.QModelIndex()) 
     
    14131387        constraint_objects[0].active = False 
    14141388 
    1415         con_list = [False, False, False, False, False, True, False] 
     1389        con_list = [False, False, False, False, True, False] 
    14161390        new_list = [] 
    14171391        for row in range(self.widget._model_model.rowCount()): 
     
    14341408        self.assertEqual(self.widget.getConstraintsForModel(),[]) 
    14351409 
     1410        # select two rows 
    14361411        row1 = 1 
    1437         row2 = 5 
    1438  
    1439         param1 = "background" 
    1440         param2 = "radius" 
    1441  
    1442         default_value1 = "0.001" 
    1443         default_value2 = "20" 
    1444  
    1445         # select two rows 
     1412        row2 = 4 
    14461413        index1 = self.widget.lstParams.model().index(row1, 0, QtCore.QModelIndex()) 
    14471414        index2 = self.widget.lstParams.model().index(row2, 0, QtCore.QModelIndex()) 
     
    14551422        # simple constraints 
    14561423        # self.assertEqual(self.widget.getConstraintsForModel(), [('background', '0.001'), ('radius', '20')]) 
    1457         cons = self.widget.getConstraintForRow(row1) 
    1458         self.assertEqual(cons.param, param1) 
    1459         self.assertEqual(cons.value, default_value1) 
    1460         cons = self.widget.getConstraintForRow(row2) 
    1461         self.assertEqual(cons.param, param2) 
    1462         self.assertEqual(cons.value, default_value2) 
     1424        cons = self.widget.getConstraintForRow(1) # 1 - background 
     1425        self.assertEqual(cons.param, "background") 
     1426        self.assertEqual(cons.value, "0.001") 
     1427        cons = self.widget.getConstraintForRow(4) # 4 = radius 
     1428        self.assertEqual(cons.param, "radius") 
     1429        self.assertEqual(cons.value, "20") 
    14631430 
    14641431        objects = self.widget.getConstraintObjectsForModel() 
    14651432        self.assertEqual(len(objects), 2) 
    1466         self.assertEqual(objects[1].value, default_value2) 
    1467         self.assertEqual(objects[0].param, param1) 
    1468  
     1433        self.assertEqual(objects[1].value, '20') 
     1434        self.assertEqual(objects[0].param, 'background') 
     1435 
     1436        # add complex constraint 
     1437        const = Constraint(parent=None, param='scale', func='5*sld') 
    14691438        row = 0 
    1470         param = "scale" 
    1471         func = "5*sld" 
    1472  
    1473         # add complex constraint 
    1474         const = Constraint(parent=None, param=param, func=func) 
    14751439        self.widget.addConstraintToRow(constraint=const, row=row) 
    14761440        #self.assertEqual(self.widget.getConstraintsForModel(),[('scale', '5*sld'), ('background', '0.001'), ('radius', None)]) 
    1477         cons = self.widget.getConstraintForRow(row2) 
    1478         self.assertEqual(cons.param, param2) 
    1479         self.assertEqual(cons.value, default_value2) 
     1441        cons = self.widget.getConstraintForRow(4) # 4 = radius 
     1442        self.assertEqual(cons.param, "radius") 
     1443        self.assertEqual(cons.value, "20") 
    14801444 
    14811445        objects = self.widget.getConstraintObjectsForModel() 
    14821446        self.assertEqual(len(objects), 3) 
    1483         self.assertEqual(objects[0].func, func) 
     1447        self.assertEqual(objects[0].func, '5*sld') 
    14841448 
    14851449    def testReplaceConstraintName(self): 
  • src/sas/qtgui/Plotting/Plotter.py

    rc2f3ca2 rb764ae5  
    3030        # Dictionary of {plot_id:Data1d} 
    3131        self.plot_dict = {} 
    32         # Dictionaty of {plot_id:line} 
    33  
    34         self.plot_lines = {} 
     32 
    3533        # Window for text add 
    3634        self.addText = AddText(self) 
     
    184182        self.plot_dict[self._data.id] = self.data 
    185183 
    186         self.plot_lines[self._data.id] = line 
    187  
    188184        # Now add the legend with some customizations. 
    189185 
     
    200196 
    201197        # refresh canvas 
    202         self.canvas.draw() 
     198        self.canvas.draw_idle() 
    203199        # This is an important processEvent. 
    204200        # This allows charts to be properly updated in order 
     
    420416        This effectlvely refreshes the chart with changes to one of its plots 
    421417        """ 
    422         import logging 
    423418        self.removePlot(id) 
    424419        self.plot(data=new_plot) 
     
    475470        """ 
    476471        selected_plot = self.plot_dict[id] 
    477         selected_line = self.plot_lines[id] 
     472 
    478473        # Old style color - single integer for enum color 
    479474        # New style color - #hhhhhh 
  • src/sas/qtgui/Utilities/GuiUtils.py

    r339e22b r0eff615  
    265265    # Mask Editor requested 
    266266    maskEditorSignal = QtCore.pyqtSignal(Data2D) 
    267  
    268     #second Mask Editor for external 
    269     extMaskEditorSignal = QtCore.pyqtSignal() 
    270267 
    271268    # Fitting parameter copy to clipboard 
Note: See TracChangeset for help on using the changeset viewer.