source: sasview/sansview/perspectives/fitting/modelpage.py @ e5af88b

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

small bug fixed

  • Property mode set to 100644
File size: 31.1 KB
Line 
1import sys
2import wx
3import wx.lib
4import numpy
5import copy
6
7
8from sans.guicomm.events import StatusEvent   
9from sans.guiframe.utils import format_number
10(ModelEventbox, EVT_MODEL_BOX) = wx.lib.newevent.NewEvent()
11_BOX_WIDTH = 80
12
13
14
15
16class ModelPage(wx.ScrolledWindow):
17    """
18        FitPanel class contains fields allowing to display results when
19        fitting  a model and one data
20        @note: For Fit to be performed the user should check at least one parameter
21        on fit Panel window.
22 
23    """
24    ## Internal name for the AUI manager
25    window_name = "Fit page"
26    ## Title to appear on top of the window
27    window_caption = "Fit Page"
28   
29   
30    def __init__(self, parent,model,name, *args, **kwargs):
31        wx.ScrolledWindow.__init__(self, parent, *args, **kwargs)
32        """
33            Initialization of the Panel
34        """
35        # model on which the fit would be performed
36        self.model=model
37        #list of dispersion paramaters
38        self.disp_list=self.model.getDispParamList()
39        self.manager = None
40        self.parent  = parent
41        self.event_owner = None
42        # this panel does contain data .existing data allow a different drawing
43        #on set_model parameters
44        self.data=None
45        #panel interface
46        self.vbox  = wx.BoxSizer(wx.VERTICAL)
47        self.sizer10 = wx.GridBagSizer(5,5)
48        self.sizer9 = wx.GridBagSizer(5,5)
49        self.sizer8 = wx.GridBagSizer(5,5)
50        self.sizer7 = wx.GridBagSizer(5,5)
51        self.sizer6 = wx.GridBagSizer(5,5)
52        self.sizer5 = wx.GridBagSizer(5,5)
53        self.sizer4 = wx.GridBagSizer(5,5)
54       
55        #model selection
56        self.vbox.Add(wx.StaticLine(self, -1), 0, wx.EXPAND, 0)
57        self.vbox.Add(self.sizer4)
58        #model paramaters layer
59        self.vbox.Add(self.sizer5)
60        #polydispersion selected
61        self.vbox.Add(wx.StaticLine(self, -1), 0, wx.EXPAND, 0)
62        self.vbox.Add(self.sizer6)
63        #combox box for type of dispersion
64        self.vbox.Add(self.sizer7)
65        #dispersion parameters layer
66        self.vbox.Add(self.sizer8)
67        # plotting range
68        self.vbox.Add(self.sizer9)
69        #close layer
70        self.vbox.Add(wx.StaticLine(self, -1), 0, wx.EXPAND, 0)
71        self.vbox.Add(wx.StaticLine(self, -1), 0, wx.EXPAND, 0)
72        self.vbox.Add(self.sizer10)
73       
74     
75        #------------------ sizer 4  draw------------------------ 
76        # model on which the fit would be performed
77        self.model=model
78       
79        # define combox box
80        self.modelbox = wx.ComboBox(self, -1)
81         # preview selected model name
82        self.prevmodel_name=name
83        #print "model view prev_model",name
84        self.modelbox.SetValue(self.prevmodel_name)
85        #enable model 2D draw
86        self.enable2D= False
87        #filling sizer2
88        ix = 0
89        iy = 1
90        self.sizer4.Add(wx.StaticText(self,-1,'Model'),(iy,ix),(1,1)\
91                  , wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15)
92        ix += 1
93        self.sizer4.Add(self.modelbox,(iy,ix),(1,1),  wx.EXPAND|wx.ADJUST_MINSIZE, 0)
94        ix += 1
95        id = wx.NewId()
96        self.model_view =wx.Button(self,id,'View 2D')
97        self.model_view.Bind(wx.EVT_BUTTON, self.onModel2D,id=id)
98        self.model_view.SetToolTipString("View model in 2D")
99        self.sizer4.Add(self.model_view,(iy,ix),(1,1),\
100                   wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15)
101        self.model_view.SetFocus()
102        #----------sizer6-------------------------------------------------
103        self.disable_disp = wx.RadioButton(self, -1, 'No', (10, 10), style=wx.RB_GROUP)
104        self.enable_disp = wx.RadioButton(self, -1, 'Yes', (10, 30))
105        self.Bind(wx.EVT_RADIOBUTTON, self.Set_DipersParam, id=self.disable_disp.GetId())
106        self.Bind(wx.EVT_RADIOBUTTON, self.Set_DipersParam, id=self.enable_disp.GetId())
107        ix= 0
108        iy=1
109        self.sizer6.Add(wx.StaticText(self,-1,'Polydispersity: '),(iy,ix),(1,1)\
110                  , wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15)
111        ix += 1
112        self.sizer6.Add(self.enable_disp ,(iy,ix),(1,1),  wx.EXPAND|wx.ADJUST_MINSIZE, 0)
113        ix += 1
114        self.sizer6.Add(self.disable_disp ,(iy,ix),(1,1),  wx.EXPAND|wx.ADJUST_MINSIZE, 0)
115        ix =0
116        iy+=1
117        self.sizer6.Add((20,20),(iy,ix),(1,1),wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15) 
118
119       
120        #---------sizer 9 draw----------------------------------------
121       
122         ## Q range
123        self.qmin_x= 0.001
124        self.qmax_x= 0.1
125        self.num_points= 100
126       
127       
128        self.qmin    = wx.TextCtrl(self, -1,size=(_BOX_WIDTH,20))
129        self.qmin.SetValue(format_number(self.qmin_x))
130        self.qmin.SetToolTipString("Minimun value of Q in linear scale.")
131        self.qmin.Bind(wx.EVT_KILL_FOCUS, self._onparamEnter)
132        self.qmin.Bind(wx.EVT_TEXT_ENTER, self._onparamEnter)
133     
134        self.qmax    = wx.TextCtrl(self, -1,size=(_BOX_WIDTH,20))
135        self.qmax.SetValue(format_number(self.qmax_x))
136        self.qmax.SetToolTipString("Maximum value of Q in linear scale.")
137        self.qmax.Bind(wx.EVT_KILL_FOCUS, self._onparamEnter)
138        self.qmax.Bind(wx.EVT_TEXT_ENTER, self._onparamEnter)
139     
140
141        self.npts    = wx.TextCtrl(self, -1,size=(_BOX_WIDTH,20))
142        self.npts.SetValue(format_number(self.num_points))
143        self.npts.SetToolTipString("Number of point to plot.")
144        self.npts.Bind(wx.EVT_KILL_FOCUS, self._onparamEnter)
145        self.npts.Bind(wx.EVT_TEXT_ENTER, self._onparamEnter)
146       
147        ix = 0
148        iy = 1 
149        self.sizer9.Add(wx.StaticText(self, -1, 'Plotting Range'),(iy, ix),(1,1),\
150                            wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15)
151        ix += 1 
152        self.sizer9.Add(wx.StaticText(self, -1, 'Min'),(iy, ix),(1,1),\
153                            wx.EXPAND|wx.ADJUST_MINSIZE, 0)
154        ix += 1
155        self.sizer9.Add(wx.StaticText(self, -1, 'Max'),(iy, ix),(1,1),\
156                            wx.EXPAND|wx.ADJUST_MINSIZE, 0)
157        ix += 1
158        self.sizer9.Add(wx.StaticText(self, -1, 'Npts'),(iy, ix),(1,1),\
159                            wx.EXPAND|wx.ADJUST_MINSIZE, 0)
160        ix = 0
161        iy += 1
162        self.sizer9.Add(wx.StaticText(self, -1, 'Q range'),(iy, ix),(1,1),\
163                            wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15)
164        ix += 1
165        self.sizer9.Add(self.qmin,(iy, ix),(1,1), wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 0)
166        ix += 1
167        self.sizer9.Add(self.qmax,(iy,ix),(1,1), wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 0)
168        ix += 1
169        self.sizer9.Add(self.npts,(iy,ix),(1,1), wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 0)
170       
171        ix =0
172        iy+=1 
173        self.sizer9.Add((20,20),(iy,ix),(1,1), wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 0)
174        #----------sizer 10 draw------------------------------------------------------
175        id = wx.NewId()
176        self.btClose =wx.Button(self,id,'Close')
177        self.btClose.Bind(wx.EVT_BUTTON, self.onClose,id=id)
178        self.btClose.SetToolTipString("Close page.")
179       
180        ix= 3
181        iy= 1
182        self.sizer10.Add((20,20),(iy,ix),(1,1),wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15)
183        ix +=1
184        self.sizer10.Add( self.btClose,(iy,ix),(1,1), wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 0)
185        ix =0
186        iy+=1
187        self.sizer10.Add((20,20),(iy,ix),(1,1),wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15)
188       
189        # contains link between  model ,all its parameters, and panel organization
190        self.parameters=[]
191        self.fixed_param=[]
192        self.fittable_param=[]
193        #contains link between a model and selected parameters to fit
194        self.param_toFit=[]
195       
196        #dictionary of model name and model class
197        self.model_list_box={}
198        #Draw initial panel
199        if self.model!=None:
200            self.set_panel(self.model)
201       
202       
203       
204        self.vbox.Layout()
205        self.vbox.Fit(self) 
206        self.SetSizer(self.vbox)
207        self.SetScrollbars(20,20,55,40)
208       
209        self.Centre()
210        self.Layout()
211        self.parent.GetSizer().Layout()
212       
213    def set_owner(self,owner):
214        """
215            set owner of fitpage
216            @param owner: the class responsible of plotting
217        """
218        self.event_owner=owner   
219   
220 
221    def set_manager(self, manager):
222        """
223             set panel manager
224             @param manager: instance of plugin fitting
225        """
226        self.manager = manager 
227       
228    def populate_box(self, dict):
229        """
230            Populate each combox box of each page
231            @param page: the page to populate
232        """
233        id=0
234        self.model_list_box=dict
235        list_name=[]
236        for item in  self.model_list_box.itervalues():
237            name = item.__name__
238            if hasattr(item, "name"):
239                name = item.name
240            list_name.append(name)
241        list_name.sort() 
242         
243        for name in list_name:
244            self.modelbox.Insert(name,int(id))
245            id+=1
246        wx.EVT_COMBOBOX(self.modelbox,-1, self._on_select_model) 
247        return 0
248   
249
250    def Set_DipersParam(self, event):
251        if self.enable_disp.GetValue():
252            if len(self.disp_list)==0:
253                ix=0
254                iy=1
255                self.fittable_param=[]
256                self.fixed_param=[]
257                self.sizer8.Clear(True)
258                model_disp = wx.StaticText(self, -1, 'No PolyDispersity for this model')
259                self.sizer7.Add(model_disp,( iy, ix),(1,1),  wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15)
260                self.vbox.Layout()
261                self.SetScrollbars(20,20,55,40)
262                self.Layout()
263                self.parent.GetSizer().Layout()
264                return 
265            else:
266                if self.data !=None: # allow to recognize data panel from model panel
267                    self.cb1.SetValue(False)
268                    self.select_all_param_helper()
269               
270                self.populate_disp_box()
271                self.set_panel_dispers(self.disp_list)
272               
273        else:
274            if self.data !=None:
275                if self.cb1.GetValue():
276                    self.select_all_param_helper()
277            self.fittable_param=[]       
278            self.fixed_param=[]
279            self.sizer7.Clear(True)
280            self.sizer8.Clear(True)
281            self.vbox.Layout()
282            self.SetScrollbars(20,20,55,40)
283            self.Layout()
284            self.parent.GetSizer().Layout()
285           
286    def populate_disp_box(self):
287        self.sizer7.Clear(True)
288        if len(self.disp_list)>0:
289            ix=0
290            iy=1
291            model_disp = wx.StaticText(self, -1, 'Model Disp')
292            self.sizer7.Add(model_disp,( iy, ix),(1,1),  wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15)
293            ix += 1 
294            # set up the combox box
295            id = 0
296            self.disp_box = wx.ComboBox(self, -1)
297            self.disp_box.SetValue("Gaussian")
298            self.disp_box.Insert("Gaussian",int(id))
299            wx.EVT_COMBOBOX(self.disp_box,-1, self._on_select_Disp) 
300            self.sizer7.Add(self.disp_box,( iy, ix),(1,1), wx.EXPAND|wx.ADJUST_MINSIZE, 0)
301            self.vbox.Layout()
302            self.SetScrollbars(20,20,55,40)
303            self.Layout()
304            self.parent.GetSizer().Layout() 
305           
306           
307    def set_range(self, qmin_x, qmax_x, npts):
308        """
309            Set the range for the plotted models
310            @param qmin: minimum Q
311            @param qmax: maximum Q
312            @param npts: number of Q bins
313        """
314        # Set the data members
315        self.qmin_x = qmin_x
316        self.qmax_x = qmax_x
317        self.num_points = npts
318       
319        # Set the controls
320        self.qmin.SetValue(format_number(self.qmin_x))
321        self.qmax.SetValue(format_number(self.qmax_x))
322        self.npts.SetValue(format_number(self.num_points))
323    def checkFitRange(self):
324        """
325            Check the validity of fitting range
326            @note: qmin should always be less than qmax or else each control box
327            background is colored in pink.
328        """
329       
330        flag = True
331        valueMin = self.qmin.GetValue()
332        valueMax = self.qmax.GetValue()
333        # Check for possible values entered
334        #print "fitpage: checkfitrange:",valueMin,valueMax
335        try:
336            if (float(valueMax)> float(valueMin)):
337                self.qmax.SetBackgroundColour(wx.WHITE)
338                self.qmin.SetBackgroundColour(wx.WHITE)
339            else:
340                flag = False
341                self.qmin.SetBackgroundColour("pink")
342                self.qmax.SetBackgroundColour("pink")     
343        except:
344            flag = False
345            self.qmin.SetBackgroundColour("pink")
346            self.qmax.SetBackgroundColour("pink")
347           
348        self.qmin.Refresh()
349        self.qmax.Refresh()
350        return flag
351   
352
353       
354    def onClose(self,event):
355        """ close the page associated with this panel"""
356        self.parent.onClose()
357       
358 
359       
360    def onModel2D(self, event):
361        """
362         call manager to plot model in 2D
363        """
364        # If the 2D display is not currently enabled, plot the model in 2D
365        # and set the enable2D flag.
366        if self.enable2D==False:
367            self.enable2D=True
368            self._draw_model()
369            self.model_view.Disable()
370           
371   
372    def select_model(self, model, name):
373        """
374            Select a new model
375            @param model: model object
376        """
377        self.model= model
378        print "select_model", model.__class__
379        self.set_panel(model)
380        self._draw_model(name)
381       
382        # Select the model from the combo box
383        items = self.modelbox.GetItems()
384        for i in range(len(items)):
385            print "model name",items[i],model.name, model.__class__.__name__
386            #if items[i]==model.__class__.__name__:
387            if items[i]==name:
388                self.modelbox.SetSelection(i)
389               
390               
391    def _on_select_Disp(self,event):
392        """
393             allow selecting different dispersion
394             self.disp_list should change type later .now only gaussian
395        """
396        type = "Gaussian" 
397        if type ==event.GetString():
398            self.set_panel_dispers( self.disp_list,type )
399               
400    def _on_select_model(self,event):
401        """
402            react when a model is selected from page's combo box
403            post an event to its owner to draw an appropriate theory
404        """
405        self.disable_disp.SetValue(True)
406        self.sizer8.Clear(True)
407        self.sizer7.Clear(True)       
408        self.vbox.Layout()
409        self.SetScrollbars(20,20,55,40)
410        self.Layout()
411        self.parent.GetSizer().Layout()
412        for item in self.model_list_box.itervalues():
413            name = item.__name__
414            if hasattr(item, "name"):
415                name = item.name
416            if name ==event.GetString():
417                model=item()
418                self.model= model
419                self.set_panel(model)
420                self.name= name
421                #self.manager.draw_model(model, name)
422                self.enable2D=False
423                self.model_view.Enable()
424                self._draw_model(name)
425           
426           
427    def get_model_box(self): 
428        """ return reference to combox box self.model"""
429        return self.modelbox
430
431   
432    def get_param_list(self):
433        """
434            @return self.param_toFit: list containing  references to TextCtrl
435            checked.Theses TextCtrl will allow reference to parameters to fit.
436            @raise: if return an empty list of parameter fit will nnote work
437            properly so raise ValueError,"missing parameter to fit"
438        """
439        if self.param_toFit !=[]:
440            return self.param_toFit
441        else:
442            raise ValueError,"missing parameter to fit"
443       
444       
445    def set_panel(self,model):
446        """
447            Build the panel from the model content
448            @param model: the model selected in combo box for fitting purpose
449        """
450        print "set_panel", model
451       
452        self.sizer5.Clear(True)
453        self.parameters = []
454        self.param_toFit=[]
455        self.fixed_param=[]
456        self.model = model
457        keys = self.model.getParamList()
458        #list of dispersion paramaters
459        self.disp_list=self.model.getDispParamList()
460       
461        keys.sort()
462        ik=0
463        im=1
464       
465        iy = 1
466        ix = 0
467        self.cb1 = wx.CheckBox(self, -1,"Select all", (10, 10))
468        if self.data!=None:
469            wx.EVT_CHECKBOX(self, self.cb1.GetId(), self.select_all_param)
470            self.cb1.SetValue(False)
471        else:
472            self.cb1.Disable()
473            self.cb1.Hide()
474       
475        self.sizer5.Add(self.cb1,(iy, ix),(1,1),\
476                          wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15)
477        ix +=1
478        self.text2_2 = wx.StaticText(self, -1, 'Values')
479        self.sizer5.Add(self.text2_2,(iy, ix),(1,1),\
480                            wx.EXPAND|wx.ADJUST_MINSIZE, 0) 
481        ix +=2
482        self.text2_3 = wx.StaticText(self, -1, 'Errors')
483        self.sizer5.Add(self.text2_3,(iy, ix),(1,1),\
484                            wx.EXPAND|wx.ADJUST_MINSIZE, 0)
485        self.text2_3.Hide() 
486        ix +=1
487        self.text2_4 = wx.StaticText(self, -1, 'Units')
488        self.sizer5.Add(self.text2_4,(iy, ix),(1,1),\
489                            wx.EXPAND|wx.ADJUST_MINSIZE, 0) 
490        self.text2_4.Hide()
491        disp_list=self.model.getDispParamList()
492        for item in keys:
493            if not item in disp_list:
494                iy += 1
495                ix = 0
496   
497                cb = wx.CheckBox(self, -1, item, (10, 10))
498                if self.data!=None:
499                    cb.SetValue(False)
500                    wx.EVT_CHECKBOX(self, cb.GetId(), self.select_param)
501                else:
502                    cb.Disable()
503                self.sizer5.Add( cb,( iy, ix),(1,1),  wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15)
504               
505                ix += 1
506                value= self.model.getParam(item)
507                ctl1 = wx.TextCtrl(self, -1, size=(_BOX_WIDTH,20), style=wx.TE_PROCESS_ENTER)
508                ctl1.SetValue(str (format_number(value)))
509                ctl1.Bind(wx.EVT_KILL_FOCUS, self._onparamEnter)
510                ctl1.Bind(wx.EVT_TEXT_ENTER,self._onparamEnter)
511                self.sizer5.Add(ctl1, (iy,ix),(1,1), wx.EXPAND)
512               
513                ix += 1
514                text2=wx.StaticText(self, -1, '+/-')
515                self.sizer5.Add(text2,(iy, ix),(1,1),\
516                                wx.EXPAND|wx.ADJUST_MINSIZE, 0) 
517                text2.Hide() 
518                ix += 1
519                ctl2 = wx.TextCtrl(self, -1, size=(_BOX_WIDTH,20), style=wx.TE_PROCESS_ENTER)
520                self.sizer5.Add(ctl2, (iy,ix),(1,1), wx.EXPAND|wx.ADJUST_MINSIZE, 0)
521                ctl2.Hide()
522                ix +=1
523                # Units
524                try:
525                    units = wx.StaticText(self, -1, self.model.details[item][0], style=wx.ALIGN_LEFT)
526                except:
527                    units = wx.StaticText(self, -1, "", style=wx.ALIGN_LEFT)
528                self.sizer5.Add(units, (iy,ix),(1,1),  wx.EXPAND|wx.ADJUST_MINSIZE, 0)
529           
530            self.parameters.append([cb,ctl1,text2,ctl2])
531               
532        iy+=1
533        self.sizer5.Add((20,20),(iy,ix),(1,1), wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15)
534       
535        #Display units text on panel
536        for item in keys:   
537            if self.model.details[item][0]!='':
538                self.text2_4.Show()
539                break
540            else:
541                self.text2_4.Hide()
542        #Disable or enable fit button
543        """
544        if not (len(self.param_toFit ) >0):
545            self.qmin.Disable()
546            self.qmax.Disable()
547        else:
548            self.qmin.Enable()
549            self.qmax.Enable()
550        """ 
551        self.vbox.Layout()
552        self.SetScrollbars(20,20,55,40)
553        self.Layout()
554        self.parent.GetSizer().Layout()
555       
556       
557    def  set_panel_dispers(self, disp_list, type="Gaussian" ):
558       
559        self.fittable_param=[]
560        self.fixed_param=[]
561               
562        ix=0
563        iy=1
564        ### this will become a separate method
565        if type== "Gaussian" :
566            print "went here"
567            self.sizer8.Clear(True)
568            disp = wx.StaticText(self, -1, 'Dispersion')
569            self.sizer8.Add(disp,( iy, ix),(1,1),  wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15)
570            ix += 1 
571            values = wx.StaticText(self, -1, 'Values')
572            self.sizer8.Add(values,( iy, ix),(1,1), wx.EXPAND|wx.ADJUST_MINSIZE, 0)
573            ix +=2
574            self.text2_3 = wx.StaticText(self, -1, 'Errors')
575            self.sizer8.Add(self.text2_3,(iy, ix),(1,1),\
576                            wx.EXPAND|wx.ADJUST_MINSIZE, 0)
577            self.text2_3.Hide() 
578           
579            ix += 1 
580            npts = wx.StaticText(self, -1, 'Npts')
581            self.sizer8.Add(npts,( iy, ix),(1,1), wx.EXPAND|wx.ADJUST_MINSIZE, 0)
582            ix += 1 
583            nsigmas = wx.StaticText(self, -1, 'Nsigmas')
584            self.sizer8.Add(nsigmas,( iy, ix),(1,1), wx.EXPAND|wx.ADJUST_MINSIZE, 0)
585           
586            disp_list.sort()
587            #print disp_list,self.model.fixed,self.model.dispersion
588            for item in self.model.dispersion.keys():
589                name1=item+".width"
590                name2=item+".npts"
591                name3=item+".nsigmas"
592                iy += 1
593                for p in self.model.dispersion[item].keys():
594                    #print "name 1 2 3", name1, name2, name3
595                    if p=="width":
596                        ix = 0
597                        cb = wx.CheckBox(self, -1, name1, (10, 10))
598                        if self.data !=None:
599                            cb.SetValue(False)
600                            wx.EVT_CHECKBOX(self, cb.GetId(), self.select_param)
601                        else:
602                            cb.Disable()
603                        self.sizer8.Add( cb,( iy, ix),(1,1),  wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15)
604                        ix = 1
605                        value= self.model.getParam(name1)
606                        ctl1 = wx.TextCtrl(self, -1, size=(_BOX_WIDTH,20), style=wx.TE_PROCESS_ENTER)
607                        ctl1.SetValue(str (format_number(value)))
608                        ctl1.Bind(wx.EVT_KILL_FOCUS, self._onparamEnter)
609                        ctl1.Bind(wx.EVT_TEXT_ENTER,self._onparamEnter)
610                        self.sizer8.Add(ctl1, (iy,ix),(1,1), wx.EXPAND)
611                       
612                        ix = 2
613                        text2=wx.StaticText(self, -1, '+/-')
614                        self.sizer8.Add(text2,(iy, ix),(1,1),\
615                                        wx.EXPAND|wx.ADJUST_MINSIZE, 0) 
616                        text2.Hide() 
617                        ix = 3
618                        ctl2 = wx.TextCtrl(self, -1, size=(_BOX_WIDTH,20), style=wx.TE_PROCESS_ENTER)
619                        self.sizer8.Add(ctl2, (iy,ix),(1,1), wx.EXPAND|wx.ADJUST_MINSIZE, 0)
620                        ctl2.Hide()
621                        self.fittable_param.append([cb,ctl1,text2,ctl2])
622                       
623                       
624                    elif p=="npts":
625                            ix =4 
626                            value= self.model.getParam(name2)
627                            Tctl = wx.TextCtrl(self, -1, size=(_BOX_WIDTH/2,20), style=wx.TE_PROCESS_ENTER)
628                            Tctl.SetValue(str (format_number(value)))
629                            Tctl.Bind(wx.EVT_KILL_FOCUS, self._onparamEnter)
630                            Tctl.Bind(wx.EVT_TEXT_ENTER,self._onparamEnter)
631                            self.sizer8.Add(Tctl, (iy,ix),(1,1), wx.EXPAND|wx.ADJUST_MINSIZE, 0)
632                            self.fixed_param.append([name2, Tctl])
633                    elif p=="nsigmas":
634                            ix =5 
635                            value= self.model.getParam(name3)
636                            Tctl = wx.TextCtrl(self, -1, size=(_BOX_WIDTH/2,20), style=wx.TE_PROCESS_ENTER)
637                            Tctl.SetValue(str (format_number(value)))
638                            Tctl.Bind(wx.EVT_KILL_FOCUS, self._onparamEnter)
639                            Tctl.Bind(wx.EVT_TEXT_ENTER,self._onparamEnter)
640                            self.sizer8.Add(Tctl, (iy,ix),(1,1), wx.EXPAND|wx.ADJUST_MINSIZE, 0)
641                            self.fixed_param.append([name3, Tctl])
642                   
643            ix =0
644            iy +=1 
645            self.sizer8.Add((20,20),(iy,ix),(1,1), wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15)       
646            self.vbox.Layout()
647            self.SetScrollbars(20,20,55,40)
648            self.Layout()
649            self.parent.GetSizer().Layout() 
650         
651           
652       
653    def _onparamEnter(self,event):
654        """
655            when enter value on panel redraw model according to changed
656        """
657        self.set_model_parameter()
658       
659    def set_model_parameter(self):
660        if len(self.parameters) !=0 and self.model !=None:
661            # Flag to register when a parameter has changed.
662            is_modified = False
663            for item in self.fittable_param:
664                try:
665                     name=str(item[0].GetLabelText())
666                     value= float(item[1].GetValue())
667                     #print "model para", name,value
668                     # If the value of the parameter has changed,
669                     # update the model and set the is_modified flag
670                     if value != self.model.getParam(name):
671                         #print "went hereee"
672                         self.model.setParam(name,value)
673                         is_modified = True
674                         
675                except:
676                    raise
677                    wx.PostEvent(self.parent.parent, StatusEvent(status=\
678                            "Model Drawing  Error:wrong value entered : %s"% sys.exc_value))
679               
680            for item in self.fixed_param:
681                try:
682                     name=str(item[0])
683                     value= float(item[1].GetValue())
684                     #print "model para", name,value,self.model.getParam(name)
685                     # If the value of the parameter has changed,
686                     # update the model and set the is_modified flag
687                     if value != self.model.getParam(name):
688                         #print "went hereee"
689                         self.model.setParam(name,value)
690                         is_modified = True
691                         
692                except:
693                    raise
694                    wx.PostEvent(self.parent.parent, StatusEvent(status=\
695                            "Model Drawing  Error:wrong value entered : %s"% sys.exc_value))
696               
697            for item in self.parameters:
698                try:
699                     name=str(item[0].GetLabelText())
700                     value= float(item[1].GetValue())
701                     #print " fittable model para", name,value
702                     # If the value of the parameter has changed,
703                     # update the model and set the is_modified flag
704                     if value != self.model.getParam(name):
705                         #print "went here", name,value
706                         self.model.setParam(name,value)
707                         is_modified = True
708                except:
709                     wx.PostEvent(self.parent.parent, StatusEvent(status=\
710                            "Model Drawing  Error:wrong value entered : %s"% sys.exc_value))
711           
712            # Here we should check whether the boundaries have been modified.
713            # If qmin and qmax have been modified, update qmin and qmax and
714            # set the is_modified flag to True
715            if float(self.qmin.GetValue()) != self.qmin_x:
716                self.qmin_x = float(self.qmin.GetValue())
717                is_modified = True
718            if float(self.qmax.GetValue()) != self.qmax_x:
719                self.qmax_x = float(self.qmax.GetValue())
720                is_modified = True
721           
722            if float(self.npts.GetValue()) !=  self.num_points:
723                self.num_points = float(self.npts.GetValue())
724                is_modified = True
725         
726            if is_modified:
727                self._draw_model()           
728           
729    def _draw_model(self, name=None):
730        """
731            Method to draw or refresh a plotted model.
732            The method will use the data member from the model page
733            to build a call to the fitting perspective manager.
734           
735            [Note to coder: This way future changes will be done in only one place.]
736        """
737        #print "_draw_model",self.model
738        if name==None:
739            name= self.model.name
740       
741        self.manager.draw_model(self.model, name, data=self.data,
742                                qmin=self.qmin_x, qmax=self.qmax_x,
743                                qstep= self.num_points,
744                                enable2D=self.enable2D)
745        """
746            self.manager.draw_model(self.model, self.model.name,
747                                    qmin=self.qmin, qmax=self.qmax,
748                                    qstep= self.num_points,
749                                    enable2D=self.enable2D)
750        """
751    def select_param(self,event):
752        pass
753    def select_all_param(self,event): 
754        pass
755    def select_all_param_helper(self):
756        """
757             Allows selecting or delecting button
758        """
759        self.param_toFit=[]
760        if  self.parameters !=[]:
761            if  self.cb1.GetValue()==True:
762                for item in self.parameters:
763                    item[0].SetValue(True)
764                    list= [item[0],item[1],item[2],item[3]]
765                    self.param_toFit.append(list )
766                if len(self.fittable_param)>0:
767                    for item in self.fittable_param:
768                        item[0].SetValue(True)
769                        list= [item[0],item[1],item[2],item[3]]
770                        self.param_toFit.append(list )
771               
772                if not (len(self.param_toFit ) >0):
773                    self.qmin.Disable()
774                    self.qmax.Disable()
775                else:
776                    self.qmin.Enable()
777                    self.qmax.Enable()
778            else:
779                for item in self.parameters:
780                    item[0].SetValue(False)
781                for item in self.fittable_param:
782                    item[0].SetValue(False)
783                self.param_toFit=[]
784             
785                self.qmin.Disable()
786                self.qmax.Disable()
787       
Note: See TracBrowser for help on using the repository browser.