Changeset fbc3e04 in sasview for sansview


Ignore:
Timestamp:
Mar 6, 2009 9:19:16 PM (15 years ago)
Author:
Gervaise Alina <gervyh@…>
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:
bdb27e6
Parents:
0b99881
Message:

go back to version 1617 for fitpage1D and modelpage.py

Location:
sansview/perspectives/fitting
Files:
2 edited

Legend:

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

    r0b99881 rfbc3e04  
    1818class FitPage1D(ModelPage): 
    1919    """ 
    20         FitPage1D class contains fields allowing to display results when 
    21         fitting  a model and one data. 
    22         This class used most of the methods of ModelPage class. 
     20        FitPanel class contains fields allowing to display results when 
     21        fitting  a model and one data 
    2322        @note: For Fit to be performed the user should check at least one parameter 
    2423        on fit Panel window. 
     
    3130    name=None 
    3231     
    33     def __init__(self, parent,data,model=None, name=None, *args, **kwargs): 
     32    def __init__(self, parent,data, *args, **kwargs): 
     33        wx.ScrolledWindow.__init__(self, parent, *args, **kwargs) 
     34         
    3435        """  
    3536            Initialization of the Panel 
    3637        """ 
    37         ModelPage.__init__(self, parent,model,name,data,*args, **kwargs) 
    38         
    3938        #TODO: remove this once the inheritence is cleaned up 
    4039        ## Data member to store the dispersion object created 
    41          
    42      
    43          
    44     def draw_panel(self): 
     40        self._disp_obj_dict = {} 
     41 
     42        #Data used for fitting  
     43        self.data = data 
     44        # flag to allow data2D plot 
     45        self.enable2D=False 
     46        #fit page manager  
     47        self.manager = None 
     48        #Store the parent of this panel parent 
     49        # For this application fitpanel is the parent 
     50        self.parent  = parent 
     51        # Event_owner is the owner of model event 
     52        self.event_owner = None 
    4553        #panel interface 
    4654        self.vbox  = wx.BoxSizer(wx.VERTICAL) 
     
    7987        #---------sizer 1 draw-------------------------------- 
    8088        #Filling the sizer containing data related fields 
    81         self.DataSource  =wx.StaticText(self, -1,str(self.data.name)) 
     89        self.DataSource  =wx.StaticText(self, -1,str(data.name)) 
    8290        ix = 0 
    8391        iy = 1 
     
    93101            iy = 1 
    94102            # Minimum value of data    
    95             self.data_min = wx.StaticText(self, -1,str(format_number(numpy.min(self.data.x)))) 
     103            self.data_min    = wx.StaticText(self, -1,str(format_number(numpy.min(data.x)))) 
    96104            # Maximum value of data   
    97             self.data_max =  wx.StaticText(self, -1,str(format_number(numpy.max(self.data.x))))    
     105            self.data_max    =  wx.StaticText(self, -1,str(format_number(numpy.max(data.x))))    
    98106            self.text4_3 = wx.StaticText(self, -1, 'Maximum Data Range(Linear)', style=wx.ALIGN_LEFT) 
    99107            self.sizer2.Add(self.text4_3,(iy,ix),(1,1),\ 
     
    152160        self.disable_disp = wx.RadioButton(self, -1, 'No', (10, 10), style=wx.RB_GROUP) 
    153161        self.enable_disp = wx.RadioButton(self, -1, 'Yes', (10, 30)) 
    154         self.Bind(wx.EVT_RADIOBUTTON, self.set_Dispers_Param, id=self.disable_disp.GetId()) 
    155         self.Bind(wx.EVT_RADIOBUTTON, self.set_Dispers_Param, id=self.enable_disp.GetId()) 
     162        self.Bind(wx.EVT_RADIOBUTTON, self.Set_DipersParam, id=self.disable_disp.GetId()) 
     163        self.Bind(wx.EVT_RADIOBUTTON, self.Set_DipersParam, id=self.enable_disp.GetId()) 
    156164        ix= 0 
    157165        iy=1 
     
    239247        iy+=1  
    240248        self.sizer9.Add((20,20),(iy,ix),(1,1), wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 0) 
    241         
     249         
     250        # Contains link between  model ,all its parameters, and panel organization 
     251        self.parameters=[] 
     252        # Contains list of parameters that cannot be fitted and reference to  
     253        #panel objects  
     254        self.fixed_param=[] 
     255        # Contains list of parameters with dispersity and reference to  
     256        #panel objects  
     257        self.fittable_param=[] 
     258        #list of dispersion paramaters 
     259        self.disp_list=[] 
     260        #contains link between a model and selected parameters to fit  
     261        self.param_toFit=[] 
     262        # model on which the fit would be performed 
     263        self.model=None 
     264         
     265        self.back_up_model= None 
     266        #dictionary of model name and model class 
     267        self.model_list_box={}     
     268                      
     269        if self.model == None: 
     270            self.qmin.Disable() 
     271            self.qmax.Disable()  
     272        else: 
     273            self.qmin.Enable() 
     274            self.qmax.Enable()  
     275 
    242276     
    243277        self.vbox.Layout() 
     
    246280        self.SetScrollbars(20,20,55,40) 
    247281         
     282        self.Centre() 
     283        self.Layout() 
     284        self.GrandParent.GetSizer().Layout() 
     285    
    248286    def compute_chisqr2D(self): 
    249287        """  
     
    260298                    for j in range(len(self.data.y_bins)): 
    261299                        #Check the range containing data between self.qmin_x and self.qmax_x 
    262                         radius = math.pow(self.data.x_bins[i],2)\ 
    263                             + math.pow(self.data.y_bins[j],2) 
    264                              
    265                         if radius >= math.pow(self.qmin_x,2): 
    266                             if radius <=math.pow(self.qmax_x,2): 
    267                                 temp= self.model.runXY( [self.data.y_bins[j],self.data.x_bins[i]] ) 
    268                                 chisqrji=(self.data.data[j][i]- temp)/self.data.err_data[j][i] 
     300                        if math.pow(self.data.x_bins[i],2)+math.pow(self.data.y_bins[j],2)>=math.pow(self.qmin_x,2): 
     301                            if math.pow(self.data.x_bins[i],2)+math.pow(self.data.y_bins[j],2)<=math.pow(self.qmax_x,2): 
     302                                chisqrji=(self.data.data[j][i]- self.model.runXY(\ 
     303                                                                                    [self.data.y_bins[j],self.data.x_bins[i]]))\ 
     304                                                                                    /self.data.err_data[j][i] 
    269305                                #Vector containing residuals 
    270306                                res.append( math.pow(chisqrji,2) ) 
     
    276312                self.tcChi.SetLabel(format_number(math.fabs(sum/ len(res)))) 
    277313            except: 
    278                 msg= "Chisqr cannot be compute: %s"% sys.exc_value 
    279                 wx.PostEvent(self.parent.GrandParent, StatusEvent(status= msg )) 
     314                wx.PostEvent(self.parent.GrandParent, StatusEvent(status=\ 
     315                            "Chisqr cannot be compute: %s"% sys.exc_value)) 
    280316                return 
    281317     
     
    295331                    self.qmin_x = float(self.qmin.GetValue()) 
    296332                    self.qmax_x = float(self.qmax.GetValue()) 
    297                     # Compute residuals within self.qmin_x and self.qmax_x 
     333                    # return residuals within self.qmin_x and self.qmax_x 
    298334                    x,y,dy = [numpy.asarray(v) for v in (self.data.x,self.data.y,self.data.dy)] 
    299335                    if self.qmin_x==None and self.qmax_x==None:  
     
    313349                    self.tcChi.SetLabel(format_number(math.fabs(sum/ len(res)))) 
    314350            except: 
    315                 msg=  "Chisqr cannot be compute: %s"% sys.exc_value 
    316                 wx.PostEvent(self.parent.GrandParent, StatusEvent(status= msg)) 
     351                wx.PostEvent(self.parent.GrandParent, StatusEvent(status=\ 
     352                            "Chisqr cannot be compute: %s"% sys.exc_value)) 
    317353                return  
    318              
    319354             
    320355    def _on_select_model(self,event): 
     
    345380             
    346381            if name ==event.GetString(): 
    347                 self.model=item() 
    348                 self.back_up_model= self.model.clone() 
    349                 evt = ModelEventbox(model=self.model,name=name) 
    350                 wx.PostEvent(self.event_owner, evt) 
    351382                try: 
     383                    self.model=item() 
     384                    self.back_up_model= self.model.clone() 
     385                    evt = ModelEventbox(model=self.model,name=name) 
     386                    wx.PostEvent(self.event_owner, evt) 
     387                    self.text1_1.Show() 
    352388                    self.compute_chisqr() 
    353389                    self.tcChi.Show() 
    354                     self.text1_1.Show() 
    355390                except: 
    356                     self.text1_1.Hide() 
    357                     pass 
     391                    raise #ValueError,"model.name is not equal to model class name" 
    358392                break   
    359                   
     393             
    360394                  
    361395    def onFit(self,event): 
     
    383417            self.parent.GetSizer().Layout() 
    384418        else: 
    385             msg= "Select at least one parameter to fit " 
    386             wx.PostEvent(self.parent.parent, StatusEvent(status= msg )) 
     419            wx.PostEvent(self.parent.parent, StatusEvent(status=\ 
     420                            "Select at least one parameter to fit ")) 
    387421   
     422    
     423    def _onTextEnter(self,event): 
     424        """ 
     425            set a flag to determine if the fitting range entered by the user is valid 
     426        """ 
     427       
     428        try: 
     429            flag=self.checkFitRange() 
     430            if flag==True and self.model!=None: 
     431                self.manager.redraw_model(float(self.xmin.GetValue())\ 
     432                                               ,float(self.xmax.GetValue())) 
     433        except: 
     434 
     435            wx.PostEvent(self.parent.GrandParent, StatusEvent(status=\ 
     436                            "Drawing  Error:wrong value entered %s"% sys.exc_value)) 
     437         
     438    
    388439     
    389440    def get_param_list(self): 
     
    408459            self.compute_chisqr() 
    409460        except: 
    410             self.text1_1.Hide() 
    411461            pass 
    412462         
     
    462512                if item in self.param_toFit: 
    463513                    self.param_toFit.remove(item)            
    464         #Set the value of checkbox that selected all checkboxes or not to true or false            
     514        #Set the value of checkbox that selected every checkbox or not             
    465515        if len(self.parameters)+len(self.fittable_param) ==len(self.param_toFit): 
    466516            self.cb1.SetValue(True) 
  • sansview/perspectives/fitting/modelpage.py

    r0b99881 rfbc3e04  
    1414 
    1515 
     16 
    1617class ModelPage(wx.ScrolledWindow): 
    1718    """ 
    18         ModelPage is a panel that allows the user to view information related to a  
    19         model.  
     19        FitPanel class contains fields allowing to display results when 
     20        fitting  a model and one data 
     21        @note: For Fit to be performed the user should check at least one parameter 
     22        on fit Panel window. 
    2023   
    2124    """ 
     
    2427    ## Title to appear on top of the window 
    2528    window_caption = "Fit Page" 
    26     # name of the panel directly related to the model name selected 
    27     name =" " 
    28  
    29     def __init__(self, parent,model=None,name=None,data=None, *args, **kwargs): 
     29    name="" 
     30     
     31    def __init__(self, parent,model,name, *args, **kwargs): 
    3032        wx.ScrolledWindow.__init__(self, parent, *args, **kwargs) 
    3133        """  
     
    3739        ## Data member to store the dispersion object created 
    3840        self._disp_obj_dict = {} 
    39          
    40         #list of dispersion parameters 
     41 
     42        #list of dispersion paramaters 
    4143        self.disp_list=[] 
    4244        try: 
     
    4951        # this panel does contain data .existing data allow a different drawing 
    5052        #on set_model parameters 
    51         self.data=data 
    52          
    53          
    54         # contains link between  model ,all its parameters, and panel organization 
    55         self.parameters=[] 
    56         #list of parameters that cannot be fitted and panel object related to this parameters 
    57         #values 
    58         self.fixed_param=[] 
    59         # 
    60         self.fittable_param=[] 
    61         self.polydisp= {} 
    62         #contains link between a model and selected parameters to fit  
    63         self.param_toFit=[] 
    64          
    65         self.prevmodel_name=name 
    66         self.draw_panel() 
    67         #dictionary of model name and model class 
    68         self.model_list_box={} 
    69         #Draw initial panel 
    70         if self.model!=None: 
    71             self.set_panel(self.model) 
    72         self.theta_cb=None 
    73         # flag to allow data2D plot 
    74         self.enable2D=False 
    75          
    76      
    77         self.Centre() 
    78         self.Layout() 
    79         self.parent.GetSizer().Layout() 
    80          
    81     def draw_panel(self):    
     53        self.data=None 
    8254        #panel interface 
    8355        self.vbox  = wx.BoxSizer(wx.VERTICAL) 
     
    9062        self.sizer5 = wx.GridBagSizer(5,5) 
    9163        self.sizer4 = wx.GridBagSizer(5,5) 
     64        
    9265        #model selection 
    9366        self.vbox.Add(wx.StaticLine(self, -1), 0, wx.EXPAND, 0) 
     
    10679        # plotting range 
    10780        self.vbox.Add(self.sizer9) 
    108      
     81        #close layer 
     82        #self.vbox.Add(wx.StaticLine(self, -1), 0, wx.EXPAND, 0) 
     83        #self.vbox.Add(self.sizer10) 
     84         
     85       
    10986        #------------------ sizer 4  draw------------------------   
     87        
     88        
    11089        # define combox box 
    11190        self.modelbox = wx.ComboBox(self, -1) 
    11291         # preview selected model name 
    113          
     92        self.prevmodel_name=name 
    11493        #print "model view prev_model",name 
    11594        self.modelbox.SetValue(self.prevmodel_name) 
     
    142121        self.disable_disp = wx.RadioButton(self, -1, 'No', (10, 10), style=wx.RB_GROUP) 
    143122        self.enable_disp = wx.RadioButton(self, -1, 'Yes', (10, 30)) 
    144         self.Bind(wx.EVT_RADIOBUTTON, self.set_Dispers_Param, id=self.disable_disp.GetId()) 
    145         self.Bind(wx.EVT_RADIOBUTTON, self.set_Dispers_Param, id=self.enable_disp.GetId()) 
     123        self.Bind(wx.EVT_RADIOBUTTON, self.Set_DipersParam, id=self.disable_disp.GetId()) 
     124        self.Bind(wx.EVT_RADIOBUTTON, self.Set_DipersParam, id=self.enable_disp.GetId()) 
    146125        ix= 0 
    147126        iy=1 
     
    155134        iy+=1 
    156135        self.sizer6.Add((20,20),(iy,ix),(1,1),wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15)   
     136 
     137         
    157138        #---------sizer 9 draw---------------------------------------- 
    158         ## Q range 
     139        
     140         ## Q range 
    159141        self.qmin_x= 0.001 
    160142        self.qmax_x= 0.1 
     
    208190        iy+=1  
    209191        self.sizer9.Add((20,20),(iy,ix),(1,1), wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 0) 
     192        #----------sizer 10 draw------------------------------------------------------ 
     193        """ 
     194        id = wx.NewId() 
     195        self.btClose =wx.Button(self,id,'Close') 
     196        self.btClose.Bind(wx.EVT_BUTTON, self.onClose,id=id) 
     197        self.btClose.SetToolTipString("Close page.") 
     198         
     199        ix= 3 
     200        iy= 1 
     201        self.sizer10.Add((20,20),(iy,ix),(1,1),wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15) 
     202        ix +=1 
     203        self.sizer10.Add( self.btClose,(iy,ix),(1,1), wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 0) 
     204        ix =0 
     205        iy+=1 
     206        self.sizer10.Add((20,20),(iy,ix),(1,1),wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15) 
     207        """ 
     208        # contains link between  model ,all its parameters, and panel organization 
     209        self.parameters=[] 
     210        self.fixed_param=[] 
     211        self.fittable_param=[] 
     212        self.polydisp= {} 
     213        #contains link between a model and selected parameters to fit  
     214        self.param_toFit=[] 
     215         
     216        #dictionary of model name and model class 
     217        self.model_list_box={} 
     218        #Draw initial panel 
     219         #-----sizer 11--------------------model description------ 
     220        if self.model!=None: 
     221            self.set_panel(self.model) 
     222        self.theta_cb=None 
     223        
     224        
    210225        self.vbox.Layout() 
    211226        self.vbox.Fit(self)  
     
    213228        self.SetScrollbars(20,20,55,40) 
    214229         
    215          
     230        self.Centre() 
     231        self.Layout() 
     232        self.parent.GetSizer().Layout() 
    216233    def set_model_description(self, model): 
    217         """ 
    218             Set a sizer with model description field 
    219             @param model: the model select that provides the description 
    220         """ 
     234         
    221235        if model !=None and str(model.description)!=""and self.data==None: 
    222236            self.sizer11.Clear(True) 
     
    266280     
    267281 
    268     def set_Dispers_Param(self, event): 
    269         """ 
    270              set a sizer with dispersion parameters  
     282    def Set_DipersParam(self, event): 
     283        """ 
     284            This method is called when the user changes the state  
     285            of the "dispersity" radio buttons. 
     286             
     287            #TODO: correct the spelling mistake in the name of this method, start name with lowercase. 
    271288        """ 
    272289        if self.enable_disp.GetValue(): 
     
    287304                return  
    288305            else: 
    289                 # allow to recognize data panel from model panel 
    290                 if self.data !=None and self.model !=None:  
    291                      
    292                     self.cb1.SetValue(False) 
    293                     self.select_all_param_helper() 
    294                  
     306                # Show the default dispersion/averaging sub-panel 
    295307                self.populate_disp_box() 
    296308                self.set_panel_dispers(self.disp_list) 
     
    323335             
    324336    def populate_disp_box(self): 
    325         """ 
    326             populate polydispersion combo box  
    327         """ 
    328337        self.sizer7.Clear(True) 
    329338        if len(self.disp_list)>0: 
     
    341350            for k,v in self.polydisp.iteritems(): 
    342351                if str(v)=="MyModel": 
    343                                 # Remove the option until the rest of the code is ready for it 
     352                    # Remove the option until the rest of the code is ready for it 
    344353                    #self.disp_box.Insert("Select customized Model",id) 
    345354                    pass   
     
    372381        self.qmax.SetValue(format_number(self.qmax_x)) 
    373382        self.npts.SetValue(format_number(self.num_points)) 
    374          
    375          
    376383    def checkFitRange(self): 
    377384        """ 
     
    380387            background is colored in pink. 
    381388        """ 
     389        
    382390        flag = True 
    383391        valueMin = self.qmin.GetValue() 
    384392        valueMax = self.qmax.GetValue() 
    385393        # Check for possible values entered 
     394        #print "fitpage: checkfitrange:",valueMin,valueMax 
    386395        try: 
    387396            if (float(valueMax)> float(valueMin)): 
     
    401410        return flag 
    402411     
     412 
     413         
     414    def onClose(self,event): 
     415        """ close the page associated with this panel""" 
     416        self.parent.onClose() 
     417         
     418   
    403419         
    404420    def onModel2D(self, event): 
     
    440456        type =event.GetString() 
    441457        self.set_panel_dispers( self.disp_list,type ) 
    442            
    443       
     458                 
    444459    def _on_select_model(self,event): 
    445460        """ 
     
    532547        self.text2_3.Hide()  
    533548         
     549        
    534550        ix +=1 
    535551        self.text2_4 = wx.StaticText(self, -1, 'Units') 
     
    538554        self.text2_4.Hide() 
    539555        disp_list=self.model.getDispParamList() 
    540         #  
    541556        for item in keys: 
    542557            if not item in disp_list: 
     
    599614         
    600615    def _selectDlg(self): 
    601         """ 
    602             Create a dialog to select files 
    603         """ 
    604616        import os 
    605617        dlg = wx.FileDialog(self, "Choose a weight file", os.getcwd(), "", "*.*", wx.OPEN) 
     
    609621        dlg.Destroy() 
    610622        return path 
    611      
    612      
    613623    def read_file(self, path): 
    614         """ 
    615             Read a file  of 2 colons 
    616             @param path: the path to the file 
    617             @return 2 numpy arrays containing numbers 
    618         """ 
    619624        try: 
    620625            if path==None: 
     
    641646            return numpy.array(angles), numpy.array(weights) 
    642647        except: 
    643              msg= "Simultaneous Fit completed but Following error occurred: " 
    644              msg+= "%s"%sys.exc_value 
    645              wx.PostEvent(self.parent.parent, StatusEvent(status=msg)) 
    646              return   
     648            raise  
    647649         
    648650           
     
    652654            @param event: check box event 
    653655        """ 
     656         
     657         
    654658        # Go through the list of dispersion check boxes to identify which one has changed  
    655659        for p in self.disp_cb_dict: 
     
    713717                    self._draw_model() 
    714718        return 
    715         
     719 
     720                       
     721                       
    716722                       
    717723    def set_panel_dispers(self, disp_list, type="GaussianModel" ): 
    718724        """ 
    719             Fill sizer with disperstion info 
    720725        """ 
    721726         
     
    838843            self.parent.GetSizer().Layout()   
    839844           
    840            
    841845    def checkFitValues(self,val_min, val_max): 
    842846        """ 
     
    894898        self.set_model_parameter() 
    895899         
    896          
    897          
    898900    def set_model_parameter(self): 
    899901        """ 
    900             Value Enter by the user on the parameter fields are used to reset the model 
    901             and model will be drawn again if the user enters different values 
    902902        """ 
    903903        if len(self.parameters) !=0 and self.model !=None: 
     
    915915                          
    916916                except: 
     917                    #raise 
    917918                    wx.PostEvent(self.parent.parent, StatusEvent(status=\ 
    918919                            "Model Drawing  Error:wrong value entered : %s"% sys.exc_value)) 
     
    931932                          
    932933                except: 
     934                    raise 
    933935                    wx.PostEvent(self.parent.parent, StatusEvent(status=\ 
    934                             "Model Drawing Error:wrong value entered : %s"% sys.exc_value)) 
     936                            "Model Drawing  Error:wrong value entered : %s"% sys.exc_value)) 
    935937                 
    936938            for item in self.parameters: 
     
    947949                    #raise  
    948950                    wx.PostEvent(self.parent.parent, StatusEvent(status=\ 
    949                            "Model Drawing Error:wrong value entered : %s"% sys.exc_value)) 
     951                           "Model Drawing  Error:wrong value entered : %s"% sys.exc_value)) 
    950952                    return 
    951953                 
     
    968970                self._draw_model()             
    969971             
    970              
    971972    def _draw_model(self, name=None): 
    972973        """ 
     
    985986                                enable2D=self.enable2D) 
    986987        
    987         
    988988    def select_param(self,event): 
    989989        """ 
    990             Select_parameter is implemented in fitpage.py  
     990         
    991991        """ 
    992992        pass 
    993      
    994      
    995993    def select_all_param(self,event):  
    996994        """ 
    997             Implemented in fitpage.py 
     995         
    998996        """ 
    999997        pass 
    1000      
    1001      
    1002998    def select_all_param_helper(self): 
    1003999        """ 
    1004              Allows selecting or unselecting  checkbutton 
     1000             Allows selecting or delecting button 
    10051001        """ 
    10061002        self.param_toFit=[] 
Note: See TracChangeset for help on using the changeset viewer.