Ignore:
File:
1 edited

Legend:

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

    r70f4458 rf3cc979  
    88from sas.qtgui.Plotting.PlotterData import Data1D 
    99from sas.qtgui.Plotting.PlotterData import Data2D 
     10 
     11from sas.qtgui.Perspectives.Fitting.AssociatedComboBox import AssociatedComboBox 
    1012 
    1113model_header_captions = ['Parameter', 'Value', 'Min', 'Max', 'Units'] 
     
    6163    return (param_name, param_length) 
    6264 
    63 def addParametersToModel(parameters, kernel_module, is2D): 
    64     """ 
    65     Update local ModelModel with sasmodel parameters 
     65def 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 
     93def 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. 
    6698    """ 
    6799    multishell_parameters = getIterParams(parameters) 
     
    72104    else: 
    73105        params = parameters.iq_parameters 
    74     item = [] 
     106 
     107    rows = [] 
    75108    for param in params: 
    76109        # don't include shell parameters 
    77110        if param.name == multishell_param_name: 
    78111            continue 
     112 
    79113        # Modify parameter name from <param>[n] to <param>1 
    80114        item_name = param.name 
    81115        if param in multishell_parameters: 
    82116            continue 
    83         #    item_name = replaceShellName(param.name, 1) 
    84117 
    85118        item1 = QtGui.QStandardItem(item_name) 
    86119        item1.setCheckable(True) 
    87120        item1.setEditable(False) 
    88         # item_err = QtGui.QStandardItem() 
     121 
    89122        # check for polydisp params 
    90123        if param.polydisperse: 
     
    93126            item1_1 = QtGui.QStandardItem("Distribution") 
    94127            item1_1.setEditable(False) 
     128 
    95129            # Find param in volume_params 
    96             for p in parameters.form_volume_parameters: 
     130            poly_pars = parameters.form_volume_parameters 
     131            if is2D: 
     132                poly_pars += parameters.orientation_parameters 
     133            for p in poly_pars: 
    97134                if p.name != param.name: 
    98135                    continue 
    99136                width = kernel_module.getParam(p.name+'.width') 
    100137                ptype = kernel_module.getParam(p.name+'.type') 
    101  
    102138                item1_2 = QtGui.QStandardItem(str(width)) 
    103139                item1_2.setEditable(False) 
     
    110146                poly_item.appendRow([item1_1, item1_2, item1_3, item1_4, item1_5]) 
    111147                break 
     148 
    112149            # Add the polydisp item as a child 
    113150            item1.appendRow([poly_item]) 
     151 
    114152        # Param values 
    115153        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() 
    119154        item3 = QtGui.QStandardItem(str(param.limits[0])) 
    120155        item4 = QtGui.QStandardItem(str(param.limits[1])) 
    121         item5 = QtGui.QStandardItem(param.units) 
     156        item5 = QtGui.QStandardItem(str(param.units)) 
    122157        item5.setEditable(False) 
    123         item.append([item1, item2, item3, item4, item5]) 
    124     return item 
    125  
    126 def 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) 
     158 
     159        # Check if fixed-choice (returns combobox, if so, also makes some items uneditable) 
     160        row = [item1, item2, item3, item4, item5] 
     161        cbox = createFixedChoiceComboBox(param, row) 
     162 
     163        # Append to the model and use the combobox, if required 
     164        if None not in (model, view): 
     165            model.appendRow(row) 
     166            if cbox: 
     167                view.setIndexWidget(item2.index(), cbox) 
     168        rows.append(row) 
     169 
     170    return rows 
     171 
     172def addSimpleParametersToModel(parameters, is2D, parameters_original=None, model=None, view=None, row_num=None): 
     173    """ 
     174    Update local ModelModel with sasmodel parameters (non-dispersed, non-magnetic) 
     175    Actually appends to model, if model and view params are not None. 
     176    Always returns list of lists of QStandardItems. 
     177 
     178    parameters_original: list of parameters before any tagging on their IDs, e.g. for product model (so that those are 
     179    the display names; see below) 
    131180    """ 
    132181    if is2D: 
     
    147196        params_orig = params 
    148197 
    149     item = [] 
     198    rows = [] 
    150199    for param, param_orig in zip(params, params_orig): 
    151200        # Create the top level, checkable item 
     
    155204        item1.setCheckable(True) 
    156205        item1.setEditable(False) 
     206 
    157207        # Param values 
    158208        # TODO: add delegate for validation of cells 
    159209        item2 = QtGui.QStandardItem(str(param.default)) 
    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 
     210        item3 = QtGui.QStandardItem(str(param.limits[0])) 
     211        item4 = QtGui.QStandardItem(str(param.limits[1])) 
     212        item5 = QtGui.QStandardItem(str(param.units)) 
     213        item5.setEditable(False) 
     214 
     215        # Check if fixed-choice (returns combobox, if so, also makes some items uneditable) 
     216        row = [item1, item2, item3, item4, item5] 
     217        cbox = createFixedChoiceComboBox(param, row) 
     218 
     219        # Append to the model and use the combobox, if required 
     220        if None not in (model, view): 
     221            if row_num is None: 
     222                model.appendRow(row) 
     223            else: 
     224                model.insertRow(row_num, row) 
     225                row_num += 1 
     226 
     227            if cbox: 
     228                view.setIndexWidget(item2.index(), cbox) 
     229 
     230        rows.append(row) 
     231 
     232    return rows 
    166233 
    167234def markParameterDisabled(model, row): 
     
    259326    model.header_tooltips = copy.copy(poly_header_error_tooltips) 
    260327 
    261 def addShellsToModel(parameters, model, index, row_num=None): 
     328def addShellsToModel(parameters, model, index, row_num=None, view=None): 
    262329    """ 
    263330    Find out multishell parameters and update the model with the requested number of them. 
    264331    Inserts them after the row at row_num, if not None; otherwise, appends to end. 
     332    If view param is not None, supports fixed-choice params. 
    265333    Returns a list of lists of QStandardItem objects. 
    266334    """ 
     
    285353                    item1_3 = QtGui.QStandardItem(str(p.limits[0])) 
    286354                    item1_4 = QtGui.QStandardItem(str(p.limits[1])) 
    287                     item1_5 = QtGui.QStandardItem(p.units) 
     355                    item1_5 = QtGui.QStandardItem(str(p.units)) 
    288356                    poly_item.appendRow([item1_1, item1_2, item1_3, item1_4, item1_5]) 
    289357                    break 
     
    293361            item3 = QtGui.QStandardItem(str(par.limits[0])) 
    294362            item4 = QtGui.QStandardItem(str(par.limits[1])) 
    295             item5 = QtGui.QStandardItem(par.units) 
     363            item5 = QtGui.QStandardItem(str(par.units)) 
     364            item5.setEditable(False) 
     365 
     366            # Check if fixed-choice (returns combobox, if so, also makes some items uneditable) 
    296367            row = [item1, item2, item3, item4, item5] 
    297             rows.append(row) 
    298  
     368            cbox = createFixedChoiceComboBox(par, row) 
     369 
     370            # Always add to the model 
    299371            if row_num is None: 
    300372                model.appendRow(row) 
     
    302374                model.insertRow(row_num, row) 
    303375                row_num += 1 
     376 
     377            # Apply combobox if required 
     378            if None not in (view, cbox): 
     379                view.setIndexWidget(item2.index(), cbox) 
     380 
     381            rows.append(row) 
    304382 
    305383    return rows 
     
    474552 
    475553    theory_name = str(current_data.name.split()[0]) 
    476     residuals.name = "Residuals for " + str(theory_name) + "[" + \ 
    477                     str(reference_data.filename) + "]" 
     554    res_name = reference_data.filename if reference_data.filename else reference_data.name 
     555    residuals.name = "Residuals for " + str(theory_name) + "[" + res_name + "]" 
    478556    residuals.title = residuals.name 
    479557    residuals.ytransform = 'y' 
     
    501579    """ 
    502580    weight = None 
     581    if data is None: 
     582        return [] 
    503583    if is2d: 
     584        if not hasattr(data, 'err_data'): 
     585            return [] 
    504586        dy_data = data.err_data 
    505587        data = data.data 
    506588    else: 
     589        if not hasattr(data, 'dy'): 
     590            return [] 
    507591        dy_data = data.dy 
    508592        data = data.y 
Note: See TracChangeset for help on using the changeset viewer.