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

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

save gaussian dispersity

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