source: sasview/sansview/perspectives/fitting/basepage.py @ c77d859

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

new interface design —→ proposition

  • Property mode set to 100644
File size: 32.1 KB
Line 
1
2import sys
3import wx
4import numpy
5
6from sans.guiframe.utils import format_number
7from sans.guicomm.events import StatusEvent   
8
9_BOX_WIDTH = 80
10
11class BasicPage(wx.ScrolledWindow):
12    """
13        This class provide general structure of  fitpanel page
14    """
15    ## Internal name for the AUI manager
16    window_name = "Fit page"
17    ## Title to appear on top of the window
18    window_caption = "Fit Page"
19    name=""
20    def __init__(self,parent, pageinfo, name):
21        wx.ScrolledWindow.__init__(self, parent)
22        ## store name
23        self.name = name
24        ## store info of panel
25        self.page_info= pageinfo
26        self.page_info.page_name = name
27        ## parent of the page
28        self.parent = parent
29        ## owner of the page (fitting plugin)
30        self.event_owner= None
31        ## create the basic structure of the panel with empty sizer
32        self.define_page_structure()
33        ## dictionary containing list of models
34        self.model_list_box={}
35        ## Data member to store the dispersion object created
36        self._disp_obj_dict = {}
37        self.disp_cb_dict ={}
38        ##list of model parameters. each item must have same length
39        ## each item related to a given parameters
40        ##[cb state, name, value, "+/-", error of fit, min, max , units]
41        self.parameters=[]
42        ## list of parameters to fit , must be like self.parameters
43        self.param_toFit=[]
44        ## list of looking like parameters but with non fittable parameters info
45        self.fixed_param=[]
46        ## list of looking like parameters but with  fittable parameters info
47        self.fittable_param=[]
48        ##list of dispersion parameters
49        self.disp_list=[]
50       
51        ##enable model 2D draw
52        self.enable2D= False
53        ## check that the fit range is correct to plot the model again
54        self.fitrange= True
55        ## current model
56        self.model= None
57        ## data
58        self.data=None
59        ## Q range
60        self.qmin_x= 0.001
61        self.qmax_x= 0.1
62        self.num_points= 100
63        ## changing initial values given page_info value
64        if self.page_info !=None and len(self.page_info.model_list_box) >0:
65            self.model_list_box = self.page_info.model_list_box
66            ## current model
67            self.model=self.page_info.model
68            self.data = self.page_info.data
69            self.event_owner = self.page_info.event_owner
70            if self.model !=None:
71                self.disp_list= self.model.getDispParamList()
72        ## drawing Initial dispersion parameters sizer
73        self.set_dispers_sizer()
74        ## layout
75        self.set_layout()
76       
77       
78    def define_page_structure(self):
79        """
80            Create empty sizer for a panel
81        """
82        self.vbox  = wx.BoxSizer(wx.VERTICAL)
83        self.sizer0 = wx.BoxSizer(wx.VERTICAL)
84        self.sizer1 = wx.BoxSizer(wx.VERTICAL)
85        self.sizer2 = wx.BoxSizer(wx.VERTICAL)
86        self.sizer3 = wx.BoxSizer(wx.VERTICAL)
87       
88        self.sizer4 = wx.BoxSizer(wx.VERTICAL)
89        self.sizer5 = wx.BoxSizer(wx.VERTICAL)
90       
91        self.vbox.Add(self.sizer0)
92        self.vbox.Add(self.sizer1)
93        self.vbox.Add(self.sizer2)
94        self.vbox.Add(self.sizer3)
95        self.vbox.Add(self.sizer4)
96        self.vbox.Add(self.sizer5)
97       
98    def set_layout(self):
99        """
100             layout
101        """
102        self.vbox.Layout()
103        self.vbox.Fit(self) 
104        self.SetSizer(self.vbox)
105       
106        self.set_scroll()
107        self.Centre()
108       
109    def set_scroll(self):
110        self.SetScrollbars(20,20,200,100)
111        self.Layout()   
112         
113    def set_owner(self,owner):
114        """
115            set owner of fitpage
116            @param owner: the class responsible of plotting
117        """
118        self.event_owner = owner   
119        self.page_info.event_owner = owner
120 
121    def set_manager(self, manager):
122        """
123             set panel manager
124             @param manager: instance of plugin fitting
125        """
126        self.manager = manager 
127        self.page_info.manager = manager
128       
129    def populate_box(self, dict):
130        """
131             Store list of model
132             @param dict: dictionary containing list of models
133        """
134        self.model_list_box = dict
135        if self.page_info!=None:
136            self.page_info.model_list_box = self.model_list_box
137           
138   
139       
140    def set_dispers_sizer(self):
141        """
142            fill sizer containing dispersity info
143        """
144        self.sizer4.Clear(True)
145        box_description= wx.StaticBox(self, -1,"PolyDispersity")
146        boxsizer1 = wx.StaticBoxSizer(box_description, wx.VERTICAL)
147        #----------------------------------------------------
148        self.disable_disp = wx.RadioButton(self, -1, 'No', (10, 10), style=wx.RB_GROUP)
149        self.enable_disp = wx.RadioButton(self, -1, 'Yes', (10, 30))
150        self.Bind(wx.EVT_RADIOBUTTON, self._set_dipers_Param, id=self.disable_disp.GetId())
151        self.Bind(wx.EVT_RADIOBUTTON, self._set_dipers_Param, id=self.enable_disp.GetId())
152       
153        sizer_dispersion = wx.BoxSizer(wx.HORIZONTAL)
154        sizer_dispersion.Add((20,20))
155        sizer_dispersion.Add(wx.StaticText(self,-1,'Polydispersity: '))
156        sizer_dispersion.Add(self.enable_disp )
157        sizer_dispersion.Add((20,20))
158        sizer_dispersion.Add(self.disable_disp )
159        sizer_dispersion.Add((10,10))
160       
161        ## fill a sizer with the combobox to select dispersion type
162        sizer_select_dispers = wx.BoxSizer(wx.HORIZONTAL) 
163        self.model_disp = wx.StaticText(self, -1, 'Model Disp')
164           
165        import sans.models.dispersion_models 
166        self.polydisp= sans.models.dispersion_models.models
167        self.disp_box = wx.ComboBox(self, -1)
168        self.disp_box.SetValue("GaussianModel")
169       
170        for key in self.polydisp.iterkeys():
171            name = str(key.__name__)
172            if name=="ArrayDispersion":
173                # Remove the option until the rest of the code is ready for it
174                self.disp_box.Append("Select customized Model",key)
175                pass 
176            else:
177                self.disp_box.Append(name,key) 
178        wx.EVT_COMBOBOX(self.disp_box,-1, self._on_select_Disp) 
179             
180        sizer_select_dispers.Add((10,10)) 
181        sizer_select_dispers.Add(self.model_disp) 
182        sizer_select_dispers.Add(self.disp_box) 
183        sizer_select_dispers.Add((10,10)) 
184        self.model_disp.Hide()
185        self.disp_box.Hide()
186       
187        boxsizer1.Add( sizer_dispersion )
188        boxsizer1.Add( (10,10) )
189        boxsizer1.Add( sizer_select_dispers )
190        self.sizer4_4 = wx.GridBagSizer(5,5)
191        boxsizer1.Add( self.sizer4_4  )
192        #-----------------------------------------------------
193        self.sizer4.Add(boxsizer1,0, wx.EXPAND | wx.ALL, 10)
194        self.sizer4.Layout()
195        self.SetScrollbars(20,20,200,100)
196   
197    def select_disp_angle(self, event): 
198        """
199            Event for when a user select a parameter to average over.
200            @param event: check box event
201        """
202       
203       
204        # Go through the list of dispersion check boxes to identify which one has changed
205        for p in self.disp_cb_dict:
206            # Catch which one of the box was just checked or unchecked.
207            if event.GetEventObject() == self.disp_cb_dict[p]:             
208
209               
210                if self.disp_cb_dict[p].GetValue() == True:
211                    # The user wants this parameter to be averaged.
212                    # Pop up the file selection dialog.
213                    path = self._selectDlg()
214                   
215                    # If nothing was selected, just return
216                    if path is None:
217                        self.disp_cb_dict[p].SetValue(False)
218                        return
219                   
220                    try:
221                        values,weights = self.read_file(path)
222                    except:
223                        msg="Could not read input file"
224                        wx.PostEvent(self.parent.parent, StatusEvent(status= msg))
225                        return
226                   
227                    # If any of the two arrays is empty, notify the user that we won't
228                    # proceed
229                    if values is None or weights is None:
230                        wx.PostEvent(self.parent.parent, StatusEvent(status=\
231                            "The loaded %s distrubtion is corrupted or empty" % p))
232                        return
233                       
234                    # Tell the user that we are about to apply the distribution
235                    wx.PostEvent(self.parent.parent, StatusEvent(status=\
236                            "Applying loaded %s distribution: %s" % (p, path))) 
237                   
238                    # Create the dispersion objects
239                    from sans.models.dispersion_models import ArrayDispersion
240                    disp_model = ArrayDispersion()
241                    disp_model.set_weights(values, weights)
242                    # Store the object to make it persist outside the scope of this method
243                    #TODO: refactor model to clean this up?
244                    self._disp_obj_dict[p] = disp_model
245                   
246                    # Set the new model as the dispersion object for the selected parameter
247                    self.model.set_dispersion(p, disp_model)
248                         
249                else:
250                    # The parameter was un-selected. Go back to Gaussian model (with 0 pts)
251                    self._reset_dispersity()
252                   
253                ## Redraw the model
254                self._draw_model()
255        return
256   
257         
258   
259   
260    def read_file(self, path):
261        """
262            Read two columns file
263            @param path: the path to the file to read
264        """
265        try:
266            if path==None:
267                wx.PostEvent(self.parent.parent, StatusEvent(status=\
268                            " Selected Distribution was not loaded: %s"%path))
269                return None, None
270            input_f = open(path, 'r')
271            buff = input_f.read()
272            lines = buff.split('\n')
273           
274            angles = []
275            weights=[]
276            for line in lines:
277                toks = line.split()
278                if len(toks)==2:
279                    try:
280                        angle = float(toks[0])
281                        weight = float(toks[1])
282                    except:
283                        # Skip non-data lines
284                        pass
285                    angles.append(angle)
286                    weights.append(weight)
287            return numpy.array(angles), numpy.array(weights)
288        except:
289            raise 
290     
291         
292    def _selectDlg(self):
293        """
294            open a dialog file to selected the customized dispersity
295        """
296        import os
297        dlg = wx.FileDialog(self, "Choose a weight file", os.getcwd(), "", "*.*", wx.OPEN)
298        path = None
299        if dlg.ShowModal() == wx.ID_OK:
300            path = dlg.GetPath()
301        dlg.Destroy()
302        return path
303         
304   
305    def _onparamEnter_helper(self):
306        """
307             check if values entered by the user are changed and valid to replot
308             model
309             use : _check_value_enter
310        """
311        if self.model !=None:
312            # Flag to register when a parameter has changed.
313            is_modified = False
314            is_modified =self._check_value_enter( self.fittable_param ,is_modified)
315            is_modified =self._check_value_enter( self.fixed_param ,is_modified)
316            is_modified =self._check_value_enter( self.parameters ,is_modified)       
317           
318            # Here we should check whether the boundaries have been modified.
319            # If qmin and qmax have been modified, update qmin and qmax and
320            # set the is_modified flag to True
321            from sans.guiframe.utils import check_value
322            if check_value( self.qmin, self.qmax):
323                if float(self.qmin.GetValue()) != self.qmin_x:
324                    self.qmin_x = float(self.qmin.GetValue())
325                    is_modified = True
326                if float(self.qmax.GetValue()) != self.qmax_x:
327                    self.qmax_x = float(self.qmax.GetValue())
328                    is_modified = True
329                self.fitrange = True
330            else:
331                self.fitrange = False
332            if self.npts != None:
333                if float(self.npts.GetValue()) !=  self.num_points:
334                    self.num_points = float(self.npts.GetValue())
335                    is_modified = True
336            ## if any value is modify draw model with new value
337            if is_modified:
338                self._draw_model() 
339               
340               
341    def _set_model_sizer_selection(self, model):
342        """
343            Display the sizer according to the type of the current model
344        """
345        if hasattr(model ,"model2"):
346           
347            class_name= model.model2.__class__
348            name= model.model2.name
349            flag= name != "NoStructure"
350            if flag and (class_name in self.model_list_box["Structure Factors"]):
351                self.structurebox.Show(True)
352                self.text2.Show(True)
353                self.multip_cb.SetValue(True)
354                items = self.structurebox.GetItems()
355                self.sizer1.Layout()
356                self.SetScrollbars(20,20,200,100)
357                for i in range(len(items)):
358                    if items[i]== str(name):
359                        self.structurebox.SetSelection(i)
360                        break
361                   
362        if hasattr(model ,"model1"):
363            class_name = model.model1.__class__
364            name = model.model1.name
365            self.formfactorbox.Clear()
366           
367            for k, list in self.model_list_box.iteritems():
368                if k == "shapes":
369                    self.shape_rbutton.SetValue(True)
370                elif k == "Shape-independent":
371                    self.shape_indep_rbutton.SetValue(True)
372                elif k == "Structure Factors":
373                     self.struct_rbutton.SetValue(True)
374                else:
375                    self.plugin_rbutton.SetValue(True)
376                   
377                if class_name in list:
378                    ## fill the form factor list with new model
379                    self._populate_box(self.formfactorbox, list)
380                    items = self.formfactorbox.GetItems()
381                    ## set comboxbox to the selected item
382                    for i in range(len(items)):
383                        if items[i]== str(name):
384                            self.formfactorbox.SetSelection(i)
385                            break
386                    break
387        else:
388            ## Select the model from the combo box
389            class_name = model.__class__
390            name = model.name
391            self.formfactorbox.Clear()
392            items = self.formfactorbox.GetItems()
393            for k, list in self.model_list_box.iteritems():
394                if k == "shapes":
395                    self.shape_rbutton.SetValue(True)
396                elif k == "Shape-independent":
397                    self.shape_indep_rbutton.SetValue(True)
398                elif k == "Structure Factors":
399                     self.struct_rbutton.SetValue(True)
400                else:
401                    self.plugin_rbutton.SetValue(True)
402                if class_name in list:
403                ## fill the form factor list with new model
404                    self._populate_box(self.formfactorbox, list)
405                    items = self.formfactorbox.GetItems()
406                    ## set comboxbox to the selected item
407                    for i in range(len(items)):
408                        if items[i]== str(name):
409                            self.formfactorbox.SetSelection(i)
410                            break
411                    break
412                   
413       
414       
415    def _draw_model(self):
416        """
417            Method to draw or refresh a plotted model.
418            The method will use the data member from the model page
419            to build a call to the fitting perspective manager.
420           
421            [Note to coder: This way future changes will be done in only one place.]
422        """
423        if self.model !=None:
424            self.manager.draw_model(self.model, data=self.data,
425                                    qmin=self.qmin_x, qmax=self.qmax_x,
426                                    qstep= self.num_points,
427                                    enable2D=self.enable2D) 
428       
429    def _set_model_sizer(self, sizer, title="", object=None):
430        """
431            Use lists to fill a sizer for model info
432        """
433       
434        sizer.Clear(True)
435        box_description= wx.StaticBox(self, -1,str(title))
436        boxsizer1 = wx.StaticBoxSizer(box_description, wx.VERTICAL)
437        #--------------------------------------------------------
438        self.shape_rbutton = wx.RadioButton(self, -1, 'Shape', style=wx.RB_GROUP)
439        self.shape_indep_rbutton = wx.RadioButton(self, -1, "Shape Independent")
440        self.struct_rbutton = wx.RadioButton(self, -1, "Structure ")
441        self.plugin_rbutton = wx.RadioButton(self, -1, "customized Model")
442        self.multip_cb = wx.CheckBox(self, -1,"P(Q)*S(Q)")
443       
444       
445       
446        self.Bind( wx.EVT_RADIOBUTTON, self._show_combox,
447                            id= self.shape_rbutton.GetId() ) 
448        self.Bind( wx.EVT_RADIOBUTTON, self._show_combox,
449                            id= self.shape_indep_rbutton.GetId() ) 
450        self.Bind( wx.EVT_RADIOBUTTON, self._show_combox,
451                            id= self.struct_rbutton.GetId() ) 
452        self.Bind( wx.EVT_RADIOBUTTON, self._show_combox,
453                            id= self.plugin_rbutton.GetId() ) 
454        wx.EVT_CHECKBOX(self, self.multip_cb.GetId() , self._show_combox )             
455        ## store state
456        self.page_info.save_radiobox_state( self.shape_rbutton )
457        self.page_info.save_radiobox_state( self.shape_indep_rbutton )
458        self.page_info.save_radiobox_state( self.struct_rbutton )
459        self.page_info.save_radiobox_state( self.plugin_rbutton )
460       
461       
462        sizer_radiobutton = wx.GridSizer(3, 3,5, 5)
463        sizer_radiobutton.Add(self.shape_rbutton)
464        sizer_radiobutton.Add(self.shape_indep_rbutton)
465        sizer_radiobutton.Add(self.multip_cb)
466        sizer_radiobutton.Add(self.plugin_rbutton)
467        sizer_radiobutton.Add(self.struct_rbutton)
468       
469        sizer_selection = wx.BoxSizer(wx.HORIZONTAL)
470       
471        self.text1 = wx.StaticText( self,-1,"P(Q)" )
472        self.text2 = wx.StaticText( self,-1,"* S(Q)" )
473       
474        self.text2.Hide()
475       
476        self.formfactorbox = wx.ComboBox(self, -1)
477        if self.model!=None:
478            self.formfactorbox.SetValue(self.model.name)
479       
480        self.structurebox = wx.ComboBox(self, -1)
481        wx.EVT_COMBOBOX(self.formfactorbox,-1, self._on_select_model)
482        wx.EVT_COMBOBOX(self.structurebox,-1, self._on_select_model)
483        self.structurebox.Hide()
484       
485        ## fill combox box
486        if len(self.model_list_box)>0:
487            self._populate_box( self.formfactorbox,self.model_list_box["shapes"])
488       
489        if len(self.model_list_box)>0:
490            self._populate_box( self.structurebox,
491                                self.model_list_box["Structure Factors"])
492       
493         ## check model type to show sizer
494        if self.model !=None:
495            self._set_model_sizer_selection( self.model )
496       
497        sizer_selection.Add(self.text1)
498        sizer_selection.Add((5,5))
499        sizer_selection.Add(self.formfactorbox)
500        sizer_selection.Add((5,5))
501        sizer_selection.Add(self.text2)
502        sizer_selection.Add((5,5))
503        sizer_selection.Add(self.structurebox)
504        sizer_selection.Add((5,5))
505       
506        boxsizer1.Add( sizer_radiobutton )
507        boxsizer1.Add( (20,20))
508        boxsizer1.Add( sizer_selection )
509        if object !=None:
510            boxsizer1.Add( (20,20))
511            boxsizer1.Add( object )
512        #--------------------------------------------------------
513        sizer.Add(boxsizer1,0, wx.EXPAND | wx.ALL, 10)
514        sizer.Layout()
515        self.SetScrollbars(20,20,200,100)
516       
517       
518    def _show_combox(self, event):
519        """
520            Show combox box associate with type of model selected
521        """
522        self.page_info.save_radiobox_state( self.shape_rbutton )
523        self.page_info.save_radiobox_state( self.shape_indep_rbutton )
524        self.page_info.save_radiobox_state( self.struct_rbutton )
525        self.page_info.save_radiobox_state( self.plugin_rbutton )
526       
527       
528       
529        if self.shape_rbutton.GetValue():
530            ##fill the comboxbox with form factor list
531            self.structurebox.Hide()
532            self.text2.Hide()
533            self.formfactorbox.Clear()
534            self._populate_box( self.formfactorbox,self.model_list_box["shapes"])
535           
536        if self.shape_indep_rbutton.GetValue():
537            ##fill the comboxbox with shape independent  factor list
538            self.structurebox.Hide()
539            self.text2.Hide()
540            self.formfactorbox.Clear()
541            self._populate_box( self.formfactorbox,
542                                self.model_list_box["Shape-independent"])
543           
544        if self.struct_rbutton.GetValue():
545            ##fill the comboxbox with structure factor list
546            self.structurebox.Hide()
547            self.text2.Hide()
548            self.formfactorbox.Clear()
549            self._populate_box( self.formfactorbox,
550                                self.model_list_box["Structure Factors"])
551           
552        if self.plugin_rbutton.GetValue():
553            ##fill the comboxbox with form factor list
554            self.structurebox.Hide()
555            self.text2.Hide()
556            self.formfactorbox.Clear()
557            self._populate_box( self.formfactorbox,
558                                self.model_list_box["Added models"])
559           
560           
561        if self.multip_cb.GetValue():
562            ## multplication not available for structure factor
563            if self.struct_rbutton.GetValue():
564                self.multip_cb.SetValue(False)
565                self.structurebox.Hide()
566                return
567            ##fill the comboxbox with form factor list
568            self.structurebox.Show(True)
569            self.text2.Show(True)
570       
571        self.set_scroll()
572       
573       
574   
575           
576    def _populate_box(self, combobox, list):
577        """
578            fill combox box with dict item
579            @param list: contains item to fill the combox
580            item must model class
581        """
582        for models in list:
583            model= models()
584            name = model.__class__.__name__
585            if hasattr(model, "name"):
586                name = model.name
587            combobox.Append(name,models)
588           
589        wx.EVT_COMBOBOX(combobox,-1, self._on_select_model) 
590        return 0
591   
592   
593    def _on_select_model_helper(self,event): 
594        """
595             call back for model selection
596        """
597        f_id = self.formfactorbox.GetCurrentSelection()
598        s_id = self.structurebox.GetCurrentSelection()
599        form_factor = self.formfactorbox.GetClientData( f_id )
600        struct_factor = self.structurebox.GetClientData( s_id )
601       
602        if self.multip_cb.GetValue():
603            if struct_factor != None and struct_factor.__name__ != "NoStructure":
604                from sans.models.MultiplicationModel import MultiplicationModel
605                if form_factor != None:
606                    self.model= MultiplicationModel(form_factor(),struct_factor())
607            msg= "select one P(Q) and one S(Q) to plot"
608            wx.PostEvent(self.parent.parent, StatusEvent(status= msg))
609        else:
610            if form_factor != None:
611                self.model= form_factor()
612       
613       
614    def _onparamEnter(self,event):
615        """
616            when enter value on panel redraw model according to changed
617        """
618        self._onparamEnter_helper()
619       
620       
621    def _check_value_enter(self, list, modified):
622        """
623            @param list: model parameter and panel info
624            each item of the list should be as follow:
625            item=[cb state, name, value, "+/-", error of fit, min, max , units]
626        """ 
627        is_modified =  modified
628        if len(list)==0:
629            return is_modified
630        for item in list:
631            try:
632                 name = str(item[1])
633                 value= float(item[2].GetValue())
634                 # If the value of the parameter has changed,
635                 # update the model and set the is_modified flag
636                 if value != self.model.getParam(name):
637                     self.model.setParam(name,value)
638                     is_modified = True   
639            except:
640                msg= "Model Drawing  Error:wrong value entered : %s"% sys.exc_value
641                wx.PostEvent(self.parent.parent, StatusEvent(status = msg ))
642                return 
643        return is_modified
644       
645       
646 
647    def _set_dipers_Param(self, event):
648        """
649            Add more item to select user dispersity
650        """
651        if self.model == None:
652            msg= " Select non - model value:%s !"%self.model
653            wx.PostEvent(self.parent.parent, StatusEvent(status= msg))
654            return 
655        else:
656            if self.enable_disp.GetValue():
657                self.model_disp.Show(True)
658                self.disp_box.Show(True)
659                ## layout for model containing no dispersity parameters
660                if len(self.disp_list)==0:
661                    self._layout_sizer_noDipers() 
662                else:
663                    ## set gaussian sizer
664                    self._set_sizer_gaussian() 
665            else:
666                self.model_disp.Hide()
667                self.disp_box.Hide()
668                self.sizer4_4.Clear(True)
669                self._reset_dispersity()
670                self._draw_model()
671           
672            self.sizer4_4.Layout()
673            self.sizer4.Layout()
674            self.SetScrollbars(20,20,200,100)
675       
676       
677    def _layout_sizer_noDipers(self):
678        """
679            Draw a sizer with no dispersity info
680        """
681        ix=0
682        iy=1
683        self.fittable_param=[]
684        self.fixed_param=[]
685        self.model_disp.Hide()
686        self.disp_box.Hide()
687        self.sizer4_4.Clear(True)
688        model_disp = wx.StaticText(self, -1, 'No PolyDispersity for this model')
689        self.sizer4_4.Add(model_disp,( iy, ix),(1,1),  wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15)
690        self.sizer4_4.Layout()
691        self.sizer4.Layout()
692        self.SetScrollbars(20,20,200,100)
693        return 
694   
695    def _reset_gaussian_dispers(self):
696        """
697            reset model paramaters to gaussian
698            TO IMPLEMENT
699        """
700   
701        return
702        from sans.models.dispersion_models import GaussianDispersion
703        if self.model==None:
704            return
705        list= self.model.dispersion.keys()
706        for key in list:
707           
708            ## The parameter was un-selected. Go back to Gaussian model (with 0 pts)
709            disp_model = GaussianDispersion()
710            ## Set the new model as the dispersion object for the selected parameter
711            self.model.set_dispersion(key,disp_model)
712            self._draw_model()
713           
714           
715    def _reset_dispersity(self):
716        """
717             put gaussian dispersity into current model
718        """
719        self.fittable_param=[]
720        self.fixed_param=[]
721        from sans.models.dispersion_models import GaussianDispersion
722        if len(self.disp_cb_dict)==0:
723            return 
724       
725        for p in self.disp_cb_dict:
726            # The parameter was un-selected. Go back to Gaussian model (with 0 pts)
727            disp_model = GaussianDispersion()
728            # Store the object to make it persist outside the scope of this method
729            #TODO: refactor model to clean this up?
730            self._disp_obj_dict[p] = disp_model
731           
732            # Set the new model as the dispersion object for the selected parameter
733            self.model.set_dispersion(p, disp_model)
734           
735            # Redraw the model
736           
737           
738           
739    def _on_select_Disp(self,event):
740        """
741             allow selecting different dispersion
742             self.disp_list should change type later .now only gaussian
743        """
744        dispersity  =event.GetClientData()
745        name= dispersity.__name__
746       
747        if name == "GaussianModel":
748            self._set_sizer_gaussian()
749           
750        if  name=="ArrayDispersion":
751            self._set_sizer_arraydispersion()
752           
753           
754           
755   
756    def _set_sizer_arraydispersion(self):
757        """
758            draw sizer with array dispersity  parameters
759        """
760        self.sizer4_4.Clear(True) 
761        ix=0
762        iy=1     
763        disp1 = wx.StaticText(self, -1, 'Array Dispersion')
764        self.sizer4_4.Add(disp1,( iy, ix),(1,1),  wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15)
765       
766        # Look for model parameters to which we can apply an ArrayDispersion model
767        # Add a check box for each parameter.
768        self.disp_cb_dict = {}
769        for p in self.model.dispersion.keys():
770            ix+=1 
771            self.disp_cb_dict[p] = wx.CheckBox(self, -1, p, (10, 10))
772           
773            wx.EVT_CHECKBOX(self, self.disp_cb_dict[p].GetId(), self.select_disp_angle)
774            self.sizer4_4.Add(self.disp_cb_dict[p], (iy, ix), (1,1), wx.EXPAND|wx.ADJUST_MINSIZE, 0)
775       
776        ix =0
777        iy +=1 
778        self.sizer4_4.Add((20,20),(iy,ix),(1,1), wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15)       
779        self.sizer4_4.Layout()
780        self.sizer4.Layout()
781        self.SetScrollbars(20,20,200,100)
782       
783       
784    def _set_range_sizer(self, title, object1=None,object=None):
785        """
786            Fill the
787        """
788        self.sizer5.Clear(True)
789        box_description= wx.StaticBox(self, -1,str(title))
790        boxsizer1 = wx.StaticBoxSizer(box_description, wx.VERTICAL)
791        #--------------------------------------------------------------
792        self.qmin    = wx.TextCtrl(self, -1,size=(_BOX_WIDTH,20))
793        self.qmin.SetValue(format_number(self.qmin_x))
794        self.qmin.SetToolTipString("Minimun value of Q in linear scale.")
795        self.qmin.Bind(wx.EVT_KILL_FOCUS, self._onparamEnter)
796        self.qmin.Bind(wx.EVT_TEXT_ENTER, self._onparamEnter)
797     
798        self.qmax    = wx.TextCtrl(self, -1,size=(_BOX_WIDTH,20))
799        self.qmax.SetValue(format_number(self.qmax_x))
800        self.qmax.SetToolTipString("Maximum value of Q in linear scale.")
801        self.qmax.Bind(wx.EVT_KILL_FOCUS, self._onparamEnter)
802        self.qmax.Bind(wx.EVT_TEXT_ENTER, self._onparamEnter)
803     
804        sizer_horizontal=wx.BoxSizer(wx.HORIZONTAL)
805        sizer= wx.GridSizer(3, 3,5, 5)
806       
807        sizer.Add((5,5))
808        sizer.Add(wx.StaticText(self, -1, 'Min'))
809        sizer.Add(wx.StaticText(self, -1, 'Max'))
810        sizer.Add(wx.StaticText(self, -1, 'Q range'))
811             
812        sizer.Add(self.qmin)
813        sizer.Add(self.qmax)
814        sizer_horizontal.Add(sizer)
815        if object!=None:
816            sizer_horizontal.Add(object)
817       
818        if object1!=None:
819           boxsizer1.Add(object1) 
820           boxsizer1.Add((10,10))
821        boxsizer1.Add(sizer_horizontal)
822       
823        #----------------------------------------------------------------
824        self.sizer5.Add(boxsizer1,0, wx.EXPAND | wx.ALL, 10)
825        self.sizer5.Layout()
826        self.SetScrollbars(20,20,200,100)
827   
828       
829               
Note: See TracBrowser for help on using the repository browser.