Changes in / [b69b549:fb560d2] in sasview


Ignore:
Location:
src/sas/qtgui/Perspectives/Fitting
Files:
1 deleted
2 edited

Legend:

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

    r70f4458 r70f4458  
    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, parameters_original=None): 
     127    """ 
     128    Update local ModelModel with sasmodel parameters 
     129    parameters_original: list of parameters before any tagging on their IDs, e.g. for product model 
     130    (so that those are the display names; see below) 
    177131    """ 
    178132    if is2D: 
     
    193147        params_orig = params 
    194148 
    195     rows = [] 
     149    item = [] 
    196150    for param, param_orig in zip(params, params_orig): 
    197151        # Create the top level, checkable item 
     
    201155        item1.setCheckable(True) 
    202156        item1.setEditable(False) 
    203  
    204157        # Param values 
    205158        # TODO: add delegate for validation of cells 
    206159        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 
     160        item4 = QtGui.QStandardItem(str(param.limits[0])) 
     161        item5 = QtGui.QStandardItem(str(param.limits[1])) 
     162        item6 = QtGui.QStandardItem(str(param.units)) 
     163        item6.setEditable(False) 
     164        item.append([item1, item2, item4, item5, item6]) 
     165    return item 
    224166 
    225167def markParameterDisabled(model, row): 
     
    317259    model.header_tooltips = copy.copy(poly_header_error_tooltips) 
    318260 
    319 def addShellsToModel(parameters, model, index, row_num=None, view=None): 
     261def addShellsToModel(parameters, model, index, row_num=None): 
    320262    """ 
    321263    Find out multishell parameters and update the model with the requested number of them. 
    322264    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. 
    324265    Returns a list of lists of QStandardItem objects. 
    325266    """ 
     
    344285                    item1_3 = QtGui.QStandardItem(str(p.limits[0])) 
    345286                    item1_4 = QtGui.QStandardItem(str(p.limits[1])) 
    346                     item1_5 = QtGui.QStandardItem(str(p.units)) 
     287                    item1_5 = QtGui.QStandardItem(p.units) 
    347288                    poly_item.appendRow([item1_1, item1_2, item1_3, item1_4, item1_5]) 
    348289                    break 
     
    352293            item3 = QtGui.QStandardItem(str(par.limits[0])) 
    353294            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) 
     295            item5 = QtGui.QStandardItem(par.units) 
    358296            row = [item1, item2, item3, item4, item5] 
    359             cbox = createFixedChoiceComboBox(par, row) 
    360  
    361             # Always add to the model 
     297            rows.append(row) 
     298 
    362299            if row_num is None: 
    363300                model.appendRow(row) 
     
    365302                model.insertRow(row_num, row) 
    366303                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) 
    373304 
    374305    return rows 
  • src/sas/qtgui/Perspectives/Fitting/FittingWidget.py

    r0109f2a r0109f2a  
    20792079        self.shell_names = self.shellNamesList() 
    20802080 
     2081        # Get new rows for QModel 
     2082        new_rows = FittingUtilities.addParametersToModel(self.model_parameters, self.kernel_module, self.is2D) 
     2083 
    20812084        # Add heading row 
    20822085        FittingUtilities.addHeadingRowToModel(self._model_model, model_name) 
    20832086 
    2084         # Update the QModel 
    2085         FittingUtilities.addParametersToModel( 
    2086                 self.model_parameters, 
    2087                 self.kernel_module, 
    2088                 self.is2D, 
    2089                 self._model_model, 
    2090                 self.lstParams) 
     2087        # Update QModel 
     2088        for row in new_rows: 
     2089            self._model_model.appendRow(row) 
    20912090 
    20922091    def fromStructureFactorToQModel(self, structure_factor): 
     
    21002099        p_kernel = self.kernel_module 
    21012100 
    2102         # if p_kernel is None: 
    2103         #     # Not a product model, just S(Q) 
    2104         #     self.kernel_module = s_kernel 
    2105         #     params = modelinfo.ParameterTable(self.kernel_module._model_info.parameters.kernel_parameters) 
    2106         #     FittingUtilities.addSimpleParametersToModel(params, self.is2D) 
    2107         # else: 
    2108         p_pars_len = len(p_kernel._model_info.parameters.kernel_parameters) 
    2109         s_pars_len = len(s_kernel._model_info.parameters.kernel_parameters) 
    2110  
    2111         self.kernel_module = MultiplicationModel(p_kernel, s_kernel) 
    2112         all_params = self.kernel_module._model_info.parameters.kernel_parameters 
    2113         all_param_names = [param.name for param in all_params] 
    2114  
    2115         # S(Q) params from the product model are not necessarily the same as those from the S(Q) model; any 
    2116         # conflicting names with P(Q) params will cause a rename 
    2117  
    2118         if "radius_effective_mode" in all_param_names: 
    2119             # Show all parameters 
    2120             s_params = modelinfo.ParameterTable(all_params[p_pars_len:p_pars_len+s_pars_len]) 
    2121             s_params_orig = modelinfo.ParameterTable(s_kernel._model_info.parameters.kernel_parameters) 
     2101        if p_kernel is None: 
     2102            # Not a product model, just S(Q) 
     2103            self.kernel_module = s_kernel 
     2104            params = modelinfo.ParameterTable(self.kernel_module._model_info.parameters.kernel_parameters) 
     2105            new_rows = FittingUtilities.addSimpleParametersToModel(params, self.is2D) 
    21222106        else: 
    2123             # Ensure radius_effective is not displayed 
    2124             s_params_orig = modelinfo.ParameterTable(s_kernel._model_info.parameters.kernel_parameters[1:]) 
    2125             if "radius_effective" in all_param_names: 
    2126                 s_params = modelinfo.ParameterTable(all_params[p_pars_len+1:p_pars_len+s_pars_len]) 
     2107            p_pars_len = len(p_kernel._model_info.parameters.kernel_parameters) 
     2108            s_pars_len = len(s_kernel._model_info.parameters.kernel_parameters) 
     2109 
     2110            self.kernel_module = MultiplicationModel(p_kernel, s_kernel) 
     2111            all_params = self.kernel_module._model_info.parameters.kernel_parameters 
     2112            all_param_names = [param.name for param in all_params] 
     2113 
     2114            # S(Q) params from the product model are not necessarily the same as those from the S(Q) model; any 
     2115            # conflicting names with P(Q) params will cause a rename; we also lose radius_effective (for now...) 
     2116 
     2117            # TODO: merge rest of beta approx implementation in 
     2118            # This is to ensure compatibility when we merge beta approx support in...! 
     2119 
     2120            # radius_effective is always s_params[0] 
     2121 
     2122            # if radius_effective_mode is in all_params, then all_params contains radius_effective and we want to 
     2123            # keep it in the model 
     2124 
     2125            # if radius_effective_mode is NOT in all_params, then radius_effective should NOT be kept, because the user 
     2126            # cannot specify it themselves; but, make sure we only remove it if it's actually there in the first place 
     2127            # (sasmodels master removes it already) 
     2128            if "radius_effective_mode" in all_param_names: 
     2129                # Show all parameters 
     2130                s_params = modelinfo.ParameterTable(all_params[p_pars_len:p_pars_len+s_pars_len]) 
     2131                s_params_orig = modelinfo.ParameterTable(s_kernel._model_info.parameters.kernel_parameters) 
    21272132            else: 
    2128                 s_params = modelinfo.ParameterTable(all_params[p_pars_len:p_pars_len+s_pars_len-1]) 
     2133                # Ensure radius_effective is not displayed 
     2134                s_params_orig = modelinfo.ParameterTable(s_kernel._model_info.parameters.kernel_parameters[1:]) 
     2135                if "radius_effective" in all_param_names: 
     2136                    s_params = modelinfo.ParameterTable(all_params[p_pars_len+1:p_pars_len+s_pars_len]) 
     2137                else: 
     2138                    s_params = modelinfo.ParameterTable(all_params[p_pars_len:p_pars_len+s_pars_len-1]) 
     2139 
     2140            # Get new rows for QModel 
     2141            # Any renamed parameters are stored as data in the relevant item, for later handling 
     2142            new_rows = FittingUtilities.addSimpleParametersToModel(s_params, self.is2D, s_params_orig) 
     2143 
     2144            # TODO: merge rest of beta approx implementation in 
     2145            # These parameters are not part of P(Q) nor S(Q), but are added only to the product model (e.g. specifying 
     2146            # structure factor calculation mode) 
     2147            # product_params = all_params[p_pars_len+s_pars_len:] 
    21292148 
    21302149        # Add heading row 
    21312150        FittingUtilities.addHeadingRowToModel(self._model_model, structure_factor) 
    21322151 
    2133         # Get new rows for QModel 
    2134         # Any renamed parameters are stored as data in the relevant item, for later handling 
    2135         FittingUtilities.addSimpleParametersToModel( 
    2136                 s_params, 
    2137                 self.is2D, 
    2138                 s_params_orig, 
    2139                 self._model_model, 
    2140                 self.lstParams) 
     2152        # Update QModel 
     2153        for row in new_rows: 
     2154            self._model_model.appendRow(row) 
     2155            # disable fitting of parameters not listed in self.kernel_module (probably radius_effective) 
     2156            # if row[0].text() not in self.kernel_module.params.keys(): 
     2157            #     row_num = self._model_model.rowCount() - 1 
     2158            #     FittingUtilities.markParameterDisabled(self._model_model, row_num) 
    21412159 
    21422160    def haveParamsToFit(self): 
     
    28012819            self._model_model.removeRows(first_row, remove_rows) 
    28022820 
    2803         new_rows = FittingUtilities.addShellsToModel( 
    2804                 self.model_parameters, 
    2805                 self._model_model, 
    2806                 index, 
    2807                 first_row, 
    2808                 self.lstParams) 
    2809  
     2821        new_rows = FittingUtilities.addShellsToModel(self.model_parameters, self._model_model, index, first_row) 
    28102822        self._num_shell_params = len(new_rows) 
     2823 
    28112824        self.current_shell_displayed = index 
    28122825 
Note: See TracChangeset for help on using the changeset viewer.