Changeset 442895f in sasview for sansview/perspectives


Ignore:
Timestamp:
Sep 23, 2008 3:25:52 PM (16 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:
6aa47df
Parents:
e71440c
Message:

models added

Location:
sansview/perspectives/fitting
Files:
6 edited

Legend:

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

    r55fd102 r442895f  
    22import wx 
    33import wx.lib 
    4 import numpy 
     4import numpy,math 
    55import copy 
    66 
     
    6565        self.vbox.Add(self.sizer1) 
    6666         
     67        id = wx.NewId() 
     68        self.btClose =wx.Button(self,id,'Close') 
     69        self.btClose.Bind(wx.EVT_BUTTON, self.onClose,id=id) 
     70        self.btClose.SetToolTipString("Close page.") 
    6771        ix = 0 
    6872        iy = 1 
     
    123127        ix +=2 
    124128        self.sizer1.Add(self.btFit,(iy,ix),(1,1), wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 0) 
    125          
     129        iy+= 1 
     130        ix = 3 
     131        self.sizer1.Add( self.btClose,(iy,ix),(1,1), wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 0) 
    126132        # contains link between  model ,all its parameters, and panel organization 
    127133        self.parameters=[] 
     
    193199             from the previous selected data 
    194200        """ 
    195         
    196201        try: 
    197202            if dataset !=None: 
     
    205210         
    206211         
     212    def onClose(self,event): 
     213        self.GrandParent.onClose() 
     214         
     215         
     216    def compute_chisqr(self): 
     217        """ @param fn: function that return model value 
     218            @return residuals 
     219        """ 
     220        flag=self.checkFitRange() 
     221        if flag== True: 
     222            qmin = float(self.xmin.GetValue()) 
     223            qmax = float(self.xmax.GetValue()) 
     224            x,y,dy = [numpy.asarray(v) for v in (self.data.x,self.data.y,self.data.dy)] 
     225            if qmin==None and qmax==None:  
     226                fx =numpy.asarray([self.model.run(v) for v in x]) 
     227                res=(y - fx)/dy 
     228            else: 
     229                idx = (x>= qmin) & (x <=qmax) 
     230                fx = numpy.asarray([self.model.run(item)for item in x[idx ]]) 
     231                res= (y[idx] - fx)/dy[idx]   
     232             
     233            sum=0 
     234            for item in res: 
     235                sum +=item 
     236        self.tcChi.SetValue(format_number(math.fabs(sum))) 
     237             
     238             
    207239    def onFit(self,event): 
    208240        """ signal for fitting""" 
     
    214246        qmax =float( self.xmax.GetValue()) 
    215247        if len(self.param_toFit) >0 and flag==True: 
    216             #self.manager._on_single_fit(model=self.model,qmin=qmin,qmax=qmax) 
    217248            self.manager._on_single_fit(qmin=qmin,qmax=qmax) 
    218249        else: 
     
    264295            set a flag to determine if the fitting range entered by the user is valid 
    265296        """ 
     297       
    266298        try: 
    267299            flag=self.checkFitRange() 
     
    269301                 self.manager.redraw_model(float(self.xmin.GetValue())\ 
    270302                                               ,float(self.xmax.GetValue())) 
     303            
    271304        except: 
    272305            wx.PostEvent(self.parent.GrandParent, StatusEvent(status=\ 
     
    489522            self.xmin.Disable() 
    490523            self.xmax.Disable() 
    491        
     524        self.compute_chisqr() 
    492525        self.vbox.Layout() 
    493526        self.GrandParent.GetSizer().Layout() 
     
    500533        """ 
    501534        self.set_model_parameter() 
    502          
     535        self.compute_chisqr() 
     536      
    503537    def set_model_parameter(self): 
     538        """ 
     539            this method redraws the model according to parameters values changes 
     540            and the reset model according to paramaters changes 
     541        """ 
    504542        if len(self.parameters) !=0 and self.model !=None: 
    505543            for item in self.parameters: 
     
    514552                     wx.PostEvent(self.parent.GrandParent, StatusEvent(status=\ 
    515553                            "Drawing  Error:wrong value entered : %s"% sys.exc_value)) 
     554                      
     555                      
    516556    def select_all_param(self,event):  
    517557        """ 
     
    603643            for item in self.param_toFit: 
    604644                if( out != None ) and len(out)<=len(self.param_toFit)and i < len(out): 
    605                     item[1].SetValue(format_number(out[i])) 
     645                    #item[1].SetValue(format_number(out[i])) 
     646                    item[1].SetValue(format_number(self.model.getParam(item[0].GetLabelText()))) 
    606647                    item[1].Refresh()  
    607648                if (cov !=None)and len(cov)<=len(self.param_toFit)and i < len(cov): 
  • sansview/perspectives/fitting/fitpanel.py

    r4fc6dbf r442895f  
    3737        self.nb.AddPage(self.sim_page,"Simultaneous Fit") 
    3838         
    39         id = wx.NewId() 
    40         self.btClose =wx.Button(self,id,'Close') 
    41         self.btClose.Bind(wx.EVT_BUTTON, self.onClose,id=id) 
    42         self.btClose.SetToolTipString("Close page.") 
    43      
    44         sizer_button = wx.BoxSizer(wx.HORIZONTAL) 
    45         sizer_button.Add((20, 20), 1, wx.EXPAND|wx.ADJUST_MINSIZE, 0) 
    46         sizer_button.Add(self.btClose, 0, wx.LEFT|wx.RIGHT|wx.ADJUST_MINSIZE, 10) 
    47         self.sizer.Add(sizer_button,1, wx.EXPAND) 
    4839        #dictionary of miodel {model class name, model class} 
    4940        self.model_list_box={} 
     
    145136        return self.nb.GetPage(self.nb.GetSelection()) 
    146137     
    147     def onClose(self,event): 
     138    def onClose(self): 
    148139        """ 
    149140             close the current page except the simpage. remove each check box link to the model 
    150141             selected on that page. remove its reference into page_finder (fitting module) 
    151142        """ 
     143        
    152144        sim_page = self.nb.GetPage(0) 
    153145        selected_page = self.nb.GetPage(self.nb.GetSelection()) 
  • sansview/perspectives/fitting/fitting.py

    r55fd102 r442895f  
    1414import fitpage 
    1515import park 
     16class PlottableDatas(Data,Data1D): 
     17    """ class plottable data: class allowing to plot Data type on panel""" 
     18     
     19    def __init__(self,data=None,data1d=None): 
     20        Data.__init__(self,sans_data=data1d) 
     21        Data1D.__init__(self,x=data1d.x,y = data1d.y,dx = data1d.dx,dy = data1d.dy) 
     22        #self.x = data1d.x 
     23        #self.y = data1d.y 
     24        #self.dx = data1d.dx 
     25        #self.dy = data1d.dy 
     26        #self.data=data 
     27        self.group_id = data1d.group_id 
     28        #x_name, x_units = data1d.get_xaxis()  
     29        #y_name, y_units = data1d.get_yaxis()  
     30        #self.xaxis( x_name, x_units) 
     31        #self.yaxis( y_name, y_units ) 
     32        #self.qmin = data.qmin 
     33        #self.qmax = data.qmax 
     34        
    1635 
    1736class PlottableData(Data,Data1D): 
    1837    """ class plottable data: class allowing to plot Data type on panel""" 
    19     def __init__(self,data,data1d): 
     38     
     39    def __init__(self,data=None,data1d=None): 
     40        #Data.__init__(self,*args) 
     41        #Data1D.__init__(self,**kw) 
    2042        self.x = data1d.x 
    2143        self.y = data1d.y 
    2244        self.dx = data1d.dx 
    2345        self.dy = data1d.dy 
    24         
     46        self.data=data 
    2547        self.group_id = data1d.group_id 
    2648        x_name, x_units = data1d.get_xaxis()  
     
    3052        self.qmin = data.qmin 
    3153        self.qmax = data.qmax 
     54        def residuals(self, fn): 
     55            return self.data.residuals(fn) 
    3256 
    3357class Plugin: 
     
    6892        wx.EVT_MENU(owner, id1, self.on_perspective) 
    6993        id3 = wx.NewId() 
    70         self.menu1.Append(id3,'&scipy \ park','toggle engine to park or scipy') 
     94        self.menu1.AppendCheckItem(id3, "park")  
    7195        wx.EVT_MENU(owner, id3, self._onset_engine) 
    7296         
     
    166190                    #create a fitproblem storing all link to data,model,page creation 
    167191                    self.page_finder[page]= FitProblem() 
    168                     data_for_park= Data(sans_data=item) 
    169                     datap=PlottableData(data=data_for_park,data1d=item) 
    170                     self.page_finder[page].add_data(datap) 
     192                    #data_for_park= Data(sans_data=item) 
     193                    #datap = PlottableData(data=data_for_park,data1d=item) 
     194                    #self.page_finder[page].add_data(datap) 
     195                    self.page_finder[page].add_data(item) 
    171196                except: 
     197                    #raise 
    172198                    wx.PostEvent(self.parent, StatusEvent(status="Fitting error: \ 
    173199                    data already Selected ")) 
     
    230256                    break 
    231257            i = 0 
     258#            print "fitting: single fit pars ", pars 
    232259            for name in pars: 
    233260                if result.pvec.__class__==numpy.float64: 
     
    235262                else: 
    236263                    model.setParam(name,result.pvec[i]) 
     264#                    print "fitting: single fit", name, result.pvec[i] 
    237265                    i += 1 
     266#            print "fitting result : chisqr",result.fitness 
     267#            print "fitting result : pvec",result.pvec 
     268#            print "fitting result : stderr",result.stderr 
     269             
    238270            current_pg.onsetValues(result.fitness, result.pvec,result.stderr) 
    239271            self.plot_helper(currpage=current_pg,qmin=qmin,qmax=qmax) 
    240272        except: 
     273            raise 
    241274            wx.PostEvent(self.parent, StatusEvent(status="Fitting error: %s" % sys.exc_value)) 
    242275             
     
    319352                try: 
    320353                    self.fitter.set_model(Model(model), self.id, pars)  
    321                     self.fitter.set_data(data,self.id,qmin,qmax) 
     354                    #print "fitting: data .x",data.x 
     355                    #print "fitting: data .y",data.y 
     356                    #print "fitting: data .dy",data.dy 
     357                    self.fitter.set_data(Data(sans_data=data),self.id,qmin,qmax) 
    322358                 
    323359                    result=self.fitter.fit() 
     
    325361                    
    326362                except: 
     363                    raise 
    327364                    wx.PostEvent(self.parent, StatusEvent(status="Single Fit error: %s" % sys.exc_value)) 
    328365                    return 
     
    364401                            return 
    365402                    self.fitter.set_model(Model(model), self.id, pars)  
    366                     self.fitter.set_data(data,self.id,qmin,qmax) 
     403                    self.fitter.set_data(Data(sans_data=data),self.id,qmin,qmax) 
    367404                 
    368405                    self.id += 1  
     
    415452            model.name="M"+str(self.index_model) 
    416453            self.index_model += 1   
    417             #self.page_finder[current_pg].set_theory("Fitness") 
     454             
    418455            self.page_finder[current_pg].set_model(model,M_name) 
    419456            self.plot_helper(currpage= current_pg,qmin= None,qmax= None) 
     
    448485            if data!=None: 
    449486                theory = Theory1D(x=[], y=[]) 
    450                 theory.name = model.name 
     487                theory.name = "Model" 
    451488                theory.group_id = data.group_id 
    452489               
     
    455492                theory.xaxis(x_name, x_units) 
    456493                theory.yaxis(y_name, y_units) 
    457                
     494                #print"fitting : redraw data.x",data.x 
     495                #print"fitting : redraw data.y",data.y 
     496                #print"fitting : redraw data.dy",data.dy 
    458497                if qmin == None : 
    459498                   qmin = min(data.x) 
     
    489528                        skipping point x %g %s" %(qmax, sys.exc_value))) 
    490529                try: 
    491                     from sans.guicomm.events import NewPlotEvent 
     530                    #print "fitting redraw for plot thoery .x",theory.x 
     531                    #print "fitting redraw for plot thoery .y",theory.y 
     532                    #print "fitting redraw for plot thoery .dy",theory.dy 
     533                    #rom sans.guicomm.events import NewPlotEvent 
    492534                    wx.PostEvent(self.parent, NewPlotEvent(plot=theory, title="Analytical model")) 
    493535                except: 
     536                    raise 
    494537                    print "SimView.complete1D: could not import sans.guicomm.events" 
    495538             
     
    520563            
    521564            new_plot = Theory1D(x, y) 
    522             new_plot.name = model.name 
     565            new_plot.name = "Model" 
    523566            new_plot.xaxis("\\rm{Q}", 'A^{-1}') 
    524567            new_plot.yaxis("\\rm{Intensity} ","cm^{-1}") 
  • sansview/perspectives/fitting/modelpage.py

    r55fd102 r442895f  
    268268                     self.manager.draw_model(self.model) 
    269269                except: 
     270                     
    270271                     wx.PostEvent(self.parent.GrandParent, StatusEvent(status=\ 
    271                             "Drawing  Error:wrong value entered : %s"% sys.exc_value)) 
     272                            "Model Drawing  Error:wrong value entered : %s"% sys.exc_value)) 
    272273    
    273274   
  • sansview/perspectives/fitting/models.py

    r3b19ac9 r442895f  
    11import wx 
    22import imp 
    3 import os,sys 
     3import os,sys,math 
    44import os.path 
    55 
     
    7676        self.model_list = {} 
    7777        self.model_list_box = {} 
     78         
    7879        model_info="shape-based models" 
     80         
     81        from sans.models.SphereModel import SphereModel 
     82        self.model_list[str(wx.NewId())] =  ModelInfo(SphereModel , model_info) 
     83         
    7984        from sans.models.CylinderModel import CylinderModel 
    8085        self.model_list[str(wx.NewId())] = ModelInfo(CylinderModel , model_info) 
    8186       
    82         from sans.models.SphereModel import SphereModel 
    83         self.model_list[str(wx.NewId())] =  ModelInfo(SphereModel , model_info) 
    84     
     87        from sans.models.CoreShellModel import CoreShellModel 
     88        self.model_list[str(wx.NewId())] = ModelInfo(CoreShellModel , model_info) 
     89         
     90        from sans.models.CoreShellCylinderModel import CoreShellCylinderModel 
     91        self.model_list[str(wx.NewId())] = ModelInfo(CoreShellCylinderModel , model_info) 
     92         
     93        from sans.models.EllipticalCylinderModel import EllipticalCylinderModel 
     94        self.model_list[str(wx.NewId())] = ModelInfo(EllipticalCylinderModel , model_info) 
     95         
     96        from sans.models.EllipsoidModel import EllipsoidModel 
     97        self.model_list[str(wx.NewId())] = ModelInfo(EllipsoidModel , model_info) 
     98         
    8599        from sans.guitools.LineModel import LineModel 
    86100        self.model_list[str(wx.NewId())]  = ModelInfo(LineModel , model_info) 
     101         
     102         
    87103        model_info="shape-independent models" 
    88         from sans.models.Lorentzian import Lorentzian 
    89         self.indep_model.append( ModelInfo(Lorentzian , model_info) ) 
     104         
     105        from sans.models.BEPolyelectrolyte import BEPolyelectrolyte 
     106        self.indep_model.append( ModelInfo( BEPolyelectrolyte , model_info) ) 
     107         
     108        from sans.models.DABModel import DABModel 
     109        self.indep_model.append( ModelInfo(DABModel , model_info+ 
     110        "\n Evaluates F(x) = scale/( 1 + (x*L)^2 )^(2) +bkd") ) 
     111         
     112        from sans.models.DebyeModel import DebyeModel 
     113        self.indep_model.append( ModelInfo(DebyeModel , model_info+ 
     114        "\n Evaluates F(x) = 2( exp(-x)+x -1 )/x**2") ) 
     115         
     116        from sans.models.FractalModel import FractalModel 
     117        class FractalAbsModel(FractalModel): 
     118            def _Fractal(self, x): 
     119                return FractalModel._Fractal(self, math.fabs(x)) 
     120        self.indep_model.append( ModelInfo(FractalAbsModel , model_info) ) 
     121         
     122        from sans.models.LorentzModel import LorentzModel 
     123        self.indep_model.append( ModelInfo(LorentzModel , model_info+ 
     124                "\n Evaluates F(x)= scale/( 1 + (x*L)^2 ) + bkd ") )  
     125             
     126        from sans.models.PowerLawModel import PowerLawModel 
     127        class PowerLawAbsModel(PowerLawModel): 
     128            def _PowerLaw(self, x): 
     129                try: 
     130                    return PowerLawModel._PowerLaw(self, math.fabs(x)) 
     131                except: 
     132                    print sys.exc_value   
     133        self.indep_model.append( ModelInfo(PowerLawAbsModel , model_info+ 
     134        "\n Evaluates abs(F(x)) \n with F(x) = scale* (x)^(m) + bkd ") ) 
     135                     
     136        
     137        from sans.models.TeubnerStreyModel import TeubnerStreyModel 
     138        self.indep_model.append( ModelInfo(TeubnerStreyModel , model_info) ) 
     139         
     140         
     141           
     142         
     143         
     144       
    90145         
    91146        #Looking for plugins 
  • sansview/perspectives/fitting/simfitpage.py

    r55fd102 r442895f  
    3939                        wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15) 
    4040        wx.EVT_CHECKBOX(self, self.cb1.GetId(), self.select_all_model_name) 
    41         
    42         ix  = 0 
    43         iy  = 1 
     41       
    4442        text=wx.StaticText(self, -1, 'Constraint') 
    4543        self.sizer2.Add(text,0, wx.LEFT|wx.RIGHT|wx.ADJUST_MINSIZE, 10) 
    46         ix  = 0 
    47         iy  += 1 
     44 
    4845        self.ctl2 = wx.TextCtrl(self, -1, style=wx.TE_MULTILINE) 
    4946        self.ctl2.Bind(wx.EVT_KILL_FOCUS, self._onTextEnter) 
    5047        self.ctl2.Bind(wx.EVT_TEXT_ENTER, self._onTextEnter) 
    5148        self.sizer2.Add(self.ctl2, 0, wx.LEFT|wx.RIGHT|wx.ADJUST_MINSIZE, 10) 
    52         ix +=2 
     49        
    5350        self.sizer2.Add(self.btFit, 0, wx.LEFT|wx.RIGHT|wx.ADJUST_MINSIZE, 10) 
    5451        self.params=[] 
     
    5653        self.model_toFit=[] 
    5754        self.page_finder={} 
    58         iy +=1 
     55        
     56 
    5957        #self.sizer2.Add((20,20),(iy, ix)) 
    60         self.sizer2.Add((20,20), 0, wx.LEFT|wx.RIGHT|wx.ADJUST_MINSIZE, 10) 
     58        #self.sizer2.Add((20,20), 0, wx.LEFT|wx.RIGHT|wx.ADJUST_MINSIZE, 10) 
    6159        self.vbox.Layout() 
    6260        self.vbox.Fit(self)  
     
    117115        for page, value in page_finder.iteritems(): 
    118116            try: 
    119                 list=value.get_model() 
    120                 model=list[0] 
    121                 modelname=list[1] 
     117                list = value.get_model() 
     118                model = list[0] 
     119                modelname = list[1] 
    122120                cb = wx.CheckBox(self, -1, modelname, (10, 10)) 
    123121                cb.SetValue(False) 
     
    131129                #(value.get_data().group_id,sys.exc_value))) 
    132130                pass 
     131        iy +=1 
     132        self.sizer1.Add((20,20),( iy,ix),(1,1),  wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15) 
    133133        self.sizer1.Layout()         
    134134        self.vbox.Layout() 
Note: See TracChangeset for help on using the changeset viewer.