source: sasview/sansview/perspectives/fitting/modelpage.py @ 7d680c7

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 7d680c7 was 7d680c7, checked in by Jae Cho <jhjcho@…>, 15 years ago

remove errors

  • Property mode set to 100644
File size: 42.9 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    name=""
29    def __init__(self, parent,model,name, *args, **kwargs):
30        wx.ScrolledWindow.__init__(self, parent, *args, **kwargs)
31        """
32            Initialization of the Panel
33        """
34        # model on which the fit would be performed
35        self.model=model
36        self.back_up_model= model.clone()
37        #list of dispersion paramaters
38        self.disp_list=[]
39        try:
40            self.disp_list=self.model.getDispParamList()
41        except:
42            pass 
43        self.manager = None
44        self.parent  = parent
45        self.event_owner = None
46        # this panel does contain data .existing data allow a different drawing
47        #on set_model parameters
48        self.data=None
49        #panel interface
50        self.vbox  = wx.BoxSizer(wx.VERTICAL)
51        self.sizer11 = wx.BoxSizer(wx.HORIZONTAL)
52        #self.sizer10 = wx.GridBagSizer(5,5)
53        self.sizer9 = wx.GridBagSizer(5,5)
54        self.sizer8 = wx.GridBagSizer(5,5)
55        self.sizer7 = wx.GridBagSizer(5,5)
56        self.sizer6 = wx.GridBagSizer(5,5)
57        self.sizer5 = wx.GridBagSizer(5,5)
58        self.sizer4 = wx.GridBagSizer(5,5)
59       
60        #model selection
61        self.vbox.Add(wx.StaticLine(self, -1), 0, wx.EXPAND, 0)
62        self.vbox.Add(self.sizer4)
63        #model description
64        self.vbox.Add(self.sizer11)
65        #model paramaters layer
66        self.vbox.Add(self.sizer5)
67        #polydispersion selected
68        self.vbox.Add(wx.StaticLine(self, -1), 0, wx.EXPAND, 0)
69        self.vbox.Add(self.sizer6)
70        #combox box for type of dispersion
71        self.vbox.Add(self.sizer7)
72        #dispersion parameters layer
73        self.vbox.Add(self.sizer8)
74        # plotting range
75        self.vbox.Add(self.sizer9)
76        #close layer
77        #self.vbox.Add(wx.StaticLine(self, -1), 0, wx.EXPAND, 0)
78        #self.vbox.Add(self.sizer10)
79       
80     
81        #------------------ sizer 4  draw------------------------ 
82       
83       
84        # define combox box
85        self.modelbox = wx.ComboBox(self, -1)
86         # preview selected model name
87        self.prevmodel_name=name
88        #print "model view prev_model",name
89        self.modelbox.SetValue(self.prevmodel_name)
90        #enable model 2D draw
91        self.enable2D= False
92        #filling sizer2
93        ix = 0
94        iy = 1
95        self.sizer4.Add(wx.StaticText(self,-1,'Model'),(iy,ix),(1,1)\
96                  , wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15)
97        ix += 1
98        self.sizer4.Add(self.modelbox,(iy,ix),(1,1),  wx.EXPAND|wx.ADJUST_MINSIZE, 0)
99        ix += 1
100        id = wx.NewId()
101        self.model_view =wx.Button(self,id,'View 2D')
102        self.model_view.Bind(wx.EVT_BUTTON, self.onModel2D,id=id)
103        self.model_view.SetToolTipString("View model in 2D")
104       
105        self.sizer4.Add(self.model_view,(iy,ix),(1,1),\
106                   wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15)
107       
108        self.model_view.Enable()
109        self.model_view.SetFocus()
110       
111        ix = 0
112        iy += 1
113        self.sizer4.Add((20,20),(iy,ix),(1,1),wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15)
114
115        #----------sizer6-------------------------------------------------
116        self.disable_disp = wx.RadioButton(self, -1, 'No', (10, 10), style=wx.RB_GROUP)
117        self.enable_disp = wx.RadioButton(self, -1, 'Yes', (10, 30))
118        self.Bind(wx.EVT_RADIOBUTTON, self.Set_DipersParam, id=self.disable_disp.GetId())
119        self.Bind(wx.EVT_RADIOBUTTON, self.Set_DipersParam, id=self.enable_disp.GetId())
120        ix= 0
121        iy=1
122        self.sizer6.Add(wx.StaticText(self,-1,'Polydispersity: '),(iy,ix),(1,1)\
123                  , wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15)
124        ix += 1
125        self.sizer6.Add(self.enable_disp ,(iy,ix),(1,1),  wx.EXPAND|wx.ADJUST_MINSIZE, 0)
126        ix += 1
127        self.sizer6.Add(self.disable_disp ,(iy,ix),(1,1),  wx.EXPAND|wx.ADJUST_MINSIZE, 0)
128        ix =0
129        iy+=1
130        self.sizer6.Add((20,20),(iy,ix),(1,1),wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15) 
131
132       
133        #---------sizer 9 draw----------------------------------------
134       
135         ## Q range
136        self.qmin_x= 0.001
137        self.qmax_x= 0.1
138        self.num_points= 100
139       
140       
141        self.qmin    = wx.TextCtrl(self, -1,size=(_BOX_WIDTH,20))
142        self.qmin.SetValue(format_number(self.qmin_x))
143        self.qmin.SetToolTipString("Minimun value of Q in linear scale.")
144        self.qmin.Bind(wx.EVT_KILL_FOCUS, self._onparamEnter)
145        self.qmin.Bind(wx.EVT_TEXT_ENTER, self._onparamEnter)
146     
147        self.qmax    = wx.TextCtrl(self, -1,size=(_BOX_WIDTH,20))
148        self.qmax.SetValue(format_number(self.qmax_x))
149        self.qmax.SetToolTipString("Maximum value of Q in linear scale.")
150        self.qmax.Bind(wx.EVT_KILL_FOCUS, self._onparamEnter)
151        self.qmax.Bind(wx.EVT_TEXT_ENTER, self._onparamEnter)
152     
153
154        self.npts    = wx.TextCtrl(self, -1,size=(_BOX_WIDTH,20))
155        self.npts.SetValue(format_number(self.num_points))
156        self.npts.SetToolTipString("Number of point to plot.")
157        self.npts.Bind(wx.EVT_KILL_FOCUS, self._onparamEnter)
158        self.npts.Bind(wx.EVT_TEXT_ENTER, self._onparamEnter)
159       
160        ix = 0
161        iy = 1 
162        self.sizer9.Add(wx.StaticText(self, -1, 'Plotting Range'),(iy, ix),(1,1),\
163                            wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15)
164        ix += 1 
165        self.sizer9.Add(wx.StaticText(self, -1, 'Min'),(iy, ix),(1,1),\
166                            wx.EXPAND|wx.ADJUST_MINSIZE, 0)
167        ix += 1
168        self.sizer9.Add(wx.StaticText(self, -1, 'Max'),(iy, ix),(1,1),\
169                            wx.EXPAND|wx.ADJUST_MINSIZE, 0)
170        ix += 1
171        self.sizer9.Add(wx.StaticText(self, -1, 'Npts'),(iy, ix),(1,1),\
172                            wx.EXPAND|wx.ADJUST_MINSIZE, 0)
173        ix = 0
174        iy += 1
175        self.sizer9.Add(wx.StaticText(self, -1, 'Q range'),(iy, ix),(1,1),\
176                            wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15)
177        ix += 1
178        self.sizer9.Add(self.qmin,(iy, ix),(1,1), wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 0)
179        ix += 1
180        self.sizer9.Add(self.qmax,(iy,ix),(1,1), wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 0)
181        ix += 1
182        self.sizer9.Add(self.npts,(iy,ix),(1,1), wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 0)
183       
184        ix =0
185        iy+=1 
186        self.sizer9.Add((20,20),(iy,ix),(1,1), wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 0)
187        #----------sizer 10 draw------------------------------------------------------
188        """
189        id = wx.NewId()
190        self.btClose =wx.Button(self,id,'Close')
191        self.btClose.Bind(wx.EVT_BUTTON, self.onClose,id=id)
192        self.btClose.SetToolTipString("Close page.")
193       
194        ix= 3
195        iy= 1
196        self.sizer10.Add((20,20),(iy,ix),(1,1),wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15)
197        ix +=1
198        self.sizer10.Add( self.btClose,(iy,ix),(1,1), wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 0)
199        ix =0
200        iy+=1
201        self.sizer10.Add((20,20),(iy,ix),(1,1),wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15)
202        """
203        # contains link between  model ,all its parameters, and panel organization
204        self.parameters=[]
205        self.fixed_param=[]
206        self.fittable_param=[]
207        self.polydisp= {}
208        #contains link between a model and selected parameters to fit
209        self.param_toFit=[]
210       
211        #dictionary of model name and model class
212        self.model_list_box={}
213        #Draw initial panel
214         #-----sizer 11--------------------model description------
215        if self.model!=None:
216            self.set_panel(self.model)
217        self.theta_cb=None
218       
219       
220        self.vbox.Layout()
221        self.vbox.Fit(self) 
222        self.SetSizer(self.vbox)
223        self.SetScrollbars(20,20,55,40)
224       
225        self.Centre()
226        self.Layout()
227        self.parent.GetSizer().Layout()
228    def set_model_description(self, model):
229       
230        if model !=None and str(model.description)!=""and self.data==None:
231            self.sizer11.Clear(True)
232            self.box_description= wx.StaticBox(self, -1, 'Model Description')
233            boxsizer1 = wx.StaticBoxSizer(self.box_description, wx.VERTICAL)
234            boxsizer1.SetMinSize((320,20))
235            self.description = wx.StaticText(self,-1,str(model.description))
236            boxsizer1.Add(self.description, 0, wx.EXPAND) 
237            self.sizer11.Add(boxsizer1,1, wx.EXPAND | wx.ALL, 2)
238     
239       
240    def set_owner(self,owner):
241        """
242            set owner of fitpage
243            @param owner: the class responsible of plotting
244        """
245        self.event_owner=owner   
246   
247 
248    def set_manager(self, manager):
249        """
250             set panel manager
251             @param manager: instance of plugin fitting
252        """
253        self.manager = manager 
254       
255    def populate_box(self, dict):
256        """
257            Populate each combox box of each page
258            @param page: the page to populate
259        """
260        id=0
261        self.model_list_box=dict
262        list_name=[]
263        for item in  self.model_list_box.itervalues():
264            name = item.__name__
265            if hasattr(item, "name"):
266                name = item.name
267            list_name.append(name)
268        list_name.sort() 
269         
270        for name in list_name:
271            self.modelbox.Insert(name,int(id))
272            id+=1
273        wx.EVT_COMBOBOX(self.modelbox,-1, self._on_select_model) 
274        return 0
275   
276
277    def Set_DipersParam(self, event):
278        if self.enable_disp.GetValue():
279            if len(self.disp_list)==0:
280                ix=0
281                iy=1
282                self.fittable_param=[]
283                self.fixed_param=[]
284                self.sizer8.Clear(True)
285                model_disp = wx.StaticText(self, -1, 'No PolyDispersity for this model')
286                self.sizer7.Add(model_disp,( iy, ix),(1,1),  wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15)
287                self.vbox.Layout()
288                self.SetScrollbars(20,20,55,40)
289                self.Layout()
290                self.parent.GetSizer().Layout()
291                return 
292            else:
293                if self.data !=None and self.model !=None: # allow to recognize data panel from model panel
294                   
295               
296                    self.cb1.SetValue(False)
297                    self.select_all_param_helper()
298               
299                self.populate_disp_box()
300                self.set_panel_dispers(self.disp_list)
301               
302        else:
303            if self.data !=None and self.model!=None:
304                if self.cb1.GetValue():
305                    self.select_all_param_helper()
306           
307            if self.back_up_model!=None:
308                keys = self.back_up_model.getDispParamList()
309                keys.sort()
310                #disperse param into the initial state
311                for item in keys:
312                    value= self.back_up_model.getParam(item)
313                    self.model.setParam(item, value)
314                self._draw_model() 
315           
316               
317            self.fittable_param=[]       
318            self.fixed_param=[]
319            self.sizer7.Clear(True)
320            self.sizer8.Clear(True)
321            self.vbox.Layout()
322            self.SetScrollbars(20,20,55,40)
323            self.Layout()
324            self.parent.GetSizer().Layout()
325           
326    def populate_disp_box(self):
327        self.sizer7.Clear(True)
328        if len(self.disp_list)>0:
329            ix=0
330            iy=1
331            model_disp = wx.StaticText(self, -1, 'Model Disp')
332            self.sizer7.Add(model_disp,( iy, ix),(1,1),  wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15)
333            ix += 1 
334            # set up the combox box
335            id = 0
336            import sans.models.dispersion_models 
337            self.polydisp= sans.models.dispersion_models.models
338            self.disp_box = wx.ComboBox(self, -1)
339            self.disp_box.SetValue("GaussianModel")
340            for k,v in self.polydisp.iteritems():
341                """
342                if str(v)=="MyModel":
343                    self.disp_box.Insert("Select customized Model",id) 
344                else:
345                    self.disp_box.Insert(str(v),id)
346                """
347                if str(v)!="MyModel":
348                    self.disp_box.Insert(str(v),id) 
349                   
350                id+=1
351            wx.EVT_COMBOBOX(self.disp_box,-1, self._on_select_Disp) 
352            self.sizer7.Add(self.disp_box,( iy, ix),(1,1), wx.EXPAND|wx.ADJUST_MINSIZE, 0)
353            self.vbox.Layout()
354            self.SetScrollbars(20,20,55,40)
355            self.Layout()
356            self.parent.GetSizer().Layout() 
357           
358           
359    def set_range(self, qmin_x, qmax_x, npts):
360        """
361            Set the range for the plotted models
362            @param qmin: minimum Q
363            @param qmax: maximum Q
364            @param npts: number of Q bins
365        """
366        # Set the data members
367        self.qmin_x = qmin_x
368        self.qmax_x = qmax_x
369        self.num_points = npts
370       
371        # Set the controls
372        self.qmin.SetValue(format_number(self.qmin_x))
373        self.qmax.SetValue(format_number(self.qmax_x))
374        self.npts.SetValue(format_number(self.num_points))
375    def checkFitRange(self):
376        """
377            Check the validity of fitting range
378            @note: qmin should always be less than qmax or else each control box
379            background is colored in pink.
380        """
381       
382        flag = True
383        valueMin = self.qmin.GetValue()
384        valueMax = self.qmax.GetValue()
385        # Check for possible values entered
386        #print "fitpage: checkfitrange:",valueMin,valueMax
387        try:
388            if (float(valueMax)> float(valueMin)):
389                self.qmax.SetBackgroundColour(wx.WHITE)
390                self.qmin.SetBackgroundColour(wx.WHITE)
391            else:
392                flag = False
393                self.qmin.SetBackgroundColour("pink")
394                self.qmax.SetBackgroundColour("pink")     
395        except:
396            flag = False
397            self.qmin.SetBackgroundColour("pink")
398            self.qmax.SetBackgroundColour("pink")
399           
400        self.qmin.Refresh()
401        self.qmax.Refresh()
402        return flag
403   
404
405       
406    def onClose(self,event):
407        """ close the page associated with this panel"""
408        self.parent.onClose()
409       
410 
411       
412    def onModel2D(self, event):
413        """
414         call manager to plot model in 2D
415        """
416        # If the 2D display is not currently enabled, plot the model in 2D
417        # and set the enable2D flag.
418        if self.enable2D==False:
419            self.enable2D=True
420            self._draw_model()
421            self.model_view.Disable()
422           
423   
424    def select_model(self, model, name):
425        """
426            Select a new model
427            @param model: model object
428        """
429        self.model = model
430        self.parent.model_page.name = name
431        self.parent.draw_model_name = name
432       
433        self.set_panel(model)
434        self._draw_model(name)
435       
436        # Select the model from the combo box
437        items = self.modelbox.GetItems()
438        for i in range(len(items)):
439            if items[i]==name:
440                self.modelbox.SetSelection(i)
441                self.model_view.SetFocus()
442               
443    def _on_select_Disp(self,event):
444        """
445             allow selecting different dispersion
446             self.disp_list should change type later .now only gaussian
447        """
448        type =event.GetString()
449        self.set_panel_dispers( self.disp_list,type )
450               
451    def _on_select_model(self,event):
452        """
453            react when a model is selected from page's combo box
454            post an event to its owner to draw an appropriate theory
455        """
456        self.disable_disp.SetValue(True)
457        self.sizer8.Clear(True)
458        self.sizer7.Clear(True)       
459        self.vbox.Layout()
460        self.SetScrollbars(20,20,55,40)
461        self.Layout()
462        self.parent.GetSizer().Layout()
463        for item in self.model_list_box.itervalues():
464            name = item.__name__
465            if hasattr(item, "name"):
466                name = item.name
467            if name ==event.GetString():
468                model=item()
469                self.model= model
470                self.set_panel(model)
471                self.name= name
472                self.model_view.SetFocus()
473                self.parent.model_page.name=name
474                self.parent.draw_model_name=name
475               
476                self._draw_model(name)
477           
478           
479    def get_model_box(self): 
480        """ return reference to combox box self.model"""
481        return self.modelbox
482
483   
484    def get_param_list(self):
485        """
486            @return self.param_toFit: list containing  references to TextCtrl
487            checked.Theses TextCtrl will allow reference to parameters to fit.
488            @raise: if return an empty list of parameter fit will nnote work
489            properly so raise ValueError,"missing parameter to fit"
490        """
491        if self.param_toFit !=[]:
492            return self.param_toFit
493        else:
494            raise ValueError,"missing parameter to fit"
495       
496       
497    def set_panel(self,model):
498        """
499            Build the panel from the model content
500            @param model: the model selected in combo box for fitting purpose
501        """
502        print "set_panel", model
503       
504        self.sizer5.Clear(True)
505        self.parameters = []
506        self.param_toFit=[]
507        self.fixed_param=[]
508        self.model = model
509       
510        self.set_model_description( self.model) 
511       
512        keys = self.model.getParamList()
513        #list of dispersion paramaters
514        self.disp_list=self.model.getDispParamList()
515       
516        keys.sort()
517        ik=0
518        im=1
519       
520        iy = 1
521        ix = 0
522        self.cb1 = wx.CheckBox(self, -1,"Select all", (10, 10))
523        if self.data!=None:
524            wx.EVT_CHECKBOX(self, self.cb1.GetId(), self.select_all_param)
525            self.cb1.SetValue(False)
526        else:
527            self.cb1.Disable()
528            self.cb1.Hide()
529       
530        self.sizer5.Add(self.cb1,(iy, ix),(1,1),\
531                          wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15)
532        ix +=1
533        self.text2_2 = wx.StaticText(self, -1, 'Values')
534        self.sizer5.Add(self.text2_2,(iy, ix),(1,1),\
535                            wx.EXPAND|wx.ADJUST_MINSIZE, 0) 
536        ix +=2
537        self.text2_3 = wx.StaticText(self, -1, 'Errors')
538        self.sizer5.Add(self.text2_3,(iy, ix),(1,1),\
539                            wx.EXPAND|wx.ADJUST_MINSIZE, 0)
540        self.text2_3.Hide() 
541       
542       
543        ix +=1
544        self.text2_4 = wx.StaticText(self, -1, 'Units')
545        self.sizer5.Add(self.text2_4,(iy, ix),(1,1),\
546                            wx.EXPAND|wx.ADJUST_MINSIZE, 0) 
547        self.text2_4.Hide()
548        disp_list=self.model.getDispParamList()
549        for item in keys:
550            if not item in disp_list:
551                iy += 1
552                ix = 0
553   
554                cb = wx.CheckBox(self, -1, item, (10, 10))
555                if self.data!=None:
556                    cb.SetValue(False)
557                    wx.EVT_CHECKBOX(self, cb.GetId(), self.select_param)
558                else:
559                    cb.Disable()
560                self.sizer5.Add( cb,( iy, ix),(1,1),  wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15)
561               
562                ix += 1
563                value= self.model.getParam(item)
564                ctl1 = wx.TextCtrl(self, -1, size=(_BOX_WIDTH,20), style=wx.TE_PROCESS_ENTER)
565                ctl1.SetValue(str (format_number(value)))
566                ctl1.Bind(wx.EVT_KILL_FOCUS, self._onparamEnter)
567                ctl1.Bind(wx.EVT_TEXT_ENTER,self._onparamEnter)
568                self.sizer5.Add(ctl1, (iy,ix),(1,1), wx.EXPAND)
569               
570                ix += 1
571                text2=wx.StaticText(self, -1, '+/-')
572                self.sizer5.Add(text2,(iy, ix),(1,1),\
573                                wx.EXPAND|wx.ADJUST_MINSIZE, 0) 
574                text2.Hide() 
575                ix += 1
576                ctl2 = wx.TextCtrl(self, -1, size=(_BOX_WIDTH,20), style=wx.TE_PROCESS_ENTER)
577                self.sizer5.Add(ctl2, (iy,ix),(1,1), wx.EXPAND|wx.ADJUST_MINSIZE, 0)
578                ctl2.Hide()
579               
580                ix +=1
581                # Units
582                try:
583                    units = wx.StaticText(self, -1, self.model.details[item][0], style=wx.ALIGN_LEFT)
584                except:
585                    units = wx.StaticText(self, -1, "", style=wx.ALIGN_LEFT)
586                self.sizer5.Add(units, (iy,ix),(1,1),  wx.EXPAND|wx.ADJUST_MINSIZE, 0)
587           
588            self.parameters.append([cb,ctl1,text2,ctl2])
589               
590        iy+=1
591        self.sizer5.Add((20,20),(iy,ix),(1,1), wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15)
592       
593        #Display units text on panel
594        for item in keys:   
595            if self.model.details[item][0]!='':
596                self.text2_4.Show()
597                break
598            else:
599                self.text2_4.Hide()
600       
601        self.vbox.Layout()
602        self.SetScrollbars(20,20,55,40)
603        self.Layout()
604        self.parent.GetSizer().Layout()
605       
606       
607       
608    def _selectDlg(self):
609        import os
610        dlg = wx.FileDialog(self, "Choose a weight file", os.getcwd(), "", "*.*", wx.OPEN)
611        path = None
612        if dlg.ShowModal() == wx.ID_OK:
613            path = dlg.GetPath()
614        dlg.Destroy()
615        return path
616    def read_file(self, path):
617        try:
618            if path==None:
619                wx.PostEvent(self.parent.parent, StatusEvent(status=\
620                            " Selected Distribution was not loaded: %s"%path))
621                return None, None
622            input_f = open(path, 'r')
623            buff = input_f.read()
624            lines = buff.split('\n')
625           
626            angles = []
627            weights=[]
628            for line in lines:
629                toks = line.split()
630                if len(toks)==2:
631                    try:
632                        angle = float(toks[0])
633                        weight = float(toks[1])
634                    except:
635                        # Skip non-data lines
636                        pass
637                    angles.append(angle)
638                    weights.append(weight)
639            return numpy.array(angles), numpy.array(weights)
640        except:
641            raise 
642       
643    def _draw_disp_theta(self): 
644        path = self._selectDlg()
645        dispersion=None
646       
647        for key, value in self.polydisp.iteritems():
648            if value =="MyModel":
649                disp_ph = key()
650                disp_th = key()
651                break
652        values,weights = self.read_file(path)
653        if values ==None and weights==None:
654            return 
655        import math
656        disp_ph.set_weights( values, weights)
657        disp_th.set_weights( values, weights)
658       
659        if self.theta_cb !=None:
660            angle= self.theta_cb.GetLabelText()
661        n=0
662        self.disp_list=self.model.getDispParamList()
663        if angle.lower().count("theta")>0:   
664            for param in self.model.getParamList():
665                if  not param in self.disp_list and  param.lower().count("theta")>0: 
666                    self.model.set_dispersion(param, disp_th)
667                    self.model.dispersion[param]['npts'] = len(values)
668                    n+=1
669           
670            if n ==0:
671              wx.PostEvent(self.parent.parent, StatusEvent(status=\
672                            " Model contains no theta distribution")) 
673            else:
674                self._draw_model() 
675    def _draw_disp_Phi(self): 
676        path = self._selectDlg()
677        dispersion=None
678       
679        for key, value in self.polydisp.iteritems():
680            if value =="MyModel":
681                disp_ph = key()
682                disp_th = key()
683                break
684        values,weights = self.read_file(path)
685        if values ==None and weights==None:
686            return 
687        import math
688        disp_ph.set_weights( values, weights)
689        disp_th.set_weights( values, weights)
690       
691        if self.theta_cb !=None:
692            angle= self.theta_cb.GetLabelText()
693        n=0
694        self.disp_list=self.model.getDispParamList()
695        if angle.lower().count("theta")>0:   
696            for param in self.model.getParamList():
697                if  not param in self.disp_list and  param.lower().count("theta")>0: 
698                    self.model.set_dispersion(param, disp_th)
699                    self.model.dispersion[param]['npts'] = len(values)
700                    n+=1
701           
702            if n ==0:
703              wx.PostEvent(self.parent.parent, StatusEvent(status=\
704                            " Model contains no theta distribution")) 
705            else:
706                self._draw_model() 
707         
708         
709    def select_disp_angle(self, event): 
710        if not self.phi_cb.GetValue():
711            return
712        path = self._selectDlg()
713        dispersion=None
714       
715        for key, value in self.polydisp.iteritems():
716            if value =="MyModel":
717                disp_ph = key()
718                disp_th = key()
719               
720                break
721        try:
722            values,weights = self.read_file(path)
723        except:
724            raise
725       
726        if values ==None and weights==None:
727            return 
728        import math
729        wx.PostEvent(self.parent.parent, StatusEvent(status=\
730                            " Costumized Distribution: %s"% path))
731       
732        disp_ph.set_weights( values, weights)
733        disp_th.set_weights( values, weights)
734       
735       
736       
737        if self.theta_cb !=None:
738            angle= self.phi_cb.GetLabelText()
739        n=0
740        print "hello1",self.model.runXY([0.01,0.01]) 
741        self.disp_list=self.model.getDispParamList()
742        name= "phi"
743        if angle.lower().count(name)>0:   
744            for param in self.model.getParamList():
745                if  not param in self.disp_list and  param.lower().count(name)>0: 
746                    self.model.set_dispersion(param, disp_th)
747                    print "para, th",param, disp_th
748                    #self.model.dispersion[param]['npts'] = len(values)
749                    n+=1
750            print "model dispers list",self.model.getDispParamList()
751            if n ==0:
752              wx.PostEvent(self.parent.parent, StatusEvent(status=\
753                            " Model contains no %s distribution"%name)) 
754            else:
755                print "hello2",self.model.runXY([0.01,0.01]) 
756                #self._draw_model()
757                qmin=self.qmin_x
758                qmax=self.qmax_x
759                qstep= self.num_points
760                x=  numpy.linspace(start= -1*qmax,
761                               stop= qmax,
762                               num= qstep,
763                               endpoint=True ) 
764                y = numpy.linspace(start= -1*qmax,
765                               stop= qmax,
766                               num= qstep,
767                               endpoint=True )
768                output= numpy.zeros([len(x),len(y)])
769                for i_x in range(int(len(x))):
770                    for i_y in range(int(len(y))):
771                        if (x[i_x]*x[i_x]+y[i_y]*y[i_y]) \
772                        < qmin * qmin:
773                            output[i_x] [i_y]=0   
774                        else:
775                            value = self.model.runXY([x[i_x], y[i_y]])
776                            output[i_x] [i_y]=value
777                print"modelpage", output
778                self.manager.complete( output=output, elapsed=None, model=self.model, qmin=qmin, qmax=qmax,qstep=qstep)
779                #self._draw_model()
780                     
781                     
782                     
783    def set_panel_dispers(self, disp_list, type="GaussianModel" ):
784       
785        self.fittable_param=[]
786        self.fixed_param=[]
787       
788        ix=0
789        iy=1
790                ### this will become a separate method
791        if type== "Select customized Model":
792            ix=0
793            iy=1
794            self.sizer8.Clear(True)       
795            disp1 = wx.StaticText(self, -1, 'Array Dispersion')
796            self.sizer8.Add(disp1,( iy, ix),(1,1),  wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15)
797           
798            ix+=1 
799            self.theta_cb = wx.CheckBox(self, -1,"Theta ", (10, 10))
800            wx.EVT_CHECKBOX(self, self.theta_cb.GetId(), self.select_disp_angle)
801            self.sizer8.Add(self.theta_cb,(iy, ix),(1,1),\
802                            wx.EXPAND|wx.ADJUST_MINSIZE, 0)
803            ix+=1
804            self.phi_cb = wx.CheckBox(self, -1,"Phi", (10, 10))
805            wx.EVT_CHECKBOX(self, self.phi_cb.GetId(), self.select_disp_angle)
806            self.sizer8.Add(self.phi_cb,(iy, ix),(1,1),\
807                            wx.EXPAND|wx.ADJUST_MINSIZE, 0)
808           
809            ix =0
810            iy +=1 
811            self.sizer8.Add((20,20),(iy,ix),(1,1), wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15)       
812            self.vbox.Layout()
813            self.SetScrollbars(20,20,55,40)
814            self.Layout()
815            self.parent.GetSizer().Layout() 
816           
817        if type== "GaussianModel" :
818
819            self.sizer8.Clear(True)
820            disp = wx.StaticText(self, -1, 'Dispersion')
821            self.sizer8.Add(disp,( iy, ix),(1,1),  wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15)
822            ix += 1 
823            values = wx.StaticText(self, -1, 'Values')
824            self.sizer8.Add(values,( iy, ix),(1,1), wx.EXPAND|wx.ADJUST_MINSIZE, 0)
825            ix +=2
826            self.text2_3 = wx.StaticText(self, -1, 'Errors')
827            self.sizer8.Add(self.text2_3,(iy, ix),(1,1),\
828                            wx.EXPAND|wx.ADJUST_MINSIZE, 0)
829            self.text2_3.Hide() 
830           
831            ix += 1 
832            npts = wx.StaticText(self, -1, 'Npts')
833            self.sizer8.Add(npts,( iy, ix),(1,1), wx.EXPAND|wx.ADJUST_MINSIZE, 0)
834            ix += 1 
835            nsigmas = wx.StaticText(self, -1, 'Nsigmas')
836            self.sizer8.Add(nsigmas,( iy, ix),(1,1), wx.EXPAND|wx.ADJUST_MINSIZE, 0)
837           
838            disp_list.sort()
839            print disp_list,self.model.dispersion
840            for item in self.model.dispersion.keys():
841                name1=item+".width"
842                name2=item+".npts"
843                name3=item+".nsigmas"
844                iy += 1
845                for p in self.model.dispersion[item].keys():
846                    #print "name 1 2 3", name1, name2, name3
847                    if p=="width":
848                        ix = 0
849                        cb = wx.CheckBox(self, -1, name1, (10, 10))
850                        if self.data !=None:
851                            cb.SetValue(False)
852                            wx.EVT_CHECKBOX(self, cb.GetId(), self.select_param)
853                        else:
854                            cb.Disable()
855                        self.sizer8.Add( cb,( iy, ix),(1,1),  wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15)
856                        ix = 1
857                        value= self.model.getParam(name1)
858                        ctl1 = wx.TextCtrl(self, -1, size=(_BOX_WIDTH,20), style=wx.TE_PROCESS_ENTER)
859                        ctl1.SetValue(str (format_number(value)))
860                        ctl1.Bind(wx.EVT_KILL_FOCUS, self._onparamEnter)
861                        ctl1.Bind(wx.EVT_TEXT_ENTER,self._onparamEnter)
862                        self.sizer8.Add(ctl1, (iy,ix),(1,1), wx.EXPAND)
863                       
864                        ix = 2
865                        text2=wx.StaticText(self, -1, '+/-')
866                        self.sizer8.Add(text2,(iy, ix),(1,1),\
867                                        wx.EXPAND|wx.ADJUST_MINSIZE, 0) 
868                        text2.Hide() 
869                        ix = 3
870                        ctl2 = wx.TextCtrl(self, -1, size=(_BOX_WIDTH,20), style=wx.TE_PROCESS_ENTER)
871                        self.sizer8.Add(ctl2, (iy,ix),(1,1), wx.EXPAND|wx.ADJUST_MINSIZE, 0)
872                        ctl2.Hide()
873                        self.fittable_param.append([cb,ctl1,text2,ctl2])
874                       
875                       
876                    elif p=="npts":
877                            ix =4 
878                            value= self.model.getParam(name2)
879                            Tctl = wx.TextCtrl(self, -1, size=(_BOX_WIDTH/2,20), style=wx.TE_PROCESS_ENTER)
880                            Tctl.SetValue(str (format_number(value)))
881                            Tctl.Bind(wx.EVT_KILL_FOCUS, self._onparamEnter)
882                            Tctl.Bind(wx.EVT_TEXT_ENTER,self._onparamEnter)
883                            self.sizer8.Add(Tctl, (iy,ix),(1,1), wx.EXPAND|wx.ADJUST_MINSIZE, 0)
884                            self.fixed_param.append([name2, Tctl])
885                    elif p=="nsigmas":
886                            ix =5 
887                            value= self.model.getParam(name3)
888                            Tctl = wx.TextCtrl(self, -1, size=(_BOX_WIDTH/2,20), style=wx.TE_PROCESS_ENTER)
889                            Tctl.SetValue(str (format_number(value)))
890                            Tctl.Bind(wx.EVT_KILL_FOCUS, self._onparamEnter)
891                            Tctl.Bind(wx.EVT_TEXT_ENTER,self._onparamEnter)
892                            self.sizer8.Add(Tctl, (iy,ix),(1,1), wx.EXPAND|wx.ADJUST_MINSIZE, 0)
893                            self.fixed_param.append([name3, Tctl])
894                wx.PostEvent(self.parent.parent, StatusEvent(status=\
895                            " Selected Distribution: Gaussian"))   
896            ix =0
897            iy +=1 
898            self.sizer8.Add((20,20),(iy,ix),(1,1), wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15)       
899            self.vbox.Layout()
900            self.SetScrollbars(20,20,55,40)
901            self.Layout()
902            self.parent.GetSizer().Layout() 
903         
904    def checkFitValues(self,val_min, val_max):
905        """
906            Check the validity of input values
907        """
908        flag = True
909        min_value = val_min.GetValue()
910        max_value = val_max.GetValue()
911        # Check for possible values entered
912        if min_value.lstrip().rstrip() =="-inf":
913            min_value= -numpy.inf
914        if max_value.lstrip().rstrip() =="+inf":
915            max_value= numpy.inf
916        if  min_value==-numpy.inf and max_value== numpy.inf:
917            val_min.SetBackgroundColour(wx.WHITE)
918            val_min.Refresh()
919            val_max.SetBackgroundColour(wx.WHITE)
920            val_max.Refresh()
921            return flag
922        elif max_value== numpy.inf:
923            try:
924                float(min_value)
925                val_min.SetBackgroundColour(wx.WHITE)
926                val_min.Refresh()
927            except:
928                flag = False
929                val_min.SetBackgroundColour("pink")
930                val_min.Refresh()
931            return flag
932        elif min_value==-numpy.inf:
933            try:
934                float(max_value)
935                val_max.SetBackgroundColour(wx.WHITE)
936                val_max.Refresh()
937            except:
938                flag = False
939                val_max.SetBackgroundColour("pink")
940                val_max.Refresh()
941            return flag
942        else:   
943            if (float(min_value)< float(max_value)):
944                val_min.SetBackgroundColour(wx.WHITE)
945                val_min.Refresh()
946            else:
947                flag = False
948                val_min.SetBackgroundColour("pink")
949                val_min.Refresh()
950            return flag   
951           
952       
953    def _onparamEnter(self,event):
954        """
955            when enter value on panel redraw model according to changed
956        """
957        self.set_model_parameter()
958       
959    def set_model_parameter(self):
960        if len(self.parameters) !=0 and self.model !=None:
961            # Flag to register when a parameter has changed.
962            is_modified = False
963            for item in self.fittable_param:
964                try:
965                     name=str(item[0].GetLabelText())
966                     value= float(item[1].GetValue())
967                   
968                     #print "model para", name,value
969                     # If the value of the parameter has changed,
970                     # update the model and set the is_modified flag
971                     if value != self.model.getParam(name):
972                         #print "went hereee"
973                         self.model.setParam(name,value)
974                         is_modified = True
975                         
976                except:
977                    raise
978                    wx.PostEvent(self.parent.parent, StatusEvent(status=\
979                            "Model Drawing  Error:wrong value entered : %s"% sys.exc_value))
980               
981            for item in self.fixed_param:
982                try:
983                     name=str(item[0])
984                     value= float(item[1].GetValue())
985                     #print "model para", name,value,self.model.getParam(name)
986                     # If the value of the parameter has changed,
987                     # update the model and set the is_modified flag
988                     if value != self.model.getParam(name):
989                         #print "went hereee"
990                         self.model.setParam(name,value)
991                         is_modified = True
992                         
993                except:
994                    raise
995                    wx.PostEvent(self.parent.parent, StatusEvent(status=\
996                            "Model Drawing  Error:wrong value entered : %s"% sys.exc_value))
997               
998            for item in self.parameters:
999                try:
1000                     name=str(item[0].GetLabelText())
1001                     value= float(item[1].GetValue())
1002                     #param_min= item[4].GetValue()
1003                     #param_max= item[5].GetValue()
1004                     #print " fittable model para", name,value
1005                     # If the value of the parameter has changed,
1006                     # update the model and set the is_modified flag
1007                     if value != self.model.getParam(name):
1008                         #print "went here", name,value
1009                         self.model.setParam(name,value)
1010                         is_modified = True
1011                     """
1012                     #if self.checkFitValues(item[4], item[5]):
1013                     #    if param_min.lstrip().rstrip()== "-inf":
1014                             param_min=None
1015                         else:
1016                             param_min=float(param_min)
1017                         if param_max.lstrip().rstrip() =="+inf":
1018                             param_max=None
1019                         else:
1020                             param_max=float(param_max)
1021                         if  param_min !=  self.model.details[name][1]:
1022                             self.model.details[name][1]= param_min
1023                             is_modified = True
1024                         if  param_max !=  self.model.details[name][2]:
1025                             self.model.details[name][2]= param_max
1026                             is_modified = True
1027                        """
1028                except:
1029                    #print item[4].GetValue(),item[5].GetValue()
1030                    raise 
1031                    #wx.PostEvent(self.parent.parent, StatusEvent(status=\
1032                    #       "Model Drawing  Error:wrong value entered : %s"% sys.exc_value))
1033           
1034            # Here we should check whether the boundaries have been modified.
1035            # If qmin and qmax have been modified, update qmin and qmax and
1036            # set the is_modified flag to True
1037            if float(self.qmin.GetValue()) != self.qmin_x:
1038                self.qmin_x = float(self.qmin.GetValue())
1039                is_modified = True
1040            if float(self.qmax.GetValue()) != self.qmax_x:
1041                self.qmax_x = float(self.qmax.GetValue())
1042                is_modified = True
1043           
1044            if float(self.npts.GetValue()) !=  self.num_points:
1045                self.num_points = float(self.npts.GetValue())
1046                is_modified = True
1047         
1048            if is_modified:
1049                self._draw_model()           
1050           
1051    def _draw_model(self, name=None):
1052        """
1053            Method to draw or refresh a plotted model.
1054            The method will use the data member from the model page
1055            to build a call to the fitting perspective manager.
1056           
1057            [Note to coder: This way future changes will be done in only one place.]
1058        """
1059        #print "_draw_model",self.model
1060        if name==None:
1061            name= self.model.name
1062       
1063        self.manager.draw_model(self.model, name, data=self.data,
1064                                qmin=self.qmin_x, qmax=self.qmax_x,
1065                                qstep= self.num_points,
1066                                enable2D=self.enable2D)
1067       
1068    def select_param(self,event):
1069        pass
1070    def select_all_param(self,event): 
1071        pass
1072    def select_all_param_helper(self):
1073        """
1074             Allows selecting or delecting button
1075        """
1076        self.param_toFit=[]
1077        if  self.parameters !=[]:
1078            if  self.cb1.GetValue()==True:
1079                for item in self.parameters:
1080                    item[0].SetValue(True)
1081                    list= [item[0],item[1],item[2],item[3]]
1082                    self.param_toFit.append(list )
1083                if len(self.fittable_param)>0:
1084                    for item in self.fittable_param:
1085                        item[0].SetValue(True)
1086                        list= [item[0],item[1],item[2],item[3]]
1087                        self.param_toFit.append(list )
1088            else:
1089                for item in self.parameters:
1090                    item[0].SetValue(False)
1091                for item in self.fittable_param:
1092                    item[0].SetValue(False)
1093                self.param_toFit=[]
1094               
1095               
1096       
Note: See TracBrowser for help on using the repository browser.