Changes in src/sas/qtgui/Perspectives/Fitting/FittingWidget.py [5fb714b:66d4370] in sasview
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/sas/qtgui/Perspectives/Fitting/FittingWidget.py
r5fb714b r66d4370 91 91 fittingFinishedSignal = QtCore.pyqtSignal(tuple) 92 92 batchFittingFinishedSignal = QtCore.pyqtSignal(tuple) 93 Calc1DFinishedSignal = QtCore.pyqtSignal( dict)94 Calc2DFinishedSignal = QtCore.pyqtSignal( dict)93 Calc1DFinishedSignal = QtCore.pyqtSignal(tuple) 94 Calc2DFinishedSignal = QtCore.pyqtSignal(tuple) 95 95 96 96 def __init__(self, parent=None, data=None, tab_id=1): … … 219 219 # Utility variable to enable unselectable option in category combobox 220 220 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 224 223 # Dictionary of {model name: model class} for the current category 225 224 self.models = {} … … 677 676 Return list of all parameters for the current model 678 677 """ 679 return [self._model_model.item(row).text() 680 for row in range(self._model_model.rowCount()) 681 if self.isCheckable(row)] 678 return [self._model_model.item(row).text() for row in range(self._model_model.rowCount())] 682 679 683 680 def modifyViewOnRow(self, row, font=None, brush=None): … … 707 704 assert isinstance(constraint, Constraint) 708 705 assert 0 <= row <= self._model_model.rowCount() 709 assert self.isCheckable(row)710 706 711 707 item = QtGui.QStandardItem() … … 728 724 max_col = self.lstParams.itemDelegate().param_max 729 725 for row in self.selectedParameters(): 730 assert(self.isCheckable(row))731 726 param = self._model_model.item(row, 0).text() 732 727 value = self._model_model.item(row, 1).text() … … 771 766 max_col = self.lstParams.itemDelegate().param_max 772 767 for row in range(self._model_model.rowCount()): 773 if not self.isCheckable(row):774 continue775 768 if not self.rowHasConstraint(row): 776 769 continue … … 801 794 For the given row, return its constraint, if any 802 795 """ 803 if self.isCheckable(row):796 try: 804 797 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 798 return item.child(0).data() 799 except AttributeError: 800 # return none when no constraints 801 return None 811 802 812 803 def rowHasConstraint(self, row): … … 814 805 Finds out if row of the main model has a constraint child 815 806 """ 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 807 item = self._model_model.item(row, 1) 808 if item.hasChildren(): 809 c = item.child(0).data() 810 if isinstance(c, Constraint): 811 return True 822 812 return False 823 813 … … 826 816 Finds out if row of the main model has an active constraint child 827 817 """ 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 818 item = self._model_model.item(row, 1) 819 if item.hasChildren(): 820 c = item.child(0).data() 821 if isinstance(c, Constraint) and c.active: 822 return True 834 823 return False 835 824 … … 838 827 Finds out if row of the main model has an active, nontrivial constraint child 839 828 """ 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 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.func and c.active: 833 return True 846 834 return False 847 835 … … 1209 1197 self.updateData() 1210 1198 1211 # update in param model1212 if model_column in [delegate.poly_pd, delegate.poly_error, delegate.poly_min, delegate.poly_max]:1213 row = self.getRowFromName(parameter_name)1214 param_item = self._model_model.item(row)1215 self._model_model.blockSignals(True)1216 param_item.child(0).child(0, model_column).setText(item.text())1217 self._model_model.blockSignals(False)1218 1219 1199 def onMagnetModelChange(self, item): 1220 1200 """ … … 1589 1569 # internal so can use closure for param_dict 1590 1570 param_name = str(self._model_model.item(row, 0).text()) 1591 if not self.isCheckable(row) orparam_name not in list(param_dict.keys()):1571 if param_name not in list(param_dict.keys()): 1592 1572 return 1593 1573 # modify the param value … … 1601 1581 # Utility function for updateof polydispersity part of the main model 1602 1582 param_name = str(self._model_model.item(row, 0).text())+'.width' 1603 if not self.isCheckable(row) orparam_name not in list(param_dict.keys()):1583 if param_name not in list(param_dict.keys()): 1604 1584 return 1605 1585 # modify the param value … … 1978 1958 # Crete/overwrite model items 1979 1959 self._model_model.clear() 1980 self._poly_model.clear() 1981 self._magnet_model.clear()1982 1983 if model_name is None:1984 if structure_factor not in (None, "None"): 1985 # S(Q) on its own, treat the same as a form factor1986 self.kernel_module = None1987 self.fromStructureFactorToQModel(structure_factor)1988 else:1989 # No models selected1990 return1960 1961 # First, add parameters from the main model 1962 if model_name is not None: 1963 self.fromModelToQModel(model_name) 1964 1965 # Then, add structure factor derived parameters 1966 if structure_factor is not None and structure_factor != "None": 1967 if model_name is None: 1968 # Instantiate the current sasmodel for SF-only models 1969 self.kernel_module = self.models[structure_factor]() 1970 self.fromStructureFactorToQModel(structure_factor) 1991 1971 else: 1992 self.fromModelToQModel(model_name)1993 self.addExtraShells()1994 1995 1972 # Allow the SF combobox visibility for the given sasmodel 1996 1973 self.enableStructureFactorControl(structure_factor) 1997 1998 # Add S(Q)1999 1974 if self.cbStructureFactor.isEnabled(): 2000 1975 structure_factor = self.cbStructureFactor.currentText() 2001 1976 self.fromStructureFactorToQModel(structure_factor) 2002 1977 2003 # Add polydispersity to the model 2004 self.poly_params = {} 2005 self.setPolyModel() 2006 # Add magnetic parameters to the model 2007 self.magnet_params = {} 2008 self.setMagneticModel() 1978 # Then, add multishells 1979 if model_name is not None: 1980 # Multishell models need additional treatment 1981 self.addExtraShells() 1982 1983 # Add polydispersity to the model 1984 self.poly_params = {} 1985 self.setPolyModel() 1986 # Add magnetic parameters to the model 1987 self.magnet_params = {} 1988 self.setMagneticModel() 2009 1989 2010 1990 # Adjust the table cells width … … 2079 2059 self.shell_names = self.shellNamesList() 2080 2060 2081 # Add heading row2082 FittingUtilities.addHeadingRowToModel(self._model_model, model_name)2083 2084 2061 # Update the QModel 2085 FittingUtilities.addParametersToModel(2086 self.model_parameters, 2087 self.kernel_module,2088 self.is2D,2089 self._model_model,2090 self.lstParams)2062 new_rows = FittingUtilities.addParametersToModel(self.model_parameters, self.kernel_module, self.is2D) 2063 2064 for row in new_rows: 2065 self._model_model.appendRow(row) 2066 # Update the counter used for multishell display 2067 self._last_model_row = self._model_model.rowCount() 2091 2068 2092 2069 def fromStructureFactorToQModel(self, structure_factor): … … 2096 2073 if structure_factor is None or structure_factor=="None": 2097 2074 return 2098 2099 if self.kernel_module is None: 2100 # Structure factor is the only selected model; build it and show all its params 2101 self.kernel_module = self.models[structure_factor]() 2102 s_params = self.kernel_module._model_info.parameters 2103 s_params_orig = s_params 2104 2105 else: 2106 s_kernel = self.models[structure_factor]() 2107 p_kernel = self.kernel_module 2108 2109 p_pars_len = len(p_kernel._model_info.parameters.kernel_parameters) 2110 s_pars_len = len(s_kernel._model_info.parameters.kernel_parameters) 2111 2112 self.kernel_module = MultiplicationModel(p_kernel, s_kernel) 2113 all_params = self.kernel_module._model_info.parameters.kernel_parameters 2114 all_param_names = [param.name for param in all_params] 2115 2116 # S(Q) params from the product model are not necessarily the same as those from the S(Q) model; any 2117 # conflicting names with P(Q) params will cause a rename 2118 2119 if "radius_effective_mode" in all_param_names: 2120 # Show all parameters 2121 s_params = modelinfo.ParameterTable(all_params[p_pars_len:p_pars_len+s_pars_len]) 2122 s_params_orig = modelinfo.ParameterTable(s_kernel._model_info.parameters.kernel_parameters) 2123 else: 2124 # Ensure radius_effective is not displayed 2125 s_params_orig = modelinfo.ParameterTable(s_kernel._model_info.parameters.kernel_parameters[1:]) 2126 if "radius_effective" in all_param_names: 2127 s_params = modelinfo.ParameterTable(all_params[p_pars_len+1:p_pars_len+s_pars_len]) 2128 else: 2129 s_params = modelinfo.ParameterTable(all_params[p_pars_len:p_pars_len+s_pars_len-1]) 2130 2131 # Add heading row 2132 FittingUtilities.addHeadingRowToModel(self._model_model, structure_factor) 2133 2134 # Get new rows for QModel 2135 # Any renamed parameters are stored as data in the relevant item, for later handling 2136 FittingUtilities.addSimpleParametersToModel( 2137 s_params, 2138 self.is2D, 2139 s_params_orig, 2140 self._model_model, 2141 self.lstParams) 2075 structure_module = generate.load_kernel_module(structure_factor) 2076 structure_parameters = modelinfo.make_parameter_table(getattr(structure_module, 'parameters', [])) 2077 2078 structure_kernel = self.models[structure_factor]() 2079 form_kernel = self.kernel_module 2080 2081 self.kernel_module = MultiplicationModel(form_kernel, structure_kernel) 2082 2083 new_rows = FittingUtilities.addSimpleParametersToModel(structure_parameters, self.is2D) 2084 for row in new_rows: 2085 self._model_model.appendRow(row) 2086 # disable fitting of parameters not listed in self.kernel_module (probably radius_effective) 2087 if row[0].text() not in self.kernel_module.params.keys(): 2088 row_num = self._model_model.rowCount() - 1 2089 FittingUtilities.markParameterDisabled(self._model_model, row_num) 2090 2091 # Update the counter used for multishell display 2092 self._last_model_row = self._model_model.rowCount() 2142 2093 2143 2094 def haveParamsToFit(self): … … 2165 2116 model_row = item.row() 2166 2117 name_index = self._model_model.index(model_row, 0) 2167 name_item = self._model_model.itemFromIndex(name_index)2168 2118 2169 2119 # Extract changed value. … … 2174 2124 return 2175 2125 2176 # if the item has user data, this is the actual parameter name (e.g. to handle duplicate names) 2177 if name_item.data(QtCore.Qt.UserRole): 2178 parameter_name = str(name_item.data(QtCore.Qt.UserRole)) 2179 else: 2180 parameter_name = str(self._model_model.data(name_index)) 2126 parameter_name = str(self._model_model.data(name_index)) # sld, background etc. 2181 2127 2182 2128 # Update the parameter value - note: this supports +/-inf as well … … 2412 2358 new_plots.append(sq_data) 2413 2359 2360 # Update/generate plots 2414 2361 for plot in new_plots: 2415 2362 self.communicate.plotUpdateSignal.emit([plot]) … … 2611 2558 def updateFunctionCaption(row): 2612 2559 # Utility function for update of polydispersity function name in the main model 2613 if not self.isCheckable(row):2614 return2615 self._model_model.blockSignals(True)2616 2560 param_name = str(self._model_model.item(row, 0).text()) 2617 self._model_model.blockSignals(False)2618 2561 if param_name != param.name: 2619 2562 return 2620 2563 # Modify the param value 2621 self._model_model.blockSignals(True)2622 2564 if self.has_error_column: 2623 2565 # err column changes the indexing … … 2625 2567 else: 2626 2568 self._model_model.item(row, 0).child(0).child(0,4).setText(combo_string) 2627 self._model_model.blockSignals(False)2628 2569 2629 2570 if combo_string == 'array': … … 2785 2726 2786 2727 self.lstParams.setIndexWidget(shell_index, func) 2787 self._ n_shells_row = shell_row - 12728 self._last_model_row = self._model_model.rowCount() 2788 2729 2789 2730 # Set the index to the state-kept value … … 2796 2737 """ 2797 2738 # Find row location of the combobox 2798 first_row = self._n_shells_row + 12799 remove_rows = self._ num_shell_params2739 last_row = self._last_model_row 2740 remove_rows = self._model_model.rowCount() - last_row 2800 2741 2801 2742 if remove_rows > 1: 2802 self._model_model.removeRows(first_row, remove_rows) 2803 2804 new_rows = FittingUtilities.addShellsToModel( 2805 self.model_parameters, 2806 self._model_model, 2807 index, 2808 first_row, 2809 self.lstParams) 2810 2811 self._num_shell_params = len(new_rows) 2743 self._model_model.removeRows(last_row, remove_rows) 2744 2745 FittingUtilities.addShellsToModel(self.model_parameters, self._model_model, index) 2812 2746 self.current_shell_displayed = index 2813 2747
Note: See TracChangeset
for help on using the changeset viewer.