Changeset 48e55c9 in sasview
- Timestamp:
- Sep 9, 2018 5:27:05 AM (6 years ago)
- Branches:
- ESS_GUI, ESS_GUI_batch_fitting, ESS_GUI_bumps_abstraction, ESS_GUI_iss1116, ESS_GUI_opencl, ESS_GUI_ordering, ESS_GUI_sync_sascalc
- Children:
- 28965e9
- Parents:
- 4d959c8 (diff), bb477f5 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent. - Location:
- src/sas
- Files:
-
- 11 edited
Legend:
- Unmodified
- Added
- Removed
-
src/sas/qtgui/MainWindow/DataExplorer.py
r0cd98a1 r2b8286c 98 98 self.communicator.maskEditorSignal.connect(self.showEditDataMask) 99 99 self.communicator.extMaskEditorSignal.connect(self.extShowEditDataMask) 100 self.communicator.changeDataExplorerTabSignal.connect(self.changeTabs) 100 101 101 102 self.cbgraph.editTextChanged.connect(self.enableGraphCombo) … … 139 140 else: 140 141 self.current_view = self.freezeView 142 143 def changeTabs(self, tab=0): 144 """ 145 Switch tabs of the data explorer 146 0: data tab 147 1: theory tab 148 """ 149 assert(tab in [0,1]) 150 self.setCurrentIndex(tab) 141 151 142 152 def displayHelp(self): … … 553 563 return item 554 564 555 def displayFile(self, filename=None, is_data=True ):565 def displayFile(self, filename=None, is_data=True, id=None): 556 566 """ 557 567 Forces display of charts for the given filename … … 560 570 # Now query the model item for available plots 561 571 plots = GuiUtils.plotsFromFilename(filename, model) 562 572 # Each fitpage contains the name based on fit widget number 573 fitpage_name = "" if id is None else "M"+str(id) 563 574 new_plots = [] 564 575 for item, plot in plots.items(): 565 if not self.updatePlot(plot): 566 # Don't plot intermediate results, e.g. P(Q), S(Q) 567 match = GuiUtils.theory_plot_ID_pattern.match(plot.id) 568 # 2nd match group contains the identifier for the intermediate result, if present (e.g. "[P(Q)]") 569 if match and match.groups()[1] != None: 570 continue 576 if self.updatePlot(plot) and filename != plot.name: 577 continue 578 # Don't plot intermediate results, e.g. P(Q), S(Q) 579 match = GuiUtils.theory_plot_ID_pattern.match(plot.id) 580 # 2nd match group contains the identifier for the intermediate result, if present (e.g. "[P(Q)]") 581 if match and match.groups()[1] != None: 582 continue 583 # Don't include plots from different fitpages, but always include the original data 584 if fitpage_name in plot.name or filename == plot.name: 571 585 # 'sophisticated' test to generate standalone plot for residuals 572 586 if 'esiduals' in plot.title: … … 579 593 self.plotData(new_plots) 580 594 581 def displayData(self, data_list ):595 def displayData(self, data_list, id=None): 582 596 """ 583 597 Forces display of charts for the given data set … … 588 602 # the data explorer indices. 589 603 filename = plot_to_show.filename 590 self.displayFile(filename=filename, is_data=plot_to_show.is_data )604 self.displayFile(filename=filename, is_data=plot_to_show.is_data, id=id) 591 605 592 606 def addDataPlot2D(self, plot_set, item): -
src/sas/qtgui/MainWindow/GuiManager.py
r339e22b r5b144c6 921 921 self.filesWidget.displayFile(filename=filename, is_data=True) 922 922 923 def showPlot(self, plot ):923 def showPlot(self, plot, id): 924 924 """ 925 925 Pass the show plot request to the data explorer 926 926 """ 927 927 if hasattr(self, "filesWidget"): 928 self.filesWidget.displayData(plot )928 self.filesWidget.displayData(plot, id) 929 929 930 930 def uncheckAllMenuItems(self, menuObject): -
src/sas/qtgui/Perspectives/Fitting/FittingLogic.py
r9ba91b7 r61f0c75 213 213 plots = [] 214 214 for name, result in return_data['intermediate_results'].items(): 215 if not isinstance(result, np.ndarray): 216 continue 215 217 plots.append(self._create1DPlot(tab_id, return_data['x'], result, 216 218 return_data['model'], return_data['data'], -
src/sas/qtgui/Perspectives/Fitting/FittingWidget.py
r5e0891b rbb477f5 569 569 menu.exec_(self.lstParams.viewport().mapToGlobal(position)) 570 570 except AttributeError as ex: 571 logg ing.error("Error generating context menu: %s" % ex)571 logger.error("Error generating context menu: %s" % ex) 572 572 return 573 573 … … 1456 1456 self.communicate.statusBarUpdateSignal.emit(msg) 1457 1457 msg += results.mesg 1458 logg ing.error(msg)1458 logger.error(msg) 1459 1459 return 1460 1460 … … 1499 1499 if self.calc_fit._interrupting: 1500 1500 msg = "Fitting cancelled by user after: %s s." % GuiUtils.formatNumber(elapsed) 1501 logg ing.warning("\n"+msg+"\n")1501 logger.warning("\n"+msg+"\n") 1502 1502 else: 1503 1503 msg = "Fitting completed successfully in: %s s." % GuiUtils.formatNumber(elapsed) … … 1841 1841 data_to_show = self.data if self.data_is_loaded else self.model_data 1842 1842 if data_to_show is not None: 1843 self.communicate.plotRequestedSignal.emit([data_to_show] )1843 self.communicate.plotRequestedSignal.emit([data_to_show], self.tab_id) 1844 1844 1845 1845 def onOptionsUpdate(self): … … 2052 2052 kernel_module = generate.load_kernel_module(name) 2053 2053 except ModuleNotFoundError as ex: 2054 logg ing.error("Can't find the model "+ str(ex))2054 logger.error("Can't find the model "+ str(ex)) 2055 2055 return 2056 2056 … … 2287 2287 fitted_data.symbol = "Line" 2288 2288 self.createTheoryIndex(fitted_data) 2289 # Switch to the theory tab for user's glee 2290 self.communicate.changeDataExplorerTabSignal.emit(1) 2289 2291 2290 2292 def updateModelIndex(self, fitted_data): … … 2422 2424 2423 2425 if self.data_is_loaded: 2426 # delete any plots associated with the data that were not updated (e.g. to remove beta(Q), S_eff(Q)) 2424 2427 GuiUtils.deleteRedundantPlots(self.all_data[self.data_index], new_plots) 2428 pass 2425 2429 else: 2426 2430 # delete theory items for the model, in order to get rid of any redundant items, e.g. beta(Q), S_eff(Q) … … 2511 2515 """ 2512 2516 # TODO: remimplement thread cancellation 2513 logg ing.error("".join(traceback.format_exception(etype, value, tb)))2517 logger.error("".join(traceback.format_exception(etype, value, tb))) 2514 2518 2515 2519 def setTableProperties(self, table): … … 2693 2697 2694 2698 if not datafile: 2695 logg ing.info("No weight data chosen.")2699 logger.info("No weight data chosen.") 2696 2700 raise IOError 2697 2701 … … 2809 2813 self._n_shells_row = shell_row - 1 2810 2814 2811 # Set the index to the state-kept value 2812 func.setCurrentIndex(self.current_shell_displayed 2813 if self.current_shell_displayed < func.count() else 0) 2815 # Get the default number of shells for the model 2816 kernel_pars = self.kernel_module._model_info.parameters.kernel_parameters 2817 shell_par = None 2818 for par in kernel_pars: 2819 if par.name == param_name: 2820 shell_par = par 2821 break 2822 if not shell_par: 2823 logger.error("Could not find %s in kernel parameters.", param_name) 2824 default_shell_count = shell_par.default 2825 2826 # Add default number of shells to the model 2827 func.setCurrentIndex(default_shell_count) 2814 2828 2815 2829 def modifyShellsInList(self, index): … … 3125 3139 param_value = str(self._model_model.item(row, 1).text()) 3126 3140 param_error = None 3141 param_min = None 3142 param_max = None 3127 3143 column_offset = 0 3128 3144 if self.has_error_column: 3129 3145 param_error = str(self._model_model.item(row, 2).text()) 3130 3146 column_offset = 1 3131 param_min = str(self._model_model.item(row, 2+column_offset).text()) 3132 param_max = str(self._model_model.item(row, 3+column_offset).text()) 3147 3148 try: 3149 param_min = str(self._model_model.item(row, 2+column_offset).text()) 3150 param_max = str(self._model_model.item(row, 3+column_offset).text()) 3151 except: 3152 pass 3153 3133 3154 param_list.append([param_name, param_checked, param_value, param_error, param_min, param_max]) 3134 3155 … … 3220 3241 3221 3242 # limits 3222 limit_lo = item[3] 3223 context[name].append(limit_lo) 3224 limit_hi = item[4] 3225 context[name].append(limit_hi) 3243 try: 3244 limit_lo = item[3] 3245 context[name].append(limit_lo) 3246 limit_hi = item[4] 3247 context[name].append(limit_hi) 3248 except: 3249 pass 3226 3250 3227 3251 # Polydisp … … 3282 3306 ioffset = 1 3283 3307 # min/max 3284 param_repr = GuiUtils.formatNumber(param_dict[param_name][2+ioffset], high=True) 3285 self._model_model.item(row, 2+ioffset).setText(param_repr) 3286 param_repr = GuiUtils.formatNumber(param_dict[param_name][3+ioffset], high=True) 3287 self._model_model.item(row, 3+ioffset).setText(param_repr) 3308 try: 3309 param_repr = GuiUtils.formatNumber(param_dict[param_name][2+ioffset], high=True) 3310 self._model_model.item(row, 2+ioffset).setText(param_repr) 3311 param_repr = GuiUtils.formatNumber(param_dict[param_name][3+ioffset], high=True) 3312 self._model_model.item(row, 3+ioffset).setText(param_repr) 3313 except: 3314 pass 3315 3288 3316 self.setFocus() 3317 3289 3318 3290 3319 -
src/sas/qtgui/Perspectives/Fitting/UnitTesting/FittingWidgetTest.py
r4ea8020 rf712bf30 613 613 614 614 # Check that the number of rows increased 615 # (note that n == 1 by default in core_multi_shell so this increases index by 2) 615 616 more_rows = self.widget._model_model.rowCount() - last_row 616 self.assertEqual(more_rows, 6) # 6new rows: 2 params per index617 618 # Backto 0617 self.assertEqual(more_rows, 4) # 4 new rows: 2 params per index 618 619 # Set to 0 619 620 self.widget.lstParams.indexWidget(func_index).setCurrentIndex(0) 620 self.assertEqual(self.widget._model_model.rowCount(), last_row )621 self.assertEqual(self.widget._model_model.rowCount(), last_row - 2) # 2 fewer rows than default 621 622 622 623 def testPlotTheory(self): -
src/sas/qtgui/Perspectives/Inversion/InversionPerspective.py
r4d959c8 r48e55c9 562 562 title = self.prPlot.name 563 563 GuiUtils.updateModelItemWithPlot(self._data, self.prPlot, title) 564 self.communicate.plotRequestedSignal.emit([self.prPlot] )564 self.communicate.plotRequestedSignal.emit([self.prPlot], None) 565 565 if self.dataPlot is not None: 566 566 title = self.dataPlot.name 567 567 GuiUtils.updateModelItemWithPlot(self._data, self.dataPlot, title) 568 self.communicate.plotRequestedSignal.emit([self.dataPlot] )568 self.communicate.plotRequestedSignal.emit([self.dataPlot], None) 569 569 self.enableButtons() 570 570 -
src/sas/qtgui/Plotting/Plotter.py
r0cd98a1 r5b144c6 561 561 562 562 #Remove another Fit, if exists 563 self.removePlot(" fit")563 self.removePlot("Fit") 564 564 565 565 self.fit_result.reset_view() -
src/sas/qtgui/Plotting/UnitTesting/PlotterTest.py
rb8080e1 r5b144c6 57 57 self.plotter.data = self.data 58 58 self.plotter.show() 59 FigureCanvas.draw _idle= MagicMock()59 FigureCanvas.draw = MagicMock() 60 60 61 61 self.plotter.plot(hide_error=False) 62 62 63 63 self.assertEqual(self.plotter.ax.get_xscale(), 'log') 64 self.assertTrue(FigureCanvas.draw _idle.called)64 self.assertTrue(FigureCanvas.draw.called) 65 65 66 66 self.plotter.figure.clf() … … 70 70 self.plotter.data = self.data 71 71 self.plotter.show() 72 FigureCanvas.draw _idle= MagicMock()72 FigureCanvas.draw = MagicMock() 73 73 74 74 self.plotter.plot(hide_error=True) 75 75 76 76 self.assertEqual(self.plotter.ax.get_yscale(), 'log') 77 self.assertTrue(FigureCanvas.draw _idle.called)77 self.assertTrue(FigureCanvas.draw.called) 78 78 self.plotter.figure.clf() 79 79 … … 91 91 self.plotter.data = data 92 92 self.plotter.show() 93 FigureCanvas.draw _idle= MagicMock()93 FigureCanvas.draw = MagicMock() 94 94 95 95 self.plotter.plot(hide_error=True) … … 97 97 self.assertEqual(self.plotter.ax.get_xscale(), 'linear') 98 98 self.assertEqual(self.plotter.ax.get_yscale(), 'linear') 99 self.assertTrue(FigureCanvas.draw _idle.called)99 self.assertTrue(FigureCanvas.draw.called) 100 100 101 101 def testCreateContextMenuQuick(self): … … 262 262 # Just this one plot 263 263 self.assertEqual(len(list(self.plotter.plot_dict.keys())), 1) 264 self.plotter.onLinearFit( 1)264 self.plotter.onLinearFit('Test name') 265 265 266 266 # Check that exec_ got called … … 289 289 290 290 # Delete one set 291 self.plotter.onRemovePlot( 2)291 self.plotter.onRemovePlot('Test name 2') 292 292 # Assure we have two sets 293 293 self.assertEqual(len(list(self.plotter.plot_dict.keys())), 1) … … 296 296 297 297 # Delete the remaining set 298 self.plotter.onRemovePlot( 1)298 self.plotter.onRemovePlot('Test name') 299 299 # Assure we have no plots 300 300 self.assertEqual(len(list(self.plotter.plot_dict.keys())), 0) … … 331 331 self.assertEqual(yl, "$YAXIS(cake)$") 332 332 # The hide_error flag should also remain 333 self.assertTrue(self.plotter.plot_dict[ 2].hide_error)333 self.assertTrue(self.plotter.plot_dict['Test name 2'].hide_error) 334 334 self.plotter.figure.clf() 335 335 … … 355 355 356 356 # Reverse the toggle 357 self.plotter.onToggleHideError( 2)357 self.plotter.onToggleHideError('Test name 2') 358 358 # See that the labels didn't change 359 359 xl = self.plotter.ax.xaxis.label.get_text() … … 362 362 self.assertEqual(yl, "$YAXIS(cake)$") 363 363 # The hide_error flag should toggle 364 self.assertEqual(self.plotter.plot_dict[ 2].hide_error, not error_status)364 self.assertEqual(self.plotter.plot_dict['Test name 2'].hide_error, not error_status) 365 365 self.plotter.figure.clf() 366 366 … … 417 417 self.assertEqual(yl, "$YAXIS(cake)$") 418 418 # The hide_error flag should be as set 419 self.assertEqual(self.plotter.plot_dict[ 2].hide_error, error_status)419 self.assertEqual(self.plotter.plot_dict['Test name 2'].hide_error, error_status) 420 420 self.plotter.figure.clf() 421 421 -
src/sas/qtgui/Utilities/GuiUtils.py
r339e22b r5d28d6b 225 225 # New plot requested from the GUI manager 226 226 # Old "NewPlotEvent" 227 plotRequestedSignal = QtCore.pyqtSignal(list )227 plotRequestedSignal = QtCore.pyqtSignal(list, int) 228 228 229 229 # Plot from file names … … 277 277 # Notify about new categories/models from category manager 278 278 updateModelCategoriesSignal = QtCore.pyqtSignal() 279 280 # Tell the data explorer to switch tabs 281 changeDataExplorerTabSignal = QtCore.pyqtSignal(int) 279 282 280 283 def updateModelItemWithPlot(item, update_data, name=""): … … 288 291 for index in range(item.rowCount()): 289 292 plot_item = item.child(index) 290 if plot_item.isCheckable(): 291 plot_data = plot_item.child(0).data() 292 if plot_data.id is not None and \ 293 (plot_data.name == update_data.name or plot_data.id == update_data.id): 293 if not plot_item.isCheckable(): 294 continue 295 plot_data = plot_item.child(0).data() 296 if plot_data.id is not None and \ 297 plot_data.name == update_data.name: 298 #(plot_data.name == update_data.name or plot_data.id == update_data.id): 294 299 # if plot_data.id is not None and plot_data.id == update_data.id: 295 296 297 298 299 300 301 302 300 # replace data section in item 301 plot_item.child(0).setData(update_data) 302 plot_item.setText(name) 303 # Plot title if any 304 if plot_item.child(1).hasChildren(): 305 plot_item.child(1).child(0).setText("Title: %s"%name) 306 # Force redisplay 307 return 303 308 304 309 # Create the new item -
src/sas/qtgui/Perspectives/Inversion/DMaxExplorerWidget.py
rb0ba43e re908916 42 42 self.parent = parent 43 43 44 self.setWindowTitle("D ââExplorer")44 self.setWindowTitle("Dmax Explorer") 45 45 46 46 self.pr_state = pr_state … … 116 116 bck = [] 117 117 chi2 = [] 118 118 plotable_xs = [] #Introducing this to make sure size of x and y for plotting is the same.8 119 119 try: 120 120 dmin = float(self.model.item(W.DMIN).text()) … … 128 128 129 129 original = self.pr_state.d_max 130 130 131 for x in xs: 131 132 self.pr_state.d_max = x … … 140 141 bck.append(self.pr_state.background) 141 142 chi2.append(self.pr_state.chi2) 143 plotable_xs.append(x) 142 144 except Exception as ex: 143 145 # This inversion failed, skip this D_max value … … 188 190 y_unit = "a.u." 189 191 190 data = Data1D( xs, ys)192 data = Data1D(plotable_xs, ys) 191 193 if self.hasPlot: 192 194 self.plot.removePlot(None) -
src/sas/sascalc/pr/invertor.py
rb8080e1 r6701a0b 71 71 A[j][i] = (Fourier transformed base function for point j) 72 72 73 We the mchoose a number of r-points, n_r, to evaluate the second73 We then choose a number of r-points, n_r, to evaluate the second 74 74 derivative of P(r) at. This is used as our regularization term. 75 75 For a vector r of length n_r, the following n_r rows are set to :: … … 144 144 x, y, err, d_max, q_min, q_max and alpha 145 145 """ 146 if 146 if name == 'x': 147 147 if 0.0 in value: 148 148 msg = "Invertor: one of your q-values is zero. " … … 227 227 return None 228 228 229 def add_errors(self, yvalues): 230 """ 231 Adds errors to data set is they are not avaialble 232 :return: 233 """ 234 stats_errors = np.zeros(len(yvalues)) 235 for i in range(len(yvalues)): 236 # Scale the error so that we can fit over several decades of Q 237 scale = 0.05 * np.sqrt(yvalues[i]) 238 min_err = 0.01 * yvalues[i] 239 stats_errors[i] = scale * np.sqrt(np.fabs(yvalues[i])) + min_err 240 logger.warning("Simulated errors have been added to the data set\n") 241 return stats_errors 242 229 243 def clone(self): 230 244 """ … … 244 258 invertor.x = self.x 245 259 invertor.y = self.y 246 invertor.err = self.err 260 if np.size(self.err) == 0 or np.all(self.err) == 0: 261 invertor.err = self.add_errors(self.y) 262 else: 263 invertor.err = self.err 247 264 invertor.est_bck = self.est_bck 248 265 invertor.background = self.background … … 268 285 A[i][j] = (Fourier transformed base function for point j) 269 286 270 We the mchoose a number of r-points, n_r, to evaluate the second287 We then choose a number of r-points, n_r, to evaluate the second 271 288 derivative of P(r) at. This is used as our regularization term. 272 289 For a vector r of length n_r, the following n_r rows are set to ::
Note: See TracChangeset
for help on using the changeset viewer.