Changeset 7609f1a in sasview for sansview/perspectives/fitting


Ignore:
Timestamp:
Mar 26, 2010 3:50:29 PM (15 years ago)
Author:
Jae Cho <jhjcho@…>
Branches:
master, ESS_GUI, ESS_GUI_Docs, ESS_GUI_batch_fitting, ESS_GUI_bumps_abstraction, ESS_GUI_iss1116, ESS_GUI_iss879, ESS_GUI_iss959, ESS_GUI_opencl, ESS_GUI_ordering, ESS_GUI_sync_sascalc, costrafo411, magnetic_scatt, release-4.1.1, release-4.1.2, release-4.2.2, release_4.0.1, ticket-1009, ticket-1094-headless, ticket-1242-2d-resolution, ticket-1243, ticket-1249, ticket885, unittest-saveload
Children:
83ad478
Parents:
c6036f5
Message:

Added two more types of smear selections: Removed kill_focus on param box because it becomes very expensive with extensive model calculation

Location:
sansview/perspectives/fitting
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • sansview/perspectives/fitting/basepage.py

    r2f189dc r7609f1a  
    172172                      if set_focus_callback is None else set_focus_callback 
    173173            self.Bind(wx.EVT_SET_FOCUS, self._on_set_focus) 
    174             self.Bind(wx.EVT_KILL_FOCUS, parent._onparamEnter \ 
     174            self.Bind(wx.EVT_KILL_FOCUS, self._silent_kill_focus \ 
    175175                      if kill_focus_callback is None else kill_focus_callback)                 
    176176            self.Bind(wx.EVT_TEXT_ENTER, parent._onparamEnter \ 
     
    210210                    if start==end: 
    211211                        control.SetSelection(-1,-1) 
    212                   
     212                         
     213        def _silent_kill_focus(self,event): 
     214            """ 
     215               do nothing to kill focus 
     216            """ 
     217            event.Skip() 
     218            pass 
     219     
    213220    def set_page_info(self, page_info): 
    214221        """ 
     
    318325        self.event_owner = owner     
    319326        self.state.event_owner = owner 
    320    
     327         
    321328    def get_data(self): 
    322329        """ 
    323330            return the current data  
    324331        """ 
    325         return self.data 
     332        return self.data   
     333     
    326334    def set_manager(self, manager): 
    327335        """ 
     
    664672            self.state.enable_smearer = copy.deepcopy(self.enable_smearer.GetValue()) 
    665673            self.state.disable_smearer = copy.deepcopy(self.disable_smearer.GetValue()) 
    666              
     674 
     675        self.state.pinhole_smearer = copy.deepcopy(self.pinhole_smearer.GetValue()) 
     676        self.state.slit_smearer = copy.deepcopy(self.slit_smearer.GetValue())   
     677                   
    667678        if hasattr(self,"disp_box"): 
    668679            self.state.disp_box = self.disp_box.GetCurrentSelection() 
     
    744755            self.state.enable_smearer = copy.deepcopy(self.enable_smearer.GetValue()) 
    745756            self.state.disable_smearer = copy.deepcopy(self.disable_smearer.GetValue()) 
     757             
     758        self.state.pinhole_smearer = copy.deepcopy(self.pinhole_smearer.GetValue()) 
     759        self.state.slit_smearer = copy.deepcopy(self.slit_smearer.GetValue())   
    746760             
    747761        if hasattr(self,"disp_box"): 
     
    897911            self.disable_smearer.SetValue(state.disable_smearer) 
    898912            self.onSmear(event=None)            
     913        self.pinhole_smearer.SetValue(state.pinhole_smearer) 
     914        self.slit_smearer.SetValue(state.slit_smearer) 
     915        ## we have two more options for smearing 
     916        if self.pinhole_smearer.GetValue(): self.onPinholeSmear(event=None) 
     917        elif self.slit_smearer.GetValue(): self.onSlitSmear(event=None) 
    899918        
    900919        ## reset state of checkbox,textcrtl  and dispersity parameters value 
     
    10331052        """ 
    10341053        #flag for qmin qmax check values 
    1035         flag =False 
     1054        flag = True 
    10361055        is_modified = False 
    10371056        ##So make sure that update param values on_Fit. 
     
    10541073                if tempmax != self.qmax_x: 
    10551074                    self.qmax_x = tempmax 
    1056                 flag = True 
    1057             else: 
    1058                 flag = False 
    1059         else: 
     1075                if tempmax == tempmin: 
     1076                    flag = False     
     1077                temp_smearer = None 
     1078                if not self.disable_smearer.GetValue(): 
     1079                    temp_smearer= self.current_smearer 
     1080                    if self.slit_smearer.GetValue(): 
     1081                        flag = self.update_slit_smear() 
     1082                    elif self.pinhole_smearer.GetValue(): 
     1083                        flag = self.update_pinhole_smear() 
     1084                    else: 
     1085                        self.manager.set_smearer(smearer=temp_smearer, qmin= float(self.qmin_x), 
     1086                                                 qmax= float(self.qmax_x)) 
     1087                elif self.data.__class__.__name__ !="Data2D": 
     1088                    self.manager.set_smearer(smearer=temp_smearer, qmin= float(self.qmin_x), 
     1089                                                 qmax= float(self.qmax_x)) 
     1090            else: flag = False 
     1091        else:  
    10601092            flag = False 
    1061             msg= "Cannot Fit :Must select a model!!!  " 
     1093         
     1094        if not flag: 
     1095            msg= "Cannot Fit :Must select a model or Fitting range is not valid!!!  " 
    10621096            wx.PostEvent(self.parent.parent, StatusEvent(status = msg )) 
    1063          
     1097             
     1098        self.save_current_state() 
    10641099        return flag                            
    10651100                
     
    12921327            temp_smear=None 
    12931328            if hasattr(self, "enable_smearer"): 
    1294                 if self.enable_smearer.GetValue(): 
    1295                     temp_smear= self.smearer 
     1329                if not self.disable_smearer.GetValue(): 
     1330                    temp_smear= self.current_smearer 
    12961331             
    12971332            self.manager.draw_model(self.model, data=self.data, 
     
    14491484      
    14501485        return 0 
    1451      
    1452     def _onparamEnter(self,event): 
     1486 
     1487    #def _onparamEnter(self,event): 
    14531488        """  
    1454             when enter value on panel redraw model according to changed 
     1489        #when enter value on panel redraw model according to changed 
     1490        """ 
    14551491        """ 
    14561492        tcrtl= event.GetEventObject() 
     
    14761512            #event.Skip() 
    14771513            return  
    1478     
     1514       """ 
    14791515    def _onQrangeEnter(self, event): 
    14801516        """ 
     
    15991635            qmin = float(qmin_ctrl.GetValue()) 
    16001636            qmax = float(qmax_ctrl.GetValue()) 
    1601             if qmin < qmax: 
     1637            if qmin <= qmax: 
    16021638                #Make sure to set both colours white.   
    16031639                qmin_ctrl.SetBackgroundColour(wx.WHITE) 
     
    19461982 
    19471983        self.qmin    = self.ModelTextCtrl(self, -1,size=(_BOX_WIDTH,20),style=wx.TE_PROCESS_ENTER, 
    1948                                             kill_focus_callback = self._onQrangeEnter, 
    1949                                             text_enter_callback = self._onQrangeEnter) 
     1984                                            text_enter_callback = self._onparamEnter) 
    19501985        self.qmin.SetValue(str(self.qmin_x)) 
    19511986        self.qmin.SetToolTipString("Minimun value of Q in linear scale.") 
    19521987      
    19531988        self.qmax    = self.ModelTextCtrl(self, -1,size=(_BOX_WIDTH,20),style=wx.TE_PROCESS_ENTER, 
    1954                                             kill_focus_callback = self._onQrangeEnter, 
    1955                                             text_enter_callback = self._onQrangeEnter) 
     1989                                            text_enter_callback = self._onparamEnter) 
    19561990        self.qmax.SetValue(str(self.qmax_x)) 
    19571991        self.qmax.SetToolTipString("Maximum value of Q in linear scale.") 
     
    20372071        #On 'Reset' button  for Q range clicked 
    20382072        """ 
     2073        flag = True 
    20392074        if self.check_invalid_panel(): 
    20402075            return 
     
    20492084            self.qmin_x = min(self.data.x) 
    20502085            self.qmax_x = max(self.data.x) 
     2086            # check smearing 
     2087            if not self.disable_smearer.GetValue(): 
     2088                temp_smearer= self.current_smearer 
     2089                ## set smearing value whether or not the data contain the smearing info 
     2090                if self.slit_smearer.GetValue(): 
     2091                    flag = self.update_slit_smear() 
     2092                elif self.pinhole_smearer.GetValue(): 
     2093                    flag = self.update_pinhole_smear() 
     2094                else: 
     2095                    flag = True 
    20512096        else: 
    20522097            self.qmin_x = _QMIN_DEFAULT 
     
    20552100            self.state.npts = self.num_points 
    20562101             
    2057  
     2102        if flag == False: 
     2103            msg= "Cannot Plot :Must enter a number!!!  " 
     2104            wx.PostEvent(self.parent.parent, StatusEvent(status = msg )) 
     2105             
     2106        self.save_current_state() 
    20582107        self.state.qmin = self.qmin_x 
    20592108        self.state.qmax = self.qmax_x 
  • sansview/perspectives/fitting/fitpage.py

    r00e8df8 r7609f1a  
    99import time 
    1010from sans.models.dispersion_models import ArrayDispersion, GaussianDispersion 
    11  
     11from DataLoader.data_info import Data1D 
    1212from sans.guicomm.events import StatusEvent    
    1313from sans.guiframe.utils import format_number,check_float 
    14   
     14 
    1515## event to post model to fit to fitting plugins 
    1616(ModelEventbox, EVT_MODEL_BOX) = wx.lib.newevent.NewEvent() 
     
    2121_BOX_WIDTH = 76 
    2222_DATA_BOX_WIDTH = 300 
     23SMEAR_SIZE_L = 0.005 
     24SMEAR_SIZE_H = 0.01 
     25 
    2326import basepage 
    2427from basepage import BasicPage 
     
    4750        ## default fitengine type 
    4851        self.engine_type = None 
     52        ## smear default 
     53        self.smearer = None 
     54        self.current_smearer = None 
     55        self.dxl = None 
     56        self.dxw = None 
     57        self.dx_min = None 
     58        self.dx_max = None 
    4959         
    5060        ## draw sizer 
    5161        self._fill_datainfo_sizer() 
    52         
     62         
     63        # get smear info from data 
     64        self._get_smear_info() 
     65         
    5366        self._fill_model_sizer( self.sizer1) 
    54   
     67         
     68        self._get_defult_custom_smear() 
     69         
    5570        self._fill_range_sizer()  
    56         self.enable_smearer.Disable() 
    57         self.disable_smearer.Disable() 
     71         
    5872        if self.data is None: 
    5973            self.formfactorbox.Disable() 
    6074            self.structurebox.Disable() 
    6175        else: 
    62             self.smearer = smear_selection(self.data) 
     76            self.smearer = smear_selection( self.data ) 
    6377            if self.smearer ==None: 
    6478                self.enable_smearer.Disable() 
    65                 self.disable_smearer.Disable() 
     79                #self.disable_smearer.Disable() 
     80 
    6681        self.disp_cb_dict = {} 
    6782        ## to update the panel according to the fit engine type selected 
     
    155170        """ 
    156171        title = "Fitting" 
     172        #smear messages & titles 
     173        smear_message_none  =  "No smearing is selected..." 
     174        smear_message_dqdata  =  "The dQ data is being used for smearing..." 
     175        smear_message_2d  =  "No smearing is supported for 2D model fitting..." 
     176        smear_message_new_ssmear  =  "Please enter only the value of interest to customize smearing..." 
     177        smear_message_new_psmear  =  "Please enter both; the dQ will be generated by interpolation..." 
     178        smear_message_pinhole_min_title = "dQ_min[1/A]:" 
     179        smear_message_pinhole_max_title = "dQ_max[1/A]:" 
     180        smear_message_slit_height_title = "Slit height[1/A]:" 
     181        smear_message_slit_width_title = "Slit width[1/A]:" 
     182         
     183        self._get_smear_info() 
     184 
    157185        box_description_range = wx.StaticBox(self, -1,str(title)) 
    158186        boxsizer_range = wx.StaticBoxSizer(box_description_range, wx.VERTICAL) 
     
    166194         
    167195        sizer_fit.Add((5,5),1, wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 5)         
    168         sizer_fit.Add(self.btFit,0, wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 35)  
     196        sizer_fit.Add(self.btFit,0, wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 63)  
    169197        sizer_fit.Layout() 
     198        self.sizer_set_smearer = wx.BoxSizer(wx.VERTICAL) 
    170199        sizer_smearer = wx.BoxSizer(wx.HORIZONTAL) 
     200        self.sizer_new_smear= wx.BoxSizer(wx.HORIZONTAL) 
     201        self.sizer_set_masking = wx.BoxSizer(wx.HORIZONTAL) 
     202        sizer_chi2 = wx.BoxSizer(wx.VERTICAL) 
     203        smear_set_box= wx.StaticBox(self, -1,'Set Instrumental Smearing') 
     204        sizer_smearer_box = wx.StaticBoxSizer(smear_set_box, wx.HORIZONTAL) 
     205        sizer_smearer_box.SetMinSize((_DATA_BOX_WIDTH,85)) 
     206         
     207        #textcntrl for new resolution 
     208        self.smear_pinhole_max = self.ModelTextCtrl(self, -1,size=(_BOX_WIDTH-20,20),style=wx.TE_PROCESS_ENTER, 
     209                                            text_enter_callback = self.onPinholeSmear) 
     210        self.smear_pinhole_min = self.ModelTextCtrl(self, -1,size=(_BOX_WIDTH-20,20),style=wx.TE_PROCESS_ENTER, 
     211                                            text_enter_callback = self.onPinholeSmear) 
     212        self.smear_slit_height= self.ModelTextCtrl(self, -1,size=(_BOX_WIDTH-20,20),style=wx.TE_PROCESS_ENTER, 
     213                                            text_enter_callback = self.onSlitSmear) 
     214        self.smear_slit_width = self.ModelTextCtrl(self, -1,size=(_BOX_WIDTH-20,20),style=wx.TE_PROCESS_ENTER, 
     215                                            text_enter_callback = self.onSlitSmear) 
     216        self.smear_data_left= BGTextCtrl(self, -1, size=(_BOX_WIDTH-20,20), style=0) 
     217        self.smear_data_left.SetValue(str(self.dq_l)) 
     218        self.smear_data_right = BGTextCtrl(self, -1, size=(_BOX_WIDTH-20,20), style=0) 
     219        self.smear_data_right.SetValue(str(self.dq_r)) 
     220 
     221        #set default values 
     222        self.smear_pinhole_max.SetValue(str(self.dx_max)) 
     223        self.smear_pinhole_min.SetValue(str(self.dx_min)) 
     224        self.smear_slit_height.SetValue(str(self.dxl)) 
     225        self.smear_slit_width.SetValue(str(self.dxw)) 
     226 
    171227        #Filling the sizer containing instruments smearing info. 
    172         self.disable_smearer = wx.RadioButton(self, -1, 'No', style=wx.RB_GROUP) 
    173         self.enable_smearer = wx.RadioButton(self, -1, 'Yes') 
     228        self.disable_smearer = wx.RadioButton(self, -1, 'None', style=wx.RB_GROUP) 
     229        self.enable_smearer = wx.RadioButton(self, -1, 'Use dQ Data') 
     230        #self.enable_smearer.SetToolTipString("Click to use the loaded dQ data for smearing.") 
     231        self.pinhole_smearer = wx.RadioButton(self, -1, 'Custom Pinhole Smear') 
     232        #self.pinhole_smearer.SetToolTipString("Click to input custom resolution for pinhole smearing.") 
     233        self.slit_smearer = wx.RadioButton(self, -1, 'Custom Slit Smear') 
     234        #self.slit_smearer.SetToolTipString("Click to input custom resolution for slit smearing.") 
    174235        self.Bind(wx.EVT_RADIOBUTTON, self.onSmear, id=self.disable_smearer.GetId()) 
    175236        self.Bind(wx.EVT_RADIOBUTTON, self.onSmear, id=self.enable_smearer.GetId()) 
     237        self.Bind(wx.EVT_RADIOBUTTON, self.onPinholeSmear, id=self.pinhole_smearer.GetId()) 
     238        self.Bind(wx.EVT_RADIOBUTTON, self.onSlitSmear, id=self.slit_smearer.GetId()) 
    176239        self.disable_smearer.SetValue(True) 
    177240         
    178         sizer_smearer.Add(wx.StaticText(self,-1,'Instrument Smearing? ')) 
    179         sizer_smearer.Add((10, 10)) 
    180         sizer_smearer.Add( self.enable_smearer ) 
     241        # add 4 types of smearing to the sizer 
     242        sizer_smearer.Add( self.disable_smearer,0, wx.LEFT, 10) 
    181243        sizer_smearer.Add((10,10)) 
    182         sizer_smearer.Add( self.disable_smearer ) 
    183         #Display Chi^2/dof 
    184         sizer_smearer.Add((78,10)) 
     244        sizer_smearer.Add( self.enable_smearer) 
     245        sizer_smearer.Add((10,10)) 
     246        sizer_smearer.Add( self.pinhole_smearer )  
     247        sizer_smearer.Add((10,10)) 
     248        sizer_smearer.Add( self.slit_smearer )  
     249        sizer_smearer.Add((10,10))        
     250         
     251        # static box for chi2 
    185252        box_description= wx.StaticBox(self, -1,'Chi2/dof') 
    186253        boxsizer1 = wx.StaticBoxSizer(box_description, wx.VERTICAL) 
    187         boxsizer1.SetMinSize((80,-1)) 
    188         temp_smearer = None 
    189         if self.enable_smearer.GetValue(): 
    190             temp_smearer= self.smearer 
    191          
     254        boxsizer1.SetMinSize((70,40)) 
     255         
     256         
     257         
     258        # StaticText for chi2 and smear 
    192259        self.tcChi    =  wx.StaticText(self, -1, "-", style=wx.ALIGN_LEFT) 
    193           
    194         boxsizer1.Add( self.tcChi )    
    195         sizer_smearer.Add( boxsizer1 ) 
    196                 
     260        self.smear_description_none    =  wx.StaticText(self, -1, smear_message_none , style=wx.ALIGN_LEFT) 
     261        self.smear_description_dqdata    =  wx.StaticText(self, -1, smear_message_dqdata , style=wx.ALIGN_LEFT) 
     262        self.smear_description_type    =  wx.StaticText(self, -1, "Type:" , style=wx.ALIGN_LEFT) 
     263        self.smear_description_smear_type    =  BGTextCtrl(self, -1, size=(45,20), style=0) 
     264        self.smear_description_smear_type.SetValue(str(self.dq_l)) 
     265        self.SetBackgroundColour(self.GetParent().GetBackgroundColour()) 
     266        self.smear_description_2d     =  wx.StaticText(self, -1, smear_message_2d  , style=wx.ALIGN_LEFT) 
     267        self.smear_message_new_s = wx.StaticText(self, -1, smear_message_new_ssmear  , style=wx.ALIGN_LEFT) 
     268        self.smear_message_new_p = wx.StaticText(self, -1, smear_message_new_psmear  , style=wx.ALIGN_LEFT) 
     269        self.smear_description_pin_min     =  wx.StaticText(self, -1, smear_message_pinhole_min_title  , style=wx.ALIGN_LEFT) 
     270        self.smear_description_pin_max     =  wx.StaticText(self, -1, smear_message_pinhole_max_title  , style=wx.ALIGN_LEFT) 
     271        self.smear_description_slit_height    =  wx.StaticText(self, -1, smear_message_slit_height_title   , style=wx.ALIGN_LEFT) 
     272        self.smear_description_slit_width    =  wx.StaticText(self, -1, smear_message_slit_width_title   , style=wx.ALIGN_LEFT) 
     273         
     274        #arrange sizers  
     275        boxsizer1.Add( self.tcChi )   
     276        self.sizer_set_smearer.Add(sizer_smearer ) 
     277        self.sizer_set_smearer.Add((10,10)) 
     278        self.sizer_set_smearer.Add( self.smear_description_none,0, wx.CENTER, 10 )  
     279        self.sizer_set_smearer.Add( self.smear_description_dqdata,0, wx.CENTER, 10 ) 
     280        self.sizer_set_smearer.Add( self.smear_description_2d,0, wx.CENTER, 10 ) 
     281        self.sizer_new_smear.Add( self.smear_description_type,0, wx.CENTER, 10 ) 
     282        self.sizer_new_smear.Add( self.smear_description_smear_type,0, wx.CENTER, 10 ) 
     283        self.sizer_new_smear.Add((15,-1)) 
     284        self.sizer_new_smear.Add( self.smear_description_pin_min,0, wx.CENTER, 10 ) 
     285        self.sizer_new_smear.Add( self.smear_description_slit_height,0, wx.CENTER, 10 ) 
     286        self.sizer_new_smear.Add( self.smear_pinhole_min,0, wx.CENTER, 10 ) 
     287        self.sizer_new_smear.Add( self.smear_slit_height,0, wx.CENTER, 10 ) 
     288        self.sizer_new_smear.Add( self.smear_data_left,0, wx.CENTER, 10 ) 
     289        self.sizer_new_smear.Add((20,-1)) 
     290        self.sizer_new_smear.Add( self.smear_description_pin_max,0, wx.CENTER, 10 ) 
     291        self.sizer_new_smear.Add( self.smear_description_slit_width,0, wx.CENTER, 10 ) 
     292        self.sizer_new_smear.Add( self.smear_pinhole_max,0, wx.CENTER, 10 ) 
     293        self.sizer_new_smear.Add( self.smear_slit_width,0, wx.CENTER, 10 ) 
     294        self.sizer_new_smear.Add( self.smear_data_right,0, wx.CENTER, 10 ) 
     295            
     296        self.sizer_set_smearer.Add( self.smear_message_new_s,0, wx.CENTER, 10) 
     297        self.sizer_set_smearer.Add( self.smear_message_new_p,0, wx.CENTER, 10) 
     298        self.sizer_set_smearer.Add((5,2)) 
     299        self.sizer_set_smearer.Add( self.sizer_new_smear,0, wx.CENTER, 10 ) 
     300         
     301        # add all to chi2 sizer 
     302         
     303        sizer_smearer_box.Add(self.sizer_set_smearer)  
     304         
     305        sizer_chi2.Add(sizer_smearer_box) 
     306        sizer_chi2.Add((-1,5)) 
     307        self.sizer_set_masking.Add((305,-1)) 
     308        self.sizer_set_masking.Add(boxsizer1,0, wx.RIGHT, 10) 
     309        sizer_chi2.Add(self.sizer_set_masking ) 
     310 
     311        #sizer_smearer_box.Add(sizer_chi2) 
     312        # hide all smear messages and textctrl 
     313        self._hide_all_smear_info() 
     314         
     315        # get smear_selection 
     316        self.current_smearer= smear_selection( self.data ) 
     317        print "self.current_smearer",self.current_smearer,self.data.__class__.__name__ 
     318        # Show only the relevant smear messages, etc 
     319        if self.current_smearer == None: 
     320            if self.data.__class__.__name__ != 'Data2D': 
     321                self.smear_description_none.Show(True) 
     322                self.enable_smearer.Disable()   
     323            else: 
     324                print "2dl" 
     325                self.smear_description_2d.Show(True)  
     326                self.pinhole_smearer.Disable()  
     327                self.slit_smearer.Disable()    
     328                self.enable_smearer.Disable()  
     329        else: self._show_smear_sizer() 
     330   
     331             
    197332        #Set sizer for Fitting section 
    198         self._set_range_sizer( title=title,box_sizer=boxsizer_range, object1=sizer_smearer, object= sizer_fit) 
    199  
     333        self._set_range_sizer( title=title,box_sizer=boxsizer_range, object1=sizer_chi2, object= sizer_fit) 
     334         
    200335    def _fill_datainfo_sizer(self): 
    201336        """ 
     
    229364        #Filling the sizer containing data related fields 
    230365        #self.dataSource = wx.StaticText(self, -1,str(self.data.name)) 
    231         self.dataSource = wx.TextCtrl(self, -1) 
     366        self.dataSource = BGTextCtrl(self, -1) 
    232367        self.dataSource.SetValue(str(data_name)) 
    233         self.dataSource.SetEditable(False) 
     368        #self.dataSource.SetEditable(False) 
    234369        self.dataSource.SetMinSize((_DATA_BOX_WIDTH, -1)) 
    235370        sizer_data.Add(wx.StaticText(self, -1, 'Source Name : ')) 
     
    242377        sizer_range = wx.BoxSizer(wx.HORIZONTAL) 
    243378        sizer_range.Add( text4_3 ,0, wx.RIGHT, 10) 
    244         self.minimum_q = wx.TextCtrl(self, -1, size=(_BOX_WIDTH,20)) 
     379        self.minimum_q = BGTextCtrl(self, -1, size=(_BOX_WIDTH,20)) 
    245380        self.minimum_q.SetValue(str(data_min)) 
    246         self.minimum_q.SetEditable(False) 
    247         self.maximum_q = wx.TextCtrl(self, -1,size=(_BOX_WIDTH,20)) 
     381        #self.minimum_q.SetEditable(False) 
     382        self.maximum_q = BGTextCtrl(self, -1,size=(_BOX_WIDTH,20)) 
    248383        self.maximum_q.SetValue(str(data_max)) 
    249         self.maximum_q.SetEditable(False) 
     384        #self.maximum_q.SetEditable(False) 
    250385        sizer_range.Add(wx.StaticText(self, -1, "Min: "),0, wx.LEFT, 10) 
    251386        sizer_range.Add(self.minimum_q,0, wx.LEFT, 10) 
     
    388523                        ix = 4 
    389524                        ctl3 = self.ModelTextCtrl(self, -1, size=(_BOX_WIDTH/2,20), style=wx.TE_PROCESS_ENTER, 
    390                                                        kill_focus_callback = self._onparamRangeEnter, 
    391525                                                       text_enter_callback = self._onparamRangeEnter) 
    392526 
     
    396530                        ix = 5 
    397531                        ctl4 = self.ModelTextCtrl(self, -1, size=(_BOX_WIDTH/2,20), style=wx.TE_PROCESS_ENTER, 
    398                                                        kill_focus_callback = self._onparamRangeEnter, 
    399532                                                       text_enter_callback = self._onparamRangeEnter) 
    400533                        self.sizer4_4.Add(ctl4, (iy,ix),(1,1), wx.EXPAND|wx.ADJUST_MINSIZE, 0) 
     
    487620                        ix = 4 
    488621                        ctl3 = self.ModelTextCtrl(self, -1, size=(_BOX_WIDTH/2,20), style=wx.TE_PROCESS_ENTER, 
    489                                                        kill_focus_callback = self._onparamRangeEnter, 
    490622                                                       text_enter_callback = self._onparamRangeEnter) 
    491623 
     
    496628                        ix = 5 
    497629                        ctl4 = self.ModelTextCtrl(self, -1, size=(_BOX_WIDTH/2,20), style=wx.TE_PROCESS_ENTER, 
    498                                                        kill_focus_callback = self._onparamRangeEnter, 
    499630                                                       text_enter_callback = self._onparamRangeEnter) 
    500631                        self.sizer4_4.Add(ctl4, (iy,ix),(1,1), wx.EXPAND|wx.ADJUST_MINSIZE, 0) 
     
    584715                 
    585716        if not flag: 
    586             msg= "Fitting range invalid" 
     717            msg= "Fitting range or parameters are invalid" 
    587718            wx.PostEvent(self.parent.parent, StatusEvent(status= msg )) 
    588719            return  
     
    663794        self.state.enable_disp = self.enable_disp.GetValue() 
    664795        self.state.disable_disp = self.disable_disp.GetValue() 
     796        self.state.pinhole_smearer = self.pinhole_smearer.GetValue() 
     797        self.state.slit_smearer = self.slit_smearer.GetValue() 
    665798     
    666799        self.state.structurecombobox = self.structurebox.GetCurrentSelection() 
     
    687820 
    688821        if check_float(tcrtl): 
    689             flag = self._onparamEnter_helper() 
    690             if flag: 
    691                 temp_smearer = None 
    692                 if self.enable_smearer.GetValue(): 
    693                     temp_smearer= self.smearer 
     822            flag = self._onparamEnter_helper()                 
     823            temp_smearer = None 
     824            if not self.disable_smearer.GetValue(): 
     825                temp_smearer= self.current_smearer 
     826                ## set smearing value whether or not the data contain the smearing info 
     827                if self.slit_smearer.GetValue(): 
     828                    flag1 = self.update_slit_smear() 
     829                    flag = flag or flag1 
     830                elif self.pinhole_smearer.GetValue(): 
     831                    flag1 = self.update_pinhole_smear() 
     832                    flag = flag or flag1 
     833            else: 
     834                self.manager.set_smearer(smearer=temp_smearer, qmin= float(self.qmin_x), 
     835                                                         qmax= float(self.qmax_x))  
     836            if flag:    
    694837                self.compute_chisqr(smearer= temp_smearer) 
    695838     
     
    699842                    event = PageInfoEvent(page = self) 
    700843                    wx.PostEvent(self.parent, event) 
    701                 self.state_change= False 
    702             self.save_current_state() 
     844                self.state_change= False            
    703845        else: 
    704846            self.save_current_state() 
    705847            msg= "Cannot Plot :Must enter a number!!!  " 
    706848            wx.PostEvent(self.parent.parent, StatusEvent(status = msg )) 
    707             return  
    708          
    709  
     849              
     850        self.save_current_state()  
     851        return  
     852    
    710853    def _onparamRangeEnter(self, event): 
    711854        """ 
     
    841984        return         
    842985                 
     986    def _get_defult_custom_smear(self): 
     987        """ 
     988           Get the defult values for custum smearing. 
     989        """ 
     990 
     991        # get the default values 
     992        if self.dxl == None: self.dxl = 0.0 
     993        if self.dxw == None: self.dxw = "" 
     994        if self.dx_min == None: self.dx_min = SMEAR_SIZE_L 
     995        if self.dx_max == None: self.dx_max = SMEAR_SIZE_H 
     996         
     997    def _get_smear_info(self): 
     998        """ 
     999           Get the smear info from data. 
     1000           @return: self.smear_type, self.dq_l and self.dq_r,  
     1001            respectively the type of the smear, dq_min and dq_max for pinhole smear data  
     1002            while dxl and dxw for slit smear 
     1003        """ 
     1004 
     1005        # default 
     1006        self.smear_type = None 
     1007        self.dq_l = None 
     1008        self.dq_r = None 
     1009         
     1010        if self.data is None or\ 
     1011                self.data.__class__.__name__ == 'Data2D':            
     1012            return 
     1013 
     1014        data = self.data 
     1015 
     1016        # check if it is pinhole smear and get min max if it is. 
     1017        if data.dx != None and all(data.dx !=0):  
     1018            self.smear_type = "Pinhole"  
     1019            self.dq_l = numpy.min(data.dx) 
     1020            self.dq_r = numpy.max(data.dx) 
     1021             
     1022        # check if it is slit smear and get min max if it is. 
     1023        elif data.dxl != None or data.dxw != None:  
     1024            self.smear_type = "Slit"  
     1025            if data.dxl != None and all(data.dxl !=0): 
     1026                self.dq_l = data.dxl[0] 
     1027            if data.dxw != None and all(data.dxw !=0):  
     1028                self.dq_r = data.dxw[0] 
     1029                 
     1030        #return self.smear_type,self.dq_l,self.dq_r        
     1031     
     1032    def _show_smear_sizer(self):     
     1033        """ 
     1034            Show only the sizers depending on smear selection 
     1035        """ 
     1036        if self.disable_smearer.GetValue(): 
     1037            self.smear_description_none.Show(True) 
     1038        elif self.enable_smearer.GetValue(): 
     1039            self.smear_description_dqdata.Show(True) 
     1040            if self.smear_type != None: 
     1041                self.smear_description_type.Show(True) 
     1042                self.smear_description_smear_type.Show(True) 
     1043                if self.smear_type == 'Slit': 
     1044                    self.smear_description_slit_height.Show(True) 
     1045                    self.smear_description_slit_width.Show(True) 
     1046                elif self.smear_type == 'Pinhole': 
     1047                    self.smear_description_pin_min.Show(True) 
     1048                    self.smear_description_pin_max.Show(True) 
     1049                self.smear_data_left.Show(True) 
     1050                self.smear_data_right.Show(True) 
     1051        elif self.pinhole_smearer.GetValue(): 
     1052            self.smear_message_new_p.Show(True) 
     1053            self.smear_description_pin_min.Show(True) 
     1054            self.smear_pinhole_min.Show(True) 
     1055            self.smear_description_pin_max.Show(True) 
     1056            self.smear_pinhole_max.Show(True) 
     1057        elif self.slit_smearer.GetValue(): 
     1058            self.smear_message_new_s.Show(True) 
     1059            self.smear_description_slit_height.Show(True) 
     1060            self.smear_slit_height.Show(True) 
     1061            self.smear_description_slit_width.Show(True) 
     1062            self.smear_slit_width.Show(True) 
     1063 
     1064    def _hide_all_smear_info(self): 
     1065        """ 
     1066           Hide all smearing messages in the set_smearer sizer 
     1067        """ 
     1068        self.smear_description_none.Hide() 
     1069        self.smear_description_dqdata.Hide() 
     1070        self.smear_description_type.Hide() 
     1071        self.smear_description_smear_type.Hide() 
     1072        self.smear_description_2d.Hide() 
     1073        self.smear_data_left.Hide() 
     1074        self.smear_data_right.Hide() 
     1075        self.smear_description_pin_min.Hide() 
     1076        self.smear_pinhole_min.Hide() 
     1077        self.smear_description_pin_max.Hide() 
     1078        self.smear_pinhole_max.Hide() 
     1079        self.smear_description_slit_height.Hide() 
     1080        self.smear_slit_height.Hide() 
     1081        self.smear_description_slit_width.Hide() 
     1082        self.smear_slit_width.Hide() 
     1083        self.smear_message_new_p.Hide() 
     1084        self.smear_message_new_s.Hide() 
     1085     
    8431086         
    8441087    def set_data(self, data): 
     
    8571100            if self.smearer == None: 
    8581101                self.enable_smearer.Disable() 
    859                 self.disable_smearer.Disable() 
    8601102            else: 
    8611103                self.enable_smearer.Enable() 
    862                 self.disable_smearer.Enable() 
     1104 
     1105            # more disables for 2D 
     1106            if self.data.__class__.__name__ =="Data2D": 
     1107                self.smear_description_none.Hide() 
     1108                self.smear_description_2d.Show(True) 
     1109                self.pinhole_smearer.Disable() 
     1110                self.slit_smearer.Disable() 
    8631111                 
    8641112            self.formfactorbox.Enable() 
     
    8921140        self.state.qmax = self.qmax_x 
    8931141         
    894          
     1142 
    8951143    def reset_page(self, state,first=False): 
    8961144        """ 
     
    9721220        if chisqr != None or numpy.isfinite(chisqr): 
    9731221        #format chi2   
    974             if self.engine_type == "park" and npt_fit > 0 
     1222            if self.engine_type == "park" 
    9751223                npt_fit = float(self.get_npts2fit())  
    976                 chisqr =chisqr/npt_fit     
     1224                if npt_fit > 0: 
     1225                    chisqr =chisqr/npt_fit     
    9771226            chi2 = format_number(chisqr)     
    9781227            self.tcChi.SetLabel(chi2)     
     
    10761325        msg = "Fit completed! " 
    10771326        wx.PostEvent(self.manager.parent, StatusEvent(status=msg)) 
    1078        
    1079  
     1327 
     1328    def onPinholeSmear(self, event): 
     1329        """ 
     1330            Create a custom pinhole smear object that will change the way residuals 
     1331            are compute when fitting 
     1332        """ 
     1333 
     1334        if self.check_invalid_panel(): 
     1335            return 
     1336        if self.model ==None: 
     1337            msg="Need model and data to smear plot" 
     1338            wx.PostEvent(self.manager.parent, StatusEvent(status=\ 
     1339                            "Smear: %s"%msg)) 
     1340            return 
     1341         
     1342        # msg default 
     1343        msg = None 
     1344        if event != None: 
     1345            tcrtl= event.GetEventObject() 
     1346            # event case of radio button 
     1347            if tcrtl.GetValue()== True: 
     1348                self.dx_min = 0.0 
     1349                self.dx_max = 0.0 
     1350                is_new_pinhole = True 
     1351            else: 
     1352                is_new_pinhole = self._is_changed_pinhole() 
     1353        # if any value is changed 
     1354        if is_new_pinhole: 
     1355            msg = self._set_pinhole_smear() 
     1356        # hide all silt sizer     
     1357        self._hide_all_smear_info() 
     1358            
     1359        ##Calculate chi2 
     1360        self.compute_chisqr(smearer= self.current_smearer)  
     1361        # show relevant slit sizers  
     1362        self._show_smear_sizer() 
     1363        self.sizer_set_smearer.Layout() 
     1364        self.Layout()    
     1365         
     1366        if event != None:  
     1367            event.Skip()                   
     1368        #self._undo.Enable(True) 
     1369        self.save_current_state() 
     1370        event = PageInfoEvent(page = self) 
     1371        wx.PostEvent(self.parent, event) 
     1372         
     1373    def _is_changed_pinhole(self):   
     1374        """ 
     1375            check if any of pinhole smear is changed 
     1376            return: True or False 
     1377        """ 
     1378        # get the values 
     1379        pin_min = self.smear_pinhole_min.GetValue() 
     1380        pin_max = self.smear_pinhole_max.GetValue() 
     1381                     
     1382        # Check changes in slit width     
     1383        try: 
     1384            dx_min = float(pin_min) 
     1385        except: 
     1386            return True 
     1387        if self.dx_min != dx_min: 
     1388            return True 
     1389         
     1390        # Check changes in slit heigth 
     1391        try: 
     1392            dx_max = float(pin_max) 
     1393        except: 
     1394            return True 
     1395        if self.dx_max != dx_max: 
     1396            return True 
     1397        return False 
     1398     
     1399    def _set_pinhole_smear(self): 
     1400        """ 
     1401            Set custom pinhole smear 
     1402            return: msg 
     1403        """ 
     1404        # copy data 
     1405        data = copy.deepcopy(self.data) 
     1406        data_len = len(data.x) 
     1407        data.dx = None 
     1408        data.dxl = None 
     1409        data.dxw = None 
     1410        msg = None 
     1411    
     1412        # make sure once more if it is smearer 
     1413        data = copy.deepcopy(self.data) 
     1414        len_data = len(data.x) 
     1415        data.dx = numpy.zeros(len_data) 
     1416        get_pin_min = self.smear_pinhole_min 
     1417        get_pin_max = self.smear_pinhole_max         
     1418 
     1419        if self._validate_qrange(get_pin_min, get_pin_max ): 
     1420            if len_data < 2: len_data = 2      
     1421            self.dx_min = float(get_pin_min.GetValue()) 
     1422            self.dx_max = float(get_pin_max.GetValue()) 
     1423            if self.dx_min != None and self.dx_max != None:              
     1424                if self.dx_min == self.dx_max: 
     1425                    data.dx[data.dx==0] = self.dx_min 
     1426                else: 
     1427                    step = math.fabs(self.dx_max - self.dx_min)/(len_data-1)     
     1428                    data.dx = numpy.arange(self.dx_min,self.dx_max+step/1.1,step)             
     1429            elif self.dx_min != None:  
     1430                data.dx[data.dx==0] = self.dx_min  
     1431            elif self.dx_max != None: 
     1432                data.dx[data.dx==0] = self.dx_max           
     1433            self.current_smearer = smear_selection(data) 
     1434 
     1435        else: 
     1436            get_pin_min.SetBackgroundColour("pink") 
     1437            get_pin_max.SetBackgroundColour("pink") 
     1438            msg= "Model Error:wrong value entered!!!" 
     1439            wx.PostEvent(self.manager.parent, StatusEvent(status = msg )) 
     1440        ## set smearing value whether or not the data contain the smearing info 
     1441        self.manager.set_smearer(smearer=self.current_smearer, qmin= float(self.qmin_x),qmax= float(self.qmax_x)) 
     1442  
     1443        return msg 
     1444         
     1445    def update_pinhole_smear(self): 
     1446        """ 
     1447            called by kill_focus on pinhole TextCntrl 
     1448            to update the changes  
     1449            return: msg: False when wrong value was entered 
     1450        """ 
     1451        # msg default 
     1452        msg = None 
     1453        # check if any value is changed 
     1454        if self._is_changed_pinhole(): 
     1455            msg = self._set_pinhole_smear()            
     1456        #self._undo.Enable(True) 
     1457        self.save_current_state() 
     1458 
     1459        if msg != None: 
     1460            return False    
     1461        else: 
     1462            return True 
     1463                      
     1464    def onSlitSmear(self, event): 
     1465        """ 
     1466            Create a custom slit smear object that will change the way residuals 
     1467            are compute when fitting 
     1468        """ 
     1469 
     1470                
     1471        if self.check_invalid_panel(): 
     1472            return 
     1473        if self.model ==None: 
     1474            msg="Need model and data to smear plot" 
     1475            wx.PostEvent(self.manager.parent, StatusEvent(status=\ 
     1476                            "Smear: %s"%msg)) 
     1477            return 
     1478        # msg default 
     1479        msg = None 
     1480        # for event given 
     1481        if event != None: 
     1482            tcrtl= event.GetEventObject() 
     1483            # event case of radio button 
     1484            if tcrtl.GetValue(): 
     1485                self.dxl = 0.0 
     1486                self.dxw = 0.0 
     1487                is_new_slit = True 
     1488            else: 
     1489                is_new_slit = self._is_changed_slit() 
     1490                 
     1491        # if any value is changed 
     1492        if is_new_slit: 
     1493            msg = self._set_slit_smear() 
     1494        # hide all silt sizer 
     1495        self._hide_all_smear_info()         
     1496        ##Calculate chi2 
     1497        self.compute_chisqr(smearer= self.current_smearer)   
     1498        # show relevant slit sizers        
     1499        self._show_smear_sizer() 
     1500        self.sizer_set_smearer.Layout() 
     1501        self.Layout() 
     1502         
     1503        if event != None: 
     1504            event.Skip()      
     1505        #self._undo.Enable(True) 
     1506        self.save_current_state() 
     1507        event = PageInfoEvent(page = self) 
     1508        wx.PostEvent(self.parent, event) 
     1509        if msg != None: 
     1510            wx.PostEvent(self.manager.parent, StatusEvent(status = msg)) 
     1511 
     1512             
     1513    def _is_changed_slit(self):   
     1514        """ 
     1515            check if any of slit lengths is changed 
     1516            return: True or False 
     1517        """ 
     1518        # get the values 
     1519        width = self.smear_slit_width.GetValue() 
     1520        height = self.smear_slit_height.GetValue() 
     1521         
     1522        # check and change the box bg color if it was pink but it should be white now 
     1523        # because this is the case that _set_slit_smear() will not handle 
     1524        if height.lstrip().rstrip()=="": 
     1525            self.smear_slit_height.SetBackgroundColour(wx.WHITE) 
     1526        if width.lstrip().rstrip()=="": 
     1527            self.smear_slit_width.SetBackgroundColour(wx.WHITE) 
     1528             
     1529        # Check changes in slit width     
     1530        if width == "":  
     1531            dxw = 0.0 
     1532        else: 
     1533            try: 
     1534                dxw = float(width) 
     1535            except: 
     1536                return True 
     1537        if self.dxw != dxw: 
     1538            return True 
     1539         
     1540        # Check changes in slit heigth 
     1541        if height == "":  
     1542            dxl = 0.0 
     1543        else: 
     1544            try: 
     1545                dxl = float(height) 
     1546            except: 
     1547                return True 
     1548        if self.dxl != dxl: 
     1549            return True 
     1550        return False 
     1551     
     1552    def _set_slit_smear(self): 
     1553        """ 
     1554            Set custom slit smear 
     1555            return: msg 
     1556        """ 
     1557        temp_smearer = None 
     1558        # make sure once more if it is smearer 
     1559        data = copy.deepcopy(self.data) 
     1560        data_len = len(data.x) 
     1561        data.dx = None 
     1562        data.dxl = None 
     1563        data.dxw = None 
     1564        msg = None 
     1565    
     1566        try: 
     1567            self.dxl = float(self.smear_slit_height.GetValue()) 
     1568            data.dxl = self.dxl* numpy.ones(data_len) 
     1569            self.smear_slit_height.SetBackgroundColour(wx.WHITE) 
     1570        except:  
     1571            data.dxl = numpy.zeros(data_len) 
     1572            if self.smear_slit_height.GetValue().lstrip().rstrip()!="": 
     1573                self.smear_slit_height.SetBackgroundColour("pink") 
     1574                msg = "Wrong value entered... "   
     1575            else: 
     1576                self.smear_slit_height.SetBackgroundColour(wx.WHITE) 
     1577        try: 
     1578            self.dxw = float(self.smear_slit_width.GetValue()) 
     1579            self.smear_slit_width.SetBackgroundColour(wx.WHITE) 
     1580            data.dxw = self.dxw* numpy.ones(data_len) 
     1581        except:  
     1582            data.dxw = numpy.zeros(data_len) 
     1583            if self.smear_slit_width.GetValue().lstrip().rstrip()!="": 
     1584                self.smear_slit_width.SetBackgroundColour("pink") 
     1585                msg = "Wrong Fit value entered... " 
     1586            else: 
     1587                self.smear_slit_width.SetBackgroundColour(wx.WHITE) 
     1588                 
     1589        self.current_smearer = smear_selection(data) 
     1590        #temp_smearer = self.current_smearer 
     1591        ## set smearing value whether or not the data contain the smearing info 
     1592        self.manager.set_smearer(smearer=self.current_smearer, qmin= float(self.qmin_x), qmax= float(self.qmax_x))  
     1593 
     1594        return msg 
     1595     
     1596     
     1597    def update_slit_smear(self): 
     1598        """ 
     1599            called by kill_focus on pinhole TextCntrl 
     1600            to update the changes  
     1601            return: msg: False when wrong value was entered 
     1602        """              
     1603        # msg default 
     1604        msg = None 
     1605        # check if any value is changed 
     1606        if self._is_changed_slit(): 
     1607            msg = self._set_slit_smear()            
     1608        #self._undo.Enable(True) 
     1609        self.save_current_state() 
     1610 
     1611        if msg != None: 
     1612            return False    
     1613        else: 
     1614            return True 
     1615                             
     1616     
    10801617    def onSmear(self, event): 
    10811618        """ 
     
    10911628            return 
    10921629        temp_smearer = None 
    1093        
     1630        self._get_smear_info() 
     1631         
     1632        #renew smear sizer 
     1633        if self.smear_type != None: 
     1634            self.smear_description_smear_type.SetValue(str(self.smear_type)) 
     1635            self.smear_data_left.SetValue(str(self.dq_l))    
     1636            self.smear_data_right.SetValue(str(self.dq_r))        
     1637         
     1638        self._hide_all_smear_info() 
     1639         
     1640        data = copy.deepcopy(self.data) 
     1641        # make sure once more if it is smearer 
     1642        self.current_smearer = smear_selection(data) 
     1643 
    10941644        if self.enable_smearer.GetValue(): 
    1095             temp_smearer= self.smearer 
     1645            temp_smearer= self.current_smearer 
    10961646            if hasattr(self.data,"dxl"): 
     1647                 
    10971648                msg= ": Resolution smearing parameters" 
    10981649            if hasattr(self.data,"dxw"): 
     
    11041655                wx.PostEvent(self.manager.parent, StatusEvent(status=\ 
    11051656                            "Data contains smearing information %s"%msg)) 
    1106         
     1657            self.smear_description_dqdata.Show(True) 
     1658            self.smear_data_left.Show(True) 
     1659            self.smear_data_right.Show(True) 
     1660        elif self.disable_smearer.GetValue(): 
     1661            self.smear_description_none.Show(True) 
     1662             
     1663        self._show_smear_sizer() 
     1664        self.sizer_set_smearer.Layout() 
     1665        self.Layout() 
    11071666        ## set smearing value whether or not the data contain the smearing info 
    11081667        self.manager.set_smearer(smearer=temp_smearer, qmin= float(self.qmin_x), 
     
    11131672        self.state.enable_smearer=  self.enable_smearer.GetValue() 
    11141673        self.state.disable_smearer=self.disable_smearer.GetValue() 
    1115     
     1674        self.state.pinhole_smearer = self.pinhole_smearer.GetValue() 
     1675        self.state.slit_smearer = self.slit_smearer.GetValue() 
     1676         
    11161677    def complete_chisqr(self, output, elapsed=None):   
    11171678        """ 
     
    14171978                ix += 1 
    14181979                ctl3 = self.ModelTextCtrl(self, -1, size=(_BOX_WIDTH/2,20), style=wx.TE_PROCESS_ENTER, 
    1419                                                kill_focus_callback = self._onparamRangeEnter, 
    14201980                                               text_enter_callback = self._onparamRangeEnter) 
    14211981      
     
    14251985                ix += 1 
    14261986                ctl4 = self.ModelTextCtrl(self, -1, size=(_BOX_WIDTH/2,20), style=wx.TE_PROCESS_ENTER, 
    1427                                                kill_focus_callback = self._onparamRangeEnter, 
    14281987                                               text_enter_callback = self._onparamRangeEnter) 
    14291988                sizer.Add(ctl4, (iy,ix),(1,1), wx.EXPAND|wx.ADJUST_MINSIZE, 0) 
     
    15162075                    ix += 1 
    15172076                    ctl3 = self.ModelTextCtrl(self, -1, size=(_BOX_WIDTH/2,20), style=wx.TE_PROCESS_ENTER, 
    1518                                                    kill_focus_callback = self._onparamRangeEnter, 
    15192077                                                   text_enter_callback = self._onparamRangeEnter) 
    15202078                
     
    15242082                    ix += 1 
    15252083                    ctl4 = self.ModelTextCtrl(self, -1, size=(_BOX_WIDTH/2,20), style=wx.TE_PROCESS_ENTER, 
    1526                                                    kill_focus_callback = self._onparamRangeEnter, 
    15272084                                                   text_enter_callback = self._onparamRangeEnter) 
    15282085                    sizer.Add(ctl4, (iy,ix),(1,1), wx.EXPAND|wx.ADJUST_MINSIZE, 0) 
     
    15712128        self.SetScrollbars(20,20,25,65) 
    15722129 
    1573  
     2130class BGTextCtrl(wx.TextCtrl): 
     2131    """ 
     2132        Text control used to display outputs. 
     2133        No editing allowed. The background is  
     2134        grayed out. User can't select text. 
     2135    """ 
     2136    def __init__(self, *args, **kwds): 
     2137        wx.TextCtrl.__init__(self, *args, **kwds) 
     2138        self.SetEditable(False) 
     2139        self.SetBackgroundColour(self.GetParent().GetBackgroundColour()) 
     2140         
     2141        # Bind to mouse event to avoid text highlighting 
     2142        # The event will be skipped once the call-back 
     2143        # is called. 
     2144        self.Bind(wx.EVT_MOUSE_EVENTS, self._click) 
     2145         
     2146    def _click(self, event): 
     2147        """ 
     2148            Prevent further handling of the mouse event 
     2149            by not calling Skip(). 
     2150        """  
     2151        pass 
    15742152         
    15752153class HelpWindow(wx.Frame): 
  • sansview/perspectives/fitting/pagestate.py

    rb421b1a r7609f1a  
    5151        ## smearer info 
    5252        self.smearer=None 
     53        self.smear_type = None 
     54        self.dq_l = None 
     55        self.dq_r = None 
     56 
    5357        #list of dispersion paramaters 
    5458        self.disp_list =[] 
     
    8589        self.enable_smearer = False 
    8690        self.disable_smearer = True 
     91        self.pinhole_smearer = False 
     92        self.slit_smearer   = False 
    8793        ## disperity selection 
    8894        self.enable_disp= False 
     
    138144        obj.enable_smearer = copy.deepcopy(self.enable_smearer) 
    139145        obj.disable_smearer = copy.deepcopy(self.disable_smearer) 
     146        obj.pinhole_smearer = copy.deepcopy(self.pinhole_smearer) 
     147        obj.slit_smearer = copy.deepcopy(self.slit_smearer) 
     148        obj.smear_type = copy.deepcopy(self.smear_type) 
     149        obj.dq_l = copy.deepcopy(self.dq_l) 
     150        obj.dq_r = copy.deepcopy(self.dq_r) 
     151 
    140152        
    141153        obj.disp_box = copy.deepcopy(self.disp_box) 
Note: See TracChangeset for help on using the changeset viewer.