def __init__(self, params, finite_bounds=False, parent=None): super(LimitsModel, self).__init__(parent) self.params = params self.finite_bounds = finite_bounds self.varys = curvefitter.varys(self.params) self.fitted_params = np.where(self.varys)[0] self.names = curvefitter.names(self.params)
def data(self, index, role=QtCore.Qt.DisplayRole): if not index.isValid(): return False row = index.row() col = index.column() names = curvefitter.names(self.params) if row: name = names[row - 1] if role == QtCore.Qt.DisplayRole: if col == 0: if row == 0: return str(len(self.params)) else: return name elif col == 1 and row > 0: return str(self.params[name].value) elif col == 2 and row > 0: return str(self.params[name].min) elif col == 3 and row > 0: return str(self.params[name].max) elif col == 4 and row > 0: return str(self.params[name].expr) if role == QtCore.Qt.CheckStateRole: if row > 0 and col == 1: if self.params[name].vary: return QtCore.Qt.Unchecked else: return QtCore.Qt.Checked
def rowcol_to_name(self, row, col, nlayers): if row == 0 and col == 1: param = 2 elif row == 0 and col == 2: param = 3 elif row == nlayers + 1 and col == 1: param = 4 elif row == nlayers + 1 and col == 2: param = 5 elif row == nlayers + 1 and col == 3: param = 7 else: param = 4 * (row - 1) + col + 8 names = curvefitter.names(self.params) return names[param]
def remove_layer(self, which_layer): params = self.params values = curvefitter.values(params) if int(values[0]) == 0: return False if not reflect.is_proper_abeles_input(values): raise ValueError('The size of the parameter array passed' ' to reflectivity should be 4 * coefs[0] + 8') oldlayers = int(values[0]) self.beginRemoveRows(QtCore.QModelIndex(), which_layer, which_layer) self.params['nlayers'].value = oldlayers - 1 startP = 4 * (which_layer - 1) + 8 #get rid of parameters we don't need anymore names_lost = curvefitter.names(self.params)[startP: startP + 4] map(self.params.pop, names_lost) # but now we need to rejig parameters names # the only way to do this is to pop them all and readd values = curvefitter.values(self.params) varys = curvefitter.varys(self.params) bounds = np.array(curvefitter.bounds(self.params)) names = ReflectivityFitFunction.parameter_names(values.size) map(self.params.pop, self.params.keys()) parlist = zip(names, values, varys, bounds.T[0], bounds.T[1], [None] * values.size) for para in parlist: self.params.add(*para) self.endRemoveRows()
def setData(self, index, value, role=QtCore.Qt.EditRole): row = index.row() col = index.column() names = curvefitter.names(self.params) if row: name = names[row - 1] if role == QtCore.Qt.CheckStateRole: if row > 0 and col == 1: if value == QtCore.Qt.Checked: self.params[name].vary = False else: self.params[name].vary = True if role == QtCore.Qt.EditRole: if row == 0 and col == 0: currentparams = self.rowCount() - 1 validator = QtGui.QIntValidator() voutput = validator.validate(value, 1) if voutput[0] is QtGui.QValidator.State.Acceptable and int(voutput[1]) >= 0: newparams = int(voutput[1]) if newparams == currentparams: return True if newparams > currentparams: self.beginInsertRows( QtCore.QModelIndex(), currentparams + 1, newparams) if newparams < currentparams: self.beginRemoveRows( QtCore.QModelIndex(), newparams + 1, currentparams) if newparams > currentparams: for i in range(currentparams, newparams): self.params.add('p%d'%i, 0, True, -np.inf, np.inf, None) self.endInsertRows() if newparams < currentparams: remove_names = names[newparams:] map(self.params.pop, remove_names) self.endRemoveRows() self.modelReset.emit() if row > 0 and col in [1, 2, 3]: validator = QtGui.QDoubleValidator() voutput = validator.validate(value, 1) if voutput[0] == QtGui.QValidator.State.Acceptable: number = float(voutput[1]) else: return False if col == 1: self.params[name].value = number if col == 2: self.params[name].min = number if col == 3: self.params[name].max = number if row > 0 and col == 0: #change a parameter name requires making a new dictionary if not valid_symbol_name(value): return False p = Parameters() param = self.params[name] newparam = Parameter(value, param.value, param.vary, param.min, param.max, param.expr) for k, v in self.params.items(): if k == name: p[value] = newparam else: p[k] = v self.params = p if row > 0 and col == 4: #set an expression param = self.params[name] param.expr = value self.dataChanged.emit(index, index) return True