Changeset 0f29fad in sasview for src/sas/qtgui
- Timestamp:
- Aug 16, 2018 3:45:31 AM (6 years ago)
- Branches:
- ESS_GUI, ESS_GUI_batch_fitting, ESS_GUI_bumps_abstraction, ESS_GUI_iss1116, ESS_GUI_iss879, ESS_GUI_opencl, ESS_GUI_ordering, ESS_GUI_sync_sascalc
- Children:
- 04368e6
- Parents:
- 3bd0cd7 (diff), 4bf58293 (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/qtgui
- Files:
-
- 10 edited
Legend:
- Unmodified
- Added
- Removed
-
src/sas/qtgui/MainWindow/DataExplorer.py
rc7f259d r4bf58293 4 4 import time 5 5 import logging 6 import re 6 7 7 8 from PyQt5 import QtCore … … 36 37 # The controller which is responsible for managing signal slots connections 37 38 # for the gui and providing an interface to the data model. 39 40 # This matches the ID of a plot created using FittingLogic._create1DPlot, e.g. 41 # "5 [P(Q)] modelname" 42 # or 43 # "4 modelname". 44 # Useful for determining whether the plot in question is for an intermediate result, such as P(Q) or S(Q) in the 45 # case of a product model; the identifier for this is held in square brackets, as in the example above. 46 theory_plot_ID_pattern = re.compile(r"^([0-9]+)\s+(\[(.*)\]\s+)?(.*)$") 38 47 39 48 def __init__(self, parent=None, guimanager=None, manager=None): … … 525 534 self.active_plots[plot_id].replacePlot(plot_id, plot) 526 535 else: 536 # Don't plot intermediate results, e.g. P(Q), S(Q) 537 match = self.theory_plot_ID_pattern.match(plot_id) 538 # 2nd match group contains the identifier for the intermediate result, if present (e.g. "[P(Q)]") 539 if match and match.groups()[1] != None: 540 continue 527 541 # 'sophisticated' test to generate standalone plot for residuals 528 542 if 'esiduals' in plot.title: … … 1240 1254 #if current_tab_name in self.theory_model.item(current_index).text(): 1241 1255 if current_tab_name == self.theory_model.item(current_index).text(): 1242 return1243 1256 self.theory_model.removeRow(current_index) 1244 1257 break -
src/sas/qtgui/MainWindow/DataManager.py
r0261bc1 r4e255d1 24 24 import json 25 25 import time 26 from io import StringIO26 from io import BytesIO 27 27 import numpy as np 28 28 … … 368 368 # ndarray 369 369 if isinstance(o, np.ndarray): 370 buffer = StringIO()370 buffer = BytesIO() 371 371 np.save(buffer, o) 372 372 buffer.seek(0) … … 435 435 # ndarray 436 436 if cls == np.ndarray: 437 buffer = StringIO()437 buffer = BytesIO() 438 438 buffer.write(data['data'].encode('latin-1')) 439 439 buffer.seek(0) -
src/sas/qtgui/Perspectives/Fitting/FittingLogic.py
r87dfca4 rb4d05bd 132 132 self._data.ymax = ymax 133 133 134 def new1DPlot(self, return_data, tab_id): 135 """ 136 Create a new 1D data instance based on fitting results 137 """ 138 # Unpack return data from Calc1D 139 x, y, page_id, state, weight,\ 140 fid, toggle_mode_on, \ 141 elapsed, index, model,\ 142 data, update_chisqr, source = return_data 143 134 def _create1DPlot(self, tab_id, x, y, model, data, component=None): 135 """ 136 For internal use: create a new 1D data instance based on fitting results. 137 'component' is a string indicating the model component, e.g. "P(Q)" 138 """ 144 139 # Create the new plot 145 140 new_plot = Data1D(x=x, y=y) … … 150 145 151 146 new_plot.group_id = data.group_id 152 new_plot.id = str(tab_id) + " " + model.id 153 154 if data.filename: 155 new_plot.name = model.name + " [" + data.filename + "]" # data file 156 else: 157 new_plot.name = model.name + " [" + model.id + "]" # theory 147 new_plot.id = str(tab_id) + " " + ("[" + component + "] " if component else "") + model.id 148 149 # use data.filename for data, use model.id for theory 150 id_str = data.filename if data.filename else model.id 151 new_plot.name = model.name + ((" " + component) if component else "") + " [" + id_str + "]" 158 152 159 153 new_plot.title = new_plot.name … … 162 156 163 157 return new_plot 158 159 def new1DPlot(self, return_data, tab_id): 160 """ 161 Create a new 1D data instance based on fitting results 162 """ 163 # Unpack return data from Calc1D 164 x, y, page_id, state, weight,\ 165 fid, toggle_mode_on, \ 166 elapsed, index, model, \ 167 data, update_chisqr, source, \ 168 unsmeared_output, unsmeared_data, unsmeared_error, \ 169 pq_values, sq_values = return_data 170 171 return self._create1DPlot(tab_id, x, y, model, data) 164 172 165 173 def new2DPlot(self, return_data): … … 205 213 return new_plot 206 214 215 def new1DProductPlots(self, return_data, tab_id): 216 """ 217 If return_data contains separated P(Q) and/or S(Q) data, create 1D plots for each and return as the tuple 218 (pq_plot, sq_plot). If either are unavailable, the corresponding plot is None. 219 """ 220 # Unpack return data from Calc1D 221 x, y, page_id, state, weight, \ 222 fid, toggle_mode_on, \ 223 elapsed, index, model, \ 224 data, update_chisqr, source, \ 225 unsmeared_output, unsmeared_data, unsmeared_error, \ 226 pq_values, sq_values = return_data 227 228 pq_plot = None 229 sq_plot = None 230 231 if pq_values is not None: 232 pq_plot = self._create1DPlot(tab_id, x, pq_values, model, data, component="P(Q)") 233 if sq_values is not None: 234 sq_plot = self._create1DPlot(tab_id, x, sq_values, model, data, component="S(Q)") 235 236 return pq_plot, sq_plot 237 207 238 def computeDataRange(self): 208 239 """ -
src/sas/qtgui/Perspectives/Fitting/FittingWidget.py
r10fee37 recfe6b6 2113 2113 self.updateModelIndex(fitted_data) 2114 2114 else: 2115 name = self.nameForFittedData(self.kernel_module.id) 2115 if not fitted_data.name: 2116 name = self.nameForFittedData(self.kernel_module.id) 2117 else: 2118 name = fitted_data.name 2116 2119 fitted_data.title = name 2117 fitted_data.name = name2118 2120 fitted_data.filename = name 2119 2121 fitted_data.symbol = "Line" … … 2229 2231 self.model_data = fitted_data 2230 2232 2233 # Create plots for intermediate product data 2234 pq_data, sq_data = self.logic.new1DProductPlots(return_data, self.tab_id) 2235 if pq_data is not None: 2236 pq_data.symbol = "Line" 2237 self.createNewIndex(pq_data) 2238 if sq_data is not None: 2239 sq_data.symbol = "Line" 2240 self.createNewIndex(sq_data) 2241 2231 2242 def complete2D(self, return_data): 2232 2243 """ -
src/sas/qtgui/Perspectives/Fitting/ModelThread.py
rd4dac80 r3ae9179 222 222 s_model = self.model.s_model 223 223 p_model = self.model.p_model 224 elif hasattr(self.model, "get_composition_models"): 225 p_model, s_model = self.model.get_composition_models() 226 227 if p_model is not None and s_model is not None: 228 sq_values = numpy.zeros((len(self.data.x))) 229 pq_values = numpy.zeros((len(self.data.x))) 230 sq_values[index] = s_model.evalDistribution(self.data.x[index]) 231 pq_values[index] = p_model.evalDistribution(self.data.x[index]) 224 elif hasattr(self.model, "calc_composition_models"): 225 results = self.model.calc_composition_models(self.data.x[index]) 226 if results is not None: 227 pq_values, sq_values = results 228 229 if pq_values is None or sq_values is None: 230 if p_model is not None and s_model is not None: 231 sq_values = numpy.zeros((len(self.data.x))) 232 pq_values = numpy.zeros((len(self.data.x))) 233 sq_values[index] = s_model.evalDistribution(self.data.x[index]) 234 pq_values[index] = p_model.evalDistribution(self.data.x[index]) 232 235 233 236 elapsed = time.time() - self.starttime … … 243 246 self.data, 244 247 self.update_chisqr, 245 self.source) 248 self.source, 249 unsmeared_output, unsmeared_data, unsmeared_error, 250 pq_values, sq_values) 246 251 else: 247 252 self.complete(x=self.data.x[index], y=output[index], -
src/sas/qtgui/Perspectives/Fitting/UnitTesting/FittingLogicTest.py
r80468f6 re752ab8 100 100 data.id = "poop" 101 101 return_data = (data.x,data.y, 7, None, None, 102 0, True, 0.0, 1, data, 103 data, False, None) 102 0, True, 0.0, 1, data, 103 data, False, None, 104 None, None, None, 105 None, None) 104 106 105 107 new_plot = self.logic.new1DPlot(return_data=return_data, tab_id=0) -
src/sas/qtgui/Utilities/GuiUtils.py
r685e0e3 r3933ee9 312 312 return clone 313 313 314 315 def getMonospaceFont(): 316 """Convenience function; returns a monospace font to be used in any shells, code editors, etc.""" 317 318 # Note: Consolas is only available on Windows; the style hint is used on other operating systems 319 font = QtGui.QFont("Consolas", 10) 320 font.setStyleHint(QtGui.QFont.Monospace, QtGui.QFont.PreferQuality) 321 return font 314 322 315 323 def createModelItemWithPlot(update_data, name=""): -
src/sas/qtgui/Utilities/IPythonWidget.py
rfbfc488 r3933ee9 4 4 5 5 from PyQt5 import QtSvg 6 7 from sas.qtgui.Utilities import GuiUtils 6 8 7 9 def new_load_qt(api_options): … … 35 37 app = guisupport.get_app_qt4() 36 38 39 font = GuiUtils.getMonospaceFont() 40 self.font = font 41 37 42 # Create an in-process kernel 38 43 kernel_manager = QtInProcessKernelManager() -
src/sas/qtgui/Utilities/ModelEditor.py
r26970b3 r3933ee9 3 3 4 4 from sas.qtgui.Utilities.UI.ModelEditor import Ui_ModelEditor 5 from sas.qtgui.Utilities import GuiUtils 5 6 6 7 class ModelEditor(QtWidgets.QDialog, Ui_ModelEditor): … … 30 31 self.highlight = PythonHighlighter(self.txtEditor.document()) 31 32 33 self.txtEditor.setFont(GuiUtils.getMonospaceFont()) 34 32 35 def addSignals(self): 33 36 """ -
src/sas/qtgui/Utilities/PluginDefinition.py
r060413c r3933ee9 4 4 5 5 from sas.qtgui.Utilities.UI.PluginDefinitionUI import Ui_PluginDefinition 6 from sas.qtgui.Utilities import GuiUtils 6 7 7 8 # txtName … … 64 65 """ 65 66 self.txtFunction.insertPlainText(text) 67 self.txtFunction.setFont(GuiUtils.getMonospaceFont()) 66 68 67 69 # Validators
Note: See TracChangeset
for help on using the changeset viewer.