Changeset 5156918 in sasview for src/sas/sasgui/perspectives


Ignore:
Timestamp:
Mar 31, 2017 3:20:15 AM (7 years ago)
Author:
wojciech
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.
Message:

Merge branch 'master' of https://github.com/SasView/sasview into ticket-854

Location:
src/sas/sasgui/perspectives
Files:
10 edited

Legend:

Unmodified
Added
Removed
  • src/sas/sasgui/perspectives/calculator/model_editor.py

    ra08b89b rddbac66  
    55function of y (usually the intensity).  It also provides a drop down of 
    66standard available math functions.  Finally a full python editor panel for 
    7 complete customizatin is provided. 
    8  
    9 :TODO the writiong of the file and name checking (and maybe some other 
    10 funtions?) should be moved to a computational module which could be called 
    11 fropm a python script.  Basically one just needs to pass the name, 
     7complete customization is provided. 
     8 
     9:TODO the writing of the file and name checking (and maybe some other 
     10functions?) should be moved to a computational module which could be called 
     11from a python script.  Basically one just needs to pass the name, 
    1212description text and function text (or in the case of the composite editor 
    1313the names of the first and second model and the operator to be used). 
     
    6161    """ 
    6262    Dialog for easy custom composite models.  Provides a wx.Dialog panel 
    63     to choose two existing models (including pre-existing custom models which 
     63    to choose two existing models (including pre-existing Plugin Models which 
    6464    may themselves be composite models) as well as an operation on those models 
    6565    (add or multiply) the resulting model will add a scale parameter for summed 
     
    380380            color = 'blue' 
    381381        except: 
    382             msg = "Easy Custom Sum/Multipy: Error occurred..." 
     382            msg = "Easy Sum/Multipy Plugin: Error occurred..." 
    383383            info = 'Error' 
    384384            color = 'red' 
     
    501501        self.factor = factor 
    502502        self._operator = operator 
    503         self.explanation = "  Custom Model = %s %s (model1 %s model2)\n" % \ 
     503        self.explanation = "  Plugin Model = %s %s (model1 %s model2)\n" % \ 
    504504                           (self.factor, f_oper, self._operator) 
    505505        self.explanationctr.SetLabel(self.explanation) 
     
    617617class EditorPanel(wx.ScrolledWindow): 
    618618    """ 
    619     Custom model function editor 
     619    Simple Plugin Model function editor 
    620620    """ 
    621621    def __init__(self, parent, base, path, title, *args, **kwds): 
     
    652652        self.msg_sizer = None 
    653653        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" 
    655657        self.function_tcl = None 
    656658        self.math_combo = None 
     
    991993        else: 
    992994            self._notes = result 
    993             msg = "Successful! Please look for %s in Customized Models."%name 
     995            msg = "Successful! Please look for %s in Plugin Models."%name 
    994996            msg += "  " + self._notes 
    995997            info = 'Info' 
     
    11381140    def on_help(self, event): 
    11391141        """ 
    1140         Bring up the Custom Model Editor Documentation whenever 
     1142        Bring up the New Plugin Model Editor Documentation whenever 
    11411143        the HELP button is clicked. 
    11421144 
     
    11901192        #self.Destroy() 
    11911193 
    1192 ## Templates for custom models 
     1194## Templates for plugin models 
    11931195 
    11941196CUSTOM_TEMPLATE = """ 
  • src/sas/sasgui/perspectives/calculator/pyconsole.py

    rd472e86 rddbac66  
    302302        success = show_model_output(self, fname) 
    303303 
    304         # Update custom model list in fitpage combobox 
     304        # Update plugin model list in fitpage combobox 
    305305        if success and self._manager != None and self.panel != None: 
    306306            self._manager.set_edit_menu_helper(self.parent) 
  • src/sas/sasgui/perspectives/fitting/basepage.py

    r1a8e13f0 r5156918  
    5353    ON_MAC = True 
    5454 
     55CUSTOM_MODEL = 'Plugin Models' 
     56 
    5557class BasicPage(ScrolledPanel, PanelBase): 
    5658    """ 
    57     This class provide general structure of fitpanel page 
     59    This class provide general structure of the fitpanel page 
    5860    """ 
    5961    # Internal name for the AUI manager 
     
    118120        self.dxw = None 
    119121        # pinhole smear 
    120         self.dx_min = None 
    121         self.dx_max = None 
     122        self.dx_percent = None 
    122123        # smear attrbs 
    123124        self.enable_smearer = None 
     
    677678    def _copy_info(self, flag): 
    678679        """ 
    679         Send event dpemding on flag 
    680  
    681         : Param flag: flag that distinguish event 
     680        Send event depending on flag 
     681 
     682        : Param flag: flag that distinguishes the event 
    682683        """ 
    683684        # messages depending on the flag 
     
    847848        self.state.pinhole_smearer = \ 
    848849                                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) 
    851851        self.state.dxl = copy.deepcopy(self.dxl) 
    852852        self.state.dxw = copy.deepcopy(self.dxw) 
     
    11191119        :precondition: the page is already drawn or created 
    11201120 
    1121         :postcondition: the state of the underlying data change as well as the 
     1121        :postcondition: the state of the underlying data changes as well as the 
    11221122            state of the graphic interface 
    11231123        """ 
     
    11671167        self._show_combox(None) 
    11681168        from models import PLUGIN_NAME_BASE 
    1169         if self.categorybox.GetValue() == 'Customized Models' \ 
     1169        if self.categorybox.GetValue() == CUSTOM_MODEL \ 
    11701170                and PLUGIN_NAME_BASE not in state.formfactorcombobox: 
    11711171            state.formfactorcombobox = \ 
     
    12451245        # we have two more options for smearing 
    12461246        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) 
    12531252            self.onPinholeSmear(event=None) 
    12541253        elif self.slit_smearer.GetValue(): 
     
    13351334    def _selectDlg(self): 
    13361335        """ 
    1337         open a dialog file to selected the customized dispersity 
     1336        open a dialog file to select the customized polydispersity function 
    13381337        """ 
    13391338        if self.parent is not None: 
     
    17471746    def _set_multfactor_combobox(self, multiplicity=10): 
    17481747        """ 
    1749         Set comboBox for muitfactor of CoreMultiShellModel 
     1748        Set comboBox for multitfactor of CoreMultiShellModel 
    17501749        :param multiplicit: no. of multi-functionality 
    17511750        """ 
     
    17851784        Fill panel's combo box according to the type of model selected 
    17861785        """ 
    1787         custom_model = 'Customized Models' 
     1786 
    17881787        mod_cat = self.categorybox.GetStringSelection() 
    17891788        self.structurebox.SetSelection(0) 
     
    17941793        m_list = [] 
    17951794        try: 
    1796             if mod_cat == custom_model: 
     1795            if mod_cat == CUSTOM_MODEL: 
    17971796                for model in self.model_list_box[mod_cat]: 
    17981797                    m_list.append(self.model_dict[model.name]) 
     
    34303429        fills out the category list box 
    34313430        """ 
    3432         uncat_str = 'Customized Models' 
     3431        uncat_str = 'Plugin Models' 
    34333432        self._read_category_info() 
    34343433 
     
    34593458        self.model_box.Clear() 
    34603459 
    3461         if category == 'Customized Models': 
     3460        if category == 'Plugin Models': 
    34623461            for model in self.model_list_box[category]: 
    34633462                str_m = str(model).split(".")[0] 
  • src/sas/sasgui/perspectives/fitting/fitpage.py

    r1a8e13f0 r5156918  
    2929_BOX_WIDTH = 76 
    3030_DATA_BOX_WIDTH = 300 
    31 SMEAR_SIZE_L = 0.00 
    3231SMEAR_SIZE_H = 0.00 
    33  
     32CUSTOM_MODEL = 'Plugin Models' 
    3433 
    3534class FitPage(BasicPage): 
     
    164163        On_select_data 
    165164        """ 
    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 
    171167            data = self.dataSource.GetClientData(pos) 
    172168            self.set_data(data) 
     
    213209              "Please enter only the value of interest to customize smearing..." 
    214210        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..." 
    216212        smear_message_2d_x_title = "<dQp>[1/A]:" 
    217213        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[%]:" 
    220215        smear_message_slit_height_title = "Slit height[1/A]:" 
    221216        smear_message_slit_width_title = "Slit width[1/A]:" 
     
    256251        self.Bind(wx.EVT_RADIOBUTTON, self.onWeighting, 
    257252                  id=self.dI_idata.GetId()) 
    258         self.dI_didata.SetValue(True) 
     253        self.dI_noweight.SetValue(True) 
    259254        # add 4 types of weighting to the sizer 
    260255        sizer_weighting.Add(self.dI_noweight, 0, wx.LEFT, 10) 
     
    266261        sizer_weighting.Add(self.dI_idata) 
    267262        sizer_weighting.Add((10, 10)) 
    268         self.dI_noweight.Enable(False) 
     263        self.dI_noweight.Enable(True) 
    269264        self.dI_didata.Enable(False) 
    270265        self.dI_sqrdata.Enable(False) 
     
    310305         
    311306        # 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) 
    320312        self.smear_slit_height = ModelTextCtrl(self, wx.ID_ANY, 
    321313                            size=(_BOX_WIDTH - 25, 20), 
     
    336328 
    337329        # 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)) 
    340331        self.smear_slit_height.SetValue(str(self.dxl)) 
    341332        self.smear_slit_width.SetValue(str(self.dxw)) 
     
    362353        self.Bind(wx.EVT_RADIOBUTTON, self.onSlitSmear, 
    363354                  id=self.slit_smearer.GetId()) 
    364         self.enable_smearer.SetValue(True) 
     355        self.disable_smearer.SetValue(True) 
    365356 
    366357        sizer_smearer.Add(self.disable_smearer, 0, wx.LEFT, 10) 
     
    429420        self.smear_description_2d_y.SetToolTipString( 
    430421                                    " 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) 
    435425        self.smear_description_slit_height = wx.StaticText(self, wx.ID_ANY, 
    436426                        smear_message_slit_height_title, style=wx.ALIGN_LEFT) 
     
    456446        self.sizer_new_smear.Add((15, -1)) 
    457447        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) 
    460448        self.sizer_new_smear.Add(self.smear_description_slit_height, 
    461449                                 0, wx.CENTER, 10) 
    462450 
    463         self.sizer_new_smear.Add(self.smear_pinhole_min, 0, wx.CENTER, 10) 
    464451        self.sizer_new_smear.Add(self.smear_slit_height, 0, wx.CENTER, 10) 
    465452        self.sizer_new_smear.Add(self.smear_data_left, 0, wx.CENTER, 10) 
     
    467454        self.sizer_new_smear.Add(self.smear_description_2d_y, 
    468455                                 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, 
    470457                                 0, wx.CENTER, 10) 
    471458        self.sizer_new_smear.Add(self.smear_description_slit_width, 
    472459                                 0, wx.CENTER, 10) 
    473460 
    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) 
    475462        self.sizer_new_smear.Add(self.smear_slit_width, 0, wx.CENTER, 10) 
    476463        self.sizer_new_smear.Add(self.smear_data_right, 0, wx.CENTER, 10) 
     
    12491236            wx.PostEvent(self.parent, new_event) 
    12501237            # update list of plugins if new plugin is available 
    1251             custom_model = 'Customized Models' 
     1238            custom_model = CUSTOM_MODEL 
    12521239            mod_cat = self.categorybox.GetStringSelection() 
    12531240            if mod_cat == custom_model: 
     
    12711258            if copy_flag: 
    12721259                self.get_paste_params(copy_flag) 
    1273                 wx.CallAfter(self._onDraw, None) 
     1260            wx.CallAfter(self._onDraw, None) 
    12741261 
    12751262        else: 
     
    15841571        if self.dxw is None: 
    15851572            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 
    15901575 
    15911576    def _get_smear_info(self): 
     
    16271612        elif data.dxl is not None or data.dxw is not None: 
    16281613            self.smear_type = "Slit" 
    1629             if data.dxl is not None and not numpy.all(data.dxl, 0): 
     1614            if data.dxl is not None and numpy.all(data.dxl, 0): 
    16301615                self.dq_l = data.dxl[0] 
    1631             if data.dxw is not None and not numpy.all(data.dxw, 0): 
     1616            if data.dxw is not None and numpy.all(data.dxw, 0): 
    16321617                self.dq_r = data.dxw[0] 
    16331618        # return self.smear_type,self.dq_l,self.dq_r 
     
    16491634            self.smear_description_2d_y.Show(True) 
    16501635            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) 
    16531637        # smear from data 
    16541638        elif self.enable_smearer.GetValue(): 
     
    16611645                    self.smear_description_slit_width.Show(True) 
    16621646                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) 
    16651648                self.smear_description_smear_type.Show(True) 
    16661649                self.smear_description_type.Show(True) 
     
    16711654            if self.smear_type == 'Pinhole': 
    16721655                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) 
    16781659        # custom slit smear 
    16791660        elif self.slit_smearer.GetValue(): 
     
    17001681        self.smear_data_left.Hide() 
    17011682        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() 
    17061685        self.smear_description_slit_height.Hide() 
    17071686        self.smear_slit_height.Hide() 
     
    19271906 
    19281907            # more disables for 2D 
     1908            di_flag = False 
     1909            dq_flag = False 
    19291910            if self.data.__class__.__name__ == "Data2D" or \ 
    19301911                        self.enable2D: 
     
    19321913                self.pinhole_smearer.Enable(True) 
    19331914                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 
    19441921            else: 
    19451922                self.slit_smearer.Enable(True) 
    19461923                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 
    19581949            # Enable weighting radio buttons 
    19591950            self.dI_noweight.Enable(True) 
     
    19971988            self.EditMask_title.Disable() 
    19981989 
     1990        self.on_smear_helper() 
    19991991        self.on_set_focus(None) 
    20001992        self.Refresh() 
     
    22282220            # event case of radio button 
    22292221            if tcrtl.GetValue(): 
    2230                 self.dx_min = 0.0 
    2231                 self.dx_max = 0.0 
     2222                self.dx_percent = 0.0 
    22322223                is_new_pinhole = True 
    22332224            else: 
     
    22662257        """ 
    22672258        # 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 
    22722262        try: 
    2273             dx_min = float(pin_min) 
     2263            dx_percent = float(pin_percent) 
    22742264        except: 
    22752265            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: 
    22852267            return True 
    22862268        return False 
     
    23082290        msg = None 
    23092291 
    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") 
    23182296            msg = "Model Error:wrong value entered!!!" 
    23192297        else: 
    23202298            if len_data < 2: 
    23212299                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") 
    23262303                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 
    23312306                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 
    23362309                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 
    23512311            self.current_smearer = smear_selection(data, self.model) 
    23522312            # 2D need to set accuracy 
     
    23582318            wx.PostEvent(self._manager.parent, StatusEvent(status=msg)) 
    23592319        else: 
    2360             get_pin_min.SetBackgroundColour("white") 
    2361             get_pin_max.SetBackgroundColour("white") 
     2320            get_pin_percent.SetBackgroundColour("white") 
    23622321        # set smearing value whether or not the data contain the smearing info 
    23632322 
  • src/sas/sasgui/perspectives/fitting/fitting.py

    r1a8e13f0 r5156918  
    225225 
    226226        self.id_edit = wx.NewId() 
    227         editmodel_help = "Edit customized model sample file" 
    228227        self.menu1.AppendMenu(self.id_edit, "Plugin Model Operations", 
    229                               self.edit_model_menu, editmodel_help) 
     228                              self.edit_model_menu) 
    230229        #create  menubar items 
    231230        return [(self.menu1, self.sub_menu)] 
     
    260259            self.update_custom_combo() 
    261260            if os.path.isfile(p_path): 
    262                 msg = "Sorry! Could not be able to delete the default " 
    263                 msg += "custom model... \n" 
     261                msg = "Sorry! unable to delete the default " 
     262                msg += "plugin model... \n" 
    264263                msg += "Please manually remove the files (.py, .pyc) " 
    265264                msg += "in the 'plugin_models' folder \n" 
     
    274273                    if item.GetLabel() == label: 
    275274                        self.edit_menu.DeleteItem(item) 
    276                         msg = "The custom model, %s, has been deleted." % label 
     275                        msg = "The plugin model, %s, has been deleted." % label 
    277276                        evt = StatusEvent(status=msg, type='stop', info='info') 
    278277                        wx.PostEvent(self.parent, evt) 
     
    331330            temp = self.fit_panel.reset_pmodel_list() 
    332331            if temp: 
    333                 # Set the new custom model list for all fit pages 
     332                # Set the new plugin model list for all fit pages 
    334333                for uid, page in self.fit_panel.opened_pages.iteritems(): 
    335334                    if hasattr(page, "formfactorbox"): 
     
    17461745                                          data_id="Data  " + data.name + " unsmeared", 
    17471746                                          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)") 
    17571755 
    17581756            current_pg = self.fit_panel.get_page_by_id(page_id) 
     
    19551953                ## then kill itself but cannot.  Paul Kienzle came up with 
    19561954                ## 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. 
    19581957                ## We still don't know why the fit sometimes lauched a second 
    19591958                ## thread -- something which should also be investigated. 
  • src/sas/sasgui/perspectives/fitting/media/fitting_help.rst

    r26c8be3 r5295cf5  
    3434*  in *Single* fit mode - individual data sets are fitted independently one-by-one 
    3535 
    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) 
    3739 
    3840*  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!) 
     
    4345----------------- 
    4446 
    45 By default, the models in SasView are grouped into five categories 
    46  
    47 *  *Shapes* - models describing 'objects' (spheres, cylinders, etc) 
     47The 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) 
    4856*  *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) 
    5158*  *Structure Factor* - S(Q) models 
     59*  *Plugin Models* - User-created (custom/non-library) Python models 
    5260 
    5361Use the *Category* drop-down menu to chose a category of model, then select 
     
    8492.. image:: cat_fig0.bmp 
    8593 
    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. 
     94The categorization of all models except the user supplied Plugin Models can be 
     95reassigned, added to, and removed using *Category Manager*. Models can also be 
     96hidden from view in the drop-down menus. 
    8997 
    9098.. image:: cat_fig1.bmp 
     
    93101^^^^^^^^^^^^^^^^^ 
    94102 
    95 To change category, highlight a model in the list by left-clicking on its entry and 
    96 then click the *Modify* button. Use the *Change Category* panel that appears to make 
    97 the required changes. 
     103To change category, highlight a model in the list by left-clicking on its entry 
     104and then click the *Modify* button. Use the *Change Category* panel that appears 
     105to make the required changes. 
    98106 
    99107.. image:: cat_fig2.bmp 
     
    106114^^^^^^^^^^^^^^^^^^^^^ 
    107115 
    108 Use the *Enable All / Disable All* buttons and the check boxes beside each model to 
    109 select the models to show/hide. To apply the selection, click *Ok*. Otherwise click 
    110 *Cancel*. 
     116Use the *Enable All / Disable All* buttons and the check boxes beside each model 
     117to select the models to show/hide. To apply the selection, click *Ok*. Otherwise 
     118click *Cancel*. 
    111119 
    112120*NB: It may be necessary to change to a different category and then back again* 
     
    118126--------------- 
    119127 
    120 For a complete list of all the library models available in SasView, see the `Model Documentation <../../../index.html>`_ . 
     128For a complete list of all the library models available in SasView, see 
     129the `Model Documentation <../../../index.html>`_ . 
    121130 
    122131It is also possible to add your own models. 
     
    131140There are essentially three ways to generate new fitting models for SasView: 
    132141 
    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!) 
    136149 
    137150Please read the guidance on :ref:`Writing_a_Plugin` before proceeding. 
     
    163176^^^^^^^^^^^^^^^^ 
    164177 
    165 Relatively straightforward models can be programmed directly from the SasView GUI  
    166 using the *New Plugin Model Function*. 
     178Relatively straightforward models can be programmed directly from the SasView 
     179GUI using the *New Plugin Model Function*. 
    167180 
    168181.. image:: new_model.bmp 
     
    175188*checked*\ . 
    176189 
    177 Also note that the 'Fit Parameters' have been split into two sections: those which  
    178 can be polydisperse (shape and orientation parameters) and those which are not 
    179 (eg, scattering length densities). 
     190Also note that the 'Fit Parameters' have been split into two sections: those 
     191which can be polydisperse (shape and orientation parameters) and those which are 
     192not (eg, scattering length densities). 
    180193 
    181194A model file generated by this option can be viewed and further modified using 
     
    187200.. image:: sum_model.bmp 
    188201 
    189 This option creates a custom model of the form:: 
    190  
    191      Custom Model = scale_factor \* {(scale_1 \* model_1) \+ (scale_2 \* model_2)} \+ background 
     202This option creates a custom Plugin Model of the form:: 
     203 
     204     Plugin Model = scale_factor * {(scale_1 * model_1) +/- (scale_2 * model_2)} + background 
    192205 
    193206or:: 
    194207 
    195      Custom Model = scale_factor \* model_1 \* model_2 \+ background 
     208     Plugin Model = scale_factor * model_1 /* model_2 + background 
    196209 
    197210In the *Easy Sum/Multi Editor* give the new model a function name and brief 
     
    232245Simply highlight the plugin model to be removed. The operation is final!!! 
    233246 
    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.* 
    235248 
    236249Load Plugin Models 
    237250^^^^^^^^^^^^^^^^^^ 
    238251 
    239 This option loads (or re-loads) all models present in the *~\\.sasview\\plugin_models* folder. 
     252This option loads (or re-loads) all models present in the 
     253*~\\.sasview\\plugin_models* folder. 
    240254 
    241255.. ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ 
     
    400414:ref:`Assessing_Fit_Quality`. 
    401415 
    402 *NB: If you need to use a customized 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 
     417available first (see* :ref:`Adding_your_own_models` *).* 
    404418 
    405419Method 
     
    484498If multiple data sets are in one file, load just that file. *Unselect All Data*, then 
    485499select 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 customized model, you must ensure that model is available* 
    489 *first (see* :ref:`Adding_your_own_models` *).* 
     500above under :ref:`Single_Fit_Mode`. 
     501 
     502*NB: If you need to use a custom Plugin Model, you must ensure that model is 
     503available first (see* :ref:`Adding_your_own_models` *).* 
    490504 
    491505Method 
  • src/sas/sasgui/perspectives/fitting/media/plugin.rst

    rca6cbc1c r984f3fc  
    2727 
    2828the next time SasView is started it will compile the plugin and add 
    29 it to the list of *Customized Models* in a FitPage. 
     29it to the list of *Plugin Models* in a FitPage. 
    3030 
    3131SasView models can be of three types: 
     
    364364  - the limits will show up as the default limits for the fit making it easy, 
    365365    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. 
    366369 
    367370- **"type"** can be one of: "", "sld", "volume", or "orientation". 
  • src/sas/sasgui/perspectives/fitting/model_thread.py

    rc1681ea rc1c9929  
    177177            unsmeared_output = numpy.zeros((len(self.data.x))) 
    178178            unsmeared_output[first_bin:last_bin+1] = self.model.evalDistribution(mask) 
     179            self.smearer.model = self.model 
    179180            output = self.smearer(unsmeared_output, first_bin, last_bin) 
    180181 
  • src/sas/sasgui/perspectives/fitting/models.py

    r0de74af r11b094f  
    325325                    self.plugins.append(plug) 
    326326                    self.model_dictionary[name] = plug 
    327             self.model_combobox.set_list("Customized Models", self.plugins) 
     327            self.model_combobox.set_list("Plugin Models", self.plugins) 
    328328            return self.model_combobox.get_list() 
    329329        else: 
     
    346346            self.model_dictionary[name] = plug 
    347347 
    348         self.model_combobox.reset_list("Customized Models", self.plugins) 
     348        self.model_combobox.reset_list("Plugin Models", self.plugins) 
    349349        return self.model_combobox.get_list() 
    350350 
     
    389389#                                     self.shape_indep_list) 
    390390        self.model_combobox.set_list("Structure Factors", self.struct_list) 
    391         self.model_combobox.set_list("Customized Models", self.plugins) 
     391        self.model_combobox.set_list("Plugin Models", self.plugins) 
    392392        self.model_combobox.set_list("P(Q)*S(Q)", self.multiplication_factor) 
    393393        self.model_combobox.set_list("multiplication", 
  • src/sas/sasgui/perspectives/fitting/pagestate.py

    r6d2b50b r27109e5  
    3333from sas.sascalc.dataloader.data_info import Data2D, Collimation, Detector 
    3434from sas.sascalc.dataloader.data_info import Process, Aperture 
     35 
    3536# Information to read/write state as xml 
    3637FITTING_NODE_NAME = 'fitting_plug_in' 
    3738CANSAS_NS = "cansas1d/1.0" 
     39 
     40CUSTOM_MODEL = 'Plugin Models' 
     41CUSTOM_MODEL_OLD = 'Customized Models' 
    3842 
    3943LIST_OF_DATA_ATTRIBUTES = [["is_data", "is_data", "bool"], 
     
    7074                            ["dq_l", "dq_l", "float"], 
    7175                            ["dq_r", "dq_r", "float"], 
    72                             ["dx_max", "dx_max", "float"], 
    73                             ["dx_min", "dx_min", "float"], 
     76                            ["dx_percent", "dx_percent", "float"], 
    7477                            ["dxl", "dxl", "float"], 
    7578                            ["dxw", "dxw", "float"]] 
     
    211214        self.dq_l = None 
    212215        self.dq_r = None 
    213         self.dx_max = None 
    214         self.dx_min = None 
     216        self.dx_percent = None 
     217        self.dx_old = False 
    215218        self.dxl = None 
    216219        self.dxw = None 
     
    339342        obj.dq_l = copy.deepcopy(self.dq_l) 
    340343        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) 
    343346        obj.dxl = copy.deepcopy(self.dxl) 
    344347        obj.dxw = copy.deepcopy(self.dxw) 
     
    366369        :return: None 
    367370        """ 
     371        if self.categorycombobox == CUSTOM_MODEL_OLD: 
     372            self.categorycombobox = CUSTOM_MODEL 
    368373        if self.formfactorcombobox == '': 
    369374            FIRST_FORM = { 
     
    378383                'Sphere' : 'adsorbed_layer', 
    379384                'Structure Factor' : 'hardsphere', 
    380                 'Customized Models' : '' 
     385                CUSTOM_MODEL : '' 
    381386            } 
    382387            if self.categorycombobox == '': 
     
    556561        rep += "dq_l  : %s\n" % self.dq_l 
    557562        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) 
    560564        rep += "dxl  : %s\n" % str(self.dxl) 
    561565        rep += "dxw : %s\n" % str(self.dxw) 
     
    815819 
    816820        attr = newdoc.createAttribute("version") 
    817         import sasview 
     821        from sas import sasview 
    818822        attr.nodeValue = sasview.__version__ 
    819823        # attr.nodeValue = '1.0' 
     
    10421046                    setattr(self, item[0], parse_entry_helper(node, item)) 
    10431047 
     1048                dx_old_node = get_content('ns:%s' % 'dx_min', entry) 
    10441049                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)) 
    10471058 
    10481059                for item in LIST_OF_STATE_PARAMETERS: 
Note: See TracChangeset for help on using the changeset viewer.