Ignore:
Timestamp:
May 10, 2010 6:50:05 PM (14 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:
4fbc93e
Parents:
2d409fa
Message:

Plugged in 2D smear: traditional over-sampling method

File:
1 edited

Legend:

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

    r784e2fa rf72333f  
    4444(PageInfoEvent, EVT_PAGE_INFO)   = wx.lib.newevent.NewEvent() 
    4545 
    46  
     46from fitpage import Chi2UpdateEvent 
    4747class PlotInfo: 
    4848    """ 
     
    104104        #dictionary containing data name and error on dy of that data  
    105105        self.err_dy = {} 
    106          
     106        self.theory_data = None       
    107107    
    108108         
     
    146146        self.fit_panel.set_model_list(self.menu_mng.get_model_list()) 
    147147        owner.Bind(fitpage.EVT_MODEL_BOX,self._on_model_panel) 
    148        
     148 
    149149        #create  menubar items 
    150150        return [(id, self.menu1, "Fitting")] 
     
    370370            wx.PostEvent(self.parent, StatusEvent(status="Fitting  \ 
    371371                is cancelled" , type="stop")) 
     372            
     373    def set_smearer_nodraw(self,smearer, qmin=None, qmax=None): 
     374        """ 
     375            Get a smear object and store it to a fit problem 
     376            @param smearer: smear object to allow smearing data 
     377        """   
     378        self.current_pg=self.fit_panel.get_current_page() 
     379        self.page_finder[self.current_pg].set_smearer(smearer) 
     380        ## draw model 1D with smeared data 
     381        data =  self.page_finder[self.current_pg].get_fit_data() 
     382        model = self.page_finder[self.current_pg].get_model() 
     383        ## if user has already selected a model to plot 
     384        ## redraw the model with data smeared 
     385         
     386        smear =self.page_finder[self.current_pg].get_smearer()    
    372387             
    373388    def set_smearer(self,smearer, qmin=None, qmax=None): 
     
    383398        ## if user has already selected a model to plot 
    384399        ## redraw the model with data smeared 
    385          
     400 
    386401        smear =self.page_finder[self.current_pg].get_smearer() 
    387402        if model!= None: 
     
    405420              
    406421        """ 
    407         ## draw model 1D with no loaded data 
    408         self._draw_model1D( model= model, data= data,enable1D=enable1D, smearer= smearer, 
    409                            qmin= qmin, qmax= qmax, qstep= qstep ) 
    410         ## draw model 2D with no initial data 
    411         self._draw_model2D(model=model, 
    412                            data = data, 
    413                            enable2D= enable2D, 
    414                            qmin=qmin, 
    415                            qmax=qmax, 
    416                            qstep=qstep) 
     422 
     423        if data.__class__.__name__ !="Data2D":     
     424            ## draw model 1D with no loaded data 
     425            self._draw_model1D( model= model, data= data, 
     426                                                    enable1D=enable1D,  
     427                                                    smearer= smearer, 
     428                                                    qmin= qmin, qmax= qmax, qstep= qstep ) 
     429        else:      
     430            ## draw model 2D with no initial data 
     431             self._draw_model2D(model=model, 
     432                                      data = data, 
     433                                      enable2D= enable2D, 
     434                                      smearer= smearer, 
     435                                      qmin=qmin, 
     436                                      qmax=qmax, 
     437                                      qstep=qstep) 
    417438             
    418439    def onFit(self): 
     
    600621            wx.PostEvent(self.parent, StatusEvent(status=msg, info="error")) 
    601622            return 
    602      
     623 
     624         
    603625    def _onEVT_SLICER_PANEL(self, event): 
    604626        """ 
     
    10871109                 
    10881110                 
    1089     def _complete1D(self, x,y, elapsed,model,data=None): 
     1111    def _complete1D(self, x,y, elapsed,index,model,data=None): 
    10901112        """ 
    10911113            Complete plotting 1D data 
     
    11061128            
    11071129            title= new_plot.name 
     1130            # x, y are only in range of index  
     1131            self.theory_data = new_plot 
    11081132            #new_plot.perspective = self.get_perspective() 
    11091133            # Pass the reset flag to let the plotting event handler 
     
    11161140            else: 
    11171141                wx.PostEvent(self.parent, NewPlotEvent(plot=new_plot,title= str(title))) 
     1142            # Chisqr in fitpage 
     1143            current_pg=self.fit_panel.get_current_page() 
     1144            wx.PostEvent(current_pg,Chi2UpdateEvent(output=self._cal_chisqr(data=data,index=index))) 
    11181145            msg = "Plot 1D  complete !" 
    11191146            wx.PostEvent( self.parent, StatusEvent(status=msg , type="stop" )) 
     
    11341161         
    11351162         
    1136     def _complete2D(self, image,data, model,  elapsed,qmin, qmax,qstep=DEFAULT_NPTS): 
     1163    def _complete2D(self, image,data, model,  elapsed,index,qmin, qmax,qstep=DEFAULT_NPTS): 
    11371164        """ 
    11381165            Complete get the result of modelthread and create model 2D 
     
    11651192            theory.xmin= data.xmin 
    11661193            theory.xmax= data.xmax 
    1167        
    1168         
     1194             
     1195        self.theory_data = theory 
    11691196        ## plot 
    11701197        wx.PostEvent(self.parent, NewPlotEvent(plot=theory, 
    11711198                         title="Analytical model 2D ", reset=True )) 
     1199        # Chisqr in fitpage 
     1200        current_pg=self.fit_panel.get_current_page() 
     1201        wx.PostEvent(current_pg,Chi2UpdateEvent(output=self._cal_chisqr(data=data,index=index))) 
    11721202        msg = "Plot 2D complete !" 
    11731203        wx.PostEvent( self.parent, StatusEvent( status= msg , type="stop" )) 
    1174           
     1204      
    11751205    def _on_data_error(self, event): 
    11761206        """ 
     
    11791209        """ 
    11801210        self.err_dy = event.err_dy 
    1181         #print "receiving error dy",self.err_dy 
    11821211          
    1183     def _draw_model2D(self,model,data=None,description=None, enable2D=False, 
     1212    def _draw_model2D(self,model,data=None, smearer= None,description=None, enable2D=False, 
    11841213                      qmin=DEFAULT_QMIN, qmax=DEFAULT_QMAX, qstep=DEFAULT_NPTS): 
    11851214        """ 
     
    12081237                x= data.x_bins 
    12091238                y= data.y_bins 
    1210                  
     1239                
    12111240        if not enable2D: 
    1212             return 
     1241            return None,None 
    12131242        try: 
    12141243            from model_thread import Calc2D 
     
    12161245            if self.calc_2D != None and self.calc_2D.isrunning(): 
    12171246                self.calc_2D.stop() 
     1247 
    12181248            self.calc_2D = Calc2D(  x= x, 
    12191249                                    y= y, 
    12201250                                    model= model,  
    12211251                                    data = data, 
     1252                                    smearer = smearer, 
    12221253                                    qmin= qmin, 
    12231254                                    qmax= qmax, 
     
    12261257                                    updatefn= self._update2D ) 
    12271258            self.calc_2D.queue() 
    1228              
     1259 
    12291260        except: 
    12301261            msg= " Error occurred when drawing %s Model 2D: "%model.name 
    12311262            msg+= " %s"%sys.exc_value 
    12321263            wx.PostEvent( self.parent, StatusEvent(status= msg )) 
    1233             return   
     1264 
    12341265    
    12351266    def _draw_model1D(self, model, data=None, smearer= None, 
     
    12571288         
    12581289        if not enable1D: 
    1259             return 
     1290            return  
    12601291     
    12611292        try: 
     
    12731304                                  updatefn = self._update1D  ) 
    12741305            self.calc_1D.queue() 
    1275              
     1306 
    12761307        except: 
    12771308            msg= " Error occurred when drawing %s Model 1D: "%model.name 
    12781309            msg+= " %s"%sys.exc_value 
    12791310            wx.PostEvent( self.parent, StatusEvent(status= msg )) 
    1280             return   
    1281              
    1282  
     1311 
     1312    def _cal_chisqr(self, data=None, index=None):  
     1313        """ 
     1314            Get handy Chisqr using the output from draw1D and 2D,  
     1315            instead of calling expansive CalcChisqr in guithread 
     1316        """ 
     1317        # default chisqr 
     1318        chisqr = None 
     1319        # return None if data == None 
     1320        if data == None: return chisqr 
     1321 
     1322        # Get data: data I, theory I, and data dI in order 
     1323        if data.__class__.__name__ =="Data2D": 
     1324            if index == None: index = numpy.ones(len(data.data),ntype=bool) 
     1325            fn = data.data[index]  
     1326            gn = self.theory_data.data[index] 
     1327            en = data.err_data[index] 
     1328        else: 
     1329            # 1 d theory from model_thread is only in the range of index 
     1330            if index == None: index = numpy.ones(len(data.y),ntype=bool) 
     1331             
     1332            fn = data.y[index]  
     1333            gn = self.theory_data.y 
     1334            en = data.dy[index] 
     1335 
     1336        # residual 
     1337        res = (fn - gn)/en 
     1338        # get chisqr only w/finite 
     1339        chisqr = numpy.average(res[numpy.isfinite(res)]*res[numpy.isfinite(res)]) 
     1340 
     1341        return chisqr 
     1342     
     1343     
    12831344def profile(fn, *args, **kw): 
    12841345    import cProfile, pstats, os 
Note: See TracChangeset for help on using the changeset viewer.