Ignore:
Timestamp:
Feb 2, 2009 7:28:06 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:
ca88b2e
Parents:
2cf2b87
Message:

redesign the model1D and madel page

File:
1 edited

Legend:

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

    r00d083c r26bf293  
    55import copy 
    66import sans.models.dispersion_models  
    7 from sans.guicomm.events import StatusEvent    
     7from sans.guicomm.events import StatusEvent  
     8from sans.guiframe.utils import format_number 
     9from modelpage import ModelPage   
     10from modelpage import format_number 
    811(ModelEventbox, EVT_MODEL_BOX) = wx.lib.newevent.NewEvent() 
    912_BOX_WIDTH = 80 
    1013 
    11 def format_number(value, high=False): 
    12     """ 
    13         Return a float in a standardized, human-readable formatted string  
    14     """ 
    15     try:  
    16         value = float(value) 
    17     except: 
    18         print "returning 0" 
    19         return "0" 
    20      
    21     if high: 
    22         return "%-6.4g" % value 
    23     else: 
    24         return "%-5.3g" % value 
    2514 
    26 from modelpage import format_number 
    27 from modelpage import ModelPage 
     15 
    2816class FitPage1D(ModelPage): 
    2917    """ 
     
    4533            Initialization of the Panel 
    4634        """ 
    47         #self.scroll = wx.ScrolledWindow(self) 
    48          
     35        self.data = data 
     36        self.enable2D=False 
    4937        self.manager = None 
    5038        self.parent  = parent 
     
    5240        #panel interface 
    5341        self.vbox  = wx.BoxSizer(wx.VERTICAL) 
     42        self.sizer10 = wx.GridBagSizer(5,5) 
     43        self.sizer9 = wx.GridBagSizer(5,5) 
     44        self.sizer8 = wx.GridBagSizer(5,5) 
     45        self.sizer7 = wx.GridBagSizer(5,5) 
    5446        self.sizer6 = wx.GridBagSizer(5,5) 
    5547        self.sizer5 = wx.GridBagSizer(5,5) 
     
    5850        self.sizer2 = wx.GridBagSizer(5,5) 
    5951        self.sizer1 = wx.GridBagSizer(5,5) 
    60          
    61          
     52        # Add layer 
     53        #data info layer 
     54        self.vbox.Add(self.sizer1) 
     55        #data range  
     56        self.vbox.Add(self.sizer2) 
     57        #instrument smearing selection layer 
     58        self.vbox.Add(self.sizer3) 
     59        #model selection 
     60        self.vbox.Add(wx.StaticLine(self, -1), 0, wx.EXPAND, 0) 
     61        self.vbox.Add(self.sizer4) 
     62        #model paramaters layer 
     63        self.vbox.Add(self.sizer5) 
     64        #polydispersion selected 
     65        self.vbox.Add(wx.StaticLine(self, -1), 0, wx.EXPAND, 0) 
     66        self.vbox.Add(self.sizer6) 
     67        #combox box for type of dispersion 
     68        self.vbox.Add(self.sizer7) 
     69        #dispersion parameters layer 
     70        self.vbox.Add(self.sizer8) 
     71        #fit info layer 
     72        self.vbox.Add(wx.StaticLine(self, -1), 0, wx.EXPAND, 0) 
     73        self.vbox.Add(self.sizer9) 
     74        #close layer 
     75        self.vbox.Add(wx.StaticLine(self, -1), 0, wx.EXPAND, 0) 
     76        self.vbox.Add(self.sizer10) 
     77         
     78        #---------sizer 1 draw-------------------------------- 
    6279        self.DataSource  =wx.StaticText(self, -1,str(data.name)) 
    6380        self.smearer_box = wx.ComboBox(self, -1) 
     
    7491              self.smearer_box.Insert(str(v),i)   
    7592            i+=1 
     93             
     94        # Minimum value of data    
     95        self.data_min    = wx.StaticText(self, -1,str(format_number(numpy.min(data.x)))) 
     96        # Maximum value of data   
     97        self.data_max    =  wx.StaticText(self, -1,str(format_number(numpy.max(data.x)))) 
     98        #Filing the sizer containing data related fields 
     99        ix = 0 
     100        iy = 1 
     101        self.sizer1.Add(wx.StaticText(self, -1, 'Data Source Name : '),(iy,ix),\ 
     102                 (1,1), wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15) 
     103        
     104        ix += 1 
     105        self.sizer1.Add(self.DataSource,(iy,ix),(1,1), wx.EXPAND|wx.ADJUST_MINSIZE, 0) 
     106         
     107        #---------sizer 2 draw-------------------------------- 
     108        ix = 0 
     109        iy = 1 
     110        #set maximum range for x in linear scale 
     111        self.text4_3 = wx.StaticText(self, -1, 'Maximum Data Range(Linear)', style=wx.ALIGN_LEFT) 
     112        self.sizer2.Add(self.text4_3,(iy,ix),(1,1),\ 
     113                   wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15) 
     114        ix += 2 
     115        self.sizer2.Add(wx.StaticText(self, -1, 'Min :'),(iy, ix),(1,1),\ 
     116                            wx.EXPAND|wx.ADJUST_MINSIZE, 0) 
     117        ix += 1 
     118        self.sizer2.Add(self.data_min,(iy, ix),(1,1),\ 
     119                            wx.EXPAND|wx.ADJUST_MINSIZE, 0) 
     120        ix += 1 
     121        self.sizer2.Add(wx.StaticText(self, -1, 'Max : '),(iy, ix),(1,1),\ 
     122                            wx.EXPAND|wx.ADJUST_MINSIZE, 0) 
     123        ix += 1 
     124        self.sizer2.Add(self.data_max,(iy,ix),(1,1), wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 0) 
     125         
     126        #----sizer 3 draw-------------------------------- 
     127        ix = 0 
     128        iy = 1 
     129        self.sizer3.Add(wx.StaticText(self,-1,'Instrument Smearing'),(iy,ix),(1,1)\ 
     130                  , wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15) 
     131        ix += 1 
     132        self.sizer3.Add(self.smearer_box,(iy,ix),(1,1),  wx.EXPAND|wx.ADJUST_MINSIZE, 0) 
     133        ix =0 
     134        iy+=1 
     135        self.sizer3.Add((20,20),(iy,ix),(1,1),wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15)   
     136             
     137        #------------------ sizer 4  draw------------------------    
    76138        self.modelbox = wx.ComboBox(self, -1) 
     139         
     140        #filling sizer2 
     141        ix = 0 
     142        iy = 1 
     143        self.sizer4.Add(wx.StaticText(self,-1,'Model'),(iy,ix),(1,1)\ 
     144                  , wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15) 
     145        ix += 1 
     146        self.sizer4.Add(self.modelbox,(iy,ix),(1,1),  wx.EXPAND|wx.ADJUST_MINSIZE, 0) 
     147         
     148        #----------sizer6------------------------------------------------- 
     149        self.disable_disp = wx.RadioButton(self, -1, 'No', (10, 10), style=wx.RB_GROUP) 
     150        self.enable_disp = wx.RadioButton(self, -1, 'Yes', (10, 30)) 
     151        self.Bind(wx.EVT_RADIOBUTTON, self.Set_DipersParam, id=self.disable_disp.GetId()) 
     152        self.Bind(wx.EVT_RADIOBUTTON, self.Set_DipersParam, id=self.enable_disp.GetId()) 
     153        ix= 0 
     154        iy=1 
     155        self.sizer6.Add(wx.StaticText(self,-1,'Polydispersity: '),(iy,ix),(1,1)\ 
     156                  , wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15) 
     157        ix += 1 
     158        self.sizer6.Add(self.enable_disp ,(iy,ix),(1,1),  wx.EXPAND|wx.ADJUST_MINSIZE, 0) 
     159        ix += 1 
     160        self.sizer6.Add(self.disable_disp ,(iy,ix),(1,1),  wx.EXPAND|wx.ADJUST_MINSIZE, 0) 
     161        ix =0 
     162        iy+=1 
     163        self.sizer6.Add((20,20),(iy,ix),(1,1),wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15)   
     164 
     165         
     166        #---------sizer 9 draw---------------------------------------- 
     167        self.tcChi    =  wx.StaticText(self, -1, str(0), style=wx.ALIGN_LEFT) 
     168        self.tcChi.Hide() 
     169        self.text1_1 = wx.StaticText(self, -1, 'Chi2/dof', style=wx.ALIGN_LEFT) 
     170        self.text1_1.Hide() 
     171         
    77172        id = wx.NewId() 
    78173        self.btFit =wx.Button(self,id,'Fit') 
    79174        self.btFit.Bind(wx.EVT_BUTTON, self.onFit,id=id) 
    80175        self.btFit.SetToolTipString("Perform fit.") 
    81         self.static_line_1 = wx.StaticLine(self, -1) 
    82         
    83         self.vbox.Add(self.sizer3) 
    84         self.vbox.Add(self.sizer2) 
    85         self.vbox.Add(self.static_line_1, 0, wx.EXPAND, 0) 
    86         self.vbox.Add(self.sizer5) 
    87         self.vbox.Add(self.sizer6) 
    88         self.vbox.Add(self.sizer4) 
    89         self.vbox.Add(self.sizer1) 
    90          
     176         ## Q range 
     177        print "self.data fitpage1D" , self.data,hasattr(self.data,"data") 
     178        if not hasattr(self.data,"data"): 
     179            self.qmin_x= numpy.min(self.data.x) 
     180            self.qmax_x= numpy.max(self.data.x) 
     181        else: 
     182            radius1= math.sqrt(math.pow(self.data.xmin, 2)+ math.pow(self.data.ymin, 2)) 
     183            radius2= math.sqrt(math.pow(self.data.xmax, 2)+ math.pow(self.data.ymin, 2)) 
     184            radius3= math.sqrt(math.pow(self.data.xmin, 2)+ math.pow(self.data.ymax, 2)) 
     185            radius4= math.sqrt(math.pow(self.data.xmax, 2)+ math.pow(self.data.ymax, 2)) 
     186            self.qmin_x =0 
     187            self.qmax_x= max(radius1, radius2, radius3, radius4) 
     188            print "data2D range",self.qmax_x 
     189        self.num_points= 100 
     190          
     191         
     192         
     193        self.qmin    = wx.TextCtrl(self, -1,size=(_BOX_WIDTH,20)) 
     194        self.qmin.SetValue(str(format_number(self.qmin_x))) 
     195        self.qmin.SetToolTipString("Minimun value of x in linear scale.") 
     196        self.qmin.Bind(wx.EVT_KILL_FOCUS, self._onparamEnter) 
     197        self.qmin.Bind(wx.EVT_TEXT_ENTER, self._onparamEnter) 
     198        self.qmin.Disable() 
     199         
     200        self.qmax    = wx.TextCtrl(self, -1,size=(_BOX_WIDTH,20)) 
     201        self.qmax.SetValue(str(format_number(self.qmax_x))) 
     202        self.qmax.SetToolTipString("Maximum value of x in linear scale.") 
     203        self.qmax.Bind(wx.EVT_KILL_FOCUS, self._onparamEnter) 
     204        self.qmax.Bind(wx.EVT_TEXT_ENTER, self._onparamEnter) 
     205        self.qmax.Disable() 
     206 
     207        self.npts    = wx.TextCtrl(self, -1,size=(_BOX_WIDTH,20)) 
     208        self.npts.SetValue(format_number(self.num_points)) 
     209        self.npts.SetToolTipString("Number of point to plot.") 
     210        self.npts.Bind(wx.EVT_KILL_FOCUS, self._onparamEnter) 
     211        self.npts.Bind(wx.EVT_TEXT_ENTER, self._onparamEnter) 
     212        self.npts.Disable() 
     213        self.npts.Hide() 
     214        ix = 0 
     215        iy = 1  
     216        self.sizer9.Add(wx.StaticText(self, -1, 'Fitting Range'),(iy, ix),(1,1),\ 
     217                            wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15) 
     218        ix += 1  
     219        self.sizer9.Add(wx.StaticText(self, -1, 'Min'),(iy, ix),(1,1),\ 
     220                            wx.EXPAND|wx.ADJUST_MINSIZE, 0) 
     221        ix += 1 
     222        self.sizer9.Add(wx.StaticText(self, -1, 'Max'),(iy, ix),(1,1),\ 
     223                            wx.EXPAND|wx.ADJUST_MINSIZE, 0) 
     224        #ix += 1 
     225        #self.sizer9.Add(wx.StaticText(self, -1, 'Npts'),(iy, ix),(1,1),\ 
     226        #                    wx.EXPAND|wx.ADJUST_MINSIZE, 0) 
     227        ix = 0 
     228        iy += 1 
     229        self.sizer9.Add(wx.StaticText(self, -1, 'x range'),(iy, ix),(1,1),\ 
     230                            wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15) 
     231        ix += 1 
     232        self.sizer9.Add(self.qmin,(iy, ix),(1,1), wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 0) 
     233        ix += 1 
     234        self.sizer9.Add(self.qmax,(iy,ix),(1,1), wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 0) 
     235        ix += 1 
     236        self.sizer9.Add(self.npts,(iy,ix),(1,1), wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 0) 
     237        ix = 0 
     238        iy += 1 
     239        self.sizer9.Add(self.text1_1,(iy,ix),(1,1),\ 
     240                   wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15) 
     241        ix += 1 
     242        self.sizer9.Add(self.tcChi,(iy,ix),(1,1), wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 0) 
     243        ix +=2 
     244        self.sizer9.Add(self.btFit,(iy,ix),(1,1), wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 0) 
     245        ix =0 
     246        iy+=1  
     247        self.sizer9.Add((20,20),(iy,ix),(1,1), wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 0) 
     248        #----------sizer 10 draw------------------------------------------------------ 
    91249        id = wx.NewId() 
    92250        self.btClose =wx.Button(self,id,'Close') 
    93251        self.btClose.Bind(wx.EVT_BUTTON, self.onClose,id=id) 
    94252        self.btClose.SetToolTipString("Close page.") 
    95         ix = 0 
    96         iy = 1 
    97         self.sizer3.Add(wx.StaticText(self, -1, 'Data Source Name : '),(iy,ix),\ 
    98                  (1,1), wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15) 
    99         ix += 1 
    100         self.sizer3.Add(self.DataSource,(iy,ix),(1,1), wx.EXPAND|wx.ADJUST_MINSIZE, 0) 
    101         ix += 1 
    102         self.sizer3.Add((20,20),(iy,ix),(1,1),wx.RIGHT|wx.EXPAND|wx.ADJUST_MINSIZE,0) 
    103         ix = 0 
    104         iy += 1 
    105         self.sizer3.Add(wx.StaticText(self,-1,'Instrument Smearing'),(iy,ix),(1,1)\ 
    106                   , wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15) 
    107         ix += 1 
    108         self.sizer3.Add(self.smearer_box,(iy,ix),(1,1),  wx.EXPAND|wx.ADJUST_MINSIZE, 0) 
    109          
    110         ix = 0 
    111         iy += 1 
    112         self.sizer3.Add(wx.StaticText(self,-1,'Model'),(iy,ix),(1,1)\ 
    113                   , wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15) 
    114         ix += 1 
    115         self.sizer3.Add(self.modelbox,(iy,ix),(1,1),  wx.EXPAND|wx.ADJUST_MINSIZE, 0) 
    116          
    117         ix = 0 
    118         iy = 1 
    119         #set maximum range for x in linear scale 
    120         self.text4_3 = wx.StaticText(self, -1, 'Maximum Data Range(Linear)', style=wx.ALIGN_LEFT) 
    121         self.sizer4.Add(self.text4_3,(iy,ix),(1,1),\ 
    122                    wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15) 
    123         ix += 1 
    124         self.sizer4.Add(wx.StaticText(self, -1, 'Min'),(iy, ix),(1,1),\ 
    125                             wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15) 
    126         ix += 2 
    127         self.sizer4.Add(wx.StaticText(self, -1, 'Max'),(iy, ix),(1,1),\ 
    128                             wx.EXPAND|wx.ADJUST_MINSIZE, 0) 
    129         ix = 0 
    130         iy += 1 
    131         self.sizer4.Add(wx.StaticText(self, -1, 'x range'),(iy, ix),(1,1),\ 
    132                             wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15) 
    133         ix += 1 
    134         self.xmin    = wx.TextCtrl(self, -1,size=(_BOX_WIDTH,20)) 
    135         self.xmin.SetValue(format_number(numpy.min(data.x))) 
    136         self.xmin.SetToolTipString("Minimun value of x in linear scale.") 
    137         self.xmin.Bind(wx.EVT_KILL_FOCUS, self._onTextEnter) 
    138         self.xmin.Bind(wx.EVT_TEXT_ENTER, self._onTextEnter) 
    139         self.xmin.Disable() 
    140         self.sizer4.Add(self.xmin,(iy, ix),(1,1), wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15) 
    141          
    142         
    143         ix += 2 
    144         self.xmax    = wx.TextCtrl(self, -1,size=(_BOX_WIDTH,20)) 
    145         self.xmax.SetValue(format_number(numpy.max(data.x))) 
    146         self.xmax.SetToolTipString("Maximum value of x in linear scale.") 
    147         self.xmax.Bind(wx.EVT_KILL_FOCUS, self._onTextEnter) 
    148         self.xmax.Bind(wx.EVT_TEXT_ENTER, self._onTextEnter) 
    149         self.xmax.Disable() 
    150         self.sizer4.Add(self.xmax,(iy,ix),(1,1), wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 0) 
     253         
     254        ix= 3 
     255        iy= 1 
     256        self.sizer10.Add((20,20),(iy,ix),(1,1),wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15) 
     257        ix +=1 
     258        self.sizer10.Add( self.btClose,(iy,ix),(1,1), wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 0) 
    151259        ix =0 
    152260        iy+=1 
    153         self.sizer4.Add((20,20),(iy,ix),(1,1),wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15) 
    154         #Set chisqr  result into TextCtrl 
    155         ix = 0 
    156         iy = 1 
    157          
    158         self.text1_1 = wx.StaticText(self, -1, 'Chi2/dof', style=wx.ALIGN_LEFT) 
    159         #self.sizer1.Add(self.text1_1,1) 
    160         self.sizer1.Add(self.text1_1,(iy,ix),(1,1),\ 
    161                    wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15) 
    162         ix += 1 
    163         self.tcChi    = wx.TextCtrl(self, -1,size=(_BOX_WIDTH,20)) 
    164         self.tcChi.SetToolTipString("Chi^2 over degrees of freedom.") 
    165         #self.sizer1.Add(self.tcChi, 1, wx.R | wx.BOTTOM , 5) 
    166         self.sizer1.Add(self.tcChi,(iy,ix),(1,1), wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 0) 
    167         ix +=2 
    168         #self.sizer1.Add(self.btFit, 1, wx.LEFT | wx.BOTTOM , 5) 
    169         self.sizer1.Add(self.btFit,(iy,ix),(1,1), wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 0) 
    170         ix+= 2 
    171         self.sizer1.Add( self.btClose,(iy,ix),(1,1), wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 0) 
    172         #self.sizer1.Add( self.btClose,1, wx.LEFT | wx.BOTTOM , 5) 
    173         self.tcChi.Disable() 
    174         ix= 0 
    175         iy+=1 
    176         self.sizer1.Add((20,20),(iy,ix),(1,1), wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 0) 
    177         #self.sizer1.Add((20,20), 0) 
     261        self.sizer10.Add((20,20),(iy,ix),(1,1),wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15) 
     262        
    178263        # contains link between  model ,all its parameters, and panel organization 
    179264        self.parameters=[] 
    180265        self.fixed_param=[] 
     266        #list of dispersion paramaters 
     267        self.disp_list=None 
    181268        #contains link between a model and selected parameters to fit  
    182269        self.param_toFit=[] 
     
    185272        #dictionary of model name and model class 
    186273        self.model_list_box={} 
    187         self.data = data 
    188         ## Q range 
    189         self.qmin= 0.001 
    190         self.qmax= 0.1 
     274         
     275       
    191276        
    192277        self.vbox.Layout() 
     
    198283        self.Layout() 
    199284        self.GrandParent.GetSizer().Layout() 
    200         
    201  
    202    
    203    
    204   
    205          
    206     def compute_chisqr(self): 
     285    
     286    def compute_chisqr2D(self): 
    207287        """ @param fn: function that return model value 
    208288            @return residuals 
    209289        """ 
    210          
    211290        flag=self.checkFitRange() 
     291        res=[] 
    212292        if flag== True: 
    213293            try: 
    214                 qmin = float(self.xmin.GetValue()) 
    215                 qmax = float(self.xmax.GetValue()) 
    216                 x,y,dy = [numpy.asarray(v) for v in (self.data.x,self.data.y,self.data.dy)] 
    217                 if qmin==None and qmax==None:  
    218                     fx =numpy.asarray([self.model.run(v) for v in x]) 
    219                     res=(y - fx)/dy 
    220                 else: 
    221                     idx = (x>= qmin) & (x <=qmax) 
    222                     fx = numpy.asarray([self.model.run(item)for item in x[idx ]]) 
    223                     res= (y[idx] - fx)/dy[idx]   
     294                self.qmin_x = float(self.qmin.GetValue()) 
     295                self.qmax_x = float(self.qmax.GetValue()) 
    224296                 
     297                for i in range(len(self.data.x_bins)): 
     298                    if self.data.x_bins[i]>= self.qmin_x and self.data.x_bins[i]<= self.qmax_x: 
     299                        for j in range(len(self.data.y_bins)): 
     300                            if self.data.y_bins[j]>= self.qmin_x and self.data.y_bins[j]<= self.qmax_x: 
     301                                res.append( (self.data.data[j][i]- self.model.runXY(\ 
     302                                 [self.data.x_bins[i],self.data.y_bins[j]]))\ 
     303                                    /self.data.err_data[j][i] ) 
     304                sum=0 
    225305                
    226                 sum=0 
    227306                for item in res: 
    228307                    if numpy.isfinite(item): 
    229308                        sum +=item 
     309                #print "chisqr : sum 2D", xmin, xmax, ymin, ymax,sum 
     310                #print res 
    230311                self.tcChi.SetValue(format_number(math.fabs(sum))) 
    231312            except: 
    232313                wx.PostEvent(self.parent.GrandParent, StatusEvent(status=\ 
    233314                            "Chisqr cannot be compute: %s"% sys.exc_value)) 
    234              
    235              
    236     def onFit(self,event): 
    237         """ signal for fitting""" 
    238           
     315         
     316  
     317    def compute_chisqr(self): 
     318        """ @param fn: function that return model value 
     319            @return residuals 
     320        """ 
     321         
    239322        flag=self.checkFitRange() 
    240         self.set_manager(self.manager) 
    241       
    242         qmin=float(self.xmin.GetValue()) 
    243         qmax =float( self.xmax.GetValue()) 
    244         if len(self.param_toFit) >0 and flag==True: 
    245             self.manager.schedule_for_fit( value=1,fitproblem =None)  
    246             self.manager._on_single_fit(qmin=qmin,qmax=qmax) 
    247         else: 
    248               wx.PostEvent(self.parent.GrandParent, StatusEvent(status=\ 
    249                             "Select at least on parameter to fit ")) 
    250    
    251      
     323        if flag== True: 
     324            try: 
     325                if hasattr(self.data,"data"): 
     326                    self.compute_chisqr2D() 
     327                    return 
     328                else: 
     329                    self.qmin_x = float(self.qmin.GetValue()) 
     330                    self.qmax_x = float(self.qmax.GetValue()) 
     331                    x,y,dy = [numpy.asarray(v) for v in (self.data.x,self.data.y,self.data.dy)] 
     332                    if self.qmin_x==None and self.qmax_x==None:  
     333                        fx =numpy.asarray([self.model.run(v) for v in x]) 
     334                        res=(y - fx)/dy 
     335                    else: 
     336                        idx = (x>= self.qmin_x) & (x <=self.qmax_x) 
     337                        fx = numpy.asarray([self.model.run(item)for item in x[idx ]]) 
     338                        res= (y[idx] - fx)/dy[idx]   
     339                     
     340                    
     341                    sum=0 
     342                    for item in res: 
     343                        if numpy.isfinite(item): 
     344                            sum +=item 
     345                    self.tcChi.SetLabel(format_number(math.fabs(sum))) 
     346            except: 
     347                wx.PostEvent(self.parent.GrandParent, StatusEvent(status=\ 
     348                            "Chisqr cannot be compute: %s"% sys.exc_value)) 
     349             
    252350    def _on_select_model(self,event): 
    253351        """ 
     
    256354        """ 
    257355        self.btFit.SetFocus() 
     356        self.disable_disp.SetValue(True) 
     357        self.sizer8.Clear(True) 
     358        self.sizer7.Clear(True)        
     359        self.vbox.Layout() 
     360        self.SetScrollbars(20,20,55,40) 
     361        self.Layout() 
     362        self.parent.GetSizer().Layout() 
    258363        for item in self.model_list_box.itervalues(): 
    259364            name = item.__name__ 
     
    270375                except: 
    271376                    raise #ValueError,"model.name is not equal to model class name" 
    272                 break 
    273      
     377                break        
     378    def onFit(self,event): 
     379        """ signal for fitting""" 
     380          
     381        flag=self.checkFitRange() 
     382        self.set_manager(self.manager) 
     383      
     384        self.qmin_x=float(self.qmin.GetValue()) 
     385        self.qmax_x =float( self.qmax.GetValue()) 
     386        if len(self.param_toFit) >0 and flag==True: 
     387            self.manager.schedule_for_fit( value=1,fitproblem =None)  
     388            self.manager._on_single_fit(qmin=self.qmin_x,qmax=self.qmax_x) 
     389        else: 
     390              wx.PostEvent(self.parent.GrandParent, StatusEvent(status=\ 
     391                            "Select at least on parameter to fit ")) 
     392   
     393    
    274394    def _onTextEnter(self,event): 
    275395        """ 
     
    288408                            "Drawing  Error:wrong value entered %s"% sys.exc_value)) 
    289409         
    290     def checkFitRange(self): 
    291         """ 
    292             Check the validity of fitting range 
    293             @note: xmin should always be less than xmax or else each control box 
    294             background is colored in pink. 
    295         """ 
    296         
    297         flag = True 
    298         valueMin = self.xmin.GetValue() 
    299         valueMax = self.xmax.GetValue() 
    300         # Check for possible values entered 
    301         #print "fitpage: checkfitrange:",valueMin,valueMax 
    302         try: 
    303             if (float(valueMax)> float(valueMin)): 
    304                 self.xmax.SetBackgroundColour(wx.WHITE) 
    305                 self.xmin.SetBackgroundColour(wx.WHITE) 
    306             else: 
    307                 flag = False 
    308                 self.xmin.SetBackgroundColour("pink") 
    309                 self.xmax.SetBackgroundColour("pink")       
    310         except: 
    311             flag = False 
    312             self.xmin.SetBackgroundColour("pink") 
    313             self.xmax.SetBackgroundColour("pink") 
    314              
    315         self.xmin.Refresh() 
    316         self.xmax.Refresh() 
    317         return flag 
    318      
    319  
     410    
    320411     
    321412    def get_param_list(self): 
     
    331422            raise ValueError,"missing parameter to fit" 
    332423         
    333          
    334     def set_panel(self,model): 
     424     
     425            
     426    def old_set_panel(self,model): 
    335427        """ 
    336428            Build the panel from the model content 
    337429            @param model: the model selected in combo box for fitting purpose 
    338430        """ 
    339         self.sizer2.Clear(True) 
    340431        self.sizer5.Clear(True) 
    341         self.sizer6.Clear(True) 
    342432        self.parameters = [] 
    343433        self.param_toFit=[] 
     
    346436        #print "fitpage1D : dispersion list",self.model.getDispParamList() 
    347437        keys.sort() 
    348         disp_list=self.model.getDispParamList() 
    349         fixed=self.model.fixed 
    350         print "fixed",fixed 
    351         #model.setParam("scale", 2) 
    352         #print "model sphere scale fixed?", self.model.is_fittable("scale") 
    353         ip=0 
    354         iq=1 
    355          
    356438        ik=0 
    357439        im=1 
    358         if len(disp_list)>0: 
    359             disp = wx.StaticText(self, -1, 'Dispersion') 
    360             self.sizer5.Add(disp,( iq, ip),(1,1),  wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15) 
    361             ip += 1  
    362             values = wx.StaticText(self, -1, 'Values') 
    363             self.sizer5.Add(values,( iq, ip),(1,1), wx.EXPAND|wx.ADJUST_MINSIZE, 0) 
    364              
    365         disp_list.sort() 
     440         
    366441        iy = 1 
    367442        ix = 0 
    368443        self.cb1 = wx.CheckBox(self, -1,"Select all", (10, 10)) 
    369444        wx.EVT_CHECKBOX(self, self.cb1.GetId(), self.select_all_param) 
    370         self.sizer2.Add(self.cb1,(iy, ix),(1,1),\ 
     445        self.sizer5.Add(self.cb1,(iy, ix),(1,1),\ 
    371446                          wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15) 
    372447        ix +=1 
    373448        self.text2_2 = wx.StaticText(self, -1, 'Values') 
    374         self.sizer2.Add(self.text2_2,(iy, ix),(1,1),\ 
     449        self.sizer5.Add(self.text2_2,(iy, ix),(1,1),\ 
    375450                            wx.EXPAND|wx.ADJUST_MINSIZE, 0)  
    376451        ix +=2 
    377452        self.text2_3 = wx.StaticText(self, -1, 'Errors') 
    378         self.sizer2.Add(self.text2_3,(iy, ix),(1,1),\ 
     453        self.sizer5.Add(self.text2_3,(iy, ix),(1,1),\ 
    379454                            wx.EXPAND|wx.ADJUST_MINSIZE, 0) 
    380455        self.text2_3.Hide()  
    381456        ix +=1 
    382457        self.text2_4 = wx.StaticText(self, -1, 'Units') 
    383         self.sizer2.Add(self.text2_4,(iy, ix),(1,1),\ 
     458        self.sizer5.Add(self.text2_4,(iy, ix),(1,1),\ 
    384459                            wx.EXPAND|wx.ADJUST_MINSIZE, 0)  
    385460        self.text2_4.Hide() 
    386         #print "keys", keys 
    387         #print "disp_list", disp_list 
    388         #print "fix_list",fixed 
     461        disp_list=self.model.getDispParamList() 
    389462        for item in keys: 
    390463            if not item in disp_list: 
     
    394467                cb = wx.CheckBox(self, -1, item, (10, 10)) 
    395468                cb.SetValue(False) 
    396                 self.sizer2.Add( cb,( iy, ix),(1,1),  wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15) 
     469                self.sizer5.Add( cb,( iy, ix),(1,1),  wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15) 
    397470                wx.EVT_CHECKBOX(self, cb.GetId(), self.select_param) 
    398471             
     
    403476                ctl1.Bind(wx.EVT_KILL_FOCUS, self._onparamEnter) 
    404477                ctl1.Bind(wx.EVT_TEXT_ENTER,self._onparamEnter) 
    405                 self.sizer2.Add(ctl1, (iy,ix),(1,1), wx.EXPAND) 
     478                self.sizer5.Add(ctl1, (iy,ix),(1,1), wx.EXPAND) 
    406479                 
    407480                ix += 1 
    408481                text2=wx.StaticText(self, -1, '+/-') 
    409                 self.sizer2.Add(text2,(iy, ix),(1,1),\ 
     482                self.sizer5.Add(text2,(iy, ix),(1,1),\ 
    410483                                wx.EXPAND|wx.ADJUST_MINSIZE, 0)  
    411484                text2.Hide()   
    412485                ix += 1 
    413486                ctl2 = wx.TextCtrl(self, -1, size=(_BOX_WIDTH,20), style=wx.TE_PROCESS_ENTER) 
    414                 self.sizer2.Add(ctl2, (iy,ix),(1,1), wx.EXPAND|wx.ADJUST_MINSIZE, 0) 
     487                self.sizer5.Add(ctl2, (iy,ix),(1,1), wx.EXPAND|wx.ADJUST_MINSIZE, 0) 
    415488                ctl2.Hide() 
    416489                ix +=1 
     
    420493                except: 
    421494                    units = wx.StaticText(self, -1, "", style=wx.ALIGN_LEFT) 
    422                 self.sizer2.Add(units, (iy,ix),(1,1),  wx.EXPAND|wx.ADJUST_MINSIZE, 0) 
     495                self.sizer5.Add(units, (iy,ix),(1,1),  wx.EXPAND|wx.ADJUST_MINSIZE, 0) 
     496            """ 
    423497            else: 
    424                 if item in fixed: 
     498                if not item in fixed: 
    425499                    ip = 0 
    426500                    iq += 1 
     
    452526                    im += 1 
    453527            #save data 
    454              
     528            """ 
    455529            self.parameters.append([cb,ctl1,text2,ctl2]) 
    456530                 
    457531        iy+=1 
    458         self.sizer2.Add((20,20),(iy,ix),(1,1), wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15) 
     532        self.sizer5.Add((20,20),(iy,ix),(1,1), wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15) 
    459533         
    460534        #Display units text on panel 
     
    499573                    item[3].Hide() 
    500574                except: 
    501                      wx.PostEvent(self.parent.GrandParent, StatusEvent(status=\ 
    502                             "Drawing  Error:wrong value entered : %s"% sys.exc_value)) 
     575                    #enter dispersion value  
     576                    pass 
    503577        self.set_model_parameter() 
    504578         
    505     def set_model_parameter(self): 
    506         if len(self.parameters) !=0 and self.model !=None: 
    507             # Flag to register when a parameter has changed. 
    508             is_modified = False 
    509             for item in self.fixed_param: 
    510                  
    511                 try: 
    512                      name=str(item[0]) 
    513                      value= float(item[1].GetValue()) 
    514 #                     print "model para", name,value 
    515                      # If the value of the parameter has changed, 
    516                      # update the model and set the is_modified flag 
    517                      if value != self.model.getParam(name): 
    518                          self.model.setParam(name,value) 
    519                          is_modified = True 
    520                 except: 
    521                      wx.PostEvent(self.parent.GrandParent, StatusEvent(status=\ 
    522                             "Model Drawing  Error:wrong value entered : %s"% sys.exc_value)) 
    523                  
    524             for item in self.parameters: 
    525 #                print "paramters",str(item[0].GetLabelText()) 
    526                 try: 
    527                      name=str(item[0].GetLabelText()) 
    528                      value= float(item[1].GetValue()) 
    529 #                     print "model para", name,value 
    530                      # If the value of the parameter has changed, 
    531                      # update the model and set the is_modified flag 
    532                      if value != self.model.getParam(name): 
    533                          self.model.setParam(name,value) 
    534                          is_modified = True 
    535                 except: 
    536                      wx.PostEvent(self.parent.GrandParent, StatusEvent(status=\ 
    537                             "Model Drawing  Error:wrong value entered : %s"% sys.exc_value)) 
    538              
    539             # Here we should check whether the boundaries have been modified. 
    540             # If qmin and qmax have been modified, update qmin and qmax and  
    541             # set the is_modified flag to True 
    542             if float(self.xmin.GetValue()) != self.qmin: 
    543                 self.qmin = float(self.xmin.GetValue()) 
    544                 is_modified = True 
    545             if float(self.xmax.GetValue()) != self.qmax: 
    546                 self.qmax = float(self.xmax.GetValue()) 
    547                 is_modified = True 
    548              
    549             if is_modified: 
    550                 self.manager.redraw_model(qmin=self.qmin, qmax=self.qmax) 
    551           
     579     
    552580    def select_all_param(self,event):  
    553581        """ 
     
    597625             
    598626        if not (len(self.param_toFit ) >0): 
    599             self.xmin.Disable() 
    600             self.xmax.Disable() 
     627            self.qmin.Disable() 
     628            self.qmax.Disable() 
    601629        else: 
    602             self.xmin.Enable() 
    603             self.xmax.Enable() 
     630            self.qmin.Enable() 
     631            self.qmax.Enable() 
    604632        
    605633    
     
    615643        """ 
    616644        #print "fitting : onsetvalues out",out 
    617         self.tcChi.Clear() 
    618         self.tcChi.SetValue(format_number(chisqr)) 
     645        self.tcChi.SetLabel(format_number(chisqr)) 
    619646        params = {} 
    620647        is_modified = False 
Note: See TracChangeset for help on using the changeset viewer.