source: sasview/sansview/perspectives/fitting/fitpage1D.py @ d23544dc

ESS_GUIESS_GUI_DocsESS_GUI_batch_fittingESS_GUI_bumps_abstractionESS_GUI_iss1116ESS_GUI_iss879ESS_GUI_iss959ESS_GUI_openclESS_GUI_orderingESS_GUI_sync_sascalccostrafo411magnetic_scattrelease-4.1.1release-4.1.2release-4.2.2release_4.0.1ticket-1009ticket-1094-headlessticket-1242-2d-resolutionticket-1243ticket-1249ticket885unittest-saveload
Last change on this file since d23544dc was d23544dc, checked in by Gervaise Alina <gervyh@…>, 16 years ago

panel1d and 2 d for fitpanel refactored

  • Property mode set to 100644
File size: 25.1 KB
Line 
1import sys
2import wx
3import wx.lib
4import numpy,math
5import copy
6import sans.models.dispersion_models 
7from sans.guicomm.events import StatusEvent   
8(ModelEventbox, EVT_MODEL_BOX) = wx.lib.newevent.NewEvent()
9_BOX_WIDTH = 80
10
11def 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
25
26from modelpage import format_number
27from modelpage import ModelPage
28class FitPage1D(ModelPage):
29    """
30        FitPanel class contains fields allowing to display results when
31        fitting  a model and one data
32        @note: For Fit to be performed the user should check at least one parameter
33        on fit Panel window.
34 
35    """
36    ## Internal name for the AUI manager
37    window_name = "Fit page"
38    ## Title to appear on top of the window
39    window_caption = "Fit Page"
40   
41   
42    def __init__(self, parent,data, *args, **kwargs):
43        wx.ScrolledWindow.__init__(self, parent, *args, **kwargs)
44        """
45            Initialization of the Panel
46        """
47        #self.scroll = wx.ScrolledWindow(self)
48       
49        self.manager = None
50        self.parent  = parent
51        self.event_owner = None
52        #panel interface
53        self.vbox  = wx.BoxSizer(wx.VERTICAL)
54        self.sizer6 = wx.GridBagSizer(5,5)
55        self.sizer5 = wx.GridBagSizer(5,5)
56        self.sizer4 = wx.GridBagSizer(5,5)
57        self.sizer3 = wx.GridBagSizer(5,5)
58        self.sizer2 = wx.GridBagSizer(5,5)
59        self.sizer1 = wx.GridBagSizer(5,5)
60       
61       
62        self.DataSource  =wx.StaticText(self, -1,str(data.name))
63        self.smearer_box = wx.ComboBox(self, -1)
64        wx.EVT_COMBOBOX( self.smearer_box,-1, self.onSmear ) 
65        self.smeares= sans.models.dispersion_models.models
66        i=0
67        self.smearer_box.SetValue(str(None))
68        self.smearer_box.Insert(str(None),i)
69        for k,v in self.smeares.iteritems():
70            self.smearer_box.Insert(str(v),i)
71            i+=1
72        self.modelbox = wx.ComboBox(self, -1)
73        id = wx.NewId()
74        self.btFit =wx.Button(self,id,'Fit')
75        self.btFit.Bind(wx.EVT_BUTTON, self.onFit,id=id)
76        self.btFit.SetToolTipString("Perform fit.")
77        self.static_line_1 = wx.StaticLine(self, -1)
78       
79        self.vbox.Add(self.sizer3)
80        self.vbox.Add(self.sizer2)
81        self.vbox.Add(self.static_line_1, 0, wx.EXPAND, 0)
82        self.vbox.Add(self.sizer5)
83        self.vbox.Add(self.sizer6)
84        self.vbox.Add(self.sizer4)
85        self.vbox.Add(self.sizer1)
86       
87        id = wx.NewId()
88        self.btClose =wx.Button(self,id,'Close')
89        self.btClose.Bind(wx.EVT_BUTTON, self.onClose,id=id)
90        self.btClose.SetToolTipString("Close page.")
91        ix = 0
92        iy = 1
93        self.sizer3.Add(wx.StaticText(self, -1, 'Data Source Name : '),(iy,ix),\
94                 (1,1), wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15)
95        ix += 1
96        self.sizer3.Add(self.DataSource,(iy,ix),(1,1), wx.EXPAND|wx.ADJUST_MINSIZE, 0)
97        ix += 1
98        self.sizer3.Add((20,20),(iy,ix),(1,1),wx.RIGHT|wx.EXPAND|wx.ADJUST_MINSIZE,0)
99        ix = 0
100        iy += 1
101        self.sizer3.Add(wx.StaticText(self,-1,'Averaging (Smearer Type)'),(iy,ix),(1,1)\
102                  , wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15)
103        ix += 1
104        self.sizer3.Add(self.smearer_box,(iy,ix),(1,1),  wx.EXPAND|wx.ADJUST_MINSIZE, 0)
105       
106        ix = 0
107        iy += 1
108        self.sizer3.Add(wx.StaticText(self,-1,'Model'),(iy,ix),(1,1)\
109                  , wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15)
110        ix += 1
111        self.sizer3.Add(self.modelbox,(iy,ix),(1,1),  wx.EXPAND|wx.ADJUST_MINSIZE, 0)
112       
113        ix = 0
114        iy = 1
115        #set maximum range for x in linear scale
116        self.text4_3 = wx.StaticText(self, -1, 'Maximum Data Range(Linear)', style=wx.ALIGN_LEFT)
117        self.sizer4.Add(self.text4_3,(iy,ix),(1,1),\
118                   wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15)
119        ix += 1
120        self.sizer4.Add(wx.StaticText(self, -1, 'Min'),(iy, ix),(1,1),\
121                            wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15)
122        ix += 2
123        self.sizer4.Add(wx.StaticText(self, -1, 'Max'),(iy, ix),(1,1),\
124                            wx.EXPAND|wx.ADJUST_MINSIZE, 0)
125        ix = 0
126        iy += 1
127        self.sizer4.Add(wx.StaticText(self, -1, 'x range'),(iy, ix),(1,1),\
128                            wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15)
129        ix += 1
130        self.xmin    = wx.TextCtrl(self, -1,size=(_BOX_WIDTH,20))
131        self.xmin.SetValue(format_number(numpy.min(data.x)))
132        self.xmin.SetToolTipString("Minimun value of x in linear scale.")
133        self.xmin.Bind(wx.EVT_KILL_FOCUS, self._onTextEnter)
134        self.xmin.Bind(wx.EVT_TEXT_ENTER, self._onTextEnter)
135        self.xmin.Disable()
136        self.sizer4.Add(self.xmin,(iy, ix),(1,1), wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15)
137       
138       
139        ix += 2
140        self.xmax    = wx.TextCtrl(self, -1,size=(_BOX_WIDTH,20))
141        self.xmax.SetValue(format_number(numpy.max(data.x)))
142        self.xmax.SetToolTipString("Maximum value of x in linear scale.")
143        self.xmax.Bind(wx.EVT_KILL_FOCUS, self._onTextEnter)
144        self.xmax.Bind(wx.EVT_TEXT_ENTER, self._onTextEnter)
145        self.xmax.Disable()
146        self.sizer4.Add(self.xmax,(iy,ix),(1,1), wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 0)
147        ix =0
148        iy+=1
149        self.sizer4.Add((20,20),(iy,ix),(1,1),wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15)
150        #Set chisqr  result into TextCtrl
151        ix = 0
152        iy = 1
153       
154        self.text1_1 = wx.StaticText(self, -1, 'Chi2/dof', style=wx.ALIGN_LEFT)
155        #self.sizer1.Add(self.text1_1,1)
156        self.sizer1.Add(self.text1_1,(iy,ix),(1,1),\
157                   wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15)
158        ix += 1
159        self.tcChi    = wx.TextCtrl(self, -1,size=(_BOX_WIDTH,20))
160        self.tcChi.SetToolTipString("Chi^2 over degrees of freedom.")
161        #self.sizer1.Add(self.tcChi, 1, wx.R | wx.BOTTOM , 5)
162        self.sizer1.Add(self.tcChi,(iy,ix),(1,1), wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 0)
163        ix +=2
164        #self.sizer1.Add(self.btFit, 1, wx.LEFT | wx.BOTTOM , 5)
165        self.sizer1.Add(self.btFit,(iy,ix),(1,1), wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 0)
166        ix+= 2
167        self.sizer1.Add( self.btClose,(iy,ix),(1,1), wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 0)
168        #self.sizer1.Add( self.btClose,1, wx.LEFT | wx.BOTTOM , 5)
169        self.tcChi.Disable()
170        ix= 0
171        iy+=1
172        self.sizer1.Add((20,20),(iy,ix),(1,1), wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 0)
173        #self.sizer1.Add((20,20), 0)
174        # contains link between  model ,all its parameters, and panel organization
175        self.parameters=[]
176        self.fixed_param=[]
177        #contains link between a model and selected parameters to fit
178        self.param_toFit=[]
179        # model on which the fit would be performed
180        self.model=None
181        #dictionary of model name and model class
182        self.model_list_box={}
183        self.data = data
184        ## Q range
185        self.qmin= 0.001
186        self.qmax= 0.1
187        """
188        bs = wx.BoxSizer(wx.VERTICAL)
189        bs.Add(self.scroll, 1, wx.EXPAND)
190        self.SetSizer(bs)
191        self.scroll.SetSizer(self.vbox)       
192        self.scroll.SetScrollbars(20,20,55,40)
193        #width,height = self.GetSize()
194         """
195        self.vbox.Layout()
196        self.vbox.Fit(self) 
197        self.SetSizer(self.vbox)
198        self.SetScrollbars(20,20,55,40)
199       
200        self.Centre()
201        self.Layout()
202        self.GrandParent.GetSizer().Layout()
203       
204
205 
206 
207 
208       
209    def compute_chisqr(self):
210        """ @param fn: function that return model value
211            @return residuals
212        """
213       
214        flag=self.checkFitRange()
215        if flag== True:
216            try:
217                qmin = float(self.xmin.GetValue())
218                qmax = float(self.xmax.GetValue())
219                x,y,dy = [numpy.asarray(v) for v in (self.data.x,self.data.y,self.data.dy)]
220                if qmin==None and qmax==None: 
221                    fx =numpy.asarray([self.model.run(v) for v in x])
222                    res=(y - fx)/dy
223                else:
224                    idx = (x>= qmin) & (x <=qmax)
225                    fx = numpy.asarray([self.model.run(item)for item in x[idx ]])
226                    res= (y[idx] - fx)/dy[idx] 
227               
228               
229                sum=0
230                for item in res:
231                    if numpy.isfinite(item):
232                        sum +=item
233                self.tcChi.SetValue(format_number(math.fabs(sum)))
234            except:
235                wx.PostEvent(self.parent.GrandParent, StatusEvent(status=\
236                            "Chisqr cannot be compute: %s"% sys.exc_value))
237           
238           
239    def onFit(self,event):
240        """ signal for fitting"""
241         
242        flag=self.checkFitRange()
243        self.set_manager(self.manager)
244     
245        qmin=float(self.xmin.GetValue())
246        qmax =float( self.xmax.GetValue())
247        if len(self.param_toFit) >0 and flag==True:
248            self.manager.schedule_for_fit( value=1,fitproblem =None) 
249            self.manager._on_single_fit(qmin=qmin,qmax=qmax)
250        else:
251              wx.PostEvent(self.parent.GrandParent, StatusEvent(status=\
252                            "Select at least on parameter to fit "))
253 
254   
255    def _on_select_model(self,event):
256        """
257            react when a model is selected from page's combo box
258            post an event to its owner to draw an appropriate theory
259        """
260        self.btFit.SetFocus()
261        for item in self.model_list_box.itervalues():
262            name = item.__name__
263            if hasattr(item, "name"):
264                name = item.name
265            #print "fitpage: _on_select_model model name",name ,event.GetString()
266            if name ==event.GetString():
267                try:
268                    self.model=item()
269                    evt = ModelEventbox(model=self.model,name=name)
270                    wx.PostEvent(self.event_owner, evt)
271                    #self.model= item()
272                    #self.set_panel(self.model)
273                except:
274                    raise #ValueError,"model.name is not equal to model class name"
275                break
276   
277    def _onTextEnter(self,event):
278        """
279            set a flag to determine if the fitting range entered by the user is valid
280        """
281     
282        try:
283            flag=self.checkFitRange()
284            if flag==True and self.model!=None:
285                #print"fit page",self.xmin.GetValue(),self.xmax.GetValue()
286                self.manager.redraw_model(float(self.xmin.GetValue())\
287                                               ,float(self.xmax.GetValue()))
288        except:
289
290            wx.PostEvent(self.parent.GrandParent, StatusEvent(status=\
291                            "Drawing  Error:wrong value entered %s"% sys.exc_value))
292       
293    def checkFitRange(self):
294        """
295            Check the validity of fitting range
296            @note: xmin should always be less than xmax or else each control box
297            background is colored in pink.
298        """
299       
300        flag = True
301        valueMin = self.xmin.GetValue()
302        valueMax = self.xmax.GetValue()
303        # Check for possible values entered
304        #print "fitpage: checkfitrange:",valueMin,valueMax
305        try:
306            if (float(valueMax)> float(valueMin)):
307                self.xmax.SetBackgroundColour(wx.WHITE)
308                self.xmin.SetBackgroundColour(wx.WHITE)
309            else:
310                flag = False
311                self.xmin.SetBackgroundColour("pink")
312                self.xmax.SetBackgroundColour("pink")     
313        except:
314            flag = False
315            self.xmin.SetBackgroundColour("pink")
316            self.xmax.SetBackgroundColour("pink")
317           
318        self.xmin.Refresh()
319        self.xmax.Refresh()
320        return flag
321   
322
323   
324    def get_param_list(self):
325        """
326            @return self.param_toFit: list containing  references to TextCtrl
327            checked.Theses TextCtrl will allow reference to parameters to fit.
328            @raise: if return an empty list of parameter fit will nnote work
329            properly so raise ValueError,"missing parameter to fit"
330        """
331        if self.param_toFit !=[]:
332            return self.param_toFit
333        else:
334            raise ValueError,"missing parameter to fit"
335       
336       
337    def set_panel(self,model):
338        """
339            Build the panel from the model content
340            @param model: the model selected in combo box for fitting purpose
341        """
342        self.sizer2.Clear(True)
343        self.sizer5.Clear(True)
344        self.sizer6.Clear(True)
345        self.parameters = []
346        self.param_toFit=[]
347        self.model = model
348        keys = self.model.getParamList()
349        #print "fitpage1D : dispersion list",self.model.getDispParamList()
350        keys.sort()
351        disp_list=self.model.getDispParamList()
352        fixed=self.model.fixed
353        ip=0
354        iq=1
355       
356        ik=0
357        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()
366        iy = 1
367        ix = 0
368        self.cb1 = wx.CheckBox(self, -1,'Parameters', (10, 10))
369        wx.EVT_CHECKBOX(self, self.cb1.GetId(), self.select_all_param)
370        self.sizer2.Add(self.cb1,(iy, ix),(1,1),\
371                          wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15)
372        ix +=1
373        self.text2_2 = wx.StaticText(self, -1, 'Values')
374        self.sizer2.Add(self.text2_2,(iy, ix),(1,1),\
375                            wx.EXPAND|wx.ADJUST_MINSIZE, 0) 
376        ix +=2
377        self.text2_3 = wx.StaticText(self, -1, 'Errors')
378        self.sizer2.Add(self.text2_3,(iy, ix),(1,1),\
379                            wx.EXPAND|wx.ADJUST_MINSIZE, 0)
380        self.text2_3.Hide() 
381        ix +=1
382        self.text2_4 = wx.StaticText(self, -1, 'Units')
383        self.sizer2.Add(self.text2_4,(iy, ix),(1,1),\
384                            wx.EXPAND|wx.ADJUST_MINSIZE, 0) 
385        self.text2_4.Hide()
386       
387        for item in keys:
388            if not item in disp_list:
389                iy += 1
390                ix = 0
391   
392                cb = wx.CheckBox(self, -1, item, (10, 10))
393                cb.SetValue(False)
394                self.sizer2.Add( cb,( iy, ix),(1,1),  wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15)
395                wx.EVT_CHECKBOX(self, cb.GetId(), self.select_param)
396           
397                ix += 1
398                value= self.model.getParam(item)
399                ctl1 = wx.TextCtrl(self, -1, size=(_BOX_WIDTH,20), style=wx.TE_PROCESS_ENTER)
400                ctl1.SetValue(str (format_number(value)))
401                ctl1.Bind(wx.EVT_KILL_FOCUS, self._onparamEnter)
402                ctl1.Bind(wx.EVT_TEXT_ENTER,self._onparamEnter)
403                self.sizer2.Add(ctl1, (iy,ix),(1,1), wx.EXPAND)
404               
405                ix += 1
406                text2=wx.StaticText(self, -1, '+/-')
407                self.sizer2.Add(text2,(iy, ix),(1,1),\
408                                wx.EXPAND|wx.ADJUST_MINSIZE, 0) 
409                text2.Hide() 
410                ix += 1
411                ctl2 = wx.TextCtrl(self, -1, size=(_BOX_WIDTH,20), style=wx.TE_PROCESS_ENTER)
412                self.sizer2.Add(ctl2, (iy,ix),(1,1), wx.EXPAND|wx.ADJUST_MINSIZE, 0)
413                ctl2.Hide()
414                ix +=1
415                # Units
416                try:
417                    units = wx.StaticText(self, -1, self.model.details[item][0], style=wx.ALIGN_LEFT)
418                except:
419                    units = wx.StaticText(self, -1, "", style=wx.ALIGN_LEFT)
420                self.sizer2.Add(units, (iy,ix),(1,1),  wx.EXPAND|wx.ADJUST_MINSIZE, 0)
421            else:
422                if not item in fixed:
423                    ip = 0
424                    iq += 1
425                    cb = wx.CheckBox(self, -1, item, (10, 10))
426                    cb.SetValue(False)
427                    self.sizer5.Add( cb,( iq, ip),(1,1),  wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15)
428                    wx.EVT_CHECKBOX(self, cb.GetId(), self.select_param)
429                   
430                    ip += 1
431                    value= self.model.getParam(item)
432                    ctl1 = wx.TextCtrl(self, -1, size=(_BOX_WIDTH,20), style=wx.TE_PROCESS_ENTER)
433                    ctl1.SetValue(str (format_number(value)))
434                    ctl1.Bind(wx.EVT_KILL_FOCUS, self._onparamEnter)
435                    ctl1.Bind(wx.EVT_TEXT_ENTER,self._onparamEnter)
436                    self.sizer5.Add(ctl1, (iq,ip),(1,1), wx.EXPAND|wx.ADJUST_MINSIZE, 0)
437                else:
438                    ik = 0
439                    text = wx.StaticText(self, -1, item, style=wx.ALIGN_LEFT)
440                    self.sizer6.Add(text,( im, ik),(1,1),  wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15)
441           
442                    ik += 1
443                    value= self.model.getParam(item)
444                    Tctl = wx.TextCtrl(self, -1, size=(_BOX_WIDTH,20), style=wx.TE_PROCESS_ENTER)
445                    Tctl.SetValue(str (format_number(value)))
446                    Tctl.Bind(wx.EVT_KILL_FOCUS, self._onparamEnter)
447                    Tctl.Bind(wx.EVT_TEXT_ENTER,self._onparamEnter)
448                    self.sizer6.Add(Tctl, (im,ik),(1,1), wx.EXPAND|wx.ADJUST_MINSIZE, 0)
449                    self.fixed_param.append([item, Tctl])
450                    im += 1
451            #save data
452            self.parameters.append([cb,ctl1,text2,ctl2])
453               
454        iy+=1
455        self.sizer2.Add((20,20),(iy,ix),(1,1), wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15)
456       
457        #Display units text on panel
458        for item in keys:   
459            if self.model.details[item][0]!='':
460                self.text2_4.Show()
461                break
462            else:
463                self.text2_4.Hide()
464        #Disable or enable fit button
465       
466        if not (len(self.param_toFit ) >0):
467            self.xmin.Disable()
468            self.xmax.Disable()
469        else:
470            self.xmin.Enable()
471            self.xmax.Enable()
472       
473        self.compute_chisqr()
474        self.vbox.Layout()
475        self.SetScrollbars(20,20,55,40)
476        self.Layout()
477        self.GrandParent.GetSizer().Layout()
478       
479       
480       
481    def _onparamEnter(self,event):
482        """
483            when enter value on panel redraw model according to changed
484        """
485        self.set_model_parameter()
486        self.compute_chisqr()
487       
488     
489    def set_model_parameter(self):
490        """
491            this method redraws the model according to parameters values changes
492            and the reset model according to paramaters changes
493        """
494        print "went here",len(self.parameters) ,self.model
495        if len(self.parameters) !=0 and self.model !=None:
496            # Flag to register when a parameter has changed.
497            is_modified = False
498            for item in self.parameters:
499                try:
500                    self.text2_3.Hide()
501                    item[2].Hide()
502                    item[3].Clear()
503                    item[3].Hide()
504                    name=str(item[0].GetLabelText())
505                    value= float(item[1].GetValue())
506                    # If the value of the parameter has changed,
507                    # update the model and set the is_modified flag
508                    if value != self.model.getParam(name):
509                        self.model.setParam(name,value)
510                        is_modified = True 
511                except:
512                     wx.PostEvent(self.parent.GrandParent, StatusEvent(status=\
513                            "Drawing  Error:wrong value entered : %s"% sys.exc_value))
514            # Here we should check whether the boundaries have been modified.
515            # If qmin and qmax have been modified, update qmin and qmax and
516            # set the is_modified flag to True
517            if float(self.xmin.GetValue()) != self.qmin:
518                self.qmin = float(self.xmin.GetValue())
519                is_modified = True
520            if float(self.xmax.GetValue()) != self.qmax:
521                self.qmax = float(self.xmax.GetValue())
522                is_modified = True
523           
524            if is_modified:
525                self.manager.redraw_model(qmin=self.qmin, qmax=self.qmax)
526         
527    def select_all_param(self,event): 
528        """
529             set to true or false all checkBox given the main checkbox value cb1
530        """
531        self.param_toFit=[]
532        if  self.parameters !=[]:
533            if  self.cb1.GetValue()==True:
534                for item in self.parameters:
535                    item[0].SetValue(True)
536                    list= [item[0],item[1],item[2],item[3]]
537                    self.param_toFit.append(list )
538               
539                if not (len(self.param_toFit ) >0):
540                    self.xmin.Disable()
541                    self.xmax.Disable()
542                else:
543                    self.xmin.Enable()
544                    self.xmax.Enable()
545            else:
546                for item in self.parameters:
547                    item[0].SetValue(False)
548                self.param_toFit=[]
549             
550                self.xmin.Disable()
551                self.xmax.Disable()
552               
553               
554    def select_param(self,event):
555        """
556            Select TextCtrl  checked for fitting purpose and stores them
557            in  self.param_toFit=[] list
558        """
559        self.param_toFit=[]
560        for item in self.parameters:
561            if item[0].GetValue()==True:
562                list= [item[0],item[1],item[2],item[3]]
563                self.param_toFit.append(list ) 
564            else:
565                if item in self.param_toFit:
566                    self.param_toFit.remove(item)
567        if len(self.parameters)==len(self.param_toFit):
568            self.cb1.SetValue(True)
569        else:
570            self.cb1.SetValue(False)
571           
572        if not (len(self.param_toFit ) >0):
573            self.xmin.Disable()
574            self.xmax.Disable()
575        else:
576            self.xmin.Enable()
577            self.xmax.Enable()
578 
579   
580       
581 
582    def onsetValues(self,chisqr, out,cov):
583        """
584            Build the panel from the fit result
585            @param chisqr:Value of the goodness of fit metric
586            @param out:list of parameter with the best value found during fitting
587            @param cov:Covariance matrix
588       
589        """
590        #print "fitting : onsetvalues out",out
591        self.tcChi.Clear()
592        self.tcChi.SetValue(format_number(chisqr))
593        params = {}
594        is_modified = False
595        has_error = False
596        if out.__class__==numpy.float64:
597            self.param_toFit[0][1].SetValue(format_number(out))
598            self.param_toFit[0][1].Refresh()
599            if cov !=None :
600                self.text2_3.Show()
601                self.param_toFit[0][2].Show()
602                self.param_toFit[0][3].Clear()
603                self.param_toFit[0][3].SetValue(format_number(cov[0]))
604                self.param_toFit[0][3].Show()
605        #out is a list : set parameters and errors in TextCtrl
606        else:
607            i=0
608            #print "fitpage: list param  model",list
609            #for item in self.param_toFit:
610            #    print "fitpage: list display",item[0].GetLabelText()
611            for item in self.param_toFit:
612                if( out != None ) and len(out)<=len(self.param_toFit)and i < len(out):
613                    #item[1].SetValue(format_number(out[i]))
614                    item[1].SetValue(format_number(self.model.getParam(item[0].GetLabelText())))
615                    item[1].Refresh() 
616                if (cov !=None)and len(cov)<=len(self.param_toFit)and i < len(cov):
617                    self.text2_3.Show() 
618                    item[2].Show()
619                    item[3].Clear()
620                    item[3].SetValue(format_number(cov[i]))
621                    item[3].Show()   
622                i+=1
623       
624        self.vbox.Layout()
625        self.SetScrollbars(20,20,55,40)
626        self.Layout()
627        self.GrandParent.GetSizer().Layout()
628       
629       
630    def onSmear(self, event):
631        if event.GetString()=="None":
632            self.manager.set_smearer(None)   
633           
634           
635        if event.GetString()=="GaussianModel":
636            from DataLoader.qsmearing import smear_selection
637            smear =smear_selection( self.data )
638            self.manager.set_smearer(smear)   
639            print "on smearing"
640       
Note: See TracBrowser for help on using the repository browser.