- Timestamp:
- Oct 11, 2016 11:09:47 AM (8 years ago)
- Branches:
- master, ESS_GUI, ESS_GUI_Docs, ESS_GUI_batch_fitting, ESS_GUI_bumps_abstraction, ESS_GUI_iss1116, ESS_GUI_iss879, ESS_GUI_iss959, ESS_GUI_opencl, ESS_GUI_ordering, ESS_GUI_sync_sascalc, costrafo411, magnetic_scatt, release-4.1.1, release-4.1.2, release-4.2.2, ticket-1009, ticket-1094-headless, ticket-1242-2d-resolution, ticket-1243, ticket-1249, ticket885, unittest-saveload
- Children:
- 4581ac9, 7949dcf7
- Parents:
- 392056d (diff), 46dfee9 (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:
-
- 10 added
- 1 deleted
- 24 edited
- 1 moved
Legend:
- Unmodified
- Added
- Removed
-
src/sas/sascalc/fit/MultiplicationModel.py
rcb4ef58 r68669da 8 8 r""" 9 9 Use for P(Q)\*S(Q); function call must be in the order of P(Q) and then S(Q): 10 The model parameters are combined from both models, P(Q) and S(Q), except 1) ' effect_radius' of S(Q)11 which will be calculated from P(Q) via calculate_ER(), 12 and 2) 'scale' in P model which is synchronized w/ volfraction in S 10 The model parameters are combined from both models, P(Q) and S(Q), except 1) 'radius_effective' of S(Q) 11 which will be calculated from P(Q) via calculate_ER(), 12 and 2) 'scale' in P model which is synchronized w/ volfraction in S 13 13 then P*S is multiplied by a new parameter, 'scale_factor'. 14 14 The polydispersion is applicable only to P(Q), not to S(Q). … … 34 34 ## Parameter details [units, min, max] 35 35 self.details = {} 36 37 ##models 36 37 ## Define parameters to exclude from multiplication model 38 self.excluded_params={'radius_effective','scale','background'} 39 40 ##models 38 41 self.p_model = p_model 39 self.s_model = s_model 42 self.s_model = s_model 40 43 self.magnetic_params = [] 41 44 ## dispersion … … 45 48 ## New parameter:Scaling factor 46 49 self.params['scale_factor'] = 1 47 50 self.params['background'] = 0 51 48 52 ## Parameter details [units, min, max] 49 53 self._set_details() 50 54 self.details['scale_factor'] = ['', 0.0, numpy.inf] 51 55 self.details['background'] = ['',-numpy.inf,numpy.inf] 56 52 57 #list of parameter that can be fitted 53 self._set_fixed_params() 58 self._set_fixed_params() 54 59 ## parameters with orientation 55 60 for item in self.p_model.orientation_params: 56 61 self.orientation_params.append(item) 57 for item in self.p_model.magnetic_params: 58 self.magnetic_params.append(item) 62 for item in self.p_model.magnetic_params: 63 self.magnetic_params.append(item) 59 64 for item in self.s_model.orientation_params: 60 65 if not item in self.orientation_params: … … 66 71 multiplicity = 1 67 72 ## functional multiplicity of the model 68 self.multiplicity = multiplicity 69 73 self.multiplicity = multiplicity 74 70 75 # non-fittable parameters 71 self.non_fittable = p_model.non_fittable 72 self.multiplicity_info = [] 76 self.non_fittable = p_model.non_fittable 77 self.multiplicity_info = [] 73 78 self.fun_list = {} 74 79 if self.non_fittable > 1: 75 80 try: 76 self.multiplicity_info = p_model.multiplicity_info 81 self.multiplicity_info = p_model.multiplicity_info 77 82 self.fun_list = p_model.fun_list 78 83 self.is_multiplicity_model = True … … 82 87 self.is_multiplicity_model = False 83 88 self.multiplicity_info = [0] 84 89 85 90 def _clone(self, obj): 86 91 """ … … 96 101 #obj = copy.deepcopy(self) 97 102 return obj 98 99 103 104 100 105 def _set_dispersion(self): 101 106 """ … … 103 108 applied to s_model 104 109 """ 105 ##set dispersion only from p_model 110 ##set dispersion only from p_model 106 111 for name , value in self.p_model.dispersion.iteritems(): 107 self.dispersion[name] = value 108 112 self.dispersion[name] = value 113 109 114 def getProfile(self): 110 115 """ 111 116 Get SLD profile of p_model if exists 112 117 113 118 :return: (r, beta) where r is a list of radius of the transition points\ 114 119 beta is a list of the corresponding SLD values … … 121 126 x = None 122 127 y = None 123 128 124 129 return x, y 125 130 126 131 def _set_params(self): 127 132 """ 128 133 Concatenate the parameters of the two models to create 129 these model parameters 134 these model parameters 130 135 """ 131 136 132 137 for name , value in self.p_model.params.iteritems(): 133 if not name in self.params.keys() and name != 'scale':138 if not name in self.params.keys() and name not in self.excluded_params: 134 139 self.params[name] = value 135 140 136 141 for name , value in self.s_model.params.iteritems(): 137 #Remove the effect_radiusfrom the (P*S) model parameters.138 if not name in self.params.keys() and name != 'effect_radius':142 #Remove the radius_effective from the (P*S) model parameters. 143 if not name in self.params.keys() and name not in self.excluded_params: 139 144 self.params[name] = value 140 145 141 146 # Set "scale and effec_radius to P and S model as initializing 142 147 # since run P*S comes from P and S separately. 148 self._set_backgrounds() 143 149 self._set_scale_factor() 144 self._set_ effect_radius()145 150 self._set_radius_effective() 151 146 152 def _set_details(self): 147 153 """ 148 154 Concatenate details of the two models to create 149 this model's details 155 this model's details 150 156 """ 151 157 for name, detail in self.p_model.details.iteritems(): 152 if name != 'scale':158 if name not in self.excluded_params: 153 159 self.details[name] = detail 154 160 155 161 for name , detail in self.s_model.details.iteritems(): 156 if not name in self.details.keys() or name != 'effect_radius':162 if not name in self.details.keys() or name not in self.exluded_params: 157 163 self.details[name] = detail 158 164 165 def _set_backgrounds(self): 166 """ 167 Set component backgrounds to zero 168 """ 169 if 'background' in self.p_model.params: 170 self.p_model.setParam('background',0) 171 if 'background' in self.s_model.params: 172 self.s_model.setParam('background',0) 173 174 159 175 def _set_scale_factor(self): 160 176 """ … … 162 178 """ 163 179 value = self.params['volfraction'] 164 if value != None: 180 if value != None: 165 181 factor = self.p_model.calculate_VR() 166 182 if factor == None or factor == NotImplemented or factor == 0.0: … … 170 186 self.p_model.setParam('scale', value) 171 187 self.s_model.setParam('volfraction', val) 172 173 def _set_ effect_radius(self):188 189 def _set_radius_effective(self): 174 190 """ 175 191 Set effective radius to S(Q) model 176 192 """ 177 if not ' effect_radius' in self.s_model.params.keys():193 if not 'radius_effective' in self.s_model.params.keys(): 178 194 return 179 195 effective_radius = self.p_model.calculate_ER() 180 196 #Reset the effective_radius of s_model just before the run 181 197 if effective_radius != None and effective_radius != NotImplemented: 182 self.s_model.setParam(' effect_radius', effective_radius)183 198 self.s_model.setParam('radius_effective', effective_radius) 199 184 200 def setParam(self, name, value): 185 """ 201 """ 186 202 Set the value of a model parameter 187 203 188 204 :param name: name of the parameter 189 205 :param value: value of the parameter … … 191 207 # set param to P*S model 192 208 self._setParamHelper( name, value) 193 194 ## setParam to p model 195 # set 'scale' in P(Q) equal to volfraction 209 210 ## setParam to p model 211 # set 'scale' in P(Q) equal to volfraction 196 212 if name == 'volfraction': 197 213 self._set_scale_factor() 198 elif name in self.p_model.getParamList() :214 elif name in self.p_model.getParamList() and name not in self.excluded_params: 199 215 self.p_model.setParam( name, value) 200 201 ## setParam to s model 202 # This is a little bit abundant: Todo: find better way 203 self._set_ effect_radius()204 if name in self.s_model.getParamList() :216 217 ## setParam to s model 218 # This is a little bit abundant: Todo: find better way 219 self._set_radius_effective() 220 if name in self.s_model.getParamList() and name not in self.excluded_params: 205 221 if name != 'volfraction': 206 222 self.s_model.setParam( name, value) 207 223 208 224 209 225 #self._setParamHelper( name, value) 210 226 211 227 def _setParamHelper(self, name, value): 212 228 """ … … 228 244 self.params[item] = value 229 245 return 230 246 231 247 raise ValueError, "Model does not contain parameter %s" % name 232 233 248 249 234 250 def _set_fixed_params(self): 235 251 """ … … 240 256 241 257 self.fixed.sort() 242 243 258 259 244 260 def run(self, x = 0.0): 245 """ 261 """ 246 262 Evaluate the model 247 263 248 264 :param x: input q-value (float or [float, float] as [r, theta]) 249 265 :return: (scattering function value) 250 266 """ 251 267 # set effective radius and scaling factor before run 252 self._set_ effect_radius()268 self._set_radius_effective() 253 269 self._set_scale_factor() 254 270 return self.params['scale_factor'] * self.p_model.run(x) * \ 255 self.s_model.run(x) 271 self.s_model.run(x) + self.params['background'] 256 272 257 273 def runXY(self, x = 0.0): 258 """ 274 """ 259 275 Evaluate the model 260 276 261 277 :param x: input q-value (float or [float, float] as [qx, qy]) 262 278 :return: scattering function value 263 """ 279 """ 264 280 # set effective radius and scaling factor before run 265 self._set_ effect_radius()281 self._set_radius_effective() 266 282 self._set_scale_factor() 267 283 out = self.params['scale_factor'] * self.p_model.runXY(x) * \ 268 self.s_model.runXY(x) 284 self.s_model.runXY(x) + self.params['background'] 269 285 return out 270 271 ## Now (May27,10) directly uses the model eval function 286 287 ## Now (May27,10) directly uses the model eval function 272 288 ## instead of the for-loop in Base Component. 273 289 def evalDistribution(self, x = []): 274 """ 290 """ 275 291 Evaluate the model in cartesian coordinates 276 292 277 293 :param x: input q[], or [qx[], qy[]] 278 294 :return: scattering function P(q[]) 279 295 """ 280 296 # set effective radius and scaling factor before run 281 self._set_ effect_radius()297 self._set_radius_effective() 282 298 self._set_scale_factor() 283 299 out = self.params['scale_factor'] * self.p_model.evalDistribution(x) * \ 284 self.s_model.evalDistribution(x) 300 self.s_model.evalDistribution(x) + self.params['background'] 285 301 return out 286 302 … … 288 304 """ 289 305 Set the dispersion object for a model parameter 290 306 291 307 :param parameter: name of the parameter [string] 292 308 :dispersion: dispersion object of type DispersionModel … … 299 315 return value 300 316 except: 301 raise 317 raise 302 318 303 319 def fill_description(self, p_model, s_model): … … 306 322 """ 307 323 description = "" 308 description += "Note:1) The effect_radius(effective radius) of %s \n"%\324 description += "Note:1) The radius_effective (effective radius) of %s \n"%\ 309 325 (s_model.name) 310 326 description += " is automatically calculated " … … 318 334 description += " for details of individual models." 319 335 self.description += description 320 -
src/sas/sasgui/guiframe/aboutbox.py
re0f28e6 r49e000b 117 117 self.bitmap_button_ill = wx.BitmapButton(self, -1, wx.NullBitmap) 118 118 self.bitmap_button_ansto = wx.BitmapButton(self, -1, wx.NullBitmap) 119 self.bitmap_button_tudelft = wx.BitmapButton(self, -1, wx.NullBitmap) 119 120 120 121 self.static_line_3 = wx.StaticLine(self, -1) … … 135 136 self.Bind(wx.EVT_BUTTON, self.onIllLogo, self.bitmap_button_ill) 136 137 self.Bind(wx.EVT_BUTTON, self.onAnstoLogo, self.bitmap_button_ansto) 138 self.Bind(wx.EVT_BUTTON, self.onTudelftLogo, self.bitmap_button_tudelft) 137 139 # end wxGlade 138 140 # fill in acknowledgements … … 221 223 logo = wx.Bitmap(image) 222 224 self.bitmap_button_ansto.SetBitmapLabel(logo) 225 226 image = file_dir + "/images/tudelft_logo.png" 227 if os.path.isfile(config._tudelft_logo): 228 image = config._tudelft_logo 229 logo = wx.Bitmap(image) 230 self.bitmap_button_tudelft.SetBitmapLabel(logo) 223 231 224 232 # resize dialog window to fit version number nicely … … 251 259 self.bitmap_button_ill.SetSize(self.bitmap_button_ill.GetBestSize()) 252 260 self.bitmap_button_ansto.SetSize(self.bitmap_button_ansto.GetBestSize()) 261 self.bitmap_button_tudelft.SetSize(self.bitmap_button_tudelft.GetBestSize()) 253 262 # end wxGlade 254 263 … … 314 323 sizer_logos.Add(self.bitmap_button_ansto, 0, 315 324 wx.LEFT|wx.ADJUST_MINSIZE, 2) 325 sizer_logos.Add(self.bitmap_button_tudelft, 0, 326 wx.LEFT|wx.ADJUST_MINSIZE, 2) 316 327 317 328 sizer_logos.Add((10, 50), 0, wx.ADJUST_MINSIZE, 0) … … 405 416 event.Skip() 406 417 418 def onTudelftLogo(self, event): 419 """ 420 """ 421 # wxGlade: DialogAbout.<event_handler> 422 launchBrowser(config._tudelft_url) 423 event.Skip() 424 407 425 # end of class DialogAbout 408 426 -
src/sas/sasgui/perspectives/calculator/gen_scatter_panel.py
rd0248bd r0f7c930 181 181 self.hint_sizer = wx.BoxSizer(wx.HORIZONTAL) 182 182 self.qrange_sizer = wx.BoxSizer(wx.HORIZONTAL) 183 self.button_sizer = wx.BoxSizer(wx.HORIZONTAL) 183 self.button_sizer = wx.BoxSizer(wx.VERTICAL) 184 self.button_sizer1 = wx.BoxSizer(wx.HORIZONTAL) 185 self.button_sizer2 = wx.BoxSizer(wx.HORIZONTAL) 184 186 185 187 def _layout_data_name(self): … … 392 394 self.bt_close.SetToolTipString("Close this window") 393 395 394 self.button_sizer .AddMany([(self.time_text, 0, wx.LEFT, 20),395 (self.orient_combo , 0, wx.LEFT, 20) ,396 (self.bt_compute, 0, wx.LEFT, 20),396 self.button_sizer1.AddMany([(self.bt_compute, 0, wx.LEFT, 20), 397 (self.orient_combo , 0, wx.LEFT, 20)]) 398 self.button_sizer2.AddMany([(self.time_text , 0, wx.LEFT, 20), 397 399 (self.bt_help, 0, wx.LEFT, 20), 398 (self.bt_close, 0, wx.LEFT, 5)]) 400 (self.bt_close, 0, wx.LEFT, 20)]) 401 self.button_sizer.AddMany([(self.button_sizer1 , 0, wx.BOTTOM|wx.LEFT, 10), 402 (self.button_sizer2 , 0, wx.LEFT, 10)]) 399 403 400 404 def estimate_ctime(self): … … 600 604 raise 601 605 self.orient_combo.Show(is_pdbdata) 602 self.button_sizer.Layout() 606 #self.button_sizer.Layout() 607 self.FitInside() 603 608 self._set_sld_data_helper(True) 604 609 except: -
src/sas/sasgui/perspectives/calculator/media/python_shell_help.rst
rd85c194 rafb93df 3 3 .. This is a port of the original SasView html help file to ReSTructured text 4 4 .. by S King, ISIS, during SasView CodeCamp-III in Feb 2015. 5 .. Text revised during Code Camp V in Oct 2016. 5 6 6 Python Shell Tool 7 ================= 7 .. _Python_shell: 8 9 Python Shell-Editor Tool 10 ======================== 8 11 9 12 Description 10 13 ----------- 11 14 12 This is a Python shell/editor (PyCrust) provided with WxPython. An editing 13 notebook will show up when a Python file is created/loaded with the *New* or 14 *Open* options on the menu. 15 This is a Python shell/editor provided with WxPython. 15 16 16 *Run* enables the editor to compile and run the Python code. 17 For the help about Python, visit the website http://docs.python.org/tutorial/ 17 18 18 For the details about the Python, visit the website http://docs.python.org/tutorial/ 19 .. note:: This shell/editor has its own help, but the Help() and Credits() calls do not work on Macs. 19 20 20 The NumPy, SciPy, and Matplotlib, etc, libraries are shipped with SasView. 21 However, some functionality may not work. 21 The NumPy, SciPy, and Matplotlib, etc, libraries are shipped with SasView and so functions from these can be imported into the shell/editor, however, some functionality may not work. 22 22 23 PyCrust has its own Help. 23 .. image:: new_pycrust_example.png 24 :align: center 24 25 25 *NOTE! The Help() and Credits() calls do not work on Macs.* 26 When a Python file, for example a fitting model, is created or loaded with the *New* or *Open* options from the menu, a new tab opens with an editing notebook. 26 27 27 .. ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ 28 .. image:: new_pycrust_example_2.png 29 :align: center 28 30 29 Example 30 ------- 31 If a Python (.py) model has a linked C (.c) subroutine *in the same folder* then the shell/editor will open both! However input focus is usually transferred to the tab with the .c file. 31 32 32 An example calling the Matplotlib plotting gallery: 33 34 .. image:: pycrust_example.png 33 To compile a model, select *Run* > *Check Model* from the shell/editor menu. If the model contains a unit test (which it should!!!) then this will also run and a popup window will report the success/failure of the test. 35 34 36 35 .. ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ 37 36 38 .. note:: This help document was last changed by Steve King, 1 9Feb201537 .. note:: This help document was last changed by Steve King, 10Oct2015 -
src/sas/sasgui/perspectives/calculator/model_editor.py
r9501661 rec72ceb 70 70 71 71 This Dialog pops up for the user when they press 'Sum|Multi(p1,p2)' under 72 ' Edit Custom Model' under 'Fitting' menu. This is currently called as72 'Plugin Model Operations' under 'Fitting' menu. This is currently called as 73 73 a Modal Dialog. 74 74 -
src/sas/sasgui/perspectives/calculator/pyconsole.py
r0912b405 rd472e86 103 103 window_name = "Custom Model Editor" 104 104 ## Name to appear on the window title bar 105 window_caption = " CustomModel Editor"105 window_caption = "Plugin Model Editor" 106 106 ## Flag to tell the AUI manager to put this panel in the center pane 107 107 CENTER_PANE = False … … 110 110 size=(PANEL_WIDTH, PANEL_HEIGHT)): 111 111 self.config = None 112 112 113 editor.EditorNotebookFrame.__init__(self, parent=parent, 113 title=title, size=size, 114 filename=filename) 114 title=title, size=size) 115 115 self.parent = parent 116 116 self._manager = manager … … 126 126 self.dataDir = dataDir 127 127 self.Centre() 128 129 # See if there is a corresponding C file 130 if filename != None: 131 c_filename = os.path.splitext(filename)[0] + ".c" 132 if os.path.isfile(c_filename): 133 self.bufferCreate(c_filename) 134 135 # If not, just open the requested .py, if any. 136 # Needs to be after the C file so the tab focus is correct. 137 if os.path.isfile(filename): 138 self.bufferCreate(filename) 128 139 129 140 self.Bind(wx.EVT_MENU, self.OnNewFile, id=wx.ID_NEW) -
src/sas/sasgui/perspectives/corfunc/media/corfunc_help.rst
rda456fb r1404cce 10 10 11 11 This performs a correlation function analysis of one-dimensional 12 SANS data, or generates a model-independent volume fraction profile from a 13 one-dimensional SANS pattern of an adsorbed layer. 14 15 The correlation function analysis is performed in 3 stages: 12 SAXS/SANS data, or generates a model-independent volume fraction 13 profile from the SANS from an adsorbed polymer/surfactant layer. 14 15 A correlation function may be interpreted in terms of an imaginary rod moving 16 through the structure of the material. Î\ :sub:`1D`\ (R) is the probability that 17 a rod of length R moving through the material has equal electron/neutron scattering 18 length density at either end. Hence a frequently occurring spacing within a structure 19 manifests itself as a peak. 20 21 A volume fraction profile :math:`\Phi`\ (z) describes how the density of polymer segments/surfactant molecules varies with distance from an (assumed locally flat) interface. 22 23 Both functions are returned in *real space*. 24 25 The analysis is performed in 3 stages: 16 26 17 27 * Extrapolation of the scattering curve to :math:`Q = 0` and 18 28 :math:`Q = \infty` 19 * Fourier/Hilbert Transform of the extrapolated data to give the correlation 20 function/volume fraction profile 21 * Interpretation of the 1D correlation function based on an ideal lamellar 22 morphology 29 * Smoothed merging of the two extrapolations into the original data 30 * Fourier / Hilbert Transform of the smoothed data to give the correlation 31 function / volume fraction profile, respectively 32 * (Optional) Interpretation of the 1D correlation function based on an ideal 33 lamellar morphology 23 34 24 35 .. ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ … … 28 39 29 40 To :math:`Q = 0` 30 ^^^^^^^^^^^^^^^^ 41 ................ 31 42 32 43 The data are extrapolated to Q = 0 by fitting a Guinier model to the data 33 points in the lower Q range. 44 points in the low-Q range. 45 34 46 The equation used is: 35 47 36 48 .. math:: 37 I(Q) = e^{A+Bq^2}49 I(Q) = Ae^{Bq^2} 38 50 39 51 The Guinier model assumes that the small angle scattering arises from particles … … 41 53 particles. This has dubious applicability to polymer systems. However, the 42 54 correlation function is affected by the Guinier back-extrapolation to the 43 greatest extent at large values of R and so the back-extrapolationonly has a44 small effect on the analysis.55 greatest extent at large values of R and so only has a 56 small effect on the final analysis. 45 57 46 58 To :math:`Q = \infty` 47 ^^^^^^^^^^^^^^^^^^^^^ 59 ..................... 48 60 49 61 The data are extrapolated to Q = :math:`\infty` by fitting a Porod model to 50 the data points in the upperQ range.62 the data points in the high-Q range. 51 63 52 64 The equation used is: 53 65 54 66 .. math:: 55 I(Q) = Bg + KQ^{-4}e^{-Q^2\sigma^2} 56 57 Where :math:`Bg` is the Bonart thermal background, :math:`K` is the Porod 58 constant, and :math:`\sigma > 0` describes the electron (or neutron scattering 59 length) density profile at the interface between crystalline and amorphous 60 regions (see figure 1). 67 I(Q) = K Q^{-4}e^{-Q^2\sigma^2} + Bg 68 69 Where :math:`Bg` is the background, :math:`K` is the Porod 70 constant, and :math:`\sigma` (which must be > 0) describes the width of the electron or neutron scattering length density profile at the interface between the crystalline and amorphous 71 regions as shown below. 61 72 62 73 .. figure:: fig1.gif 63 74 :align: center 64 75 65 **Figure 1** The value of :math:`\sigma` is a measure of the electron 66 density profile at the interface between crystalline and amorphous regions. 67 76 68 77 Smoothing 69 ^^^^^^^^^ 70 71 The extrapolated data set consists of the Guinier back-extrapolation up to the 72 highest Q value of the lower Q range, the original scattering data up to the 73 highest value in the upper Q range, and the Porod tail-fit beyond this. The 74 joins between the original data and the Guinier/Porod fits are smoothed using 75 the algorithm below, to avoid the formation of ripples in the transformed data. 78 --------- 79 80 The extrapolated data set consists of the Guinier back-extrapolation from Q~0 81 up to the lowest Q value in the original data, then the original scattering data, and the Porod tail-fit beyond this. The joins between the original data and the Guinier/Porod fits are smoothed using the algorithm below to avoid the formation of ripples in the transformed data. 76 82 77 83 Functions :math:`f(x_i)` and :math:`g(x_i)` where :math:`x_i \in \left\{ … … 87 93 h_i = \frac{1}{1 + \frac{(x_i-b)^2}{(x_i-a)^2}} 88 94 95 89 96 Transform 90 97 --------- 91 98 92 99 Fourier 93 ^^^^^^^ 94 95 If Fourieris selected for the transform type, the analysis will perform a100 ....... 101 102 If "Fourier" is selected for the transform type, the analysis will perform a 96 103 discrete cosine transform on the extrapolated data in order to calculate the 97 correlation function. The following algorithm is applied: 104 correlation function 105 106 .. math:: 107 \Gamma _{1D}(R) = \frac{1}{Q^{*}} \int_{0}^{\infty }I(q) q^{2} cos(qR) dq 108 109 where Q\ :sup:`*` is the Scattering Invariant. 110 111 The following algorithm is applied: 98 112 99 113 .. math:: … … 103 117 104 118 Hilbert 105 ^^^^^^^ 106 If Hilbert is selected for the transform type, the analysis will perform a 119 ....... 120 121 If "Hilbert" is selected for the transform type, the analysis will perform a 107 122 Hilbert transform on the extrapolated data in order to calculate the Volume 108 123 Fraction Profile. 109 124 125 .. note:: This functionality is not yet implemented in SasView. 126 127 110 128 Interpretation 111 129 -------------- 112 Once the correlation function has been calculated by transforming the 113 extrapolated data, it may be interpreted by clicking the "Compute Parameters" 114 button. The correlation function is interpreted in terms of an ideal lamellar 115 morphology, and structural parameters are obtained as shown in Figure 2 below. 116 It should be noted that a small beam size is assumed; no de-smearing is 130 131 Correlation Function 132 .................... 133 134 Once the correlation function has been calculated it may be interpreted by clicking the "Compute Parameters" button. 135 136 The correlation function is interpreted in terms of an ideal lamellar 137 morphology, and structural parameters are obtained from it as shown below. 138 It should be noted that a small beam size is assumed; ie, no de-smearing is 117 139 performed. 118 140 119 141 .. figure:: fig2.gif 120 142 :align: center 121 122 **Figure 2** Interpretation of the correlation function.123 143 124 144 The structural parameters obtained are: … … 131 151 * Local Crystallinity :math:`= L_c/L_p` 132 152 153 Volume Fraction Profile 154 ....................... 155 156 SasView does not provide any automatic interpretation of volume fraction profiles in the same way that it does for correlation functions. However, a number of structural parameters are obtainable by other means: 157 158 * Surface Coverage :math:`=\theta` 159 * Anchor Separation :math:`= D` 160 * Bound Fraction :math:`= <p>` 161 * Second Moment :math:`= \sigma` 162 * Maximum Extent :math:`= \delta_{\text{h}}` 163 * Adsorbed Amount :math:`= \Gamma` 164 165 .. figure:: profile1.png 166 :align: center 167 168 .. figure:: profile2.png 169 :align: center 170 171 172 References 173 ---------- 174 175 Strobl, G. R.; Schneider, M. *J. Polym. Sci.* (1980), 18, 1343-1359 176 177 Koberstein, J.; Stein R. *J. Polym. Sci. Phys. Ed.* (1983), 21, 2181-2200 178 179 Baltá Calleja, F. J.; Vonk, C. G. *X-ray Scattering of Synthetic Poylmers*, Elsevier. Amsterdam (1989), 247-251 180 181 Baltá Calleja, F. J.; Vonk, C. G. *X-ray Scattering of Synthetic Poylmers*, Elsevier. Amsterdam (1989), 257-261 182 183 Baltá Calleja, F. J.; Vonk, C. G. *X-ray Scattering of Synthetic Poylmers*, Elsevier. Amsterdam (1989), 260-270 184 185 :ref:`FDR` (PDF format) 186 133 187 .. ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ 188 134 189 135 190 Usage 136 191 ----- 137 192 Upon sending data for correlation function analysis, it will be plotted (minus 138 the background value), along with a red bar indicating the lower Q range (used 139 for back-extrapolation), and 2 purple bars indicating the upper Q range (used 140 for forward-extrapolation) [figure 3]. These bars may be moved my clicking and 141 dragging, or by entering the appropriate values in the Q range input boxes. 193 the background value), along with a *red* bar indicating the *upper end of the 194 low-Q range* (used for back-extrapolation), and 2 *purple* bars indicating the range to be used for forward-extrapolation. These bars may be moved my clicking and 195 dragging, or by entering appropriate values in the Q range input boxes. 142 196 143 197 .. figure:: tutorial1.png 144 198 :align: center 145 199 146 **Figure 3** A plot of some data showing the Q range bars 147 148 Once the Q ranges have been set, click the "Calculate" button next to the 149 background input field to calculate the Bonart thermal background level. 150 Alternatively, enter your own value into the field. Click the "Extrapolate" 151 button to extrapolate the data and plot the extrapolation in the same figure. 152 The values of the parameters used for the Guinier and Porod models will also be 153 shown in the "Extrapolation Parameters" section [figure 4] 200 Once the Q ranges have been set, click the "Calculate" button to determine the background level. Alternatively, enter your own value into the field. If the box turns yellow this indicates that background subtraction has resulted in some negative intensities. 201 202 Click the "Extrapolate" button to extrapolate the data and plot the extrapolation in the same figure. The values of the parameters used for the Guinier and Porod models will also be shown in the "Extrapolation Parameters" section of the window. 154 203 155 204 .. figure:: tutorial2.png 156 205 :align: center 157 206 158 **Figure 4** A plot showing the extrapolated data and the original data 159 160 Then, select which type of transform you would like to perform, using the radio 207 Now select which type of transform you would like to perform, using the radio 161 208 buttons: 162 209 163 210 * **Fourier** Perform a Fourier Transform to calculate the correlation 164 function of the extrapolated data211 function 165 212 * **Hilbert** Perform a Hilbert Transform to calculate the volume fraction 166 profile of the extrapolated data167 168 Click ing the transform button will thenperform the selected transform and plot169 it in a new figure. If a Fourier Transform was performed, the "Compute 170 Parameters" button can also be clicked to calculate values for the output 171 parameters [figure 5] 213 profile 214 215 Click the "Transform" button to perform the selected transform and plot 216 the result in a new graph window. 217 218 If a Fourier Transform was performed, the "Compute Parameters" button can now be clicked to interpret the correlation function as described earlier. 172 219 173 220 .. figure:: tutorial3.png 174 221 :align: center 175 222 176 **Figure 5** The Fourier Transform (correlation function) of the 177 extrapolated data, and the parameters extracted from it. 223 224 .. note:: 225 This help document was last changed by Steve King, 08Oct2016 -
src/sas/sasgui/perspectives/fitting/basepage.py
r51a4d78 r9087214 1037 1037 dispersity = self.disp_box.GetClientData(n) 1038 1038 name = dispersity.__name__ 1039 1040 1039 self._set_dipers_Param(event=None) 1041 1040 … … 1108 1107 self.Refresh() 1109 1108 1109 def get_cat_combo_box_pos(self, state): 1110 """ 1111 Iterate through the categories to find the structurefactor 1112 :return: combo_box_position 1113 """ 1114 for key, value in self.master_category_dict.iteritems(): 1115 for list_item in value: 1116 if state.formfactorcombobox in list_item: 1117 return self.categorybox.Items.index(key) 1118 1110 1119 def reset_page_helper(self, state): 1111 1120 """ … … 1163 1172 category_pos = int(state.categorycombobox) 1164 1173 except: 1174 state.formfactorcombobox = unicode(state.formfactorcombobox.lower()) 1175 state.categorycombobox = unicode(state.categorycombobox) 1165 1176 category_pos = 0 1166 for ind_cat in range(self.categorybox.GetCount()): 1167 if self.categorybox.GetString(ind_cat) == \ 1168 state.categorycombobox: 1169 category_pos = int(ind_cat) 1170 break 1177 if state.categorycombobox in self.categorybox.Items: 1178 category_pos = self.categorybox.Items.index( 1179 state.categorycombobox) 1180 else: 1181 # Look in master list for model name (model.lower) 1182 category_pos = self.get_cat_combo_box_pos(state) 1171 1183 1172 1184 self.categorybox.Select(category_pos) … … 1189 1201 structfactor_pos = int(state.structurecombobox) 1190 1202 except: 1191 structfactor_pos = 0 1192 for ind_struct in range(self.structurebox.GetCount()): 1193 if self.structurebox.GetString(ind_struct) == \ 1194 (state.structurecombobox): 1195 structfactor_pos = int(ind_struct) 1196 break 1203 if state.structurecombobox is not None: 1204 structfactor_pos = 0 1205 state.structurecombobox = unicode(state.structurecombobox) 1206 for ind_struct in range(self.structurebox.GetCount()): 1207 if self.structurebox.GetString(ind_struct) == \ 1208 (state.structurecombobox): 1209 structfactor_pos = int(ind_struct) 1210 break 1197 1211 1198 1212 self.structurebox.SetSelection(structfactor_pos) … … 1407 1421 self.state.npts = self.npts_x 1408 1422 1409 def _onparamEnter_helper(self ):1423 def _onparamEnter_helper(self,is_modified = False): 1410 1424 """ 1411 1425 check if values entered by the user are changed and valid to replot … … 1413 1427 """ 1414 1428 # Flag to register when a parameter has changed. 1415 is_modified = False1429 #is_modified = False 1416 1430 self.fitrange = True 1417 1431 is_2Ddata = False … … 1421 1435 is_2Ddata = True 1422 1436 if self.model != None: 1423 is_modified = (self._check_value_enter(self.fittable_param) 1424 or self._check_value_enter(self.fixed_param) 1425 or self._check_value_enter(self.parameters)) 1437 #Either we get a is_modified = True passed in because 1438 #_update_paramv_on_fit() has been called already or 1439 # we need to check here ourselves. 1440 if not is_modified: 1441 is_modified = (self._check_value_enter(self.fittable_param) 1442 or self._check_value_enter(self.fixed_param) 1443 or self._check_value_enter(self.parameters)) 1426 1444 1427 1445 # Here we should check whether the boundaries have been modified. … … 1472 1490 flag = True 1473 1491 self.fitrange = True 1492 is_modified = False 1474 1493 1475 1494 #wx.PostEvent(self._manager.parent, StatusEvent(status=" \ … … 1484 1503 [self.data]) 1485 1504 ##Check the values 1486 self._check_value_enter(self.fittable_param)1487 self._check_value_enter(self.fixed_param)1488 self._check_value_enter(self.parameters)1505 is_modified = (self._check_value_enter(self.fittable_param) 1506 or self._check_value_enter(self.fixed_param) 1507 or self._check_value_enter(self.parameters)) 1489 1508 1490 1509 # If qmin and qmax have been modified, update qmin and qmax and … … 1568 1587 logging.error(traceback.format_exc()) 1569 1588 1570 return flag 1589 return flag,is_modified 1571 1590 1572 1591 def _reset_parameters_state(self, listtorestore, statelist): … … 1979 1998 form_factor = self.formfactorbox.GetClientData(f_id) 1980 1999 1981 if form_factor is None or not form_factor.is_form_factor: 2000 if form_factor is None or \ 2001 not hasattr(form_factor, 'is_form_factor') or \ 2002 not form_factor.is_form_factor: 1982 2003 self.structurebox.Hide() 1983 2004 self.text2.Hide() … … 2306 2327 wx.PostEvent(self.parent, event) 2307 2328 #draw the model with the current dispersity 2308 self._draw_model() 2329 2330 #Wojtek P, Oct 8, 2016: Calling draw_model seems to be unessecary. 2331 #By comenting it we save an extra Iq calculation 2332 #self._draw_model() 2333 2309 2334 ## Need to use FitInside again here to replace the next four lines. 2310 2335 ## Otherwised polydispersity off does not resize the scrollwindow. … … 3055 3080 """ 3056 3081 content = '' 3082 bound_hi = '' 3083 bound_lo = '' 3057 3084 # go through the str params 3058 3085 for item in param: … … 3086 3113 value = item[2].GetValue() 3087 3114 3115 # Bounds 3116 try: 3117 bound_lo = item[5].GetValue() 3118 bound_hi = item[6].GetValue() 3119 except Exception: 3120 # harmless - need to just pass 3121 pass 3122 3088 3123 # add to the content 3089 3124 if disfunc != '': … … 3101 3136 except Exception: 3102 3137 logging.error(traceback.format_exc()) 3103 content += name + ',' + str(check) + ',' + value + disfunc + ':' 3138 content += name + ',' + str(check) + ',' +\ 3139 value + disfunc + ',' + bound_lo + ',' +\ 3140 bound_hi + ':' 3104 3141 3105 3142 return content … … 3152 3189 # Transfer the text to content[dictionary] 3153 3190 context[name] = [check, value] 3191 3192 # limits 3193 limit_lo = item[3] 3194 context[name].append(limit_lo) 3195 limit_hi = item[4] 3196 context[name].append(limit_hi) 3197 3154 3198 # ToDo: PlugIn this poly disp function for pasting 3155 3199 try: 3156 poly_func = item[ 3]3200 poly_func = item[5] 3157 3201 context[name].append(poly_func) 3158 3202 try: 3159 3203 # take the vals and weights for array 3160 array_values = item[ 4].split(' ')3161 array_weights = item[ 5].split(' ')3204 array_values = item[6].split(' ') 3205 array_weights = item[7].split(' ') 3162 3206 val = [float(a_val) for a_val in array_values[1:]] 3163 3207 weit = [float(a_weit) for a_weit in array_weights[1:]] … … 3207 3251 name = item[1] 3208 3252 if name in content.keys(): 3209 check = content[name][0] 3210 pd = content[name][1] 3253 values = content[name] 3254 check = values[0] 3255 pd = values[1] 3256 3211 3257 if name.count('.') > 0: 3212 3258 # If this is parameter.width, then pd may be a floating … … 3231 3277 fun_val = self.model.fun_list[content[name][1]] 3232 3278 self.model.setParam(name, fun_val) 3279 try: 3280 item[5].SetValue(str(values[-3])) 3281 item[6].SetValue(str(values[-2])) 3282 except Exception: 3283 # passing as harmless non-update 3284 pass 3233 3285 3234 3286 value = content[name][1:] … … 3275 3327 self.model.setParam(name, fun_val) 3276 3328 # save state 3329 try: 3330 item[5].SetValue(str(value[-3])) 3331 item[6].SetValue(str(value[-2])) 3332 except Exception: 3333 # passing as harmless non-update 3334 pass 3335 3277 3336 self._paste_poly_help(item, value) 3278 3337 if check == 'True': … … 3309 3368 """ 3310 3369 # Do nothing if not setting polydispersity 3311 if len(value[ 1]) == 0:3370 if len(value[3]) == 0: 3312 3371 return 3313 3372 -
src/sas/sasgui/perspectives/fitting/fitpage.py
r7988501 r9087214 424 424 self.Bind(wx.EVT_RADIOBUTTON, self.onSlitSmear, 425 425 id=self.slit_smearer.GetId()) 426 self. disable_smearer.SetValue(True)426 self.enable_smearer.SetValue(True) 427 427 428 428 sizer_smearer.Add(self.disable_smearer, 0, wx.LEFT, 10) … … 1058 1058 self.create_default_data() 1059 1059 """ 1060 flag = self._update_paramv_on_fit()1061 1062 wx.CallAfter(self._onparamEnter_helper )1060 flag,is_modified = self._update_paramv_on_fit() 1061 1062 wx.CallAfter(self._onparamEnter_helper,is_modified) 1063 1063 if not flag: 1064 1064 msg = "The parameters are invalid" -
src/sas/sasgui/perspectives/fitting/fitting.py
rff3f5821 rec72ceb 221 221 self.id_edit = wx.NewId() 222 222 editmodel_help = "Edit customized model sample file" 223 self.menu1.AppendMenu(self.id_edit, " Edit Custom Model",223 self.menu1.AppendMenu(self.id_edit, "Plugin Model Operations", 224 224 self.edit_model_menu, editmodel_help) 225 225 #create menubar items … … 236 236 frame = PyConsole(parent=self.parent, manager=self, 237 237 panel=self.fit_panel, 238 title='Advanced CustomModel Editor',238 title='Advanced Plugin Model Editor', 239 239 filename=filename) 240 240 self.put_icon(frame) … … 302 302 event_id = event.GetId() 303 303 dir_path = models.find_plugins_dir() 304 title = "New CustomModel Function"304 title = "New Plugin Model Function" 305 305 self.new_model_frame = EditorWindow(parent=self, base=self, 306 306 path=dir_path, title=title) … … 319 319 Update custom model list in the fitpage combo box 320 320 """ 321 custom_model = ' CustomizedModels'321 custom_model = 'Plugin Models' 322 322 try: 323 323 # Update edit menus … … 350 350 wx_id = wx.NewId() 351 351 #new_model_menu = wx.Menu() 352 self.edit_model_menu.Append(wx_id, 'New ',352 self.edit_model_menu.Append(wx_id, 'New Plugin Model', 353 353 'Add a new model function') 354 354 wx.EVT_MENU(owner, wx_id, self.make_new_model) … … 362 362 self.edit_menu = wx.Menu() 363 363 self.edit_model_menu.AppendMenu(e_id, 364 'Advanced ', self.edit_menu)364 'Advanced Plugin Editor', self.edit_menu) 365 365 self.set_edit_menu_helper(owner, self.edit_custom_model) 366 366 … … 368 368 self.delete_menu = wx.Menu() 369 369 self.edit_model_menu.AppendMenu(d_id, 370 'Delete ', self.delete_menu)370 'Delete Plugin Models', self.delete_menu) 371 371 self.set_edit_menu_helper(owner, self.delete_custom_model) 372 372 373 373 wx_id = wx.NewId() 374 self.edit_model_menu.Append(wx_id, 'Load Models',374 self.edit_model_menu.Append(wx_id, 'Load Plugin Models', 375 375 '(Re)Load all models present in user plugin_models folder') 376 376 wx.EVT_MENU(owner, wx_id, self.load_plugin_models) 377 377 378 378 def set_edit_menu_helper(self, owner=None, menu=None): 379 379 """ -
src/sas/sasgui/perspectives/fitting/media/fitting.rst
r05829fb r46dfee9 3 3 Fitting Documentation 4 4 ===================== 5 6 .. note:: In Windows use [Alt]-[Cursor left] to return to the previous page 5 7 6 8 .. toctree:: … … 18 20 19 21 Information on the SasView Optimisers <optimizer.rst> 20 21 Writing a Plugin <plugin.rst> 22 23 Converting SANS to SESANS for Fitting <../../../sans_to_sesans> 24 25 Fitting SESANS Data <../../../sesans_fitting.rst> 26 27 Writing a Plugin Model <plugin.rst> 28 29 Computations with a GPU <../../../gpu_computations> 30 -
src/sas/sasgui/perspectives/fitting/media/fitting_help.rst
r05829fb r3e1c9e5 18 18 ======= 19 19 20 .. note:: If some code blocks are not readable, expand the documentation window 21 20 22 .. ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ 21 23 … … 116 118 --------------- 117 119 118 For a complete list of all the library models available in SasView, see the Model Documentation.120 For a complete list of all the library models available in SasView, see the `Model Documentation <../../../index.html>`_ . 119 121 120 122 It is also possible to add your own models. … … 124 126 .. _Adding_your_own_models: 125 127 126 Adding your own models128 Adding your own Models 127 129 ---------------------- 128 130 129 There are currently two ways to add your own models to SasView: 130 131 * Using the :ref:`Custom_Model_Editor` 132 * By :ref:`Writing_a_Plugin` 133 134 .. ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ 135 136 .. _Custom_Model_Editor: 137 138 Custom Model Editor 139 ------------------- 140 141 From the *Fitting* option in the menu bar, select *Edit Custom Model*. 142 143 .. image:: edit_model_menu.bmp 144 145 and then one of the options 146 147 * *New* - to create a new custom model template 148 * *Sum|Multi(p1,p2)* - to create a new model by summing/multiplying existing models in the model library 149 * *Advanced* - to edit a new custom model 150 * *Delete* - to delete a custom model 151 152 New 153 ^^^^ 131 There are essentially three ways to generate new fitting models for SasView: 132 133 * Using the SasView :ref:`New_Plugin_Model` helper dialog (best for beginners and/or relatively simple models) 134 * By copying/editing an existing model (this can include models generated by the *New Plugin Model* dialog) in the :ref:`Python_shell` or :ref:`Advanced_Plugin_Editor` (suitable for all use cases) 135 * By writing a model from scratch outside of SasView (only recommended for code monkeys!) 136 137 Please read the guidance on :ref:`Writing_a_Plugin` before proceeding. 138 139 **To be found by SasView your model must reside in the *~\\.sasview\\plugin_models* folder.** 140 141 .. ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ 142 143 .. _Plugin_Model_Operations: 144 145 Plugin Model Operations 146 ----------------------- 147 148 From the *Fitting* option in the menu bar, select *Plugin Model Operations* 149 150 .. image:: edit_model_menu.png 151 152 and then one of the sub-options 153 154 * *New Plugin Model* - to create a plugin model template with a helper dialog 155 * *Sum|Multi(p1,p2)* - to create a plugin model by summing/multiplying *existing models* in the model library 156 * *Advanced Plugin Editor* - to create/edit a plugin model in a Python shell 157 * *Delete Plugin Models* - to delete a plugin model 158 * *Load Plugin Models* - to (re-)load plugin models 159 160 .. _New_Plugin_Model: 161 162 New Plugin Model 163 ^^^^^^^^^^^^^^^^ 154 164 155 165 .. image:: new_model.bmp 156 166 157 167 A model template generated by this option can be viewed and further modified using 158 the :ref:`Advanced ` option.168 the :ref:`Advanced_Plugin_Editor` . 159 169 160 170 *NB: "Fit Parameters" has been split into two sections, those which can be … … 167 177 .. image:: sum_model.bmp 168 178 169 This option creates a custom model of the form 170 171 Custom Model = scale_factor \* (model1 +/\* model2) 172 173 In the *Easy Sum/Multi Editor* give the new custom model a function name and brief 174 description (to appear under the *Details* button on the *Fit Page*). Then select 179 This option creates a custom model of the form:: 180 181 Custom Model = scale_factor \* {(scale_1 \* model_1) \+ (scale_2 \* model_2)} \+ background 182 183 or:: 184 185 Custom Model = scale_factor \* model_1 \* model_2 \+ background 186 187 In the *Easy Sum/Multi Editor* give the new model a function name and brief 188 description (to appear under the *Details* button on the *FitPage*). Then select 175 189 two existing models, as p1 and p2, and the required operator, '+' or '*' between 176 190 them. Finally, click the *Apply* button to generate the model and then click *Close*. 177 191 178 *NB: Any changes to a custom model generated in this way only become effective after* 179 *it is re-selected from the model drop-down menu on the Fit Page.* 180 181 .. _Advanced: 182 183 Advanced 184 ^^^^^^^^ 185 186 Selecting this option shows all the custom models in the plugin model folder 187 188 *C:\\Users\\[username]\\.sasview\\plugin_models* - (on Windows) 192 Any changes to a plugin model generated in this way only become effective *after* it is re-selected from the model drop-down menu on the FitPage. 193 194 .. _Advanced_Plugin_Editor: 195 196 Advanced Plugin Editor 197 ^^^^^^^^^^^^^^^^^^^^^^ 198 199 Selecting this option shows all the plugin models in the plugin model folder, on Windows this is 200 201 *C:\\Users\\{username}\\.sasview\\plugin_models* 189 202 190 203 You can edit, modify, and save the Python code in any of these models using the 191 *Advanced Custom Model Editor*. 192 193 See :ref:`Writing_a_Plugin` for details on the plugin format. 194 195 *NB: Sum/Product models are still using the SasView 3.x model format. Unless 196 you are confident about what you are doing, it is recommended that you 197 only modify lines denoted with the ## <----- comments!* 198 199 When editing is complete, select *Run -> Compile* from the *Model Editor* menu bar. An 200 *Info* box will appear with the results of the compilation and model unit tests. The 201 model will only be usable if the tests 'pass'. 202 203 To use the model, go to the relevant *Fit Page*, select the *Customized Models* 204 *Advanced Plugin Model Editor*. Note that this is actually the same tool as the :ref:`Python_shell` . 205 206 For details of the SasView plugin model format see :ref:`Writing_a_Plugin` . 207 208 .. note:: Model files generated with the Sum/Multi option are still using the SasView 3.x model format. Unless you are confident about what you are doing, it is recommended that you only modify lines denoted with the ## <----- comments! 209 210 When editing is complete, select *Run* > *Check Model* from the *Advanced Plugin Model Editor* menu bar. An *Info* box will appear with the results of the compilation and model unit tests. The model will only be usable if the tests 'pass'. 211 212 .. image:: ../calculator/new_pycrust_example_2.png 213 214 To use the model, go to the relevant *Fit Page*, select the *Plugin Models* 204 215 category and then select the model from the drop-down menu. 205 216 206 *NB: Any changes to a custom model generated in this way only become effective after* 207 *it is re-selected from the model drop-down menu on the Fit Page.* 208 209 Delete 210 ^^^^^^ 211 212 Simply highlight the custom model to be removed. This operation is final! 213 214 *NB: Custom models shipped with SasView cannot be removed in this way.* 217 Any changes to a plugin model generated in this way only become effective *after* it is re-selected from the model drop-down menu on the FitPage. 218 219 Delete Plugin Models 220 ^^^^^^^^^^^^^^^^^^^^ 221 222 Simply highlight the plugin model to be removed. The operation is final!!! 223 224 *NB: Plugin models shipped with SasView cannot be removed in this way.* 225 226 Load Plugin Models 227 ^^^^^^^^^^^^^^^^^^ 228 229 This option loads (or re-loads) all models present in the *~\\.sasview\\plugin_models* folder. 215 230 216 231 .. ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ … … 600 615 .. ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ 601 616 602 .. note:: This help document was last changed by Steve King, 04Jun2015617 .. note:: This help document was last changed by Steve King, 10Oct2016 -
src/sas/sasgui/perspectives/fitting/media/plugin.rst
rb2a3814 r3e1c9e5 6 6 .. note:: If some code blocks are not readable, expand the documentation window 7 7 8 Introduction 9 ^^^^^^^^^^^^ 10 11 There are essentially three ways to generate new fitting models for SasView: 12 13 * Using the SasView :ref:`New_Plugin_Model` helper dialog (best for beginners and/or relatively simple models) 14 * By copying/editing an existing model (this can include models generated by the *New Plugin Model* dialog) in the :ref:`Python_shell` or :ref:`Advanced_Plugin_Editor` as described below (suitable for all use cases) 15 * By writing a model from scratch outside of SasView (only recommended for code monkeys!) 16 8 17 Overview 9 18 ^^^^^^^^ 10 19 11 You can write your own model and save it to the the SasView 12 *plugin_models* folder 13 14 *C:\\Users\\[username]\\.sasview\\plugin_models* (on Windows) 15 16 The next time SasView is started it will compile the plugin and add 17 it to the list of *Customized Models* in a FitPage. It is recommended that an 18 existing model be used as a template. 19 20 SasView has three ways of writing models: 21 22 - As a pure python model : Example - 20 If you write your own model and save it to the the SasView *plugin_models* folder 21 22 *C:\\Users\\{username}\\.sasview\\plugin_models* (on Windows) 23 24 the next time SasView is started it will compile the plugin and add 25 it to the list of *Plugin Models* in a FitPage. 26 27 SasView models can be of three types: 28 29 - A pure python model : Example - 23 30 `broadpeak.py <https://github.com/SasView/sasmodels/blob/master/sasmodels/models/broad_peak.py>`_ 24 - A s apython model with embedded C : Example -31 - A python model with embedded C : Example - 25 32 `sphere.py <https://github.com/SasView/sasmodels/blob/master/sasmodels/models/sphere.py>`_ 26 - A s apython wrapper with separate C code : Example -33 - A python wrapper with separate C code : Example - 27 34 `cylinder.py <https://github.com/SasView/sasmodels/blob/master/sasmodels/models/cylinder.py>`_, 28 35 `cylinder.c <https://github.com/SasView/sasmodels/blob/master/sasmodels/models/cylinder.c>`_ … … 42 49 43 50 In the *~\\.sasview\\plugin_models* directory, copy the appropriate files 44 ( using the examples above as templates) to mymodel.py (and mymodel.c, etc)51 (we recommend using the examples above as templates) to mymodel.py (and mymodel.c, etc) 45 52 as required, where "mymodel" is the name for the model you are creating. 46 53 … … 662 669 ^^^^^^^^^^^^^^^^^^^ 663 670 664 Installed SasView 665 ................. 666 667 If you are editing your model from the SasView GUI, you can test it 668 by selecting *Run > Check Model* from the *Model Editor* menu bar. An 669 *Info* box will appear with the results of the compilation and a 670 check that the model runs. 671 672 673 Built SasView 674 ............. 671 Minimal Testing 672 ............... 673 674 Either open the :ref:`Python_shell` (*Tools* > *Python Shell/Editor*) or the :ref:`Advanced_Plugin_Editor` (*Fitting* > *Plugin Model Operations* > *Advanced 675 Plugin Editor*), load your model, and then select *Run > Check Model* from the 676 menu bar. 677 678 An *Info* box will appear with the results of the compilation and a check that 679 the model runs. 680 681 Recommended Testing 682 ................... 675 683 676 684 If the model compiles and runs, you can next run the unit tests that … … 793 801 consider adding your model to the 794 802 `Model Marketplace <http://marketplace.sasview.org/>`_ so that others may use it! 803 804 .. ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ 805 806 .. note:: This help document was last changed by Steve King, 10Oct2016 -
src/sas/sasgui/perspectives/fitting/models.py
r212bfc2 r5de7f69 181 181 try: 182 182 model = load_custom_model(path) 183 model.name = "[plug-in] "+model.name 183 184 plugins[model.name] = model 184 185 except Exception: -
src/sas/sasgui/perspectives/fitting/pagestate.py
re6de6b8 r467202f 1753 1753 1754 1754 return doc 1755 1756 # Simple html report templet 1757 HEADER = "<html>\n" 1758 HEADER += "<head>\n" 1759 HEADER += "<meta http-equiv=Content-Type content='text/html; " 1760 HEADER += "charset=windows-1252'> \n" 1761 HEADER += "<meta name=Generator >\n" 1762 HEADER += "</head>\n" 1763 HEADER += "<body lang=EN-US>\n" 1764 HEADER += "<div class=WordSection1>\n" 1765 HEADER += "<p class=MsoNormal><b><span ><center><font size='4' >" 1766 HEADER += "%s</font></center></span></center></b></p>" 1767 HEADER += "<p class=MsoNormal> </p>" 1768 PARA = "<p class=MsoNormal><font size='4' > %s \n" 1769 PARA += "</font></p>" 1770 CENTRE = "<p class=MsoNormal><center><font size='4' > %s \n" 1771 CENTRE += "</font></center></p>" 1772 FEET_1 = \ 1773 """ 1774 <p class=MsoNormal> </p> 1775 <br> 1776 <p class=MsoNormal><b><span ><center> <font size='4' > Graph 1777 </font></span></center></b></p> 1778 <p class=MsoNormal> </p> 1779 <center> 1780 <br><font size='4' >Model Computation</font> 1781 <br><font size='4' >Data: "%s"</font><br> 1782 """ 1783 FEET_2 = \ 1784 """ 1785 <img src="%s" > 1786 </img> 1787 """ 1788 FEET_3 = \ 1789 """ 1790 </center> 1791 </div> 1792 </body> 1793 </html> 1794 """ 1795 ELINE = "<p class=MsoNormal> </p>" -
src/sas/sasgui/perspectives/fitting/simfitpage.py
r998ca90 ra28e52b 1093 1093 sim_page.constraints_list[index][3].SetValue(constraint_value) 1094 1094 sim_page._on_add_constraint(None) 1095 sim_page._manager.sim_page = sim_page 1095 1096 1096 1097 def _format_id(self, original_id): -
src/sas/sascalc/data_util/qsmearing.py
rf8aa738 r392056d 5 5 #This software was developed by the University of Tennessee as part of the 6 6 #Distributed Data Analysis of Neutron Scattering Experiments (DANSE) 7 #project funded by the US National Science Foundation. 7 #project funded by the US National Science Foundation. 8 8 #See the license text in license.txt 9 9 #copyright 2008, University of Tennessee … … 13 13 import logging 14 14 import sys 15 from sasmodels import sesans 15 16 16 from sasmodels.resolution import Slit1D, Pinhole1D 17 from sasmodels.resolution import Slit1D, Pinhole1D, SESANS1D 17 18 from sasmodels.resolution2d import Pinhole2D 18 19 … … 48 49 49 50 # Look for resolution smearing data 51 _found_sesans = False 52 if data.dx is not None and data.meta_data['loader']=='SESANS': 53 if data.dx[0] > 0.0: 54 _found_sesans = True 55 56 if _found_sesans == True: 57 return sesans_smear(data, model) 58 50 59 _found_resolution = False 51 60 if data.dx is not None and len(data.dx) == len(data.x): … … 92 101 self.model = model 93 102 self.resolution = resolution 94 self.offset = numpy.searchsorted(self.resolution.q_calc, self.resolution.q[0]) 103 if hasattr(self.resolution, 'data'): 104 if self.resolution.data.meta_data['loader'] == 'SESANS': 105 self.offset = 0 106 # This is default behaviour, for future resolution/transform functions this needs to be revisited. 107 else: 108 self.offset = numpy.searchsorted(self.resolution.q_calc, self.resolution.q[0]) 109 else: 110 self.offset = numpy.searchsorted(self.resolution.q_calc, self.resolution.q[0]) 111 112 #self.offset = numpy.searchsorted(self.resolution.q_calc, self.resolution.q[0]) 95 113 96 114 def apply(self, iq_in, first_bin=0, last_bin=None): … … 126 144 q[first:last+1]. 127 145 """ 146 128 147 q = self.resolution.q 129 148 first = numpy.searchsorted(q, q_min) … … 142 161 width = data.dx if data.dx is not None else 0 143 162 return PySmear(Pinhole1D(q, width), model) 163 164 def sesans_smear(data, model=None): 165 #This should be calculated characteristic length scale 166 #Probably not a data prameter either 167 #Need function to calculate this based on model 168 #Here assume a number 169 Rmax = 1000000 170 q_calc = sesans.make_q(data.sample.zacceptance, Rmax) 171 return PySmear(SESANS1D(data,q_calc),model) -
src/sas/sascalc/dataloader/data_info.py
r1b1a1c1 r1fac6c0 25 25 import numpy 26 26 import math 27 28 class plottable_sesans1D(object):29 """30 SESANS is a place holder for 1D SESANS plottables.31 32 #TODO: This was directly copied from the plottables_1D. Modified Somewhat.33 #Class has been updated.34 """35 # The presence of these should be mutually36 # exclusive with the presence of Qdev (dx)37 x = None38 y = None39 lam = None40 dx = None41 dy = None42 dlam = None43 ## Slit smearing length44 dxl = None45 ## Slit smearing width46 dxw = None47 48 # Units49 _xaxis = ''50 _xunit = ''51 _yaxis = ''52 _yunit = ''53 54 def __init__(self, x, y, lam, dx=None, dy=None, dlam=None):55 # print "SESANS plottable working"56 self.x = numpy.asarray(x)57 self.y = numpy.asarray(y)58 self.lam = numpy.asarray(lam)59 if dx is not None:60 self.dx = numpy.asarray(dx)61 if dy is not None:62 self.dy = numpy.asarray(dy)63 if dlam is not None:64 self.dlam = numpy.asarray(dlam)65 66 def xaxis(self, label, unit):67 """68 set the x axis label and unit69 """70 self._xaxis = label71 self._xunit = unit72 73 def yaxis(self, label, unit):74 """75 set the y axis label and unit76 """77 self._yaxis = label78 self._yunit = unit79 80 81 27 class plottable_1D(object): 82 28 """ … … 94 40 dxw = None 95 41 42 ## SESANS specific params (wavelengths for spin echo length calculation) 43 44 lam = None 45 dlam = None 46 96 47 # Units 97 48 _xaxis = '' … … 100 51 _yunit = '' 101 52 102 def __init__(self, x, y, dx=None, dy=None, dxl=None, dxw=None ):53 def __init__(self, x, y, dx=None, dy=None, dxl=None, dxw=None, lam=None, dlam=None): 103 54 self.x = numpy.asarray(x) 104 55 self.y = numpy.asarray(y) … … 111 62 if dxw is not None: 112 63 self.dxw = numpy.asarray(dxw) 64 if lam is not None: 65 self.lam = numpy.asarray(lam) 66 if dlam is not None: 67 self.dlam = numpy.asarray(dlam) 113 68 114 69 def xaxis(self, label, unit): … … 736 691 return self._perform_union(other) 737 692 738 class SESANSData1D(plottable_sesans1D, DataInfo): 739 """ 740 SESANS 1D data class 741 """ 742 x_unit = 'nm' 743 y_unit = 'pol' 744 745 def __init__(self, x=None, y=None, lam=None, dx=None, dy=None, dlam=None): 693 class Data1D(plottable_1D, DataInfo): 694 """ 695 1D data class 696 """ 697 #if plottable_1D.lam is None: # This means it's SANS data! 698 # x_unit = '1/A' 699 # y_unit = '1/cm' 700 #elif plottable_1D.lam is not None: # This means it's SESANS data! 701 # x_unit = 'A' 702 # y_unit = 'pol' 703 #else: # and if it's neither, you get punished! 704 # raise(TypeError,'This is neither SANS nor SESANS data, what the hell are you doing??') 705 706 def __init__(self, x=None, y=None, dx=None, dy=None, lam=None, dlam=None, isSesans=False): 707 self.isSesans = isSesans 746 708 DataInfo.__init__(self) 747 plottable_sesans1D.__init__(self, x, y, lam, dx, dy, dlam) 709 plottable_1D.__init__(self, x, y, dx, dy,None, None, lam, dlam) 710 if self.isSesans: 711 x_unit = 'A' 712 y_unit = 'pol' 713 elif not self.isSesans: # it's SANS data! (Could also be simple else statement, but i prefer exhaustive conditionals...-JHB) 714 x_unit = '1/A' 715 y_unit = '1/cm' 716 else: # and if it's neither, you get punished! 717 raise(TypeError,'This is neither SANS nor SESANS data, what the hell are you doing??') 748 718 749 719 def __str__(self): … … 759 729 return _str 760 730 761 def clone_without_data(self, length=0, clone=None):762 """763 Clone the current object, without copying the data (which764 will be filled out by a subsequent operation).765 The data arrays will be initialized to zero.766 767 :param length: length of the data array to be initialized768 :param clone: if provided, the data will be copied to clone769 """770 from copy import deepcopy771 if clone is None or not issubclass(clone.__class__, Data1D):772 x = numpy.zeros(length)773 dx = numpy.zeros(length)774 y = numpy.zeros(length)775 dy = numpy.zeros(length)776 clone = Data1D(x, y, dx=dx, dy=dy)777 778 clone.title = self.title779 clone.run = self.run780 clone.filename = self.filename781 clone.instrument = self.instrument782 clone.notes = deepcopy(self.notes)783 clone.process = deepcopy(self.process)784 clone.detector = deepcopy(self.detector)785 clone.sample = deepcopy(self.sample)786 clone.source = deepcopy(self.source)787 clone.collimation = deepcopy(self.collimation)788 clone.trans_spectrum = deepcopy(self.trans_spectrum)789 clone.meta_data = deepcopy(self.meta_data)790 clone.errors = deepcopy(self.errors)791 792 return clone793 794 class Data1D(plottable_1D, DataInfo):795 """796 1D data class797 """798 x_unit = '1/A'799 y_unit = '1/cm'800 801 def __init__(self, x, y, dx=None, dy=None):802 DataInfo.__init__(self)803 plottable_1D.__init__(self, x, y, dx, dy)804 805 def __str__(self):806 """807 Nice printout808 """809 _str = "%s\n" % DataInfo.__str__(self)810 _str += "Data:\n"811 _str += " Type: %s\n" % self.__class__.__name__812 _str += " X-axis: %s\t[%s]\n" % (self._xaxis, self._xunit)813 _str += " Y-axis: %s\t[%s]\n" % (self._yaxis, self._yunit)814 _str += " Length: %g\n" % len(self.x)815 return _str816 817 731 def is_slit_smeared(self): 818 732 """ … … 843 757 y = numpy.zeros(length) 844 758 dy = numpy.zeros(length) 845 clone = Data1D(x, y, dx=dx, dy=dy) 759 lam = numpy.zeros(length) 760 dlam = numpy.zeros(length) 761 clone = Data1D(x, y, lam=lam, dx=dx, dy=dy, dlam=dlam ) 846 762 847 763 clone.title = self.title -
src/sas/sascalc/dataloader/readers/sesans_reader.py
r1c0e3b0 r392056d 8 8 import numpy 9 9 import os 10 from sas.sascalc.dataloader.data_info import SESANSData1D10 from sas.sascalc.dataloader.data_info import Data1D 11 11 12 12 # Check whether we have a converter available … … 84 84 tdx = numpy.zeros(0) 85 85 # print "all good" 86 output = SESANSData1D(x=x, y=y, lam=lam, dy=dy, dx=dx, dlam=dlam)86 output = Data1D(x=x, y=y, lam=lam, dy=dy, dx=dx, dlam=dlam, isSesans=True ) 87 87 # print output 88 88 self.filename = output.filename = basename … … 121 121 paramvals.append(toks[1]) 122 122 if len(toks)>5: 123 #zvals.append(toks[0]) 124 #dzvals.append(toks[1]) 125 #lamvals.append(toks[2]) 126 #dlamvals.append(toks[3]) 127 #Pvals.append(toks[4]) 128 #dPvals.append(toks[5]) 129 123 130 zvals.append(toks[0]) 124 dzvals.append(toks[ 1])125 lamvals.append(toks[ 2])126 dlamvals.append(toks[ 3])127 Pvals.append(toks[ 4])128 dPvals.append(toks[ 5])131 dzvals.append(toks[3]) 132 lamvals.append(toks[4]) 133 dlamvals.append(toks[5]) 134 Pvals.append(toks[1]) 135 dPvals.append(toks[2]) 129 136 else: 130 137 continue … … 140 147 default_z_unit = "A" 141 148 data_conv_P = None 142 default_p_unit = " " 149 default_p_unit = " " # Adjust unit for axis (L^-3) 143 150 lam_unit = lam_header[1].replace("[","").replace("]","") 151 if lam_unit == 'AA': 152 lam_unit = 'A' 144 153 varheader=[zvals[0],dzvals[0],lamvals[0],dlamvals[0],Pvals[0],dPvals[0]] 145 154 valrange=range(1, len(zvals)) … … 161 170 output.x, output.x_unit = self._unit_conversion(x, lam_unit, default_z_unit) 162 171 output.y = y 172 output.y_unit = '\AA^{-2} cm^{-1}' # output y_unit erbij 163 173 output.dx, output.dx_unit = self._unit_conversion(dx, lam_unit, default_z_unit) 164 174 output.dy = dy … … 166 176 output.dlam, output.dlam_unit = self._unit_conversion(dlam, lam_unit, default_z_unit) 167 177 168 output.xaxis("\ rm{z}", output.x_unit)169 output.yaxis("\\rm{ P/P0}", output.y_unit)178 output.xaxis("\\rm{z}", output.x_unit) 179 output.yaxis("\\rm{ln(P)/(t \lambda^2)}", output.y_unit) # Adjust label to ln P/(lam^2 t), remove lam column refs 170 180 # Store loading process information 171 181 output.meta_data['loader'] = self.type_name 172 output.sample.thickness = float(paramvals[6])182 #output.sample.thickness = float(paramvals[6]) 173 183 output.sample.name = paramvals[1] 174 184 output.sample.ID = paramvals[0] 175 185 zaccept_unit_split = paramnames[7].split("[") 176 186 zaccept_unit = zaccept_unit_split[1].replace("]","") 177 if zaccept_unit.strip() == '\AA^-1' :187 if zaccept_unit.strip() == '\AA^-1' or zaccept_unit.strip() == '\A^-1': 178 188 zaccept_unit = "1/A" 179 189 output.sample.zacceptance=(float(paramvals[7]),zaccept_unit) -
src/sas/sascalc/fit/AbstractFitEngine.py
rfc18690 r7988501 131 131 a way to get residuals from data. 132 132 """ 133 def __init__(self, x, y, dx=None, dy=None, smearer=None, data=None ):133 def __init__(self, x, y, dx=None, dy=None, smearer=None, data=None, lam=None, dlam=None): 134 134 """ 135 135 :param smearer: is an object of class QSmearer or SlitSmearer … … 152 152 153 153 """ 154 Data1D.__init__(self, x=x, y=y, dx=dx, dy=dy )154 Data1D.__init__(self, x=x, y=y, dx=dx, dy=dy, lam=lam,dlam=dlam) 155 155 self.num_points = len(x) 156 156 self.sas_data = data -
src/sas/sascalc/fit/BumpsFitting.py
rb699768 r7988501 26 26 from bumps import parameter 27 27 from bumps.fitproblem import FitProblem 28 29 28 30 29 from sas.sascalc.fit.AbstractFitEngine import FitEngine -
src/sas/sasgui/guiframe/dataFitting.py
r9b6d62d r1fac6c0 17 17 """ 18 18 """ 19 def __init__(self, x=None, y=None, dx=None, dy=None ):19 def __init__(self, x=None, y=None, dx=None, dy=None, lam=None, dlam=None, isSesans=False): 20 20 """ 21 21 """ … … 24 24 if y is None: 25 25 y = [] 26 PlotData1D.__init__(self, x, y, dx, dy) 27 LoadData1D.__init__(self, x, y, dx, dy) 26 self.isSesans = isSesans 27 PlotData1D.__init__(self, x, y, dx, dy, lam, dlam) 28 LoadData1D.__init__(self, x, y, dx, dy, lam, dlam, isSesans) 28 29 self.id = None 29 30 self.list_group_id = [] … … 68 69 # First, check the data compatibility 69 70 dy, dy_other = self._validity_check(other) 70 result = Data1D(x=[], y=[], dx=None, dy=None)71 result = Data1D(x=[], y=[], lam=[], dx=None, dy=None, dlam=None) 71 72 result.clone_without_data(length=len(self.x), clone=self) 72 73 result.copy_from_datainfo(data1d=self) … … 115 116 # First, check the data compatibility 116 117 self._validity_check_union(other) 117 result = Data1D(x=[], y=[], dx=None, dy=None)118 result = Data1D(x=[], y=[], lam=[], dx=None, dy=None, dlam=None) 118 119 tot_length = len(self.x) + len(other.x) 119 120 result = self.clone_without_data(length=tot_length, clone=result) 121 if self.dlam == None or other.dlam is None: 122 result.dlam = None 123 else: 124 result.dlam = numpy.zeros(tot_length) 120 125 if self.dy == None or other.dy is None: 121 126 result.dy = None … … 141 146 result.y = numpy.append(self.y, other.y) 142 147 result.y = result.y[ind] 148 result.lam = numpy.append(self.lam, other.lam) 149 result.lam = result.lam[ind] 150 if result.dlam != None: 151 result.dlam = numpy.append(self.dlam, other.dlam) 152 result.dlam = result.dlam[ind] 143 153 if result.dy != None: 144 154 result.dy = numpy.append(self.dy, other.dy) … … 260 270 # First, check the data compatibility 261 271 self._validity_check_union(other) 262 result = Data1D(x=[], y=[], dx=None, dy=None)272 result = Data1D(x=[], y=[], lam=[], dx=None, dy=None, dlam=[]) 263 273 tot_length = len(self.x)+len(other.x) 264 274 result.clone_without_data(length=tot_length, clone=self) 275 if self.dlam == None or other.dlam is None: 276 result.dlam = None 277 else: 278 result.dlam = numpy.zeros(tot_length) 265 279 if self.dy == None or other.dy is None: 266 280 result.dy = None … … 285 299 result.y = numpy.append(self.y, other.y) 286 300 result.y = result.y[ind] 301 result.lam = numpy.append(self.lam, other.lam) 302 result.lam = result.lam[ind] 287 303 if result.dy != None: 288 304 result.dy = numpy.append(self.dy, other.dy) -
src/sas/sasgui/guiframe/data_manager.py
rd85c194 r1fac6c0 62 62 if issubclass(Data2D, data.__class__): 63 63 new_plot = Data2D(image=None, err_image=None) 64 else: 65 new_plot = Data1D(x=[], y=[], dx=None, dy=None) 64 elif data.meta_data['loader'] == 'SESANS': 65 new_plot = Data1D(x=[], y=[], dx=None, dy=None, lam=None, dlam=None, isSesans=True) 66 else: 67 new_plot = Data1D(x=[], y=[], dx=None, dy=None, lam=None, dlam=None) #SESANS check??? 66 68 67 69 new_plot.copy_from_datainfo(data) -
src/sas/sasgui/plottools/plottables.py
r8abd96d r1fac6c0 1022 1022 """ 1023 1023 1024 def __init__(self, x, y, dx=None, dy=None ):1024 def __init__(self, x, y, dx=None, dy=None, lam=None, dlam=None): 1025 1025 """ 1026 1026 Draw points specified by x[i],y[i] in the current color/symbol. … … 1036 1036 self.x = x 1037 1037 self.y = y 1038 self.lam = lam 1038 1039 self.dx = dx 1039 1040 self.dy = dy 1041 self.dlam = dlam 1040 1042 self.source = None 1041 1043 self.detector = None
Note: See TracChangeset
for help on using the changeset viewer.