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

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 c8c5b9a was 1b07935d, checked in by Gervaise Alina <gervyh@…>, 16 years ago

creating a panel for model display

  • Property mode set to 100644
File size: 8.6 KB
Line 
1import sys
2import wx
3import wx.lib
4import numpy
5import copy
6
7from sans.guicomm.events import StatusEvent   
8(ModelEventbox, EVT_MODEL_BOX) = wx.lib.newevent.NewEvent()
9_BOX_WIDTH = 80
10
11def format_number(value, high=False):
12    """
13        Return a float in a standardized, human-readable formatted string
14    """
15    try: 
16        value = float(value)
17    except:
18        print "returning 0"
19        return "0"
20   
21    if high:
22        return "%-6.4g" % value
23    else:
24        return "%-5.3g" % value
25
26   
27class ModelPage(wx.Panel):
28    """
29        FitPanel class contains fields allowing to display results when
30        fitting  a model and one data
31        @note: For Fit to be performed the user should check at least one parameter
32        on fit Panel window.
33 
34    """
35    ## Internal name for the AUI manager
36    window_name = "Fit page"
37    ## Title to appear on top of the window
38    window_caption = "Fit Page"
39   
40   
41    def __init__(self, parent,model, *args, **kwargs):
42        wx.Panel.__init__(self, parent, *args, **kwargs)
43        """
44            Initialization of the Panel
45        """
46        self.manager = None
47        self.parent  = parent
48        self.event_owner=None
49        #panel interface
50        self.vbox  = wx.BoxSizer(wx.VERTICAL)
51       
52        self.sizer3 = wx.GridBagSizer(5,5)
53        self.sizer2 = wx.GridBagSizer(5,5)
54       
55        self.modelbox = wx.ComboBox(self, -1)
56        id = wx.NewId()
57       
58        self.vbox.Add(self.sizer3)
59        self.vbox.Add(self.sizer2)
60     
61        ix = 0
62        iy = 1
63       
64        self.sizer3.Add(wx.StaticText(self,-1,'Model'),(iy,ix),(1,1)\
65                  , wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15)
66        ix += 1
67        self.sizer3.Add(self.modelbox,(iy,ix),(1,1),  wx.EXPAND|wx.ADJUST_MINSIZE, 0)
68       
69        # contains link between  model ,all its parameters, and panel organization
70        self.parameters=[]
71        #contains link between a model and selected parameters to fit
72        self.param_toFit=[]
73        # model on which the fit would be performed
74        self.model=model
75        self.set_panel(model)
76        # preview selected model name
77        self.prevmodel_name=model.__class__.__name__
78        self.modelbox.SetValue(self.prevmodel_name)
79        # flag to check if the user has selected a new model in the combox box
80        self.model_hasChanged=False
81       
82        #dictionary of model name and model class
83        self.model_list_box={}
84        # Data1D to make a deep comparison between 2 Data1D for checking data
85        #change
86       
87        self.vbox.Layout()
88        self.vbox.Fit(self) 
89        self.SetSizer(self.vbox)
90        self.Centre()
91       
92       
93    def set_owner(self,owner):
94        """
95            set owner of fitpage
96            @param owner: the class responsible of plotting
97        """
98        self.event_owner=owner   
99   
100 
101    def set_manager(self, manager):
102        """
103             set panel manager
104             @param manager: instance of plugin fitting
105        """
106        self.manager = manager
107 
108    def populate_box(self, dict):
109        """
110            Populate each combox box of each page
111            @param page: the page to populate
112        """
113        id=0
114        self.model_list_box=dict
115        for item in self.model_list_box.itervalues():
116            if hasattr(item, "name"):
117                name = item.name
118            else:
119                name = item.__name__
120           
121            self.modelbox.Insert(name,int(id))
122            id+=1
123           
124            wx.EVT_COMBOBOX(self.modelbox,-1, self._on_select_model) 
125        return 0
126   
127   
128    def _on_select_model(self,event):
129        """
130            react when a model is selected from page's combo box
131            post an event to its owner to draw an appropriate theory
132        """
133        print "modelpage: self.model_list_box ",self.model_list_box
134        for item in self.model_list_box.itervalues():
135            model=item()
136            print "modelpage:model",model
137            if hasattr(model, "name"):
138                name = model.name
139            else:
140                name = model.__class__.__name__
141            try:
142                if name ==event.GetString():
143                    self.model=model
144                    self.set_panel(self.model)
145                    self.manager.draw_model(self.model)
146            except:
147                raise #ValueError,"model.name is not equal to model class name"
148    def set_model_name(self,name):
149        """
150            set model name. set also self.model_hasChanged to true is the model
151            type has changed or false if it didn't
152            @param name: model 's name
153        """
154        self.model_hasChanged=False
155        if (name != self.prevmodel_name):
156            self.model_hasChanged=True
157       
158        self.prevmodel_name=self.modelbox.GetValue()
159       
160           
161    def get_model_box(self): 
162        """ return reference to combox box self.model"""
163        return self.modelbox
164
165   
166    def get_param_list(self):
167        """
168            @return self.param_toFit: list containing  references to TextCtrl
169            checked.Theses TextCtrl will allow reference to parameters to fit.
170            @raise: if return an empty list of parameter fit will nnote work
171            properly so raise ValueError,"missing parameter to fit"
172        """
173        if self.param_toFit !=[]:
174            return self.param_toFit
175        else:
176            raise ValueError,"missing parameter to fit"
177       
178       
179    def set_panel(self,model):
180        """
181            Build the panel from the model content
182            @param model: the model selected in combo box for fitting purpose
183        """
184   
185        self.sizer2.Clear(True)
186        self.parameters = []
187        self.param_toFit=[]
188        self.model = model
189        keys = self.model.getParamList()
190        keys.sort()
191        iy = 1
192        ix = 0
193        self.cb1 = wx.StaticText(self, -1,'Parameters')
194        self.sizer2.Add(self.cb1,(iy, ix),(1,1),\
195                          wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15)
196        ix +=1
197        self.text2_2 = wx.StaticText(self, -1, 'Values')
198        self.sizer2.Add(self.text2_2,(iy, ix),(1,1),\
199                            wx.EXPAND|wx.ADJUST_MINSIZE, 0) 
200        ix +=1
201        self.text2_4 = wx.StaticText(self, -1, 'Units')
202        self.sizer2.Add(self.text2_4,(iy, ix),(1,1),\
203                            wx.EXPAND|wx.ADJUST_MINSIZE, 0) 
204        self.text2_4.Hide()
205        for item in keys:
206            iy += 1
207            ix = 0
208            cb=wx.StaticText(self, -1, item)
209            self.sizer2.Add( cb,( iy, ix),(1,1),  wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15)
210            ix += 1
211            value= self.model.getParam(item)
212            ctl1 = wx.TextCtrl(self, -1, size=(_BOX_WIDTH,20), style=wx.TE_PROCESS_ENTER)
213            ctl1.SetValue(str (format_number(value)))
214            ctl1.Bind(wx.EVT_KILL_FOCUS, self._onparamEnter)
215            self.sizer2.Add(ctl1, (iy,ix),(1,1), wx.EXPAND|wx.ADJUST_MINSIZE, 0)
216           
217            ix +=1
218            # Units
219            try:
220                units = wx.StaticText(self, -1, self.model.details[item][0], style=wx.ALIGN_LEFT)
221            except:
222                units = wx.StaticText(self, -1, "", style=wx.ALIGN_LEFT)
223            self.sizer2.Add(units, (iy,ix),(1,1),  wx.EXPAND|wx.ADJUST_MINSIZE, 0)
224            #save data
225            self.parameters.append([cb,ctl1])
226        #Display units text on panel
227        for item in keys:   
228            if self.model.details[item][0]!='':
229                self.text2_4.Show()
230                break
231            else:
232                self.text2_4.Hide()
233       
234        self.vbox.Layout()
235        self.GrandParent.GetSizer().Layout()
236       
237       
238    def _onparamEnter(self,event):
239        """
240            when enter value on panel redraw model according to changed
241        """
242        self.set_model_parameter()
243       
244    def set_model_parameter(self):
245        if len(self.parameters) !=0 and self.model !=None:
246            for item in self.parameters:
247                try:
248                     name=str(item[0])
249                     value= float(item[1].GetValue())
250                     
251                     self.model.setParam(name,value)
252                     self.manager.draw_model(self.model)
253                except:
254                     wx.PostEvent(self.parent.GrandParent, StatusEvent(status=\
255                            "Drawing  Error:wrong value entered : %s"% sys.exc_value))
256   
257 
Note: See TracBrowser for help on using the repository browser.