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

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

working on stopping scipy fit

  • Property mode set to 100644
File size: 50.9 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        print "self.qmin, self.qmax====>",self.qmax_x,self.qmin_x
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            self.compute_chisqr()
557        else:
558            msg= "Cannot Plot :Must enter a number!!!  "
559            wx.PostEvent(self.parent.parent, StatusEvent(status = msg ))
560            return 
561       
562       
563    def set_data(self, data ):
564        """
565            reset the current data
566        """
567        if data ==None:
568            return 
569        self.data =data
570        self.state.data= data
571        self._fill_datainfo_sizer()
572        self.SetScrollbars(20,20,200,100)
573        self.Layout()   
574       
575    def reset_page(self, state):
576        """
577            reset the state
578        """
579        self.reset_page_helper(state)
580        evt = ModelEventbox(model=self.model)
581        wx.PostEvent(self.event_owner, evt)   
582           
583           
584    def get_range(self):
585        """
586            return the fitting range
587        """
588        return float(self.qmin_x) , float(self.qmax_x)
589       
590    def get_param_list(self):
591        """
592            @return self.param_toFit: list containing  references to TextCtrl
593            checked.Theses TextCtrl will allow reference to parameters to fit.
594            @raise: if return an empty list of parameter fit will nnote work
595            properly so raise ValueError,"missing parameter to fit"
596        """
597        if self.param_toFit !=[]:
598            return self.param_toFit
599        else:
600            raise ValueError,"missing parameter to fit"   
601     
602    def onsetValues(self,chisqr, out,cov):
603        """
604            Build the panel from the fit result
605            @param chisqr:Value of the goodness of fit metric
606            @param out:list of parameter with the best value found during fitting
607            @param cov:Covariance matrix
608       
609        """
610        self.tcChi.SetLabel(format_number(chisqr))
611        params = {}
612        is_modified = False
613        has_error = False
614        self.text2_3.Hide()
615        try:
616            n = self.disp_box.GetCurrentSelection()
617            dispersity= self.disp_box.GetClientData(n)
618            name= dispersity.__name__
619            if name == "GaussianDispersion":
620                if hasattr(self,"text_disp_1" ):
621                    if self.text_disp_1 !=None:
622                        self.text_disp_1.Hide()
623        except:
624            pass
625        #set the panel when fit result are float not list
626        if out.__class__==numpy.float64:
627            self.param_toFit[0][2].SetValue(format_number(out))
628            self.param_toFit[0][2].Refresh()
629           
630            self.param_toFit[0][4].Clear()
631            self.param_toFit[0][4].Hide()
632            if cov !=None :
633                self.text2_3.Show(True)
634                try:
635                    name= dispersity.__name__
636                    if name == "GaussianDispersion":
637                        if hasattr(self,"text_disp_1" ):
638                            if self.text_disp_1 !=None:
639                                self.text_disp_1.Show(True)
640                except:
641                    pass
642                if cov[0]==None or  not numpy.isfinite(cov[0]): 
643                    self.param_toFit[0][3].Hide()
644                    self.param_toFit[0][4].Clear()
645                    self.param_toFit[0][4].Hide()
646                    self.param_toFit[0][4].Refresh()
647                else:
648                    self.param_toFit[0][3].Show(True)
649                    self.param_toFit[0][4].Clear()
650                    self.param_toFit[0][4].SetValue(format_number(cov[0]))
651                    self.param_toFit[0][4].Show(True)
652                    self.param_toFit[0][4].Refresh()
653        else:
654            i=0
655            j=0
656            #Set the panel when fit result are list
657            for item in self.param_toFit:
658                ## reset error value to initial state
659                item[4].Clear()
660                item[4].Hide()
661                item[4].Refresh()
662                if( out != None ) and len(out)<=len(self.param_toFit)and i < len(out):
663                    item[2].SetValue(format_number(self.model.getParam(item[1])))
664                    item[2].Refresh()
665                if(cov !=None)and len(cov)<=len(self.param_toFit)and i < len(cov):
666                    self.text2_3.Show(True) 
667                    try:
668                        name= dispersity.__name__
669                        if name == "GaussianDispersion":
670                            if hasattr(self,"text_disp_1" ):
671                                if self.text_disp_1!=None:
672                                    self.text_disp_1.Show(True)
673                    except:
674                        pass
675                    item[3].Show(True)
676                    item[4].Clear()
677                    for j in range(len(out)):
678                        if out[j]==self.model.getParam(item[1]):
679                            break
680                    ## unable to compare cov[j]==numpy.nan so switch to None
681                    if cov[j]==None or not numpy.isfinite(cov[j]):
682                        item[3].Hide()
683                        item[4].Refresh()
684                        item[4].Clear()
685                        item[4].Hide()
686                    else:
687                        item[4].SetValue(format_number(cov[j]))
688                        item[4].Refresh()
689                        item[4].Show(True)   
690                i+=1
691       
692        self.sizer3.Layout()
693        self.sizer4.Layout()
694        self.SetScrollbars(20,20,200,100)
695       
696       
697    def onSmear(self, event):
698        """
699            Create a smear object that will change the way residuals
700            are compute when fitting
701        """
702        temp_smearer = None
703        if self.enable_smearer.GetValue():
704            msg=""
705            temp_smearer= self.smearer
706            if hasattr(self.data,"dxl"):
707                msg= ": Resolution smearing parameters"
708            if hasattr(self.data,"dxw"):
709                msg= ": Slit smearing parameters"
710            if self.smearer ==None:
711                wx.PostEvent(self.manager.parent, StatusEvent(status=\
712                            "Data contains no smearing information"))
713            else:
714                wx.PostEvent(self.manager.parent, StatusEvent(status=\
715                            "Data contains smearing information %s"%msg))
716       
717        ## set smearing value whether or not the data contain the smearing info
718        self.manager.set_smearer(smearer=temp_smearer, qmin= float(self.qmin_x),
719                                     qmax= float(self.qmax_x)) 
720        ##Calculate chi2
721        self.compute_chisqr(smearer= temp_smearer) 
722        ## save the state enable smearing
723        self.save_current_state() 
724   
725    def complete_chisqr(self, output, elapsed=None): 
726        """
727            print result chisqr
728        """
729        try:
730            self.tcChi.SetLabel(format_number(output))
731        except:
732            raise
733       
734       
735    def compute_chisqr1D(self, smearer=None):
736        """
737            Compute chisqr for 1D
738        """
739        from sans.guiframe.utils import check_value
740        flag = check_value( self.qmin, self.qmax)
741       
742        if not flag:
743            return 
744       
745        try:
746            self.qmin_x = float(self.qmin.GetValue())
747            self.qmax_x = float(self.qmax.GetValue())
748            ##return residuals within self.qmin_x and self.qmax_x
749            from gui_thread import CalcChisqr1D
750            ## If a thread is already started, stop it
751            if self.calc_Chisqr!= None and self.calc_Chisqr.isrunning():
752                self.calc_Chisqr.stop()
753               
754            self.calc_Chisqr= CalcChisqr1D( x= self.data.x,
755                                            y= self.data.y,
756                                            dy= self.data.dy,
757                                            model= self.model,
758                                            smearer=smearer,
759                                            qmin=self.qmin_x,
760                                            qmax=self.qmax_x,
761                                            completefn = self.complete_chisqr,
762                                            updatefn   = None)
763   
764            self.calc_Chisqr.queue()
765           
766        except:
767            raise ValueError," Could not compute Chisqr for %s Model 2D: "%self.model.name
768           
769           
770   
771       
772       
773    def compute_chisqr2D(self):
774        """
775            compute chi square given a model and data 2D and set the value
776            to the tcChi txtcrl
777        """
778        from sans.guiframe.utils import check_value
779        flag = check_value( self.qmin, self.qmax)
780        if not flag:
781            return 
782     
783        try:
784            self.qmin_x = float(self.qmin.GetValue())
785            self.qmax_x = float(self.qmax.GetValue())
786           
787            ##return residuals within self.qmin_x and self.qmax_x
788            from gui_thread import CalcChisqr2D
789            ## If a thread is already started, stop it
790            if self.calc_Chisqr!= None and self.calc_Chisqr.isrunning():
791                self.calc_Chisqr.stop()
792               
793            self.calc_Chisqr= CalcChisqr2D( x_bins= self.data.x_bins,
794                                            y_bins= self.data.y_bins,
795                                            data= self.data.data,
796                                            err_data = self.data.err_data,
797                                            model= self.model,
798                                            qmin= self.qmin_x,
799                                            qmax = self.qmax_x,
800                                            completefn = self.complete_chisqr,
801                                            updatefn   = None)
802   
803            self.calc_Chisqr.queue()
804         
805        except:
806            raise ValueError," Could not compute Chisqr for %s Model 2D: "%self.model.name
807           
808
809       
810    def compute_chisqr(self , smearer=None):
811        """
812            compute chi square given a model and data 1D and set the value
813            to the tcChi txtcrl
814        """
815        from sans.guiframe.utils import check_value
816        flag = check_value( self.qmin, self.qmax)
817        if flag== True:
818            try:
819                if hasattr(self.data,"data"):
820                    self.compute_chisqr2D()
821                    return
822                else:
823                    self.compute_chisqr1D(smearer=smearer)
824                    return
825            except:
826                wx.PostEvent(self.parent.GrandParent, StatusEvent(status=\
827                            "Chisqr Error: %s"% sys.exc_value))
828                return 
829           
830   
831    def select_all_param(self,event): 
832        """
833             set to true or false all checkBox given the main checkbox value cb1
834        """           
835
836        self.param_toFit=[]
837        if  self.parameters !=[]:
838            if  self.cb1.GetValue():
839                for item in self.parameters:
840                    ## for data2D select all to fit
841                    if self.data.__class__.__name__=="Data2D":
842                        item[0].SetValue(True)
843                        self.param_toFit.append(item )
844                    else:
845                        ## for 1D all parameters except orientation
846                        if not item in self.orientation_params:
847                            item[0].SetValue(True)
848                            self.param_toFit.append(item )
849                if len(self.fittable_param)>0:
850                    for item in self.fittable_param:
851                        if self.data.__class__.__name__=="Data2D":
852                            item[0].SetValue(True)
853                            self.param_toFit.append(item )
854                        else:
855                            ## for 1D all parameters except orientation
856                            if not item in self.orientation_params_disp:
857                                item[0].SetValue(True)
858                                self.param_toFit.append(item )
859            else:
860                for item in self.parameters:
861                    item[0].SetValue(False)
862                for item in self.fittable_param:
863                    item[0].SetValue(False)
864                self.param_toFit=[]
865               
866        self.save_current_state() 
867       
868               
869               
870    def select_param(self,event):
871        """
872            Select TextCtrl  checked for fitting purpose and stores them
873            in  self.param_toFit=[] list
874        """
875        self.param_toFit=[]
876        for item in self.parameters:
877            #Select parameters to fit for list of primary parameters
878            if item[0].GetValue():
879                if not (item in self.param_toFit):
880                    self.param_toFit.append(item ) 
881            else:
882                #remove parameters from the fitting list
883                if item in self.param_toFit:
884                    self.param_toFit.remove(item)
885        #Select parameters to fit for list of fittable parameters with dispersion         
886        for item in self.fittable_param:
887            if item[0].GetValue():
888                if not (item in self.param_toFit):
889                    self.param_toFit.append(item) 
890            else:
891                #remove parameters from the fitting list
892                if item in self.param_toFit:
893                    self.param_toFit.remove(item)           
894        #Set the value of checkbox that selected every checkbox or not           
895        if len(self.parameters)+len(self.fittable_param) ==len(self.param_toFit):
896            self.cb1.SetValue(True)
897        else:
898            self.cb1.SetValue(False)
899        ## save current state of the page
900        self.save_current_state()
901       
902   
903       
904    def set_model_param_sizer(self, model):
905        """
906            Build the panel from the model content
907            @param model: the model selected in combo box for fitting purpose
908        """
909        self.sizer3.Clear(True)
910        self.parameters = []
911        self.param_toFit=[]
912        self.fittable_param=[]
913        self.fixed_param=[]
914        self.orientation_params=[]
915        self.orientation_params_disp=[]
916       
917        if model ==None:
918            self.sizer3.Layout()
919            self.SetScrollbars(20,20,200,100)
920            return
921        ## the panel is drawn using the current value of the fit engine
922        if self.engine_type==None and self.manager !=None:
923            self.engine_type= self.manager._return_engine_type()
924           
925        box_description= wx.StaticBox(self, -1,str("Model Parameters"))
926        boxsizer1 = wx.StaticBoxSizer(box_description, wx.VERTICAL)
927        sizer = wx.GridBagSizer(5,5)
928        ## save the current model
929        self.model = model
930           
931        keys = self.model.getParamList()
932        #list of dispersion paramaters
933        self.disp_list=self.model.getDispParamList()
934       
935        keys.sort()
936   
937        iy = 1
938        ix = 0
939        self.cb1 = wx.CheckBox(self, -1,"Select all", (10, 10))
940        wx.EVT_CHECKBOX(self, self.cb1.GetId(), self.select_all_param)
941        self.cb1.SetValue(False)
942       
943        sizer.Add(self.cb1,(iy, ix),(1,1),\
944                             wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 5)
945        ix +=1
946        self.text2_2 = wx.StaticText(self, -1, 'Values')
947        sizer.Add(self.text2_2,(iy, ix),(1,1),\
948                            wx.EXPAND|wx.ADJUST_MINSIZE, 0)
949        ix +=2 
950        self.text2_3 = wx.StaticText(self, -1, 'Errors')
951        sizer.Add(self.text2_3,(iy, ix),(1,1),\
952                            wx.EXPAND|wx.ADJUST_MINSIZE, 0) 
953        self.text2_3.Hide()
954        ix +=1 
955        self.text2_min = wx.StaticText(self, -1, 'Min')
956        sizer.Add(self.text2_min,(iy, ix),(1,1),\
957                            wx.EXPAND|wx.ADJUST_MINSIZE, 0) 
958        self.text2_min.Hide()
959        ix +=1 
960        self.text2_max = wx.StaticText(self, -1, 'Max')
961        sizer.Add(self.text2_max,(iy, ix),(1,1),\
962                            wx.EXPAND|wx.ADJUST_MINSIZE, 0) 
963        self.text2_max.Hide()
964        ix += 1
965        self.text2_4 = wx.StaticText(self, -1, '[Units]')
966        sizer.Add(self.text2_4,(iy, ix),(1,1),\
967                            wx.EXPAND|wx.ADJUST_MINSIZE, 0) 
968        self.text2_4.Hide()
969        if self.engine_type=="park":
970            self.text2_max.Show(True)
971            self.text2_min.Show(True)
972
973        for item in keys:
974            if not item in self.disp_list and not item in self.model.orientation_params:
975                iy += 1
976                ix = 0
977                ## add parameters name with checkbox for selecting to fit
978                cb = wx.CheckBox(self, -1, item )
979                cb.SetValue(False)
980                wx.EVT_CHECKBOX(self, cb.GetId(), self.select_param)
981                sizer.Add( cb,( iy, ix),(1,1),
982                             wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 5)
983               
984                ## add parameter value
985                ix += 1
986                value= self.model.getParam(item)
987                ctl1 = wx.TextCtrl(self, -1, size=(_BOX_WIDTH,20),
988                                    style=wx.TE_PROCESS_ENTER)
989               
990                ctl1.SetValue(format_number(value))
991                ctl1.Bind(wx.EVT_SET_FOCUS, self.onSetFocus)
992                ctl1.Bind(wx.EVT_KILL_FOCUS, self._onparamEnter)
993                ctl1.Bind(wx.EVT_TEXT_ENTER,self._onparamEnter)
994                sizer.Add(ctl1, (iy,ix),(1,1), wx.EXPAND)
995                ## text to show error sign
996                ix += 1
997                text2=wx.StaticText(self, -1, '+/-')
998                sizer.Add(text2,(iy, ix),(1,1),\
999                                wx.EXPAND|wx.ADJUST_MINSIZE, 0) 
1000                text2.Hide() 
1001                ## txtcrtl to add error from fit
1002                ix += 1
1003                ctl2 = wx.TextCtrl(self, -1, size=(_BOX_WIDTH,20), style=wx.TE_PROCESS_ENTER)
1004                sizer.Add(ctl2, (iy,ix),(1,1), wx.EXPAND|wx.ADJUST_MINSIZE, 0)
1005                ctl2.Hide()
1006               
1007                param_min, param_max= self.model.details[item][1:]
1008                ix += 1
1009                ctl3 = wx.TextCtrl(self, -1, size=(_BOX_WIDTH/2,20), style=wx.TE_PROCESS_ENTER)
1010                if param_min ==None:
1011                    ctl3.SetValue("")
1012                else:
1013                    ctl3.SetValue(str(param_min))
1014                ctl3.Bind(wx.EVT_SET_FOCUS, self.onSetFocus)
1015                ctl3.Bind(wx.EVT_KILL_FOCUS, self._onparamRangeEnter)
1016                ctl3.Bind(wx.EVT_TEXT_ENTER,self._onparamRangeEnter)
1017                sizer.Add(ctl3, (iy,ix),(1,1), wx.EXPAND|wx.ADJUST_MINSIZE, 0)
1018                ctl3.Hide()
1019       
1020                ix += 1
1021                ctl4 = wx.TextCtrl(self, -1, size=(_BOX_WIDTH/2,20), style=wx.TE_PROCESS_ENTER)
1022                ctl4.Bind(wx.EVT_SET_FOCUS, self.onSetFocus)
1023                ctl4.Bind(wx.EVT_KILL_FOCUS, self._onparamRangeEnter)
1024                ctl4.Bind(wx.EVT_TEXT_ENTER,self._onparamRangeEnter)
1025                sizer.Add(ctl4, (iy,ix),(1,1), wx.EXPAND|wx.ADJUST_MINSIZE, 0)
1026                if param_max==None:
1027                    ctl4.SetValue("")
1028                else:
1029                    ctl4.SetValue(str(param_max))
1030                ctl4.Hide()
1031               
1032                if self.engine_type=="park":
1033                    ctl3.Show(True)
1034                    ctl4.Show(True)
1035                ix +=1
1036                # Units
1037                try:
1038                    units = wx.StaticText(self, -1, self.model.details[item][0], style=wx.ALIGN_LEFT)
1039                except:
1040                    units = wx.StaticText(self, -1, "", style=wx.ALIGN_LEFT)
1041                sizer.Add(units, (iy,ix),(1,1),  wx.EXPAND|wx.ADJUST_MINSIZE, 0)
1042                   
1043                ##[cb state, name, value, "+/-", error of fit, min, max , units]
1044                self.parameters.append([cb,item, ctl1,
1045                                        text2,ctl2, ctl3, ctl4,None])
1046             
1047        iy+=1
1048        sizer.Add((10,10),(iy,ix),(1,1), wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15)
1049        for item in self.model.orientation_params:
1050            if not item in self.disp_list :
1051                iy += 1
1052                ix = 0
1053                ## add parameters name with checkbox for selecting to fit
1054                cb = wx.CheckBox(self, -1, item )
1055                cb.SetValue(False)
1056                wx.EVT_CHECKBOX(self, cb.GetId(), self.select_param)
1057                if self.data.__class__.__name__ =="Data2D":
1058                    cb.Enable()
1059                else:
1060                    cb.Disable()
1061                sizer.Add( cb,( iy, ix),(1,1),
1062                             wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 5)
1063
1064                ## add parameter value
1065                ix += 1
1066                value= self.model.getParam(item)
1067                ctl1 = wx.TextCtrl(self, -1, size=(_BOX_WIDTH,20),
1068                                    style=wx.TE_PROCESS_ENTER)
1069               
1070                ctl1.SetValue(format_number(value))
1071                if self.data.__class__.__name__ =="Data2D":
1072                    ctl1.Enable()
1073                else:
1074                    ctl1.Disable()
1075                ctl1.Bind(wx.EVT_SET_FOCUS, self.onSetFocus)
1076                ctl1.Bind(wx.EVT_KILL_FOCUS, self._onparamEnter)
1077                ctl1.Bind(wx.EVT_TEXT_ENTER,self._onparamEnter)
1078                sizer.Add(ctl1, (iy,ix),(1,1), wx.EXPAND)
1079                ## text to show error sign
1080                ix += 1
1081                text2=wx.StaticText(self, -1, '+/-')
1082                sizer.Add(text2,(iy, ix),(1,1),\
1083                                wx.EXPAND|wx.ADJUST_MINSIZE, 0) 
1084                text2.Hide() 
1085                ## txtcrtl to add error from fit
1086                ix += 1
1087                ctl2 = wx.TextCtrl(self, -1, size=(_BOX_WIDTH,20), style=wx.TE_PROCESS_ENTER)
1088                sizer.Add(ctl2, (iy,ix),(1,1), wx.EXPAND|wx.ADJUST_MINSIZE, 0)
1089                ctl2.Hide()
1090                if self.data.__class__.__name__ =="Data2D":
1091                    ctl1.Enable()
1092                else:
1093                    ctl1.Disable()
1094                param_min, param_max= self.model.details[item][1:]
1095                ix += 1
1096                ctl3 = wx.TextCtrl(self, -1, size=(_BOX_WIDTH/2,20), style=wx.TE_PROCESS_ENTER)
1097                if param_min ==None:
1098                    ctl3.SetValue("")
1099                else:
1100                    ctl3.SetValue(str(param_min))
1101                ctl3.Bind(wx.EVT_SET_FOCUS, self.onSetFocus)
1102                ctl3.Bind(wx.EVT_KILL_FOCUS, self._onparamRangeEnter)
1103                ctl3.Bind(wx.EVT_TEXT_ENTER,self._onparamRangeEnter)
1104                sizer.Add(ctl3, (iy,ix),(1,1), wx.EXPAND|wx.ADJUST_MINSIZE, 0)
1105                ctl3.Hide()
1106                if self.data.__class__.__name__ =="Data2D":
1107                    ctl3.Enable()
1108                else:
1109                    ctl3.Disable()
1110                ix += 1
1111                ctl4 = wx.TextCtrl(self, -1, size=(_BOX_WIDTH/2,20), style=wx.TE_PROCESS_ENTER)
1112                ctl4.Bind(wx.EVT_SET_FOCUS, self.onSetFocus)
1113                ctl4.Bind(wx.EVT_KILL_FOCUS, self._onparamRangeEnter)
1114                ctl4.Bind(wx.EVT_TEXT_ENTER,self._onparamRangeEnter)
1115                sizer.Add(ctl4, (iy,ix),(1,1), wx.EXPAND|wx.ADJUST_MINSIZE, 0)
1116                if param_max ==None:
1117                    ctl4.SetValue("")
1118                else:
1119                    ctl4.SetValue(str(param_max))
1120                ctl4.Hide()
1121                if self.data.__class__.__name__ =="Data2D":
1122                    ctl4.Enable()
1123                else:
1124                    ctl4.Disable()
1125                if self.engine_type=="park":
1126                    ctl3.Show(True)
1127                    ctl4.Show(True)
1128                ix +=1
1129                # Units
1130                try:
1131                    units = wx.StaticText(self, -1, self.model.details[item][0], style=wx.ALIGN_LEFT)
1132                except:
1133                    units = wx.StaticText(self, -1, "", style=wx.ALIGN_LEFT)
1134                if self.data.__class__.__name__ =="Data2D":
1135                    units.Enable()
1136                else:
1137                    units.Disable()
1138                sizer.Add(units, (iy,ix),(1,1),  wx.EXPAND|wx.ADJUST_MINSIZE, 0)
1139                   
1140               
1141                ##[cb state, name, value, "+/-", error of fit, min, max , units]
1142                self.parameters.append([cb,item, ctl1,
1143                                        text2,ctl2, ctl3, ctl4,None])
1144                self.orientation_params.append([cb,item, ctl1,
1145                                        text2,ctl2, ctl3, ctl4,None])
1146             
1147        iy+=1
1148        sizer.Add((10,10),(iy,ix),(1,1), wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15)
1149       
1150        #Display units text on panel
1151        for item in keys:   
1152            if self.model.details[item][0]!='':
1153                self.text2_4.Show()
1154                break
1155            else:
1156                self.text2_4.Hide()
1157   
1158        boxsizer1.Add(sizer)
1159       
1160        self.sizer3.Add(boxsizer1,0, wx.EXPAND | wx.ALL, 10)
1161        self.sizer3.Layout()
1162        self.SetScrollbars(20,20,200,100)
1163       
1164   
1165           
1166       
1167class HelpWindow(wx.Frame):
1168    def __init__(self, parent, id, title):
1169        wx.Frame.__init__(self, parent, id, title, size=(570, 400))
1170       
1171        from sans.models.CylinderModel import CylinderModel
1172        model = CylinderModel()
1173       
1174        from danse.common.plottools.plottables import Data1D
1175        data= Data1D(x=[1,2], y=[3,4], dy=[0.1, 0,1])
1176   
1177        from fitpanel import PageInfo
1178        myinfo = PageInfo(self,  model, data=data )
1179       
1180        ## add data
1181       
1182        from models import ModelList
1183        mylist= ModelList()
1184
1185        from sans.models.SphereModel import SphereModel
1186        from sans.models.SquareWellStructure import SquareWellStructure
1187        from sans.models.DebyeModel import DebyeModel
1188        from sans.models.LineModel import LineModel
1189        name= "shapes"
1190        list1= [SphereModel]
1191        mylist.set_list( name, list1)
1192       
1193        name= "Shape-independent"
1194        list1= [DebyeModel]
1195        mylist.set_list( name, list1)
1196       
1197        name= "Structure Factors"
1198        list1= [SquareWellStructure]
1199        mylist.set_list( name, list1)
1200       
1201        name= "Added models"
1202        list1= [LineModel]
1203        mylist.set_list( name, list1)
1204       
1205        myinfo.model_list_box = mylist.get_list()
1206       
1207        self.page = FitPage(self, myinfo) 
1208       
1209       
1210       
1211        self.Centre()
1212        self.Show(True)
1213
1214
1215   
1216if __name__=="__main__":
1217    app = wx.App()
1218    HelpWindow(None, -1, 'HelpWindow')
1219    app.MainLoop()
1220               
Note: See TracBrowser for help on using the repository browser.