Changeset 5156918 in sasview for src/sas/sasgui/perspectives/fitting
- Timestamp:
- Mar 31, 2017 3:20:15 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.2.2, ticket-1009, ticket-1094-headless, ticket-1242-2d-resolution, ticket-1243, ticket-1249, ticket885, unittest-saveload
- Children:
- 7b15990
- Parents:
- 1a8e13f0 (diff), 7cbbacd (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/sasgui/perspectives/fitting
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
src/sas/sasgui/perspectives/fitting/basepage.py
r1a8e13f0 r5156918 53 53 ON_MAC = True 54 54 55 CUSTOM_MODEL = 'Plugin Models' 56 55 57 class BasicPage(ScrolledPanel, PanelBase): 56 58 """ 57 This class provide general structure of fitpanel page59 This class provide general structure of the fitpanel page 58 60 """ 59 61 # Internal name for the AUI manager … … 118 120 self.dxw = None 119 121 # pinhole smear 120 self.dx_min = None 121 self.dx_max = None 122 self.dx_percent = None 122 123 # smear attrbs 123 124 self.enable_smearer = None … … 677 678 def _copy_info(self, flag): 678 679 """ 679 Send event d pemding on flag680 681 : Param flag: flag that distinguish event680 Send event depending on flag 681 682 : Param flag: flag that distinguishes the event 682 683 """ 683 684 # messages depending on the flag … … 847 848 self.state.pinhole_smearer = \ 848 849 copy.deepcopy(self.pinhole_smearer.GetValue()) 849 self.state.dx_max = copy.deepcopy(self.dx_max) 850 self.state.dx_min = copy.deepcopy(self.dx_min) 850 self.state.dx_percent = copy.deepcopy(self.dx_percent) 851 851 self.state.dxl = copy.deepcopy(self.dxl) 852 852 self.state.dxw = copy.deepcopy(self.dxw) … … 1119 1119 :precondition: the page is already drawn or created 1120 1120 1121 :postcondition: the state of the underlying data change as well as the1121 :postcondition: the state of the underlying data changes as well as the 1122 1122 state of the graphic interface 1123 1123 """ … … 1167 1167 self._show_combox(None) 1168 1168 from models import PLUGIN_NAME_BASE 1169 if self.categorybox.GetValue() == 'Customized Models'\1169 if self.categorybox.GetValue() == CUSTOM_MODEL \ 1170 1170 and PLUGIN_NAME_BASE not in state.formfactorcombobox: 1171 1171 state.formfactorcombobox = \ … … 1245 1245 # we have two more options for smearing 1246 1246 if self.pinhole_smearer.GetValue(): 1247 self.dx_min = state.dx_min 1248 self.dx_max = state.dx_max 1249 if self.dx_min is not None: 1250 self.smear_pinhole_min.SetValue(str(self.dx_min)) 1251 if self.dx_max is not None: 1252 self.smear_pinhole_max.SetValue(str(self.dx_max)) 1247 self.dx_percent = state.dx_percent 1248 if self.dx_percent is not None: 1249 if state.dx_old: 1250 self.dx_percent = 100 * (self.dx_percent / self.data.x[0]) 1251 self.smear_pinhole_percent.SetValue("%.2f" % self.dx_percent) 1253 1252 self.onPinholeSmear(event=None) 1254 1253 elif self.slit_smearer.GetValue(): … … 1335 1334 def _selectDlg(self): 1336 1335 """ 1337 open a dialog file to select ed the customized dispersity1336 open a dialog file to select the customized polydispersity function 1338 1337 """ 1339 1338 if self.parent is not None: … … 1747 1746 def _set_multfactor_combobox(self, multiplicity=10): 1748 1747 """ 1749 Set comboBox for mu itfactor of CoreMultiShellModel1748 Set comboBox for multitfactor of CoreMultiShellModel 1750 1749 :param multiplicit: no. of multi-functionality 1751 1750 """ … … 1785 1784 Fill panel's combo box according to the type of model selected 1786 1785 """ 1787 custom_model = 'Customized Models' 1786 1788 1787 mod_cat = self.categorybox.GetStringSelection() 1789 1788 self.structurebox.SetSelection(0) … … 1794 1793 m_list = [] 1795 1794 try: 1796 if mod_cat == custom_model:1795 if mod_cat == CUSTOM_MODEL: 1797 1796 for model in self.model_list_box[mod_cat]: 1798 1797 m_list.append(self.model_dict[model.name]) … … 3430 3429 fills out the category list box 3431 3430 """ 3432 uncat_str = ' CustomizedModels'3431 uncat_str = 'Plugin Models' 3433 3432 self._read_category_info() 3434 3433 … … 3459 3458 self.model_box.Clear() 3460 3459 3461 if category == ' CustomizedModels':3460 if category == 'Plugin Models': 3462 3461 for model in self.model_list_box[category]: 3463 3462 str_m = str(model).split(".")[0] -
src/sas/sasgui/perspectives/fitting/fitpage.py
r1a8e13f0 r5156918 29 29 _BOX_WIDTH = 76 30 30 _DATA_BOX_WIDTH = 300 31 SMEAR_SIZE_L = 0.0032 31 SMEAR_SIZE_H = 0.00 33 32 CUSTOM_MODEL = 'Plugin Models' 34 33 35 34 class FitPage(BasicPage): … … 164 163 On_select_data 165 164 """ 166 if event is None and self.dataSource.GetCount() > 0: 167 data = self.dataSource.GetClientData(0) 168 self.set_data(data) 169 elif self.dataSource.GetCount() > 0: 170 pos = self.dataSource.GetSelection() 165 if self.dataSource.GetCount() > 0: 166 pos = self.dataSource.GetSelection() if event is not None else 0 171 167 data = self.dataSource.GetClientData(pos) 172 168 self.set_data(data) … … 213 209 "Please enter only the value of interest to customize smearing..." 214 210 smear_message_new_psmear = \ 215 "Please enter both; the dQ will be generated by interpolation..."211 "Please enter a fixed percentage to be applied to all Q values..." 216 212 smear_message_2d_x_title = "<dQp>[1/A]:" 217 213 smear_message_2d_y_title = "<dQs>[1/A]:" 218 smear_message_pinhole_min_title = "dQ_low[1/A]:" 219 smear_message_pinhole_max_title = "dQ_high[1/A]:" 214 smear_message_pinhole_percent_title = "dQ[%]:" 220 215 smear_message_slit_height_title = "Slit height[1/A]:" 221 216 smear_message_slit_width_title = "Slit width[1/A]:" … … 256 251 self.Bind(wx.EVT_RADIOBUTTON, self.onWeighting, 257 252 id=self.dI_idata.GetId()) 258 self.dI_ didata.SetValue(True)253 self.dI_noweight.SetValue(True) 259 254 # add 4 types of weighting to the sizer 260 255 sizer_weighting.Add(self.dI_noweight, 0, wx.LEFT, 10) … … 266 261 sizer_weighting.Add(self.dI_idata) 267 262 sizer_weighting.Add((10, 10)) 268 self.dI_noweight.Enable( False)263 self.dI_noweight.Enable(True) 269 264 self.dI_didata.Enable(False) 270 265 self.dI_sqrdata.Enable(False) … … 310 305 311 306 # textcntrl for custom resolution 312 self.smear_pinhole_max = ModelTextCtrl(self, wx.ID_ANY, 313 size=(_BOX_WIDTH - 25, 20), 314 style=wx.TE_PROCESS_ENTER, 315 text_enter_callback=self.onPinholeSmear) 316 self.smear_pinhole_min = ModelTextCtrl(self, wx.ID_ANY, 317 size=(_BOX_WIDTH - 25, 20), 318 style=wx.TE_PROCESS_ENTER, 319 text_enter_callback=self.onPinholeSmear) 307 self.smear_pinhole_percent = ModelTextCtrl(self, wx.ID_ANY, 308 size=(_BOX_WIDTH - 25, 20), 309 style=wx.TE_PROCESS_ENTER, 310 text_enter_callback= 311 self.onPinholeSmear) 320 312 self.smear_slit_height = ModelTextCtrl(self, wx.ID_ANY, 321 313 size=(_BOX_WIDTH - 25, 20), … … 336 328 337 329 # set default values for smear 338 self.smear_pinhole_max.SetValue(str(self.dx_max)) 339 self.smear_pinhole_min.SetValue(str(self.dx_min)) 330 self.smear_pinhole_percent.SetValue(str(self.dx_percent)) 340 331 self.smear_slit_height.SetValue(str(self.dxl)) 341 332 self.smear_slit_width.SetValue(str(self.dxw)) … … 362 353 self.Bind(wx.EVT_RADIOBUTTON, self.onSlitSmear, 363 354 id=self.slit_smearer.GetId()) 364 self. enable_smearer.SetValue(True)355 self.disable_smearer.SetValue(True) 365 356 366 357 sizer_smearer.Add(self.disable_smearer, 0, wx.LEFT, 10) … … 429 420 self.smear_description_2d_y.SetToolTipString( 430 421 " dQs(perpendicular) in q_phi direction.") 431 self.smear_description_pin_min = wx.StaticText(self, wx.ID_ANY, 432 smear_message_pinhole_min_title, style=wx.ALIGN_LEFT) 433 self.smear_description_pin_max = wx.StaticText(self, wx.ID_ANY, 434 smear_message_pinhole_max_title, style=wx.ALIGN_LEFT) 422 self.smear_description_pin_percent = wx.StaticText(self, wx.ID_ANY, 423 smear_message_pinhole_percent_title, 424 style=wx.ALIGN_LEFT) 435 425 self.smear_description_slit_height = wx.StaticText(self, wx.ID_ANY, 436 426 smear_message_slit_height_title, style=wx.ALIGN_LEFT) … … 456 446 self.sizer_new_smear.Add((15, -1)) 457 447 self.sizer_new_smear.Add(self.smear_description_2d_x, 0, wx.CENTER, 10) 458 self.sizer_new_smear.Add(self.smear_description_pin_min,459 0, wx.CENTER, 10)460 448 self.sizer_new_smear.Add(self.smear_description_slit_height, 461 449 0, wx.CENTER, 10) 462 450 463 self.sizer_new_smear.Add(self.smear_pinhole_min, 0, wx.CENTER, 10)464 451 self.sizer_new_smear.Add(self.smear_slit_height, 0, wx.CENTER, 10) 465 452 self.sizer_new_smear.Add(self.smear_data_left, 0, wx.CENTER, 10) … … 467 454 self.sizer_new_smear.Add(self.smear_description_2d_y, 468 455 0, wx.CENTER, 10) 469 self.sizer_new_smear.Add(self.smear_description_pin_ max,456 self.sizer_new_smear.Add(self.smear_description_pin_percent, 470 457 0, wx.CENTER, 10) 471 458 self.sizer_new_smear.Add(self.smear_description_slit_width, 472 459 0, wx.CENTER, 10) 473 460 474 self.sizer_new_smear.Add(self.smear_pinhole_ max, 0, wx.CENTER, 10)461 self.sizer_new_smear.Add(self.smear_pinhole_percent, 0, wx.CENTER, 10) 475 462 self.sizer_new_smear.Add(self.smear_slit_width, 0, wx.CENTER, 10) 476 463 self.sizer_new_smear.Add(self.smear_data_right, 0, wx.CENTER, 10) … … 1249 1236 wx.PostEvent(self.parent, new_event) 1250 1237 # update list of plugins if new plugin is available 1251 custom_model = 'Customized Models'1238 custom_model = CUSTOM_MODEL 1252 1239 mod_cat = self.categorybox.GetStringSelection() 1253 1240 if mod_cat == custom_model: … … 1271 1258 if copy_flag: 1272 1259 self.get_paste_params(copy_flag) 1273 1260 wx.CallAfter(self._onDraw, None) 1274 1261 1275 1262 else: … … 1584 1571 if self.dxw is None: 1585 1572 self.dxw = "" 1586 if self.dx_min is None: 1587 self.dx_min = SMEAR_SIZE_L 1588 if self.dx_max is None: 1589 self.dx_max = SMEAR_SIZE_H 1573 if self.dx_percent is None: 1574 self.dx_percent = SMEAR_SIZE_H 1590 1575 1591 1576 def _get_smear_info(self): … … 1627 1612 elif data.dxl is not None or data.dxw is not None: 1628 1613 self.smear_type = "Slit" 1629 if data.dxl is not None and n ot numpy.all(data.dxl, 0):1614 if data.dxl is not None and numpy.all(data.dxl, 0): 1630 1615 self.dq_l = data.dxl[0] 1631 if data.dxw is not None and n ot numpy.all(data.dxw, 0):1616 if data.dxw is not None and numpy.all(data.dxw, 0): 1632 1617 self.dq_r = data.dxw[0] 1633 1618 # return self.smear_type,self.dq_l,self.dq_r … … 1649 1634 self.smear_description_2d_y.Show(True) 1650 1635 if self.pinhole_smearer.GetValue(): 1651 self.smear_pinhole_min.Show(True) 1652 self.smear_pinhole_max.Show(True) 1636 self.smear_pinhole_percent.Show(True) 1653 1637 # smear from data 1654 1638 elif self.enable_smearer.GetValue(): … … 1661 1645 self.smear_description_slit_width.Show(True) 1662 1646 elif self.smear_type == 'Pinhole': 1663 self.smear_description_pin_min.Show(True) 1664 self.smear_description_pin_max.Show(True) 1647 self.smear_description_pin_percent.Show(True) 1665 1648 self.smear_description_smear_type.Show(True) 1666 1649 self.smear_description_type.Show(True) … … 1671 1654 if self.smear_type == 'Pinhole': 1672 1655 self.smear_message_new_p.Show(True) 1673 self.smear_description_pin_min.Show(True) 1674 self.smear_description_pin_max.Show(True) 1675 1676 self.smear_pinhole_min.Show(True) 1677 self.smear_pinhole_max.Show(True) 1656 self.smear_description_pin_percent.Show(True) 1657 1658 self.smear_pinhole_percent.Show(True) 1678 1659 # custom slit smear 1679 1660 elif self.slit_smearer.GetValue(): … … 1700 1681 self.smear_data_left.Hide() 1701 1682 self.smear_data_right.Hide() 1702 self.smear_description_pin_min.Hide() 1703 self.smear_pinhole_min.Hide() 1704 self.smear_description_pin_max.Hide() 1705 self.smear_pinhole_max.Hide() 1683 self.smear_description_pin_percent.Hide() 1684 self.smear_pinhole_percent.Hide() 1706 1685 self.smear_description_slit_height.Hide() 1707 1686 self.smear_slit_height.Hide() … … 1927 1906 1928 1907 # more disables for 2D 1908 di_flag = False 1909 dq_flag = False 1929 1910 if self.data.__class__.__name__ == "Data2D" or \ 1930 1911 self.enable2D: … … 1932 1913 self.pinhole_smearer.Enable(True) 1933 1914 self.default_mask = copy.deepcopy(self.data.mask) 1934 if self.data.err_data is None or\ 1935 numpy.all(err == 1 for err in self.data.err_data) or \ 1936 not numpy.any(self.data.err_data): 1937 self.dI_didata.Enable(False) 1938 self.dI_noweight.SetValue(True) 1939 self.weightbt_string = self.dI_noweight.GetLabelText() 1940 else: 1941 self.dI_didata.Enable(True) 1942 self.dI_didata.SetValue(True) 1943 self.weightbt_string = self.dI_didata.GetLabelText() 1915 if self.data.err_data is not None \ 1916 and numpy.any(self.data.err_data): 1917 di_flag = True 1918 if self.data.dqx_data is not None \ 1919 and numpy.any(self.data.dqx_data): 1920 dq_flag = True 1944 1921 else: 1945 1922 self.slit_smearer.Enable(True) 1946 1923 self.pinhole_smearer.Enable(True) 1947 1948 if self.data.dy is None or\ 1949 numpy.all(self.data.dy == 1) or\ 1950 not numpy.any(self.data.dy): 1951 self.dI_didata.Enable(False) 1952 self.dI_noweight.SetValue(True) 1953 self.weightbt_string = self.dI_noweight.GetLabelText() 1954 else: 1955 self.dI_didata.Enable(True) 1956 self.dI_didata.SetValue(True) 1957 self.weightbt_string = self.dI_didata.GetLabelText() 1924 if self.data.dy is not None and numpy.any(self.data.dy): 1925 di_flag = True 1926 if self.data.dx is not None and numpy.any(self.data.dx): 1927 dq_flag = True 1928 elif self.data.dxl is not None and numpy.any(self.data.dxl): 1929 dq_flag = True 1930 1931 if dq_flag: 1932 self.enable_smearer.Enable(True) 1933 self.enable_smearer.SetValue(True) 1934 self.disable_smearer.SetValue(False) 1935 else: 1936 self.enable_smearer.Disable() 1937 self.disable_smearer.Enable(True) 1938 self.disable_smearer.SetValue(True) 1939 1940 if di_flag: 1941 self.dI_didata.Enable(True) 1942 self.dI_didata.SetValue(True) 1943 self.weightbt_string = self.dI_didata.GetLabelText() 1944 else: 1945 self.dI_didata.Enable(False) 1946 self.dI_noweight.SetValue(True) 1947 self.weightbt_string = self.dI_noweight.GetLabelText() 1948 1958 1949 # Enable weighting radio buttons 1959 1950 self.dI_noweight.Enable(True) … … 1997 1988 self.EditMask_title.Disable() 1998 1989 1990 self.on_smear_helper() 1999 1991 self.on_set_focus(None) 2000 1992 self.Refresh() … … 2228 2220 # event case of radio button 2229 2221 if tcrtl.GetValue(): 2230 self.dx_min = 0.0 2231 self.dx_max = 0.0 2222 self.dx_percent = 0.0 2232 2223 is_new_pinhole = True 2233 2224 else: … … 2266 2257 """ 2267 2258 # get the values 2268 pin_min = self.smear_pinhole_min.GetValue() 2269 pin_max = self.smear_pinhole_max.GetValue() 2270 2271 # Check changes in slit width 2259 pin_percent = self.smear_pinhole_percent.GetValue() 2260 2261 # Check changes in slit heigth 2272 2262 try: 2273 dx_ min = float(pin_min)2263 dx_percent = float(pin_percent) 2274 2264 except: 2275 2265 return True 2276 if self.dx_min != dx_min: 2277 return True 2278 2279 # Check changes in slit heigth 2280 try: 2281 dx_max = float(pin_max) 2282 except: 2283 return True 2284 if self.dx_max != dx_max: 2266 if self.dx_percent != dx_percent: 2285 2267 return True 2286 2268 return False … … 2308 2290 msg = None 2309 2291 2310 get_pin_min = self.smear_pinhole_min 2311 get_pin_max = self.smear_pinhole_max 2312 2313 if not check_float(get_pin_min): 2314 get_pin_min.SetBackgroundColour("pink") 2315 msg = "Model Error:wrong value entered!!!" 2316 elif not check_float(get_pin_max): 2317 get_pin_max.SetBackgroundColour("pink") 2292 get_pin_percent = self.smear_pinhole_percent 2293 2294 if not check_float(get_pin_percent): 2295 get_pin_percent.SetBackgroundColour("pink") 2318 2296 msg = "Model Error:wrong value entered!!!" 2319 2297 else: 2320 2298 if len_data < 2: 2321 2299 len_data = 2 2322 self.dx_min = float(get_pin_min.GetValue()) 2323 self.dx_max = float(get_pin_max.GetValue()) 2324 if self.dx_min < 0: 2325 get_pin_min.SetBackgroundColour("pink") 2300 self.dx_percent = float(get_pin_percent.GetValue()) 2301 if self.dx_percent < 0: 2302 get_pin_percent.SetBackgroundColour("pink") 2326 2303 msg = "Model Error:This value can not be negative!!!" 2327 elif self.dx_max < 0: 2328 get_pin_max.SetBackgroundColour("pink") 2329 msg = "Model Error:This value can not be negative!!!" 2330 elif self.dx_min is not None and self.dx_max is not None: 2304 elif self.dx_percent is not None: 2305 percent = self.dx_percent/100 2331 2306 if self._is_2D(): 2332 data.dqx_data[data.dqx_data == 0] = self.dx_min 2333 data.dqy_data[data.dqy_data == 0] = self.dx_max 2334 elif self.dx_min == self.dx_max: 2335 data.dx[data.dx == 0] = self.dx_min 2307 data.dqx_data[data.dqx_data == 0] = percent * data.qx_data 2308 data.dqy_data[data.dqy_data == 0] = percent * data.qy_data 2336 2309 else: 2337 step = (self.dx_max - self.dx_min) / (len_data - 1) 2338 data.dx = numpy.arange(self.dx_min, 2339 self.dx_max + step / 1.1, 2340 step) 2341 elif self.dx_min is not None: 2342 if self._is_2D(): 2343 data.dqx_data[data.dqx_data == 0] = self.dx_min 2344 else: 2345 data.dx[data.dx == 0] = self.dx_min 2346 elif self.dx_max is not None: 2347 if self._is_2D(): 2348 data.dqy_data[data.dqy_data == 0] = self.dx_max 2349 else: 2350 data.dx[data.dx == 0] = self.dx_max 2310 data.dx = percent * data.x 2351 2311 self.current_smearer = smear_selection(data, self.model) 2352 2312 # 2D need to set accuracy … … 2358 2318 wx.PostEvent(self._manager.parent, StatusEvent(status=msg)) 2359 2319 else: 2360 get_pin_min.SetBackgroundColour("white") 2361 get_pin_max.SetBackgroundColour("white") 2320 get_pin_percent.SetBackgroundColour("white") 2362 2321 # set smearing value whether or not the data contain the smearing info 2363 2322 -
src/sas/sasgui/perspectives/fitting/fitting.py
r1a8e13f0 r5156918 225 225 226 226 self.id_edit = wx.NewId() 227 editmodel_help = "Edit customized model sample file"228 227 self.menu1.AppendMenu(self.id_edit, "Plugin Model Operations", 229 self.edit_model_menu , editmodel_help)228 self.edit_model_menu) 230 229 #create menubar items 231 230 return [(self.menu1, self.sub_menu)] … … 260 259 self.update_custom_combo() 261 260 if os.path.isfile(p_path): 262 msg = "Sorry! Could not beable to delete the default "263 msg += " custommodel... \n"261 msg = "Sorry! unable to delete the default " 262 msg += "plugin model... \n" 264 263 msg += "Please manually remove the files (.py, .pyc) " 265 264 msg += "in the 'plugin_models' folder \n" … … 274 273 if item.GetLabel() == label: 275 274 self.edit_menu.DeleteItem(item) 276 msg = "The custommodel, %s, has been deleted." % label275 msg = "The plugin model, %s, has been deleted." % label 277 276 evt = StatusEvent(status=msg, type='stop', info='info') 278 277 wx.PostEvent(self.parent, evt) … … 331 330 temp = self.fit_panel.reset_pmodel_list() 332 331 if temp: 333 # Set the new custommodel list for all fit pages332 # Set the new plugin model list for all fit pages 334 333 for uid, page in self.fit_panel.opened_pages.iteritems(): 335 334 if hasattr(page, "formfactorbox"): … … 1746 1745 data_id="Data " + data.name + " unsmeared", 1747 1746 dy=unsmeared_error) 1748 1749 if sq_model is not None and pq_model is not None: 1750 self.create_theory_1D(x, sq_model, page_id, model, data, state, 1751 data_description=model.name + " S(q)", 1752 data_id=str(page_id) + " " + data.name + " S(q)") 1753 self.create_theory_1D(x, pq_model, page_id, model, data, state, 1754 data_description=model.name + " P(q)", 1755 data_id=str(page_id) + " " + data.name + " P(q)") 1756 1747 # Comment this out until we can get P*S models with correctly populated parameters 1748 #if sq_model is not None and pq_model is not None: 1749 # self.create_theory_1D(x, sq_model, page_id, model, data, state, 1750 # data_description=model.name + " S(q)", 1751 # data_id=str(page_id) + " " + data.name + " S(q)") 1752 # self.create_theory_1D(x, pq_model, page_id, model, data, state, 1753 # data_description=model.name + " P(q)", 1754 # data_id=str(page_id) + " " + data.name + " P(q)") 1757 1755 1758 1756 current_pg = self.fit_panel.get_page_by_id(page_id) … … 1955 1953 ## then kill itself but cannot. Paul Kienzle came up with 1956 1954 ## this fix to prevent threads from stepping on each other 1957 ## which was causing a simple custom model to crash Sasview. 1955 ## which was causing a simple custom plugin model to crash 1956 ##Sasview. 1958 1957 ## We still don't know why the fit sometimes lauched a second 1959 1958 ## thread -- something which should also be investigated. -
src/sas/sasgui/perspectives/fitting/media/fitting_help.rst
r26c8be3 r5295cf5 34 34 * in *Single* fit mode - individual data sets are fitted independently one-by-one 35 35 36 * in *Simultaneous* fit mode - multiple data sets are fitted simultaneously to the *same* model with/without constrained parameters (this might be useful, for example, if you have measured the same sample at different contrasts) 36 * in *Simultaneous* fit mode - multiple data sets are fitted simultaneously to 37 the *same* model with/without constrained parameters (this might be useful, 38 for example, if you have measured the same sample at different contrasts) 37 39 38 40 * in *Batch* fit mode - multiple data sets are fitted sequentially to the *same* model (this might be useful, for example, if you have performed a kinetic or time-resolved experiment and have *lots* of data sets!) … … 43 45 ----------------- 44 46 45 By default, the models in SasView are grouped into five categories 46 47 * *Shapes* - models describing 'objects' (spheres, cylinders, etc) 47 The models in SasView are grouped into categories. By default these consist of: 48 49 * *Cylinder* - cylindrical shapes (disc, right cylinder, cylinder with endcaps 50 etc) 51 * *Ellipsoid* - ellipsoidal shapes (oblate,prolate, core shell, etc) 52 * *Parellelepiped* - as the name implies 53 * *Sphere* - sheroidal shapes (sphere, core multishell, vesicle, etc) 54 * *Lamellae* - lamellar shapes (lamellar, core shell lamellar, stacked 55 lamellar, etc) 48 56 * *Shape-Independent* - models describing structure in terms of density correlation functions, fractals, peaks, power laws, etc 49 * *Customized Models* - SasView- or User-created (non-library) Python models 50 * *Uncategorised* - other models (for reflectivity, etc) 57 * *Paracrystal* - semi ordered structures (bcc, fcc, etc) 51 58 * *Structure Factor* - S(Q) models 59 * *Plugin Models* - User-created (custom/non-library) Python models 52 60 53 61 Use the *Category* drop-down menu to chose a category of model, then select … … 84 92 .. image:: cat_fig0.bmp 85 93 86 The categorization of all models except the customized models can be reassigned,87 added to, and removed using *Category Manager*. Models can also be hidden from view 88 in the drop-down menus.94 The categorization of all models except the user supplied Plugin Models can be 95 reassigned, added to, and removed using *Category Manager*. Models can also be 96 hidden from view in the drop-down menus. 89 97 90 98 .. image:: cat_fig1.bmp … … 93 101 ^^^^^^^^^^^^^^^^^ 94 102 95 To change category, highlight a model in the list by left-clicking on its entry and96 then click the *Modify* button. Use the *Change Category* panel that appears to make 97 t he required changes.103 To change category, highlight a model in the list by left-clicking on its entry 104 and then click the *Modify* button. Use the *Change Category* panel that appears 105 to make the required changes. 98 106 99 107 .. image:: cat_fig2.bmp … … 106 114 ^^^^^^^^^^^^^^^^^^^^^ 107 115 108 Use the *Enable All / Disable All* buttons and the check boxes beside each model to109 select the models to show/hide. To apply the selection, click *Ok*. Otherwise click 110 *Cancel*.116 Use the *Enable All / Disable All* buttons and the check boxes beside each model 117 to select the models to show/hide. To apply the selection, click *Ok*. Otherwise 118 click *Cancel*. 111 119 112 120 *NB: It may be necessary to change to a different category and then back again* … … 118 126 --------------- 119 127 120 For a complete list of all the library models available in SasView, see the `Model Documentation <../../../index.html>`_ . 128 For a complete list of all the library models available in SasView, see 129 the `Model Documentation <../../../index.html>`_ . 121 130 122 131 It is also possible to add your own models. … … 131 140 There are essentially three ways to generate new fitting models for SasView: 132 141 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!) 142 * Using the SasView :ref:`New_Plugin_Model` helper dialog (best for beginners 143 and/or relatively simple models) 144 * By copying/editing an existing model (this can include models generated by 145 the New Plugin Model* dialog) in the :ref:`Python_shell` or 146 :ref:`Advanced_Plugin_Editor` (suitable for all use cases) 147 * By writing a model from scratch outside of SasView (only recommended for code 148 monkeys!) 136 149 137 150 Please read the guidance on :ref:`Writing_a_Plugin` before proceeding. … … 163 176 ^^^^^^^^^^^^^^^^ 164 177 165 Relatively straightforward models can be programmed directly from the SasView GUI166 using the *New Plugin Model Function*.178 Relatively straightforward models can be programmed directly from the SasView 179 GUI using the *New Plugin Model Function*. 167 180 168 181 .. image:: new_model.bmp … … 175 188 *checked*\ . 176 189 177 Also note that the 'Fit Parameters' have been split into two sections: those which178 can be polydisperse (shape and orientation parameters) and those which are not 179 (eg, scattering length densities).190 Also note that the 'Fit Parameters' have been split into two sections: those 191 which can be polydisperse (shape and orientation parameters) and those which are 192 not (eg, scattering length densities). 180 193 181 194 A model file generated by this option can be viewed and further modified using … … 187 200 .. image:: sum_model.bmp 188 201 189 This option creates a custom model of the form::190 191 Custom Model = scale_factor \* {(scale_1 \* model_1) \+ (scale_2 \* model_2)} \+ background202 This option creates a custom Plugin Model of the form:: 203 204 Plugin Model = scale_factor * {(scale_1 * model_1) +/- (scale_2 * model_2)} + background 192 205 193 206 or:: 194 207 195 Custom Model = scale_factor \* model_1 \* model_2 \+ background208 Plugin Model = scale_factor * model_1 /* model_2 + background 196 209 197 210 In the *Easy Sum/Multi Editor* give the new model a function name and brief … … 232 245 Simply highlight the plugin model to be removed. The operation is final!!! 233 246 234 *NB: Plugin models shipped with SasView cannot be removed in this way.*247 *NB: Models shipped with SasView cannot be removed in this way.* 235 248 236 249 Load Plugin Models 237 250 ^^^^^^^^^^^^^^^^^^ 238 251 239 This option loads (or re-loads) all models present in the *~\\.sasview\\plugin_models* folder. 252 This option loads (or re-loads) all models present in the 253 *~\\.sasview\\plugin_models* folder. 240 254 241 255 .. ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ … … 400 414 :ref:`Assessing_Fit_Quality`. 401 415 402 *NB: If you need to use a custom ized model, you must ensure that model is available*403 *first (see* :ref:`Adding_your_own_models` *).*416 *NB: If you need to use a custom Plugin Model, you must ensure that model is 417 available first (see* :ref:`Adding_your_own_models` *).* 404 418 405 419 Method … … 484 498 If multiple data sets are in one file, load just that file. *Unselect All Data*, then 485 499 select a single initial data set to be fitted. Fit that selected data set as described 486 above under :ref:`Single_Fit_Mode` 487 488 *NB: If you need to use a custom ized model, you must ensure that model is available*489 *first (see* :ref:`Adding_your_own_models` *).*500 above under :ref:`Single_Fit_Mode`. 501 502 *NB: If you need to use a custom Plugin Model, you must ensure that model is 503 available first (see* :ref:`Adding_your_own_models` *).* 490 504 491 505 Method -
src/sas/sasgui/perspectives/fitting/media/plugin.rst
rca6cbc1c r984f3fc 27 27 28 28 the next time SasView is started it will compile the plugin and add 29 it to the list of * CustomizedModels* in a FitPage.29 it to the list of *Plugin Models* in a FitPage. 30 30 31 31 SasView models can be of three types: … … 364 364 - the limits will show up as the default limits for the fit making it easy, 365 365 for example, to force the radius to always be greater than zero. 366 367 - these are hard limits defining the valid range of parameter values; 368 polydisperity distributions will be truncated at the limits. 366 369 367 370 - **"type"** can be one of: "", "sld", "volume", or "orientation". -
src/sas/sasgui/perspectives/fitting/model_thread.py
rc1681ea rc1c9929 177 177 unsmeared_output = numpy.zeros((len(self.data.x))) 178 178 unsmeared_output[first_bin:last_bin+1] = self.model.evalDistribution(mask) 179 self.smearer.model = self.model 179 180 output = self.smearer(unsmeared_output, first_bin, last_bin) 180 181 -
src/sas/sasgui/perspectives/fitting/models.py
r0de74af r11b094f 325 325 self.plugins.append(plug) 326 326 self.model_dictionary[name] = plug 327 self.model_combobox.set_list(" CustomizedModels", self.plugins)327 self.model_combobox.set_list("Plugin Models", self.plugins) 328 328 return self.model_combobox.get_list() 329 329 else: … … 346 346 self.model_dictionary[name] = plug 347 347 348 self.model_combobox.reset_list(" CustomizedModels", self.plugins)348 self.model_combobox.reset_list("Plugin Models", self.plugins) 349 349 return self.model_combobox.get_list() 350 350 … … 389 389 # self.shape_indep_list) 390 390 self.model_combobox.set_list("Structure Factors", self.struct_list) 391 self.model_combobox.set_list(" CustomizedModels", self.plugins)391 self.model_combobox.set_list("Plugin Models", self.plugins) 392 392 self.model_combobox.set_list("P(Q)*S(Q)", self.multiplication_factor) 393 393 self.model_combobox.set_list("multiplication", -
src/sas/sasgui/perspectives/fitting/pagestate.py
r6d2b50b r27109e5 33 33 from sas.sascalc.dataloader.data_info import Data2D, Collimation, Detector 34 34 from sas.sascalc.dataloader.data_info import Process, Aperture 35 35 36 # Information to read/write state as xml 36 37 FITTING_NODE_NAME = 'fitting_plug_in' 37 38 CANSAS_NS = "cansas1d/1.0" 39 40 CUSTOM_MODEL = 'Plugin Models' 41 CUSTOM_MODEL_OLD = 'Customized Models' 38 42 39 43 LIST_OF_DATA_ATTRIBUTES = [["is_data", "is_data", "bool"], … … 70 74 ["dq_l", "dq_l", "float"], 71 75 ["dq_r", "dq_r", "float"], 72 ["dx_max", "dx_max", "float"], 73 ["dx_min", "dx_min", "float"], 76 ["dx_percent", "dx_percent", "float"], 74 77 ["dxl", "dxl", "float"], 75 78 ["dxw", "dxw", "float"]] … … 211 214 self.dq_l = None 212 215 self.dq_r = None 213 self.dx_ max= None214 self.dx_ min = None216 self.dx_percent = None 217 self.dx_old = False 215 218 self.dxl = None 216 219 self.dxw = None … … 339 342 obj.dq_l = copy.deepcopy(self.dq_l) 340 343 obj.dq_r = copy.deepcopy(self.dq_r) 341 obj.dx_ max = copy.deepcopy(self.dx_max)342 obj.dx_ min = copy.deepcopy(self.dx_min)344 obj.dx_percent = copy.deepcopy(self.dx_percent) 345 obj.dx_old = copy.deepcopy(self.dx_old) 343 346 obj.dxl = copy.deepcopy(self.dxl) 344 347 obj.dxw = copy.deepcopy(self.dxw) … … 366 369 :return: None 367 370 """ 371 if self.categorycombobox == CUSTOM_MODEL_OLD: 372 self.categorycombobox = CUSTOM_MODEL 368 373 if self.formfactorcombobox == '': 369 374 FIRST_FORM = { … … 378 383 'Sphere' : 'adsorbed_layer', 379 384 'Structure Factor' : 'hardsphere', 380 'Customized Models': ''385 CUSTOM_MODEL : '' 381 386 } 382 387 if self.categorycombobox == '': … … 556 561 rep += "dq_l : %s\n" % self.dq_l 557 562 rep += "dq_r : %s\n" % self.dq_r 558 rep += "dx_max : %s\n" % str(self.dx_max) 559 rep += "dx_min : %s\n" % str(self.dx_min) 563 rep += "dx_percent : %s\n" % str(self.dx_percent) 560 564 rep += "dxl : %s\n" % str(self.dxl) 561 565 rep += "dxw : %s\n" % str(self.dxw) … … 815 819 816 820 attr = newdoc.createAttribute("version") 817 import sasview821 from sas import sasview 818 822 attr.nodeValue = sasview.__version__ 819 823 # attr.nodeValue = '1.0' … … 1042 1046 setattr(self, item[0], parse_entry_helper(node, item)) 1043 1047 1048 dx_old_node = get_content('ns:%s' % 'dx_min', entry) 1044 1049 for item in LIST_OF_STATE_ATTRIBUTES: 1045 node = get_content('ns:%s' % item[0], entry) 1046 setattr(self, item[0], parse_entry_helper(node, item)) 1050 if item[0] == "dx_percent" and dx_old_node is not None: 1051 dxmin = ["dx_min", "dx_min", "float"] 1052 setattr(self, item[0], parse_entry_helper(dx_old_node, 1053 dxmin)) 1054 self.dx_old = True 1055 else: 1056 node = get_content('ns:%s' % item[0], entry) 1057 setattr(self, item[0], parse_entry_helper(node, item)) 1047 1058 1048 1059 for item in LIST_OF_STATE_PARAMETERS:
Note: See TracChangeset
for help on using the changeset viewer.