source: sasview/sansview/perspectives/fitting/modelpage.py @ 01798e3

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 01798e3 was 96f97f3, checked in by Gervaise Alina <gervyh@…>, 16 years ago

enable and disable view2D enhance

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