Changeset 5156918 in sasview for src/sas/sasgui
- 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
- Files:
-
- 17 edited
Legend:
- Unmodified
- Added
- Removed
-
src/sas/sasgui/guiframe/CategoryInstaller.py
r212bfc2 rddbac66 123 123 compile it and install 124 124 :param homefile: Override the default home directory 125 :param model_list: List of model names except customized models 125 :param model_list: List of model names except those in Plugin Models 126 which are user supplied. 126 127 """ 127 128 _model_dict = { model.name: model for model in model_list} -
src/sas/sasgui/guiframe/acknowledgebox.py
rc1fdf84 r74c8cd0 11 11 import wx.richtext 12 12 import wx.lib.hyperlink 13 from wx.lib.expando import ExpandoTextCtrl 13 14 import random 14 15 import os.path … … 36 37 Shows the current method for acknowledging SasView in 37 38 scholarly publications. 38 39 39 """ 40 40 … … 44 44 wx.Dialog.__init__(self, *args, **kwds) 45 45 46 self.ack = wx.TextCtrl(self, style=wx.TE_LEFT|wx.TE_MULTILINE|wx.TE_BESTWRAP|wx.TE_READONLY|wx.TE_NO_VSCROLL)46 self.ack = ExpandoTextCtrl(self, style=wx.TE_LEFT|wx.TE_MULTILINE|wx.TE_BESTWRAP|wx.TE_READONLY|wx.TE_NO_VSCROLL) 47 47 self.ack.SetValue(config._acknowledgement_publications) 48 self.ack.SetMinSize((-1, 55)) 48 #self.ack.SetMinSize((-1, 55)) 49 self.citation = ExpandoTextCtrl(self, style=wx.TE_LEFT|wx.TE_MULTILINE|wx.TE_BESTWRAP|wx.TE_READONLY|wx.TE_NO_VSCROLL) 50 self.citation.SetValue(config._acknowledgement_citation) 49 51 self.preamble = wx.StaticText(self, -1, config._acknowledgement_preamble) 50 52 items = [config._acknowledgement_preamble_bullet1, … … 52 54 config._acknowledgement_preamble_bullet3, 53 55 config._acknowledgement_preamble_bullet4] 54 self.list1 = wx.StaticText(self, -1, " \t(1) " + items[0])55 self.list2 = wx.StaticText(self, -1, " \t(2) " + items[1])56 self.list3 = wx.StaticText(self, -1, " \t(3) " + items[2])57 self.list4 = wx.StaticText(self, -1, " \t(4) " + items[3])56 self.list1 = wx.StaticText(self, -1, "(1) " + items[0]) 57 self.list2 = wx.StaticText(self, -1, "(2) " + items[1]) 58 self.list3 = wx.StaticText(self, -1, "(3) " + items[2]) 59 self.list4 = wx.StaticText(self, -1, "(4) " + items[3]) 58 60 self.static_line = wx.StaticLine(self, 0) 59 61 self.__set_properties() … … 69 71 self.SetTitle("Acknowledging SasView") 70 72 #Increased size of box from (525, 225), SMK, 04/10/16 71 self.Set Size((600, 300))73 self.SetClientSize((600, 320)) 72 74 # end wxGlade 73 75 … … 81 83 sizer_titles.Add(self.preamble, 0, wx.ALL|wx.EXPAND, 5) 82 84 sizer_titles.Add(self.list1, 0, wx.ALL|wx.EXPAND, 5) 85 sizer_titles.Add(self.ack, 0, wx.ALL|wx.EXPAND, 5) 83 86 sizer_titles.Add(self.list2, 0, wx.ALL|wx.EXPAND, 5) 87 sizer_titles.Add(self.citation, 0, wx.ALL|wx.EXPAND, 5) 84 88 sizer_titles.Add(self.list3, 0, wx.ALL|wx.EXPAND, 5) 89 #sizer_titles.Add(self.static_line, 0, wx.ALL|wx.EXPAND, 0) 85 90 sizer_titles.Add(self.list4, 0, wx.ALL|wx.EXPAND, 5) 86 sizer_titles.Add(self.static_line, 0, wx.ALL|wx.EXPAND, 0)87 sizer_titles.Add(self.ack, 0, wx.ALL|wx.EXPAND, 5)88 91 sizer_main.Add(sizer_titles, -1, wx.ALL|wx.EXPAND, 5) 89 92 self.SetAutoLayout(True) … … 91 94 self.Layout() 92 95 self.Centre() 96 #self.SetClientSize(sizer_main.GetSize()) 93 97 # end wxGlade 94 98 -
src/sas/sasgui/guiframe/config.py
rd85c194 rf9d1f60 1 1 """ 2 Application settings2 Application settings 3 3 """ 4 import time 4 5 import os 5 import time6 6 from sas.sasgui.guiframe.gui_style import GUIFRAME 7 import sas.sasview 8 import logging 9 7 10 # Version of the application 8 __appname__ = " DummyView"9 __version__ = '0.0.0'10 __build__ = '1'11 __appname__ = "SasView" 12 __version__ = sas.sasview.__version__ 13 __build__ = sas.sasview.__build__ 11 14 __download_page__ = 'https://github.com/SasView/sasview/releases' 12 15 __update_URL__ = 'http://www.sasview.org/latestversion.json' 13 16 14 15 17 # Debug message flag 16 __EVT_DEBUG__ = True18 __EVT_DEBUG__ = False 17 19 18 20 # Flag for automated testing … … 29 31 _acknowledgement_preamble =\ 30 32 '''To ensure the long term support and development of this software please''' +\ 31 ''' remember to do the following.'''33 ''' remember to:''' 32 34 _acknowledgement_preamble_bullet1 =\ 33 '''Acknowledge its use in your publications as suggested below'''35 '''Acknowledge its use in your publications as :''' 34 36 _acknowledgement_preamble_bullet2 =\ 35 '''Reference the following website: http://www.sasview.org'''37 '''Reference SasView as:''' 36 38 _acknowledgement_preamble_bullet3 =\ 37 39 '''Reference the model you used if appropriate (see documentation for refs)''' … … 39 41 '''Send us your reference for our records: developers@sasview.org''' 40 42 _acknowledgement_publications = \ 41 '''This work benefited from the use of the SasView application, originally 42 developed under NSF award DMR-0520547. 43 '''This work benefited from the use of the SasView application, originally developed under NSF Award DMR-0520547. SasView also contains code developed with funding from the EU Horizon 2020 programme under the SINE2020 project Grant No 654000.''' 44 _acknowledgement_citation = \ 45 '''M. Doucet et al. SasView Version 4.1, Zenodo, 10.5281/zenodo.438138''' 46 47 _acknowledgement = \ 48 '''This work was originally developed as part of the DANSE project funded by the US NSF under Award DMR-0520547,\n but is currently maintained by a collaboration between UTK, UMD, NIST, ORNL, ISIS, ESS, ILL, ANSTO and TU Delft and the scattering community.\n\n SasView also contains code developed with funding from the EU Horizon 2020 programme under the SINE2020 project (Grant No 654000).\nA list of individual contributors can be found at: https://github.com/orgs/SasView/people 43 49 ''' 44 _acknowledgement = \45 '''This work originally developed as part of the DANSE project funded by the NSF46 under grant DMR-0520547, and currently maintained by NIST, UMD, ORNL, ISIS, ESS47 and ILL.48 50 49 '''50 51 _homepage = "http://www.sasview.org" 51 _download = "http://sourceforge.net/projects/sasview/files/"52 _download = __download_page__ 52 53 _authors = [] 53 54 _paper = "http://sourceforge.net/p/sasview/tickets/" 54 55 _license = "mailto:help@sasview.org" 55 _nsf_logo = "images/nsf_logo.png" 56 _danse_logo = "images/danse_logo.png" 57 _inst_logo = "images/utlogo.gif" 58 _nist_logo = "images/nist_logo.png" 59 _umd_logo = "images/umd_logo.png" 60 _sns_logo = "images/sns_logo.png" 61 _isis_logo = "images/isis_logo.png" 62 _ess_logo = "images/ess_logo.png" 63 _ill_logo = "images/ill_logo.png" 56 57 58 icon_path = os.path.abspath(os.path.join(os.path.dirname(__file__), "images")) 59 logging.info("icon path: %s" % icon_path) 60 media_path = os.path.abspath(os.path.join(os.path.dirname(__file__), "media")) 61 test_path = os.path.abspath(os.path.join(os.path.dirname(__file__), "test")) 62 63 _nist_logo = os.path.join(icon_path, "nist_logo.png") 64 _umd_logo = os.path.join(icon_path, "umd_logo.png") 65 _sns_logo = os.path.join(icon_path, "sns_logo.png") 66 _ornl_logo = os.path.join(icon_path, "ornl_logo.png") 67 _isis_logo = os.path.join(icon_path, "isis_logo.png") 68 _ess_logo = os.path.join(icon_path, "ess_logo.png") 69 _ill_logo = os.path.join(icon_path, "ill_logo.png") 70 _ansto_logo = os.path.join(icon_path, "ansto_logo.png") 71 _tudelft_logo = os.path.join(icon_path, "tudelft_logo.png") 72 _nsf_logo = os.path.join(icon_path, "nsf_logo.png") 73 _danse_logo = os.path.join(icon_path, "danse_logo.png") 74 _inst_logo = os.path.join(icon_path, "utlogo.gif") 64 75 _nist_url = "http://www.nist.gov/" 65 76 _umd_url = "http://www.umd.edu/" 66 77 _sns_url = "http://neutrons.ornl.gov/" 78 _ornl_url = "http://neutrons.ornl.gov/" 67 79 _nsf_url = "http://www.nsf.gov" 68 _danse_url = "http://www.cacr.caltech.edu/projects/danse/release/index.html"69 _inst_url = "http://www.utk.edu"70 80 _isis_url = "http://www.isis.stfc.ac.uk/" 71 81 _ess_url = "http://ess-scandinavia.eu/" 72 82 _ill_url = "http://www.ill.eu/" 73 _corner_image = "images/angles_flat.png" 74 _welcome_image = "images/SVwelcome.png" 75 _copyright = "(c) 2008, University of Tennessee" 76 #edit the lists below of file state your plugin can read 77 #for sasview this how you can edit these lists 78 #PLUGIN_STATE_EXTENSIONS = ['.prv','.fitv', '.inv'] 79 #APPLICATION_STATE_EXTENSION = '.svs' 80 #PLUGINS_WLIST = ['P(r) files (*.prv)|*.prv', 81 # 'Fitting files (*.fitv)|*.fitv', 82 # 'Invariant files (*.inv)|*.inv'] 83 #APPLICATION_WLIST = 'SasView files (*.svs)|*.svs' 84 APPLICATION_WLIST = '' 85 APPLICATION_STATE_EXTENSION = None 86 PLUGINS_WLIST = [] 87 PLUGIN_STATE_EXTENSIONS = [] 88 SPLASH_SCREEN_PATH = "images/danse_logo.png" 89 DEFAULT_STYLE = GUIFRAME.SINGLE_APPLICATION 90 SPLASH_SCREEN_WIDTH = 500 91 SPLASH_SCREEN_HEIGHT = 300 92 WELCOME_PANEL_ON = False 93 TUTORIAL_PATH = None 94 SS_MAX_DISPLAY_TIME = 1500 95 PLOPANEL_WIDTH = 350 96 PLOPANEL_HEIGTH = 350 97 GUIFRAME_WIDTH = 1000 98 GUIFRAME_HEIGHT = 800 99 CONTROL_WIDTH = -1 100 CONTROL_HEIGHT = -1 101 SetupIconFile_win = os.path.join("images", "ball.ico") 102 SetupIconFile_mac = os.path.join("images", "ball.icns") 103 DefaultGroupName = "DANSE" 104 OutputBaseFilename = "setupGuiFrame" 83 _ansto_url = "http://www.ansto.gov.au/" 84 _tudelft_url = "http://www.tnw.tudelft.nl/en/cooperation/facilities/reactor-instituut-delft/" 85 _danse_url = "http://www.cacr.caltech.edu/projects/danse/release/index.html" 86 _inst_url = "http://www.utk.edu" 87 _corner_image = os.path.join(icon_path, "angles_flat.png") 88 _welcome_image = os.path.join(icon_path, "SVwelcome.png") 89 _copyright = "(c) 2009 - 2017, UTK, UMD, NIST, ORNL, ISIS, ESS, ILL, ANSTO and TU Delft" 90 marketplace_url = "http://marketplace.sasview.org/" 91 92 #edit the list of file state your plugin can read 93 APPLICATION_WLIST = 'SasView files (*.svs)|*.svs' 94 APPLICATION_STATE_EXTENSION = '.svs' 95 GUIFRAME_WIDTH = 1150 96 GUIFRAME_HEIGHT = 840 97 PLUGIN_STATE_EXTENSIONS = ['.fitv', '.inv', '.prv', '.crf'] 98 PLUGINS_WLIST = ['Fitting files (*.fitv)|*.fitv', 99 'Invariant files (*.inv)|*.inv', 100 'P(r) files (*.prv)|*.prv', 101 'Corfunc files (*.crf)|*.crf'] 102 PLOPANEL_WIDTH = 415 103 PLOPANEL_HEIGTH = 370 105 104 DATAPANEL_WIDTH = 235 106 105 DATAPANEL_HEIGHT = 700 106 SPLASH_SCREEN_PATH = os.path.join(icon_path, "SVwelcome_mini.png") 107 TUTORIAL_PATH = os.path.join(media_path, "Tutorial.pdf") 108 DEFAULT_STYLE = GUIFRAME.MULTIPLE_APPLICATIONS|GUIFRAME.MANAGER_ON\ 109 |GUIFRAME.CALCULATOR_ON|GUIFRAME.TOOLBAR_ON 110 SPLASH_SCREEN_WIDTH = 512 111 SPLASH_SCREEN_HEIGHT = 366 112 SS_MAX_DISPLAY_TIME = 2000 113 WELCOME_PANEL_ON = True 114 WELCOME_PANEL_SHOW = False 115 CLEANUP_PLOT = False 116 # OPEN and SAVE project menu 117 OPEN_SAVE_PROJECT_MENU = True 118 #VIEW MENU 119 VIEW_MENU = True 120 #EDIT MENU 121 EDIT_MENU = True 122 123 SetupIconFile_win = os.path.join(icon_path, "ball.ico") 124 SetupIconFile_mac = os.path.join(icon_path, "ball.icns") 125 DefaultGroupName = "." 126 OutputBaseFilename = "setupSasView" 127 107 128 FIXED_PANEL = True 108 129 DATALOADER_SHOW = True … … 113 134 # set a default perspective 114 135 DEFAULT_PERSPECTIVE = 'None' 115 # OPEN and SAVE project menu 116 OPEN_SAVE_PROJECT_MENU = True 117 CLEANUP_PLOT = False 118 # OPEN and SAVE project menu 119 OPEN_SAVE_PROJECT_MENU = False 120 #VIEW MENU 121 VIEW_MENU = False 122 #EDIT MENU 123 EDIT_MENU = False 124 import wx.lib.newevent 125 (StatusBarEvent, EVT_STATUS) = wx.lib.newevent.NewEvent() 136 137 # Time out for updating sasview 138 UPDATE_TIMEOUT = 2 139 140 #OpenCL option 141 SAS_OPENCL = None 126 142 127 143 def printEVT(message): 128 """129 :TODO - need method documentation130 """131 144 if __EVT_DEBUG__: 145 """ 146 :TODO - Need method doc string 147 """ 132 148 print "%g: %s" % (time.clock(), message) 133 149 134 150 if __EVT_DEBUG_2_FILE__: 135 151 out = open(__EVT_DEBUG_FILENAME__, 'a') 136 152 out.write("%10g: %s\n" % (time.clock(), message)) 137 153 out.close() 138 -
src/sas/sasgui/guiframe/dataFitting.py
r345e7e4 r68adf86 17 17 """ 18 18 """ 19 def __init__(self, x=None, y=None, dx=None, dy=None): 19 20 def __init__(self, x=None, y=None, dx=None, dy=None, lam=None, dlam=None, isSesans=False): 20 21 """ 21 22 """ … … 24 25 if y is None: 25 26 y = [] 26 PlotData1D.__init__(self, x, y, dx, dy) 27 LoadData1D.__init__(self, x, y, dx, dy) 27 self.isSesans = isSesans 28 PlotData1D.__init__(self, x, y, dx, dy, lam, dlam) 29 LoadData1D.__init__(self, x, y, dx, dy, lam, dlam, isSesans) 30 28 31 self.id = None 29 32 self.list_group_id = [] … … 32 35 self.path = None 33 36 self.xtransform = None 37 if self.isSesans: 38 self.xtransform = "x" 34 39 self.ytransform = None 40 if self.isSesans: 41 self.ytransform = "y" 35 42 self.title = "" 36 43 self.scale = None … … 68 75 # First, check the data compatibility 69 76 dy, dy_other = self._validity_check(other) 70 result = Data1D(x=[], y=[], dx=None, dy=None)77 result = Data1D(x=[], y=[], lam=[], dx=None, dy=None, dlam=None) 71 78 result.clone_without_data(length=len(self.x), clone=self) 72 79 result.copy_from_datainfo(data1d=self) … … 115 122 # First, check the data compatibility 116 123 self._validity_check_union(other) 117 result = Data1D(x=[], y=[], dx=None, dy=None)124 result = Data1D(x=[], y=[], lam=[], dx=None, dy=None, dlam=None) 118 125 tot_length = len(self.x) + len(other.x) 119 126 result = self.clone_without_data(length=tot_length, clone=result) 127 if self.dlam == None or other.dlam is None: 128 result.dlam = None 129 else: 130 result.dlam = numpy.zeros(tot_length) 120 131 if self.dy == None or other.dy is None: 121 132 result.dy = None … … 141 152 result.y = numpy.append(self.y, other.y) 142 153 result.y = result.y[ind] 154 result.lam = numpy.append(self.lam, other.lam) 155 result.lam = result.lam[ind] 156 if result.dlam != None: 157 result.dlam = numpy.append(self.dlam, other.dlam) 158 result.dlam = result.dlam[ind] 143 159 if result.dy != None: 144 160 result.dy = numpy.append(self.dy, other.dy) … … 260 276 # First, check the data compatibility 261 277 self._validity_check_union(other) 262 result = Data1D(x=[], y=[], dx=None, dy=None)278 result = Data1D(x=[], y=[], lam=[], dx=None, dy=None, dlam=[]) 263 279 tot_length = len(self.x)+len(other.x) 264 280 result.clone_without_data(length=tot_length, clone=self) 281 if self.dlam == None or other.dlam is None: 282 result.dlam = None 283 else: 284 result.dlam = numpy.zeros(tot_length) 265 285 if self.dy == None or other.dy is None: 266 286 result.dy = None … … 285 305 result.y = numpy.append(self.y, other.y) 286 306 result.y = result.y[ind] 307 result.lam = numpy.append(self.lam, other.lam) 308 result.lam = result.lam[ind] 287 309 if result.dy != None: 288 310 result.dy = numpy.append(self.dy, other.dy) -
src/sas/sasgui/guiframe/data_manager.py
r345e7e4 r2ffe241 61 61 62 62 if issubclass(Data2D, data.__class__): 63 new_plot = Data2D(image=None, err_image=None) 64 else: 65 new_plot = Data1D(x=[], y=[], dx=None, dy=None) 66 63 new_plot = Data2D(image=None, err_image=None) # For now, isSesans for 2D data is always false 64 else: 65 new_plot = Data1D(x=[], y=[], dx=None, dy=None, lam=None, dlam=None, isSesans=data.isSesans) 66 67 68 #elif data.meta_data['loader'] == 'SESANS': 69 # new_plot = Data1D(x=[], y=[], dx=None, dy=None, lam=None, dlam=None, isSesans=True) 70 #else: 71 # new_plot = Data1D(x=[], y=[], dx=None, dy=None, lam=None, dlam=None) #SESANS check??? 72 67 73 new_plot.copy_from_datainfo(data) 68 74 data.clone_without_data(clone=new_plot) -
src/sas/sasgui/guiframe/data_panel.py
rc8e1996 ra45a298 66 66 IS_MAC = True 67 67 68 STYLE_FLAG = wx.RAISED_BORDER | CT.TR_HAS_BUTTONS | CT.TR_HIDE_ROOT |\69 wx.WANTS_CHARS | CT.TR_HAS_VARIABLE_ROW_HEIGHT 68 STYLE_FLAG = (wx.RAISED_BORDER | CT.TR_HAS_BUTTONS | 69 wx.WANTS_CHARS | CT.TR_HAS_VARIABLE_ROW_HEIGHT) 70 70 71 71 … … 74 74 Check list control to be used for Data Panel 75 75 """ 76 def __init__(self, parent, *args, **kwds):76 def __init__(self, parent, root, *args, **kwds): 77 77 # agwstyle is introduced in wx.2.8.11 but is not working for mac 78 78 if IS_MAC and wx_version < 812: … … 97 97 del kwds['style'] 98 98 CT.CustomTreeCtrl.__init__(self, parent, *args, **kwds) 99 self.root = self.AddRoot( "Available Data")99 self.root = self.AddRoot(root) 100 100 101 101 def OnCompareItems(self, item1, item2): … … 520 520 Add a listcrtl in the panel 521 521 """ 522 tree_ctrl_label = wx.StaticText(self, -1, "Data") 523 tree_ctrl_label.SetForegroundColour('blue') 524 self.tree_ctrl = DataTreeCtrl(parent=self, style=wx.SUNKEN_BORDER) 522 # Add splitter 523 w, h = self.parent.GetSize() 524 splitter = wx.SplitterWindow(self) 525 splitter.SetMinimumPaneSize(50) 526 splitter.SetSashGravity(1.0) 527 528 file_sizer = wx.BoxSizer(wx.VERTICAL) 529 file_sizer.SetMinSize(wx.Size(w/13, h*2/5)) 530 theory_sizer = wx.BoxSizer(wx.VERTICAL) 531 theory_sizer.SetMinSize(wx.Size(w/13, h*2/5)) 532 533 self.tree_ctrl = DataTreeCtrl(parent=splitter, 534 style=wx.SUNKEN_BORDER, 535 root="Available Data") 536 525 537 self.tree_ctrl.Bind(CT.EVT_TREE_ITEM_CHECKING, self.on_check_item) 526 538 self.tree_ctrl.Bind(CT.EVT_TREE_ITEM_MENU, self.on_right_click_data) … … 557 569 wx.EVT_MENU(self, self.editmask_id, self.on_edit_data) 558 570 559 tree_ctrl_theory_label = wx.StaticText(self, -1, "Theory") 560 tree_ctrl_theory_label.SetForegroundColour('blue') 561 self.tree_ctrl_theory = DataTreeCtrl(parent=self, 562 style=wx.SUNKEN_BORDER) 571 self.tree_ctrl_theory = DataTreeCtrl(parent=splitter, 572 style=wx.SUNKEN_BORDER, 573 root="Available Theory") 563 574 self.tree_ctrl_theory.Bind(CT.EVT_TREE_ITEM_CHECKING, 564 575 self.on_check_item) 565 576 self.tree_ctrl_theory.Bind(CT.EVT_TREE_ITEM_MENU, 566 577 self.on_right_click_theory) 567 self.sizer1.Add(tree_ctrl_label, 0, wx.LEFT, 10) 568 self.sizer1.Add(self.tree_ctrl, 1, wx.EXPAND | wx.ALL, 10) 569 self.sizer1.Add(tree_ctrl_theory_label, 0, wx.LEFT, 10) 570 self.sizer1.Add(self.tree_ctrl_theory, 1, wx.EXPAND | wx.ALL, 10) 578 splitter.SplitHorizontally(self.tree_ctrl, self.tree_ctrl_theory) 579 self.sizer1.Add(splitter, 1, wx.EXPAND | wx.ALL, 10) 571 580 572 581 def on_right_click_theory(self, event): … … 722 731 if self.tree_ctrl.root: 723 732 self.tree_ctrl.SortChildren(self.tree_ctrl.root) 733 # Expand root if # of data sets > 0 734 if self.tree_ctrl.GetCount() > 0: 735 self.tree_ctrl.root.Expand() 724 736 self.enable_remove() 725 737 self.enable_import() … … 760 772 state_id=state_id, 761 773 theory_list=theory_list) 774 if self.tree_ctrl_theory.GetCount() > 0: 775 self.tree_ctrl_theory.root.Expand() 762 776 763 777 def append_theory_helper(self, tree, root, state_id, theory_list): -
src/sas/sasgui/perspectives/calculator/model_editor.py
ra08b89b rddbac66 5 5 function of y (usually the intensity). It also provides a drop down of 6 6 standard available math functions. Finally a full python editor panel for 7 complete customizati n is provided.8 9 :TODO the writi ong of the file and name checking (and maybe some other10 fun tions?) should be moved to a computational module which could be called11 fro pm a python script. Basically one just needs to pass the name,7 complete customization is provided. 8 9 :TODO the writing of the file and name checking (and maybe some other 10 functions?) should be moved to a computational module which could be called 11 from a python script. Basically one just needs to pass the name, 12 12 description text and function text (or in the case of the composite editor 13 13 the names of the first and second model and the operator to be used). … … 61 61 """ 62 62 Dialog for easy custom composite models. Provides a wx.Dialog panel 63 to choose two existing models (including pre-existing custom models which63 to choose two existing models (including pre-existing Plugin Models which 64 64 may themselves be composite models) as well as an operation on those models 65 65 (add or multiply) the resulting model will add a scale parameter for summed … … 380 380 color = 'blue' 381 381 except: 382 msg = "Easy Custom Sum/Multipy: Error occurred..."382 msg = "Easy Sum/Multipy Plugin: Error occurred..." 383 383 info = 'Error' 384 384 color = 'red' … … 501 501 self.factor = factor 502 502 self._operator = operator 503 self.explanation = " CustomModel = %s %s (model1 %s model2)\n" % \503 self.explanation = " Plugin Model = %s %s (model1 %s model2)\n" % \ 504 504 (self.factor, f_oper, self._operator) 505 505 self.explanationctr.SetLabel(self.explanation) … … 617 617 class EditorPanel(wx.ScrolledWindow): 618 618 """ 619 Custom model function editor619 Simple Plugin Model function editor 620 620 """ 621 621 def __init__(self, parent, base, path, title, *args, **kwds): … … 652 652 self.msg_sizer = None 653 653 self.warning = "" 654 self._description = "New Custom Model" 654 #This does not seem to be used anywhere so commenting out for now 655 # -- PDB 2/26/17 656 #self._description = "New Plugin Model" 655 657 self.function_tcl = None 656 658 self.math_combo = None … … 991 993 else: 992 994 self._notes = result 993 msg = "Successful! Please look for %s in CustomizedModels."%name995 msg = "Successful! Please look for %s in Plugin Models."%name 994 996 msg += " " + self._notes 995 997 info = 'Info' … … 1138 1140 def on_help(self, event): 1139 1141 """ 1140 Bring up the CustomModel Editor Documentation whenever1142 Bring up the New Plugin Model Editor Documentation whenever 1141 1143 the HELP button is clicked. 1142 1144 … … 1190 1192 #self.Destroy() 1191 1193 1192 ## Templates for custommodels1194 ## Templates for plugin models 1193 1195 1194 1196 CUSTOM_TEMPLATE = """ -
src/sas/sasgui/perspectives/calculator/pyconsole.py
rd472e86 rddbac66 302 302 success = show_model_output(self, fname) 303 303 304 # Update custommodel list in fitpage combobox304 # Update plugin model list in fitpage combobox 305 305 if success and self._manager != None and self.panel != None: 306 306 self._manager.set_edit_menu_helper(self.parent) -
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: -
src/sas/sasgui/plottools/plottables.py
r345e7e4 ra9f579c 1023 1023 """ 1024 1024 1025 def __init__(self, x, y, dx=None, dy=None ):1025 def __init__(self, x, y, dx=None, dy=None, lam=None, dlam=None): 1026 1026 """ 1027 1027 Draw points specified by x[i],y[i] in the current color/symbol. … … 1037 1037 self.x = x 1038 1038 self.y = y 1039 self.lam = lam 1039 1040 self.dx = dx 1040 1041 self.dy = dy 1042 self.dlam = dlam 1041 1043 self.source = None 1042 1044 self.detector = None
Note: See TracChangeset
for help on using the changeset viewer.