Changeset 9258c43c in sasview for src/sas/sasgui
- Timestamp:
- Jun 3, 2018 6:33:35 AM (6 years ago)
- Branches:
- master, magnetic_scatt, release-4.2.2, ticket-1009, ticket-1094-headless, ticket-1242-2d-resolution, ticket-1243, ticket-1249, unittest-saveload
- Children:
- 316b9c1
- Parents:
- de43192 (diff), 8b89396 (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. - git-author:
- Paul Butler <butlerpd@…> (06/03/18 06:33:35)
- git-committer:
- GitHub <noreply@…> (06/03/18 06:33:35)
- Location:
- src/sas/sasgui
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
src/sas/sasgui/perspectives/calculator/model_editor.py
rc6dfb9f r9258c43c 663 663 Do the layout for parameter related widgets 664 664 """ 665 param_txt = wx.StaticText(self, -1, 'Fit Parameters NOT requiring' + \ 666 ' polydispersity (if any): ') 667 668 param_tip = "#Set the parameters NOT requiring polydispersity " + \ 669 "and their initial values.\n" 665 param_txt = wx.StaticText(self, -1, 'Fit Parameters: ') 666 667 param_tip = "#Set the parameters and their initial values.\n" 670 668 param_tip += "#Example:\n" 671 669 param_tip += "A = 1\nB = 1" … … 681 679 (self.param_tcl, 1, wx.EXPAND | wx.ALL, 10)]) 682 680 683 # Parameters with polydispersity684 pd_param_txt = wx.StaticText(self, -1, 'Fit Parameters requiring ' + \685 'polydispersity (if any): ')686 687 pd_param_tip = "#Set the parameters requiring polydispersity and " + \688 "their initial values.\n"689 pd_param_tip += "#Example:\n"690 pd_param_tip += "C = 2\nD = 2"691 newid = wx.NewId()692 self.pd_param_tcl = EditWindow(self, newid, wx.DefaultPosition,693 wx.DefaultSize,694 wx.CLIP_CHILDREN | wx.SUNKEN_BORDER)695 self.pd_param_tcl.setDisplayLineNumbers(True)696 self.pd_param_tcl.SetToolTipString(pd_param_tip)697 698 self.param_sizer.AddMany([(pd_param_txt, 0, wx.LEFT, 10),699 (self.pd_param_tcl, 1, wx.EXPAND | wx.ALL, 10)])700 681 701 682 def _layout_function(self): … … 899 880 description = self.desc_tcl.GetValue() 900 881 param_str = self.param_tcl.GetText() 901 pd_param_str = self.pd_param_tcl.GetText()902 882 func_str = self.function_tcl.GetText() 903 883 # No input for the model function … … 905 885 if func_str.count('return') > 0: 906 886 self.write_file(self.fname, name, description, param_str, 907 pd_param_str,func_str)887 func_str) 908 888 try: 909 889 result, msg = check_model(self.fname), None … … 945 925 self.warning = msg 946 926 947 def write_file(self, fname, name, desc_str, param_str, pd_param_str,func_str):927 def write_file(self, fname, name, desc_str, param_str, func_str): 948 928 """ 949 929 Write content in file … … 952 932 :param desc_str: content of the description strings 953 933 :param param_str: content of params; Strings 954 :param pd_param_str: content of params requiring polydispersity; Strings955 934 :param func_str: content of func; Strings 956 935 """ … … 966 945 # Write out parameters 967 946 param_names = [] # to store parameter names 968 pd_params = []969 947 out_f.write('parameters = [ \n') 970 948 out_f.write('# ["name", "units", default, [lower, upper], "type", "description"],\n') … … 973 951 out_f.write(" ['%s', '', %s, [-inf, inf], '', '%s'],\n" 974 952 % (pname, pvalue, desc)) 975 for pname, pvalue, desc in self.get_param_helper(pd_param_str):976 param_names.append(pname)977 pd_params.append(pname)978 out_f.write(" ['%s', '', %s, [-inf, inf], 'volume', '%s'],\n"979 % (pname, pvalue, desc))980 953 out_f.write(' ]\n') 981 954 982 955 # Write out function definition 956 out_f.write('\n') 983 957 out_f.write('def Iq(%s):\n' % ', '.join(['x'] + param_names)) 984 958 out_f.write(' """Absolute scattering"""\n') … … 990 964 out_f.write(' import numpy as np') 991 965 for func_line in func_str.split('\n'): 992 out_f.write('%s%s\n' % ( spaces4, func_line))966 out_f.write('%s%s\n' % (' ', func_line)) 993 967 out_f.write('## uncomment the following if Iq works for vector x\n') 994 968 out_f.write('#Iq.vectorized = True\n') 995 996 # If polydisperse, create place holders for form_volume, ER and VR997 if pd_params:998 out_f.write('\n')999 out_f.write(CUSTOM_TEMPLATE_PD % {'args': ', '.join(pd_params)})1000 969 1001 970 # Create place holder for Iqxy … … 1128 1097 description = """%(description)s""" 1129 1098 1130 '''1131 1132 CUSTOM_TEMPLATE_PD = '''\1133 def form_volume(%(args)s):1134 """1135 Volume of the particles used to compute absolute scattering intensity1136 and to weight polydisperse parameter contributions.1137 """1138 return 0.01139 1140 def ER(%(args)s):1141 """1142 Effective radius of particles to be used when computing structure factors.1143 1144 Input parameters are vectors ranging over the mesh of polydispersity values.1145 """1146 return 0.01147 1148 def VR(%(args)s):1149 """1150 Volume ratio of particles to be used when computing structure factors.1151 1152 Input parameters are vectors ranging over the mesh of polydispersity values.1153 """1154 return 1.01155 1099 ''' 1156 1100 -
src/sas/sasgui/perspectives/fitting/media/fitting_help.rst
r47ace50 r9258c43c 180 180 *checked*\ . 181 181 182 Also note that the 'Fit Parameters' have been split into two sections: those183 which can be polydisperse (shape and orientation parameters) and those which are184 not (eg, scattering length densities).185 186 182 A model file generated by this option can be viewed and further modified using 187 183 the :ref:`Advanced_Plugin_Editor` . 188 184 189 **SasView version 4.2** made it possible to specify whether a plugin created with 190 the *New Plugin Model* dialog is actually a form factor P(Q) or a structure factor 191 S(Q). To do this, simply add one or other of the following lines under the *import* 192 statements. 185 Note that the New Plugin Model Feature currently does not allow for parameters 186 to be polydisperse. However they can be edited in the Advanced Editor. 187 188 189 **SasView version 4.2** made it possible to specify whether a plugin created 190 with the *New Plugin Model* dialog is actually a form factor P(Q) or a structure 191 factor S(Q). To do this, simply add one or other of the following lines under 192 the *import* statements. 193 193 194 194 For a form factor:: … … 200 200 structure_factor = True 201 201 202 If the plugin is a structure factor it is *also* necessary to add two variables to203 t he parameter list::202 If the plugin is a structure factor it is *also* necessary to add two variables 203 to the parameter list:: 204 204 205 205 parameters = [ -
src/sas/sasgui/guiframe/local_perspectives/data_loader/data_loader.py
r20fa5fe r2924532 185 185 try: 186 186 message = "Loading {}...\n".format(p_file) 187 self.load_update( output=output,message=message, info="info")187 self.load_update(message=message, info="info") 188 188 temp = self.loader.load(p_file, format) 189 189 if not isinstance(temp, list): … … 201 201 else: 202 202 file_errors[basename] = [error_message] 203 self.load_update(output=output, 204 message=error_message, info="warning") 205 206 self.load_update(output=output, 207 message="Loaded {}\n".format(p_file), 208 info="info") 203 204 self.load_update(message="Loaded {}\n".format(p_file), 205 info="info") 209 206 210 207 except NoKnownLoaderException as e: 211 208 exception_occurred = True 212 logger.error(e.message)213 214 209 error_message = "Loading data failed!\n" + e.message 215 self.load_update(output=None, message=e.message, info="warning") 210 self.load_complete(output=None, 211 message=error_message, 212 info="warning") 216 213 217 214 except Exception as e: 218 215 exception_occurred = True 219 logger.error(e.message)220 221 216 file_err = "The Data file you selected could not be " 222 217 file_err += "loaded.\nMake sure the content of your file" … … 225 220 file_err += " following:\n" 226 221 file_err += e.message 227 file_errors[basename] = [file_err] 222 self.load_complete(output=None, 223 message=file_err, 224 info="error") 228 225 229 226 if len(file_errors) > 0: 230 227 error_message = "" 231 228 for filename, error_array in file_errors.iteritems(): 232 error_message += "The following errors occured whilst "229 error_message += "The following issues were found whilst " 233 230 error_message += "loading {}:\n".format(filename) 234 231 for message in error_array: 235 232 error_message += message + "\n" 236 error_message += "\n" 237 if not exception_occurred: # Some data loaded but with errors 238 self.load_update(output=output, message=error_message, info="error") 239 240 if not exception_occurred: # Everything loaded as expected 233 error_message = error_message[:-1] 234 self.load_complete(output=output, 235 message=error_message, 236 info="error") 237 238 elif not exception_occurred: # Everything loaded as expected 241 239 self.load_complete(output=output, message="Loading data complete!", 242 240 info="info") … … 244 242 self.load_complete(output=None, message=error_message, info="error") 245 243 246 247 def load_update(self, output=None, message="", info="warning"): 244 def load_update(self, message="", info="warning"): 248 245 """ 249 246 print update on the status bar 250 247 """ 251 248 if message != "": 252 wx.PostEvent(self.parent, StatusEvent(status=message, info=info, 249 wx.PostEvent(self.parent, StatusEvent(status=message, 250 info=info, 253 251 type="progress")) 254 252 … … 257 255 post message to status bar and return list of data 258 256 """ 259 wx.PostEvent(self.parent, StatusEvent(status=message, info=info, 257 wx.PostEvent(self.parent, StatusEvent(status=message, 258 info=info, 260 259 type="stop")) 261 260 if output is not None: -
src/sas/sasgui/guiframe/report_dialog.py
r69a6897 r91552b5 27 27 class BaseReportDialog(wx.Dialog): 28 28 29 def __init__(self, report_list, *args, **kwds):29 def __init__(self, report_list, imgRAM, fig_urls, *args, **kwds): 30 30 """ 31 31 Initialization. The parameters added to Dialog are: … … 37 37 kwds["image"] = 'Dynamic Image' 38 38 39 #MemoryFSHandle for storing images 40 self.imgRAM = imgRAM 41 #Images location in urls 42 self.fig_urls = fig_urls 39 43 # title 40 44 self.SetTitle("Report") … … 75 79 hbox.Add(button_print) 76 80 77 button_save = wx.Button(self, wx.NewId(), "Save") 78 button_save.SetToolTipString("Save this report.") 79 button_save.Bind(wx.EVT_BUTTON, self.onSave, id=button_save.GetId()) 80 hbox.Add(button_save) 81 if sys.platform != "darwin": 82 button_save = wx.Button(self, wx.NewId(), "Save") 83 button_save.SetToolTipString("Save this report.") 84 button_save.Bind(wx.EVT_BUTTON, self.onSave, id=button_save.GetId()) 85 hbox.Add(button_save) 81 86 82 87 # panel for report page … … 111 116 printh.PrintText(self.report_html) 112 117 118 113 119 def OnClose(self, event=None): 114 120 """ … … 116 122 : event: Close button event 117 123 """ 124 for fig in self.fig_urls: 125 self.imgRAM.RemoveFile(fig) 126 118 127 self.Close() 119 128 -
src/sas/sasgui/perspectives/calculator/resolution_calculator_panel.py
r7432acb r1cf490b6 18 18 matplotlib.use('WXAgg') 19 19 from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigureCanvas 20 from matplotlib.backends.backend_wxagg import NavigationToolbar2Wx as Toolbar20 from matplotlib.backends.backend_wxagg import NavigationToolbar2WxAgg as Toolbar 21 21 from matplotlib.backend_bases import FigureManagerBase 22 22 # Wx-Pylab magic for displaying plots within an application's window. -
src/sas/sasgui/perspectives/fitting/basepage.py
r1f4d708 rc192960 641 641 # get the strings for report 642 642 report_str, text_str = self.state.report(fig_urls=refs) 643 644 643 # Show the dialog 645 644 report_list = [report_str, text_str, images] 646 dialog = ReportDialog(report_list, None, wx.ID_ANY, "")645 dialog = ReportDialog(report_list, imgRAM, refs, None, wx.ID_ANY, "") 647 646 dialog.Show() 648 647 … … 677 676 refs.append('memory:' + name) 678 677 imgRAM.AddFile(name, canvas.bitmap, wx.BITMAP_TYPE_PNG) 679 680 678 # append figs 681 679 images.append(fig) … … 1472 1470 # we need to check here ourselves. 1473 1471 if not is_modified: 1474 is_modified = (self._check_value_enter(self.fittable_param) 1475 or self._check_value_enter(self.fixed_param) 1476 or self._check_value_enter(self.parameters)) 1472 is_modified = self._check_value_enter(self.fittable_param) 1473 is_modified = self._check_value_enter( 1474 self.fixed_param) or is_modified 1475 is_modified = self._check_value_enter( 1476 self.parameters) or is_modified 1477 1477 1478 1478 # Here we should check whether the boundaries have been modified. … … 1536 1536 data=[self.data]) 1537 1537 # Check the values 1538 is_modified = (self._check_value_enter(self.fittable_param)1539 or self._check_value_enter(self.fixed_param)1540 or self._check_value_enter(self.parameters))1538 is_modified = self._check_value_enter(self.fittable_param) 1539 is_modified = self._check_value_enter(self.fixed_param) or is_modified 1540 is_modified = self._check_value_enter(self.parameters) or is_modified 1541 1541 1542 1542 # If qmin and qmax have been modified, update qmin and qmax and … … 2324 2324 2325 2325 # Update value in model if it has changed 2326 if value != self.model.getParam(name): 2326 if (value != self.model.getParam(name) or 2327 (np.isnan(value) and np.isnan(self.model.getParam(name)))): 2327 2328 self.model.setParam(name, value) 2328 2329 is_modified = True -
src/sas/sasgui/perspectives/fitting/fitpage.py
rbfeb823 ra7c6f38 365 365 # StaticText for chi2, N(for fitting), Npts + Log/linear spacing 366 366 self.tcChi = BGTextCtrl(self, wx.ID_ANY, "-", size=(75, 20), style=0) 367 self.tcChi.SetToolTipString("Chi2/ Npts(Fit)")367 self.tcChi.SetToolTipString("Chi2/DOF (DOF=Npts-Npar fitted)") 368 368 self.Npts_fit = BGTextCtrl(self, wx.ID_ANY, "-", size=(75, 20), style=0) 369 369 self.Npts_fit.SetToolTipString( … … 391 391 self.points_sizer.Add(self.pointsbox) 392 392 393 box_description_1 = wx.StaticText(self, wx.ID_ANY, ' Chi2/Npts')393 box_description_1 = wx.StaticText(self, wx.ID_ANY, 'Reduced Chi2') 394 394 box_description_2 = wx.StaticText(self, wx.ID_ANY, 'Npts(Fit)') 395 395 -
src/sas/sasgui/perspectives/fitting/media/residuals_help.rst
r99ded31 r84ac3f1 27 27 28 28 $\chi^2$ is a statistical parameter that quantifies the differences between 29 an observed data set and an expected dataset (or 'theory'). 30 31 When showing the a model with the data, *SasView* displays this parameter 32 normalized to the number of data points, $N_\mathrm{pts}$ such that 29 an observed data set and an expected dataset (or 'theory') calculated as 33 30 34 31 .. math:: 35 32 36 \chi^2 _N37 = \sum[(Y_i - \mathrm{theory}_i)^2 / \mathrm{error}_i^2] / N_\mathrm{pts}33 \chi^2 34 = \sum[(Y_i - \mathrm{theory}_i)^2 / \mathrm{error}_i^2] 38 35 39 When performing a fit, *SasView* instead displays the reduced $\chi^2_R$, 40 which takes into account the number of fitting parameters $N_\mathrm{par}$ 41 (to calculate the number of 'degrees of freedom'). This is computed as 36 Fitting typically minimizes the value of $\chi^2$. For assessing the quality of 37 the model and its "fit" however, *SasView* displays the traditional reduced 38 $\chi^2_R$ which normalizes this parameter by dividing it by the number of 39 degrees of freedom (or DOF). The DOF is the number of data points being 40 considered, $N_\mathrm{pts}$, reduced by the number of free (i.e. fitted) 41 parameters, $N_\mathrm{par}$. Note that model parameters that are kept fixed do 42 *not* contribute to the DOF (they are not "free"). This reduced value is then 43 given as 42 44 43 45 .. math:: … … 47 49 / [N_\mathrm{pts} - N_\mathrm{par}] 48 50 49 The normalized $\chi^2_N$ and the reduced $\chi^2_R$ are very close to each 50 other when $N_\mathrm{pts} \gg N_\mathrm{par}$. 51 Note that this means the displayed value will vary depending on the number of 52 parameters used in the fit. In particular, when doing a calculation without a 53 fit (e.g. manually changing a parameter) the DOF will now equal $N_\mathrm{pts}$ 54 and the $\chi^2_R$ will be the smallest possible for that combination of model, 55 data set, and set of parameter values. 56 57 When $N_\mathrm{pts} \gg N_\mathrm{par}$ as it should for proper fitting, the 58 value of the reduced $\chi^2_R$ will not change very much. 51 59 52 60 For a good fit, $\chi^2_R$ tends to 1. … … 90 98 | 2015-06-08 Steve King 91 99 | 2017-09-28 Paul Kienzle 100 | 2018-03-04 Paul Butler
Note: See TracChangeset
for help on using the changeset viewer.