source: sasview/sansview/perspectives/fitting/fitpage.py @ da26c1a

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 da26c1a was da26c1a, checked in by Gervaise Alina <gervyh@…>, 15 years ago

error of data1D restore when copying onSelect()…fitting.py

  • Property mode set to 100644
File size: 51.0 KB
Line 
1
2
3import sys
4import wx
5import wx.lib.newevent
6import numpy
7import copy
8import math
9from sans.models.dispersion_models import ArrayDispersion, GaussianDispersion
10
11from sans.guicomm.events import StatusEvent   
12from sans.guiframe.utils import format_number,check_float
13
14## event to post model to fit to fitting plugins
15(ModelEventbox, EVT_MODEL_BOX) = wx.lib.newevent.NewEvent()
16
17## event to know the selected fit engine
18(FitterTypeEvent, EVT_FITTER_TYPE)   = wx.lib.newevent.NewEvent()
19_BOX_WIDTH = 76
20
21import basepage
22from basepage import BasicPage
23from basepage import PageInfoEvent
24from DataLoader.qsmearing import smear_selection
25
26class FitPage(BasicPage):
27    """
28        FitPanel class contains fields allowing to display results when
29        fitting  a model and one data
30        @note: For Fit to be performed the user should check at least one parameter
31        on fit Panel window.
32 
33    """
34    def __init__(self,parent, page_info):
35        BasicPage.__init__(self, parent, page_info)
36        """
37            Initialization of the Panel
38        """
39        ## fit page does not content npts txtcrtl
40        self.npts=None
41        ## thread for compute Chisqr
42        self.calc_Chisqr=None
43        ## default fitengine type
44        self.engine_type = None
45        ## draw sizer
46        self._fill_datainfo_sizer()
47       
48        self._fill_model_sizer( self.sizer1)
49        self._fill_range_sizer() 
50        self._on_select_model(event=None)
51        if self.data !=None:
52            self.smearer = smear_selection( self.data )
53            if self.smearer ==None:
54                self.enable_smearer.Disable()
55                self.disable_smearer.Disable()
56       
57        ## to update the panel according to the fit engine type selected
58        self.Bind(EVT_FITTER_TYPE,self._on_engine_change)
59   
60   
61    def _on_engine_change(self, event):
62        """
63            get an event containing the current name of the fit engine type
64            @param event: FitterTypeEvent containing  the name of the current engine
65        """
66        self.engine_type = event.type
67         
68        if len(self.parameters)==0:
69            return
70        if event.type =="park":
71            self.btFit.SetLabel("Fit")
72        for item in self.parameters:
73            if event.type =="scipy":
74                item[5].SetValue("")
75                item[5].Hide()
76                item[6].SetValue("")
77                item[6].Hide()
78                self.text2_min.Hide()
79                self.text2_max.Hide()
80            else:
81                item[5].Show(True)
82                item[6].Show(True)
83                self.text2_min.Show(True)
84                self.text2_max.Show(True)
85        for item in self.orientation_params:
86            if event.type =="scipy":
87                item[5].SetValue("")
88                item[5].Hide()
89                item[6].SetValue("")
90                item[6].Hide()
91                self.text2_min.Hide()
92                self.text2_max.Hide()
93            else:
94                item[5].Show(True)
95                item[6].Show(True)
96                self.text2_min.Show(True)
97                self.text2_max.Show(True)
98           
99        for item in self.orientation_params_disp:
100            if event.type =="scipy":
101                item[5].SetValue("")
102                item[5].Hide()
103                item[6].SetValue("")
104                item[6].Hide()
105                self.text2_min.Hide()
106                self.text2_max.Hide()
107            else:
108                item[5].Show(True)
109                item[6].Show(True)
110                self.text2_min.Show(True)
111                self.text2_max.Show(True)
112               
113        self.sizer3.Layout()
114        self.SetScrollbars(20,20,200,100)
115       
116   
117    def _fill_range_sizer(self):
118        """
119            Fill the sizer containing the plotting range
120            add  access to npts
121        """
122        sizer_fit = wx.GridSizer(1, 1,0, 0)
123   
124        self.btFit = wx.Button(self,wx.NewId(),'Fit')
125        self.btFit.Bind(wx.EVT_BUTTON, self._onFit,id= self.btFit.GetId())
126        self.btFit.SetToolTipString("Perform fit.")
127     
128       
129        sizer_fit.Add((5,5),1, wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 5)       
130        sizer_fit.Add(self.btFit,0, wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 5) 
131       
132        sizer_smearer = wx.BoxSizer(wx.HORIZONTAL)
133        #Filling the sizer containing instruments smearing info.
134        self.disable_smearer = wx.RadioButton(self, -1, 'No', style=wx.RB_GROUP)
135        self.enable_smearer = wx.RadioButton(self, -1, 'Yes')
136        self.Bind(wx.EVT_RADIOBUTTON, self.onSmear, id=self.disable_smearer.GetId())
137        self.Bind(wx.EVT_RADIOBUTTON, self.onSmear, id=self.enable_smearer.GetId())
138       
139        sizer_smearer.Add(wx.StaticText(self,-1,'Instrument Smearing? '))
140        sizer_smearer.Add((10, 10))
141        sizer_smearer.Add( self.enable_smearer )
142        sizer_smearer.Add((10,10))
143        sizer_smearer.Add( self.disable_smearer )
144       
145        #Display Chi^2/dof
146        sizer_smearer.Add((68,10))
147        box_description= wx.StaticBox(self, -1,'Chi2/dof')
148        boxsizer1 = wx.StaticBoxSizer(box_description, wx.VERTICAL)
149        boxsizer1.SetMinSize((60,-1))
150        temp_smearer = None
151        if self.enable_smearer.GetValue():
152            temp_smearer= self.smearer
153       
154        self.tcChi    =  wx.StaticText(self, -1, "-", style=wx.ALIGN_LEFT)
155         
156        boxsizer1.Add( self.tcChi )   
157        sizer_smearer.Add( boxsizer1 )
158               
159        #Set sizer for Fitting section
160        self._set_range_sizer( title="Fitting",
161                               object1=sizer_smearer, object= sizer_fit)
162 
163       
164    def _fill_datainfo_sizer(self):
165        """
166            fill sizer 0 with data info
167        """
168        self.sizer0.Clear(True)
169        ## no loaded data , don't fill the sizer
170        if self.data== None:
171            self.sizer0.Layout()
172            return
173       
174        box_description= wx.StaticBox(self, -1, 'Data')
175        boxsizer1 = wx.StaticBoxSizer(box_description, wx.VERTICAL)
176        #----------------------------------------------------------
177        sizer_data = wx.GridSizer(3, 3,5, 5)
178        #Filling the sizer containing data related fields
179        DataSource  =wx.StaticText(self, -1,str(self.data.name))
180
181        sizer_data.Add(wx.StaticText(self, -1, 'Source Name : '))
182        sizer_data.Add(DataSource )
183        sizer_data.Add( (0,5) )
184       
185        #---------sizer 2 draw--------------------------------
186        #set maximum range for x in linear scale
187        if not hasattr(self.data,"data"): #Display only for 1D data fit
188            # Minimum value of data   
189            data_min = min(self.data.x)
190            # Maximum value of data 
191            data_max = max(self.data.x)
192            text4_3 = wx.StaticText(self, -1, 'Total Q Range (1/A)',
193                                     style=wx.ALIGN_LEFT)
194            sizer_data.Add( text4_3 )
195            sizer_data.Add(wx.StaticText(self, -1, "Min : %s"%str(data_min)))
196            sizer_data.Add(wx.StaticText(self, -1, "Max : %s"%str(data_max)))
197           
198        else:
199            ## Minimum value of data
200            data_min= 0
201            x= max(math.fabs(self.data.xmin), math.fabs(self.data.xmax)) 
202            y= max(math.fabs(self.data.ymin), math.fabs(self.data.ymax))
203            ## Maximum value of data 
204            data_max = math.sqrt(x*x + y*y)
205         
206            #For qmin and qmax, do not use format_number
207            #.(If do, qmin and max could be different from what is in the data.)
208            text4_3 = wx.StaticText(self, -1, "Total Q Range (1/A)",
209                                     style=wx.ALIGN_LEFT)
210            sizer_data.Add( text4_3 )
211            sizer_data.Add(wx.StaticText(self, -1, "Min : %s"%str(data_min)))
212            sizer_data.Add(wx.StaticText(self, -1, "Max : %s"%str(data_max)))
213        ## set q range to plot
214        self.qmin_x= data_min
215        self.qmax_x= data_max
216
217        boxsizer1.Add(sizer_data)
218        #------------------------------------------------------------
219        self.sizer0.Add(boxsizer1,0, wx.EXPAND | wx.ALL, 10)
220        self.sizer0.Layout()
221       
222       
223       
224    def _fill_model_sizer(self, sizer):
225        """
226            fill sizer containing model info
227        """
228       
229        ## class base method  to add view 2d button   
230        self._set_model_sizer(sizer=sizer, title="Model",object=None )   
231       
232   
233    def _set_sizer_gaussian(self):
234        """
235            draw sizer with gaussian dispersity parameters
236        """
237        self.fittable_param=[]
238        self.fixed_param=[]
239        self.orientation_params_disp=[]
240       
241        self.sizer4_4.Clear(True)
242       
243        if self.model==None:
244            ##no model is selected
245            return
246        if not self.enable_disp.GetValue():
247            ## the user didn't select dispersity display
248            return 
249       
250        self._reset_dispersity()
251        # Create the dispersion objects
252        for item in self.model.dispersion.keys():
253            disp_model =  GaussianDispersion()
254            self._disp_obj_dict[item] = disp_model
255            self.model.set_dispersion(item, disp_model)
256            self.state._disp_obj_dict[item]= disp_model
257
258        ix=0
259        iy=1
260        disp = wx.StaticText(self, -1, 'Names')
261        self.sizer4_4.Add(disp,( iy, ix),(1,1), 
262                           wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15)
263        ix += 1 
264        values = wx.StaticText(self, -1, 'Values')
265        self.sizer4_4.Add(values,( iy, ix),(1,1), wx.EXPAND|wx.ADJUST_MINSIZE, 0)
266        ix +=2 
267        self.text_disp_1 = wx.StaticText(self, -1, 'Errors')
268        self.sizer4_4.Add( self.text_disp_1,(iy, ix),(1,1),\
269                            wx.EXPAND|wx.ADJUST_MINSIZE, 0) 
270        self.text_disp_1.Hide()
271        ix += 1 
272        npts = wx.StaticText(self, -1, 'Npts')
273        self.sizer4_4.Add(npts,( iy, ix),(1,1), wx.EXPAND|wx.ADJUST_MINSIZE, 0)
274        ix += 1 
275        nsigmas = wx.StaticText(self, -1, 'Nsigmas')
276        self.sizer4_4.Add(nsigmas,( iy, ix),(1,1), wx.EXPAND|wx.ADJUST_MINSIZE, 0)
277       
278        for item in self.model.dispersion.keys():
279            if not item in self.model.orientation_params:
280                self.disp_cb_dict[item]= None
281                name1=item+".width"
282                name2=item+".npts"
283                name3=item+".nsigmas"
284                iy += 1
285                for p in self.model.dispersion[item].keys(): 
286       
287                    if p=="width":
288                        ix = 0
289                        cb = wx.CheckBox(self, -1, name1, (10, 10))
290                        wx.EVT_CHECKBOX(self, cb.GetId(), self.select_param)
291                        self.sizer4_4.Add( cb,( iy, ix),(1,1), 
292                                           wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15)
293                        ix = 1
294                        value= self.model.getParam(name1)
295                        ctl1 = wx.TextCtrl(self, -1, size=(_BOX_WIDTH,20),
296                                            style=wx.TE_PROCESS_ENTER)
297                        ctl1.SetValue(str (format_number(value)))
298                        ctl1.Bind(wx.EVT_SET_FOCUS, self.onSetFocus)
299                        ctl1.Bind(wx.EVT_KILL_FOCUS, self._onparamEnter)
300                        ctl1.Bind(wx.EVT_TEXT_ENTER,self._onparamEnter)
301                        self.sizer4_4.Add(ctl1, (iy,ix),(1,1),wx.EXPAND)
302                        ## text to show error sign
303                        ix = 2
304                        text2=wx.StaticText(self, -1, '+/-')
305                        self.sizer4_4.Add(text2,(iy, ix),(1,1),
306                                          wx.EXPAND|wx.ADJUST_MINSIZE, 0)
307                        text2.Hide() 
308                        ## txtcrtl to add error from fit
309                        ix = 3
310                        ctl2 = wx.TextCtrl(self, -1, size=(_BOX_WIDTH,20), style=wx.TE_PROCESS_ENTER)
311                        self.sizer4_4.Add(ctl2, (iy,ix),(1,1), wx.EXPAND|wx.ADJUST_MINSIZE, 0)
312                        ctl2.Hide()
313                        self.fittable_param.append([cb,name1,ctl1,text2,
314                                                    ctl2, None, None,None])
315                    elif p=="npts":
316                            ix = 4
317                            value= self.model.getParam(name2)
318                            Tctl = wx.TextCtrl(self, -1, size=(_BOX_WIDTH/2,20),
319                                                style=wx.TE_PROCESS_ENTER)
320                           
321                            Tctl.SetValue(str (format_number(value)))
322                            Tctl.Bind(wx.EVT_SET_FOCUS, self.onSetFocus)
323                            Tctl.Bind(wx.EVT_KILL_FOCUS, self._onparamEnter)
324                            Tctl.Bind(wx.EVT_TEXT_ENTER,self._onparamEnter)
325                            self.sizer4_4.Add(Tctl, (iy,ix),(1,1),
326                                               wx.EXPAND|wx.ADJUST_MINSIZE, 0)
327                            self.fixed_param.append([None,name2, Tctl,None,None,
328                                                      None, None,None])
329                    elif p=="nsigmas":
330                            ix = 5
331                            value= self.model.getParam(name3)
332                            Tctl = wx.TextCtrl(self, -1, size=(_BOX_WIDTH/2,20),
333                                                style=wx.TE_PROCESS_ENTER)
334                            Tctl.SetValue(str (format_number(value)))
335                            Tctl.Bind(wx.EVT_SET_FOCUS, self.onSetFocus)
336                            Tctl.Bind(wx.EVT_KILL_FOCUS, self._onparamEnter)
337                            Tctl.Bind(wx.EVT_TEXT_ENTER,self._onparamEnter)
338                            self.sizer4_4.Add(Tctl, (iy,ix),(1,1),
339                                               wx.EXPAND|wx.ADJUST_MINSIZE, 0)
340                            ix +=1
341                            self.sizer4_4.Add((20,20), (iy,ix),(1,1),
342                                               wx.EXPAND|wx.ADJUST_MINSIZE, 0)
343                           
344                            self.fixed_param.append([None,name3, Tctl
345                                                     ,None,None, None, None,None])
346        ix =0
347        iy +=1 
348        self.sizer4_4.Add((20,20),(iy,ix),(1,1), wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15) 
349        for item in self.model.dispersion.keys():
350            if  item in self.model.orientation_params:
351                self.disp_cb_dict[item]= None
352                name1=item+".width"
353                name2=item+".npts"
354                name3=item+".nsigmas"
355                iy += 1
356                for p in self.model.dispersion[item].keys(): 
357       
358                    if p=="width":
359                        ix = 0
360                        cb = wx.CheckBox(self, -1, name1, (10, 10))
361                        wx.EVT_CHECKBOX(self, cb.GetId(), self.select_param)
362                        self.sizer4_4.Add( cb,( iy, ix),(1,1), 
363                                           wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15)
364                        if self.data.__class__.__name__ =="Data2D":
365                            cb.Enable()
366                        else:
367                            cb.Disable()
368                        ix = 1
369                        value= self.model.getParam(name1)
370                        ctl1 = wx.TextCtrl(self, -1, size=(_BOX_WIDTH,20),
371                                            style=wx.TE_PROCESS_ENTER)
372                        ctl1.SetValue(str (format_number(value)))
373                        if self.data.__class__.__name__ =="Data2D":
374                            ctl1.Enable()
375                        else:
376                            ctl1.Disable()
377                        ctl1.Bind(wx.EVT_SET_FOCUS, self.onSetFocus)
378                        ctl1.Bind(wx.EVT_KILL_FOCUS, self._onparamEnter)
379                        ctl1.Bind(wx.EVT_TEXT_ENTER,self._onparamEnter)
380                        self.sizer4_4.Add(ctl1, (iy,ix),(1,1),wx.EXPAND)
381                        ## text to show error sign
382                        ix = 2
383                        text2=wx.StaticText(self, -1, '+/-')
384                        self.sizer4_4.Add(text2,(iy, ix),(1,1),
385                                          wx.EXPAND|wx.ADJUST_MINSIZE, 0)
386                        text2.Hide() 
387                        ## txtcrtl to add error from fit
388                        ix = 3
389                        ctl2 = wx.TextCtrl(self, -1, size=(_BOX_WIDTH,20), style=wx.TE_PROCESS_ENTER)
390                        self.sizer4_4.Add(ctl2, (iy,ix),(1,1), wx.EXPAND|wx.ADJUST_MINSIZE, 0)
391                        ctl2.Hide()
392                        if self.data.__class__.__name__ =="Data2D":
393                            ctl2.Enable()
394                        else:
395                            ctl2.Disable()
396                        self.fittable_param.append([cb,name1,ctl1,text2,
397                                                    ctl2, None, None,None])
398                        self.orientation_params_disp.append([cb,name1,ctl1,text2,
399                                                    ctl2, None, None,None])
400                    elif p=="npts":
401                            ix = 4
402                            value= self.model.getParam(name2)
403                            Tctl = wx.TextCtrl(self, -1, size=(_BOX_WIDTH/2,20),
404                                                style=wx.TE_PROCESS_ENTER)
405                           
406                            Tctl.SetValue(str (format_number(value)))
407                            if self.data.__class__.__name__ =="Data2D":
408                                Tctl.Enable()
409                            else:
410                                Tctl.Disable()
411                            Tctl.Bind(wx.EVT_SET_FOCUS, self.onSetFocus)
412                            Tctl.Bind(wx.EVT_KILL_FOCUS, self._onparamEnter)
413                            Tctl.Bind(wx.EVT_TEXT_ENTER,self._onparamEnter)
414                            self.sizer4_4.Add(Tctl, (iy,ix),(1,1),
415                                               wx.EXPAND|wx.ADJUST_MINSIZE, 0)
416                            self.fixed_param.append([None,name2, Tctl,None,None,
417                                                      None, None,None])
418                            self.orientation_params_disp.append([None,name2, Tctl,None,None,
419                                                      None, None,None])
420                    elif p=="nsigmas":
421                            ix = 5
422                            value= self.model.getParam(name3)
423                            Tctl = wx.TextCtrl(self, -1, size=(_BOX_WIDTH/2,20),
424                                                style=wx.TE_PROCESS_ENTER)
425                            Tctl.SetValue(str (format_number(value)))
426                            if self.data.__class__.__name__ =="Data2D":
427                                Tctl.Enable()
428                            else:
429                                Tctl.Disable()
430                            Tctl.Bind(wx.EVT_SET_FOCUS, self.onSetFocus)
431                            Tctl.Bind(wx.EVT_KILL_FOCUS, self._onparamEnter)
432                            Tctl.Bind(wx.EVT_TEXT_ENTER,self._onparamEnter)
433                            self.sizer4_4.Add(Tctl, (iy,ix),(1,1),
434                                               wx.EXPAND|wx.ADJUST_MINSIZE, 0)
435                            ix +=1
436                            self.sizer4_4.Add((20,20), (iy,ix),(1,1),
437                                               wx.EXPAND|wx.ADJUST_MINSIZE, 0)
438                            self.fixed_param.append([None,name3, Tctl
439                                                     ,None,None, None, None,None])   
440                            self.orientation_params_disp.append([None,name3, Tctl
441                                                     ,None,None, None, None,None])
442   
443        self.state.disp_cb_dict = copy.deepcopy(self.disp_cb_dict)                         
444        wx.PostEvent(self.parent, StatusEvent(status=\
445                        " Selected Distribution: Gaussian"))   
446        ix =0
447        iy +=1 
448        self.sizer4_4.Add((20,20),(iy,ix),(1,1), wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15)       
449        self.sizer4_4.Layout()
450        self.sizer4.Layout()
451        self.SetScrollbars(20,20,200,100)
452     
453       
454    def _onFit(self, event):     
455        """
456            Allow to fit
457        """
458        from sans.guiframe.utils import check_value
459        flag = check_value( self.qmin, self.qmax) 
460       
461        if not flag:
462            msg= "Fitting range invalid"
463            wx.PostEvent(self.parent.parent, StatusEvent(status= msg ))
464            return 
465       
466        if len(self.param_toFit) <= 0:
467            msg= "Select at least one parameter to fit"
468            wx.PostEvent(self.parent.parent, StatusEvent(status= msg ))
469            return 
470
471        # Remove or do not allow fitting on the Q=0 point, especially when y(q=0)=None at x[0].
472        #ToDo: Fix this.               
473        self.qmin_x = float(self.qmin.GetValue())
474        self.qmax_x =float( self.qmax.GetValue())
475        self.manager._reset_schedule_problem( value=0)
476        self.manager.schedule_for_fit( value=1,page=self,fitproblem =None) 
477        self.manager.set_fit_range(page= self,qmin= self.qmin_x, qmax= self.qmax_x)
478       
479        #single fit
480        self.manager.onFit()
481        ## allow stopping the fit
482        if self.engine_type=="scipy":
483            self.btFit.SetLabel("Stop")
484            self.btFit.Unbind(event=wx.EVT_BUTTON, id= self.btFit.GetId())
485            self.btFit.Bind(event= wx.EVT_BUTTON, handler=self._StopFit, id=self.btFit.GetId())
486        else:
487            self.btFit.SetLabel("Fit")
488            self.btFit.Bind(event= wx.EVT_BUTTON, handler=self._onFit, id=self.btFit.GetId())
489        self.btFit.SetFocus()   
490        self.sizer5.Layout()
491        self.SetScrollbars(20,20,55,40)
492       
493    def _StopFit(self, event):
494        """
495            Stop fit
496        """
497        self.btFit.SetLabel("Fit")
498        if self.engine_type=="scipy":
499            self.manager.stop_fit()
500            self.btFit.Unbind(event=wx.EVT_BUTTON, id=self.btFit.GetId())
501            self.btFit.Bind(event=wx.EVT_BUTTON, handler=self._onFit,id=self.btFit.GetId())
502        else:
503            self.btFit.Unbind(event=wx.EVT_BUTTON, id=self.btFit.GetId())
504            self.btFit.Bind(event= wx.EVT_BUTTON, handler=self._onFit, id=self.btFit.GetId())
505        self.btFit.SetFocus()   
506        self.sizer5.Layout()
507        self.SetScrollbars(20,20,55,40)   
508           
509    def _on_select_model(self, event): 
510        """
511             call back for model selection
512        """   
513        self._on_select_model_helper() 
514        self.set_model_param_sizer(self.model)
515        try:
516            temp_smear= None
517            if self.enable_smearer.GetValue():
518                temp_smear= self.smearer
519            self.compute_chisqr(temp_smear)
520        except:
521            ## error occured on chisqr computation
522            pass
523        self.enable_disp.SetValue(False)
524        self.disable_disp.SetValue(True)
525        self.set_dispers_sizer()
526       
527        evt = ModelEventbox(model=self.model)
528        wx.PostEvent(self.event_owner, evt)   
529       
530   
531    def _onparamRangeEnter(self, event):
532        """
533            Check validity of value enter in the parameters range field
534        """
535        tcrtl= event.GetEventObject()
536        if tcrtl.GetValue().lstrip().rstrip()!="":
537            try:
538                value = float(tcrtl.GetValue())
539                tcrtl.SetBackgroundColour(wx.WHITE)
540                tcrtl.Refresh()
541            except:
542                tcrtl.SetBackgroundColour("pink")
543                tcrtl.Refresh()
544        else:
545           tcrtl.SetBackgroundColour(wx.WHITE)
546           tcrtl.Refresh() 
547        self._onparamEnter_helper()   
548       
549    def _onparamEnter(self,event):
550        """
551            when enter value on panel redraw model according to changed
552        """
553        tcrtl= event.GetEventObject()
554        if check_float(tcrtl):
555            self._onparamEnter_helper()
556            temp_smearer = None
557            if self.enable_smearer.GetValue():
558                temp_smearer= self.smearer
559            self.compute_chisqr(smearer= temp_smearer)
560        else:
561            msg= "Cannot Plot :Must enter a number!!!  "
562            wx.PostEvent(self.parent.parent, StatusEvent(status = msg ))
563            return 
564       
565       
566    def set_data(self, data ):
567        """
568            reset the current data
569        """
570        if data ==None:
571            return 
572        self.data =data
573        self.state.data= data
574        self._fill_datainfo_sizer()
575        self.SetScrollbars(20,20,200,100)
576        self.Layout()   
577       
578    def reset_page(self, state):
579        """
580            reset the state
581        """
582        self.reset_page_helper(state)
583        evt = ModelEventbox(model=self.model)
584        wx.PostEvent(self.event_owner, evt)   
585           
586           
587    def get_range(self):
588        """
589            return the fitting range
590        """
591        return float(self.qmin_x) , float(self.qmax_x)
592       
593    def get_param_list(self):
594        """
595            @return self.param_toFit: list containing  references to TextCtrl
596            checked.Theses TextCtrl will allow reference to parameters to fit.
597            @raise: if return an empty list of parameter fit will nnote work
598            properly so raise ValueError,"missing parameter to fit"
599        """
600        if self.param_toFit !=[]:
601            return self.param_toFit
602        else:
603            raise ValueError,"missing parameter to fit"   
604     
605    def onsetValues(self,chisqr, out,cov):
606        """
607            Build the panel from the fit result
608            @param chisqr:Value of the goodness of fit metric
609            @param out:list of parameter with the best value found during fitting
610            @param cov:Covariance matrix
611       
612        """
613        self.tcChi.SetLabel(format_number(chisqr))
614        params = {}
615        is_modified = False
616        has_error = False
617        self.text2_3.Hide()
618        try:
619            n = self.disp_box.GetCurrentSelection()
620            dispersity= self.disp_box.GetClientData(n)
621            name= dispersity.__name__
622            if name == "GaussianDispersion":
623                if hasattr(self,"text_disp_1" ):
624                    if self.text_disp_1 !=None:
625                        self.text_disp_1.Hide()
626        except:
627            pass
628        #set the panel when fit result are float not list
629        if out.__class__==numpy.float64:
630            self.param_toFit[0][2].SetValue(format_number(out))
631            self.param_toFit[0][2].Refresh()
632           
633            self.param_toFit[0][4].Clear()
634            self.param_toFit[0][4].Hide()
635            if cov !=None :
636                self.text2_3.Show(True)
637                try:
638                    name= dispersity.__name__
639                    if name == "GaussianDispersion":
640                        if hasattr(self,"text_disp_1" ):
641                            if self.text_disp_1 !=None:
642                                self.text_disp_1.Show(True)
643                except:
644                    pass
645                if cov[0]==None or  not numpy.isfinite(cov[0]): 
646                    self.param_toFit[0][3].Hide()
647                    self.param_toFit[0][4].Clear()
648                    self.param_toFit[0][4].Hide()
649                    self.param_toFit[0][4].Refresh()
650                else:
651                    self.param_toFit[0][3].Show(True)
652                    self.param_toFit[0][4].Clear()
653                    self.param_toFit[0][4].SetValue(format_number(cov[0]))
654                    self.param_toFit[0][4].Show(True)
655                    self.param_toFit[0][4].Refresh()
656        else:
657            i=0
658            j=0
659            #Set the panel when fit result are list
660            for item in self.param_toFit:
661                ## reset error value to initial state
662                item[4].Clear()
663                item[4].Hide()
664                item[4].Refresh()
665                if( out != None ) and len(out)<=len(self.param_toFit)and i < len(out):
666                    item[2].SetValue(format_number(self.model.getParam(item[1])))
667                    item[2].Refresh()
668                if(cov !=None)and len(cov)<=len(self.param_toFit)and i < len(cov):
669                    self.text2_3.Show(True) 
670                    try:
671                        name= dispersity.__name__
672                        if name == "GaussianDispersion":
673                            if hasattr(self,"text_disp_1" ):
674                                if self.text_disp_1!=None:
675                                    self.text_disp_1.Show(True)
676                    except:
677                        pass
678                    item[3].Show(True)
679                    item[4].Clear()
680                    for j in range(len(out)):
681                        if out[j]==self.model.getParam(item[1]):
682                            break
683                    ## unable to compare cov[j]==numpy.nan so switch to None
684                    if cov[j]==None or not numpy.isfinite(cov[j]):
685                        item[3].Hide()
686                        item[4].Refresh()
687                        item[4].Clear()
688                        item[4].Hide()
689                    else:
690                        item[4].SetValue(format_number(cov[j]))
691                        item[4].Refresh()
692                        item[4].Show(True)   
693                i+=1
694       
695        self.sizer3.Layout()
696        self.sizer4.Layout()
697        self.SetScrollbars(20,20,200,100)
698       
699       
700    def onSmear(self, event):
701        """
702            Create a smear object that will change the way residuals
703            are compute when fitting
704        """
705        temp_smearer = None
706        if self.enable_smearer.GetValue():
707            msg=""
708            temp_smearer= self.smearer
709            if hasattr(self.data,"dxl"):
710                msg= ": Resolution smearing parameters"
711            if hasattr(self.data,"dxw"):
712                msg= ": Slit smearing parameters"
713            if self.smearer ==None:
714                wx.PostEvent(self.manager.parent, StatusEvent(status=\
715                            "Data contains no smearing information"))
716            else:
717                wx.PostEvent(self.manager.parent, StatusEvent(status=\
718                            "Data contains smearing information %s"%msg))
719       
720        ## set smearing value whether or not the data contain the smearing info
721        self.manager.set_smearer(smearer=temp_smearer, qmin= float(self.qmin_x),
722                                     qmax= float(self.qmax_x)) 
723        ##Calculate chi2
724        self.compute_chisqr(smearer= temp_smearer) 
725        ## save the state enable smearing
726        self.save_current_state() 
727   
728    def complete_chisqr(self, output, elapsed=None): 
729        """
730            print result chisqr
731        """
732        try:
733            self.tcChi.SetLabel(format_number(output))
734        except:
735            raise
736       
737       
738    def compute_chisqr1D(self, smearer=None):
739        """
740            Compute chisqr for 1D
741        """
742        from sans.guiframe.utils import check_value
743        flag = check_value( self.qmin, self.qmax)
744       
745        if not flag:
746            return 
747       
748        try:
749            self.qmin_x = float(self.qmin.GetValue())
750            self.qmax_x = float(self.qmax.GetValue())
751            ##return residuals within self.qmin_x and self.qmax_x
752            from gui_thread import CalcChisqr1D
753            ## If a thread is already started, stop it
754            if self.calc_Chisqr!= None and self.calc_Chisqr.isrunning():
755                self.calc_Chisqr.stop()
756               
757            self.calc_Chisqr= CalcChisqr1D( x= self.data.x,
758                                            y= self.data.y,
759                                            dy= self.data.dy,
760                                            model= self.model,
761                                            smearer=smearer,
762                                            qmin=self.qmin_x,
763                                            qmax=self.qmax_x,
764                                            completefn = self.complete_chisqr,
765                                            updatefn   = None)
766   
767            self.calc_Chisqr.queue()
768           
769        except:
770            raise ValueError," Could not compute Chisqr for %s Model 2D: "%self.model.name
771           
772           
773   
774       
775       
776    def compute_chisqr2D(self):
777        """
778            compute chi square given a model and data 2D and set the value
779            to the tcChi txtcrl
780        """
781        from sans.guiframe.utils import check_value
782        flag = check_value( self.qmin, self.qmax)
783        if not flag:
784            return 
785     
786        try:
787            self.qmin_x = float(self.qmin.GetValue())
788            self.qmax_x = float(self.qmax.GetValue())
789           
790            ##return residuals within self.qmin_x and self.qmax_x
791            from gui_thread import CalcChisqr2D
792            ## If a thread is already started, stop it
793            if self.calc_Chisqr!= None and self.calc_Chisqr.isrunning():
794                self.calc_Chisqr.stop()
795               
796            self.calc_Chisqr= CalcChisqr2D( x_bins= self.data.x_bins,
797                                            y_bins= self.data.y_bins,
798                                            data= self.data.data,
799                                            err_data = self.data.err_data,
800                                            model= self.model,
801                                            qmin= self.qmin_x,
802                                            qmax = self.qmax_x,
803                                            completefn = self.complete_chisqr,
804                                            updatefn   = None)
805   
806            self.calc_Chisqr.queue()
807         
808        except:
809            raise ValueError," Could not compute Chisqr for %s Model 2D: "%self.model.name
810           
811
812       
813    def compute_chisqr(self , smearer=None):
814        """
815            compute chi square given a model and data 1D and set the value
816            to the tcChi txtcrl
817        """
818        from sans.guiframe.utils import check_value
819        flag = check_value( self.qmin, self.qmax)
820        if flag== True:
821            try:
822                if hasattr(self.data,"data"):
823                    self.compute_chisqr2D()
824                    return
825                else:
826                    self.compute_chisqr1D(smearer=smearer)
827                    return
828            except:
829                wx.PostEvent(self.parent.GrandParent, StatusEvent(status=\
830                            "Chisqr Error: %s"% sys.exc_value))
831                return 
832           
833   
834    def select_all_param(self,event): 
835        """
836             set to true or false all checkBox given the main checkbox value cb1
837        """           
838
839        self.param_toFit=[]
840        if  self.parameters !=[]:
841            if  self.cb1.GetValue():
842                for item in self.parameters:
843                    ## for data2D select all to fit
844                    if self.data.__class__.__name__=="Data2D":
845                        item[0].SetValue(True)
846                        self.param_toFit.append(item )
847                    else:
848                        ## for 1D all parameters except orientation
849                        if not item in self.orientation_params:
850                            item[0].SetValue(True)
851                            self.param_toFit.append(item )
852                if len(self.fittable_param)>0:
853                    for item in self.fittable_param:
854                        if self.data.__class__.__name__=="Data2D":
855                            item[0].SetValue(True)
856                            self.param_toFit.append(item )
857                        else:
858                            ## for 1D all parameters except orientation
859                            if not item in self.orientation_params_disp:
860                                item[0].SetValue(True)
861                                self.param_toFit.append(item )
862            else:
863                for item in self.parameters:
864                    item[0].SetValue(False)
865                for item in self.fittable_param:
866                    item[0].SetValue(False)
867                self.param_toFit=[]
868               
869        self.save_current_state() 
870       
871               
872               
873    def select_param(self,event):
874        """
875            Select TextCtrl  checked for fitting purpose and stores them
876            in  self.param_toFit=[] list
877        """
878        self.param_toFit=[]
879        for item in self.parameters:
880            #Select parameters to fit for list of primary parameters
881            if item[0].GetValue():
882                if not (item in self.param_toFit):
883                    self.param_toFit.append(item ) 
884            else:
885                #remove parameters from the fitting list
886                if item in self.param_toFit:
887                    self.param_toFit.remove(item)
888        #Select parameters to fit for list of fittable parameters with dispersion         
889        for item in self.fittable_param:
890            if item[0].GetValue():
891                if not (item in self.param_toFit):
892                    self.param_toFit.append(item) 
893            else:
894                #remove parameters from the fitting list
895                if item in self.param_toFit:
896                    self.param_toFit.remove(item)           
897        #Set the value of checkbox that selected every checkbox or not           
898        if len(self.parameters)+len(self.fittable_param) ==len(self.param_toFit):
899            self.cb1.SetValue(True)
900        else:
901            self.cb1.SetValue(False)
902        ## save current state of the page
903        self.save_current_state()
904       
905   
906       
907    def set_model_param_sizer(self, model):
908        """
909            Build the panel from the model content
910            @param model: the model selected in combo box for fitting purpose
911        """
912        self.sizer3.Clear(True)
913        self.parameters = []
914        self.param_toFit=[]
915        self.fittable_param=[]
916        self.fixed_param=[]
917        self.orientation_params=[]
918        self.orientation_params_disp=[]
919       
920        if model ==None:
921            self.sizer3.Layout()
922            self.SetScrollbars(20,20,200,100)
923            return
924        ## the panel is drawn using the current value of the fit engine
925        if self.engine_type==None and self.manager !=None:
926            self.engine_type= self.manager._return_engine_type()
927           
928        box_description= wx.StaticBox(self, -1,str("Model Parameters"))
929        boxsizer1 = wx.StaticBoxSizer(box_description, wx.VERTICAL)
930        sizer = wx.GridBagSizer(5,5)
931        ## save the current model
932        self.model = model
933           
934        keys = self.model.getParamList()
935        #list of dispersion paramaters
936        self.disp_list=self.model.getDispParamList()
937       
938        keys.sort()
939   
940        iy = 1
941        ix = 0
942        self.cb1 = wx.CheckBox(self, -1,"Select all", (10, 10))
943        wx.EVT_CHECKBOX(self, self.cb1.GetId(), self.select_all_param)
944        self.cb1.SetValue(False)
945       
946        sizer.Add(self.cb1,(iy, ix),(1,1),\
947                             wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 5)
948        ix +=1
949        self.text2_2 = wx.StaticText(self, -1, 'Values')
950        sizer.Add(self.text2_2,(iy, ix),(1,1),\
951                            wx.EXPAND|wx.ADJUST_MINSIZE, 0)
952        ix +=2 
953        self.text2_3 = wx.StaticText(self, -1, 'Errors')
954        sizer.Add(self.text2_3,(iy, ix),(1,1),\
955                            wx.EXPAND|wx.ADJUST_MINSIZE, 0) 
956        self.text2_3.Hide()
957        ix +=1 
958        self.text2_min = wx.StaticText(self, -1, 'Min')
959        sizer.Add(self.text2_min,(iy, ix),(1,1),\
960                            wx.EXPAND|wx.ADJUST_MINSIZE, 0) 
961        self.text2_min.Hide()
962        ix +=1 
963        self.text2_max = wx.StaticText(self, -1, 'Max')
964        sizer.Add(self.text2_max,(iy, ix),(1,1),\
965                            wx.EXPAND|wx.ADJUST_MINSIZE, 0) 
966        self.text2_max.Hide()
967        ix += 1
968        self.text2_4 = wx.StaticText(self, -1, '[Units]')
969        sizer.Add(self.text2_4,(iy, ix),(1,1),\
970                            wx.EXPAND|wx.ADJUST_MINSIZE, 0) 
971        self.text2_4.Hide()
972        if self.engine_type=="park":
973            self.text2_max.Show(True)
974            self.text2_min.Show(True)
975
976        for item in keys:
977            if not item in self.disp_list and not item in self.model.orientation_params:
978                iy += 1
979                ix = 0
980                ## add parameters name with checkbox for selecting to fit
981                cb = wx.CheckBox(self, -1, item )
982                cb.SetValue(False)
983                wx.EVT_CHECKBOX(self, cb.GetId(), self.select_param)
984                sizer.Add( cb,( iy, ix),(1,1),
985                             wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 5)
986               
987                ## add parameter value
988                ix += 1
989                value= self.model.getParam(item)
990                ctl1 = wx.TextCtrl(self, -1, size=(_BOX_WIDTH,20),
991                                    style=wx.TE_PROCESS_ENTER)
992               
993                ctl1.SetValue(format_number(value))
994                ctl1.Bind(wx.EVT_SET_FOCUS, self.onSetFocus)
995                ctl1.Bind(wx.EVT_KILL_FOCUS, self._onparamEnter)
996                ctl1.Bind(wx.EVT_TEXT_ENTER,self._onparamEnter)
997                sizer.Add(ctl1, (iy,ix),(1,1), wx.EXPAND)
998                ## text to show error sign
999                ix += 1
1000                text2=wx.StaticText(self, -1, '+/-')
1001                sizer.Add(text2,(iy, ix),(1,1),\
1002                                wx.EXPAND|wx.ADJUST_MINSIZE, 0) 
1003                text2.Hide() 
1004                ## txtcrtl to add error from fit
1005                ix += 1
1006                ctl2 = wx.TextCtrl(self, -1, size=(_BOX_WIDTH,20), style=wx.TE_PROCESS_ENTER)
1007                sizer.Add(ctl2, (iy,ix),(1,1), wx.EXPAND|wx.ADJUST_MINSIZE, 0)
1008                ctl2.Hide()
1009               
1010                param_min, param_max= self.model.details[item][1:]
1011                ix += 1
1012                ctl3 = wx.TextCtrl(self, -1, size=(_BOX_WIDTH/2,20), style=wx.TE_PROCESS_ENTER)
1013                if param_min ==None:
1014                    ctl3.SetValue("")
1015                else:
1016                    ctl3.SetValue(str(param_min))
1017                ctl3.Bind(wx.EVT_SET_FOCUS, self.onSetFocus)
1018                ctl3.Bind(wx.EVT_KILL_FOCUS, self._onparamRangeEnter)
1019                ctl3.Bind(wx.EVT_TEXT_ENTER,self._onparamRangeEnter)
1020                sizer.Add(ctl3, (iy,ix),(1,1), wx.EXPAND|wx.ADJUST_MINSIZE, 0)
1021                ctl3.Hide()
1022       
1023                ix += 1
1024                ctl4 = wx.TextCtrl(self, -1, size=(_BOX_WIDTH/2,20), style=wx.TE_PROCESS_ENTER)
1025                ctl4.Bind(wx.EVT_SET_FOCUS, self.onSetFocus)
1026                ctl4.Bind(wx.EVT_KILL_FOCUS, self._onparamRangeEnter)
1027                ctl4.Bind(wx.EVT_TEXT_ENTER,self._onparamRangeEnter)
1028                sizer.Add(ctl4, (iy,ix),(1,1), wx.EXPAND|wx.ADJUST_MINSIZE, 0)
1029                if param_max==None:
1030                    ctl4.SetValue("")
1031                else:
1032                    ctl4.SetValue(str(param_max))
1033                ctl4.Hide()
1034               
1035                if self.engine_type=="park":
1036                    ctl3.Show(True)
1037                    ctl4.Show(True)
1038                ix +=1
1039                # Units
1040                try:
1041                    units = wx.StaticText(self, -1, self.model.details[item][0], style=wx.ALIGN_LEFT)
1042                except:
1043                    units = wx.StaticText(self, -1, "", style=wx.ALIGN_LEFT)
1044                sizer.Add(units, (iy,ix),(1,1),  wx.EXPAND|wx.ADJUST_MINSIZE, 0)
1045                   
1046                ##[cb state, name, value, "+/-", error of fit, min, max , units]
1047                self.parameters.append([cb,item, ctl1,
1048                                        text2,ctl2, ctl3, ctl4,None])
1049             
1050        iy+=1
1051        sizer.Add((10,10),(iy,ix),(1,1), wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15)
1052        for item in self.model.orientation_params:
1053            if not item in self.disp_list :
1054                iy += 1
1055                ix = 0
1056                ## add parameters name with checkbox for selecting to fit
1057                cb = wx.CheckBox(self, -1, item )
1058                cb.SetValue(False)
1059                wx.EVT_CHECKBOX(self, cb.GetId(), self.select_param)
1060                if self.data.__class__.__name__ =="Data2D":
1061                    cb.Enable()
1062                else:
1063                    cb.Disable()
1064                sizer.Add( cb,( iy, ix),(1,1),
1065                             wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 5)
1066
1067                ## add parameter value
1068                ix += 1
1069                value= self.model.getParam(item)
1070                ctl1 = wx.TextCtrl(self, -1, size=(_BOX_WIDTH,20),
1071                                    style=wx.TE_PROCESS_ENTER)
1072               
1073                ctl1.SetValue(format_number(value))
1074                if self.data.__class__.__name__ =="Data2D":
1075                    ctl1.Enable()
1076                else:
1077                    ctl1.Disable()
1078                ctl1.Bind(wx.EVT_SET_FOCUS, self.onSetFocus)
1079                ctl1.Bind(wx.EVT_KILL_FOCUS, self._onparamEnter)
1080                ctl1.Bind(wx.EVT_TEXT_ENTER,self._onparamEnter)
1081                sizer.Add(ctl1, (iy,ix),(1,1), wx.EXPAND)
1082                ## text to show error sign
1083                ix += 1
1084                text2=wx.StaticText(self, -1, '+/-')
1085                sizer.Add(text2,(iy, ix),(1,1),\
1086                                wx.EXPAND|wx.ADJUST_MINSIZE, 0) 
1087                text2.Hide() 
1088                ## txtcrtl to add error from fit
1089                ix += 1
1090                ctl2 = wx.TextCtrl(self, -1, size=(_BOX_WIDTH,20), style=wx.TE_PROCESS_ENTER)
1091                sizer.Add(ctl2, (iy,ix),(1,1), wx.EXPAND|wx.ADJUST_MINSIZE, 0)
1092                ctl2.Hide()
1093                if self.data.__class__.__name__ =="Data2D":
1094                    ctl1.Enable()
1095                else:
1096                    ctl1.Disable()
1097                param_min, param_max= self.model.details[item][1:]
1098                ix += 1
1099                ctl3 = wx.TextCtrl(self, -1, size=(_BOX_WIDTH/2,20), style=wx.TE_PROCESS_ENTER)
1100                if param_min ==None:
1101                    ctl3.SetValue("")
1102                else:
1103                    ctl3.SetValue(str(param_min))
1104                ctl3.Bind(wx.EVT_SET_FOCUS, self.onSetFocus)
1105                ctl3.Bind(wx.EVT_KILL_FOCUS, self._onparamRangeEnter)
1106                ctl3.Bind(wx.EVT_TEXT_ENTER,self._onparamRangeEnter)
1107                sizer.Add(ctl3, (iy,ix),(1,1), wx.EXPAND|wx.ADJUST_MINSIZE, 0)
1108                ctl3.Hide()
1109                if self.data.__class__.__name__ =="Data2D":
1110                    ctl3.Enable()
1111                else:
1112                    ctl3.Disable()
1113                ix += 1
1114                ctl4 = wx.TextCtrl(self, -1, size=(_BOX_WIDTH/2,20), style=wx.TE_PROCESS_ENTER)
1115                ctl4.Bind(wx.EVT_SET_FOCUS, self.onSetFocus)
1116                ctl4.Bind(wx.EVT_KILL_FOCUS, self._onparamRangeEnter)
1117                ctl4.Bind(wx.EVT_TEXT_ENTER,self._onparamRangeEnter)
1118                sizer.Add(ctl4, (iy,ix),(1,1), wx.EXPAND|wx.ADJUST_MINSIZE, 0)
1119                if param_max ==None:
1120                    ctl4.SetValue("")
1121                else:
1122                    ctl4.SetValue(str(param_max))
1123                ctl4.Hide()
1124                if self.data.__class__.__name__ =="Data2D":
1125                    ctl4.Enable()
1126                else:
1127                    ctl4.Disable()
1128                if self.engine_type=="park":
1129                    ctl3.Show(True)
1130                    ctl4.Show(True)
1131                ix +=1
1132                # Units
1133                try:
1134                    units = wx.StaticText(self, -1, self.model.details[item][0], style=wx.ALIGN_LEFT)
1135                except:
1136                    units = wx.StaticText(self, -1, "", style=wx.ALIGN_LEFT)
1137                if self.data.__class__.__name__ =="Data2D":
1138                    units.Enable()
1139                else:
1140                    units.Disable()
1141                sizer.Add(units, (iy,ix),(1,1),  wx.EXPAND|wx.ADJUST_MINSIZE, 0)
1142                   
1143               
1144                ##[cb state, name, value, "+/-", error of fit, min, max , units]
1145                self.parameters.append([cb,item, ctl1,
1146                                        text2,ctl2, ctl3, ctl4,None])
1147                self.orientation_params.append([cb,item, ctl1,
1148                                        text2,ctl2, ctl3, ctl4,None])
1149             
1150        iy+=1
1151        sizer.Add((10,10),(iy,ix),(1,1), wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15)
1152       
1153        #Display units text on panel
1154        for item in keys:   
1155            if self.model.details[item][0]!='':
1156                self.text2_4.Show()
1157                break
1158            else:
1159                self.text2_4.Hide()
1160   
1161        boxsizer1.Add(sizer)
1162       
1163        self.sizer3.Add(boxsizer1,0, wx.EXPAND | wx.ALL, 10)
1164        self.sizer3.Layout()
1165        self.SetScrollbars(20,20,200,100)
1166       
1167   
1168           
1169       
1170class HelpWindow(wx.Frame):
1171    def __init__(self, parent, id, title):
1172        wx.Frame.__init__(self, parent, id, title, size=(570, 400))
1173       
1174        from sans.models.CylinderModel import CylinderModel
1175        model = CylinderModel()
1176       
1177        from danse.common.plottools.plottables import Data1D
1178        data= Data1D(x=[1,2], y=[3,4], dy=[0.1, 0,1])
1179   
1180        from fitpanel import PageInfo
1181        myinfo = PageInfo(self,  model, data=data )
1182       
1183        ## add data
1184       
1185        from models import ModelList
1186        mylist= ModelList()
1187
1188        from sans.models.SphereModel import SphereModel
1189        from sans.models.SquareWellStructure import SquareWellStructure
1190        from sans.models.DebyeModel import DebyeModel
1191        from sans.models.LineModel import LineModel
1192        name= "shapes"
1193        list1= [SphereModel]
1194        mylist.set_list( name, list1)
1195       
1196        name= "Shape-independent"
1197        list1= [DebyeModel]
1198        mylist.set_list( name, list1)
1199       
1200        name= "Structure Factors"
1201        list1= [SquareWellStructure]
1202        mylist.set_list( name, list1)
1203       
1204        name= "Added models"
1205        list1= [LineModel]
1206        mylist.set_list( name, list1)
1207       
1208        myinfo.model_list_box = mylist.get_list()
1209       
1210        self.page = FitPage(self, myinfo) 
1211       
1212       
1213       
1214        self.Centre()
1215        self.Show(True)
1216
1217
1218   
1219if __name__=="__main__":
1220    app = wx.App()
1221    HelpWindow(None, -1, 'HelpWindow')
1222    app.MainLoop()
1223               
Note: See TracBrowser for help on using the repository browser.