source: sasview/sansview/perspectives/fitting/simfitpage.py @ 202a7dc3

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 202a7dc3 was f343069, checked in by Gervaise Alina <gervyh@…>, 16 years ago

improve message on gauge of the status bar

  • Property mode set to 100644
File size: 11.2 KB
Line 
1
2import sys,re,string, wx   
3from sans.guicomm.events import StatusEvent   
4
5class SimultaneousFitPage(wx.ScrolledWindow):
6    """
7        Simultaneous fitting panel
8        All that needs to be defined are the
9        two data members window_name and window_caption
10    """
11      ## Internal name for the AUI manager
12    window_name = "simultaneous Fit page"
13    ## Title to appear on top of the window
14    window_caption = "Simultaneous Fit Page"
15   
16   
17    def __init__(self, parent, *args, **kwargs):
18        wx.ScrolledWindow.__init__(self, parent, *args, **kwargs)
19        """
20             Simultaneous page display
21        """
22        self.parent = parent
23        self.sizer3 = wx.GridBagSizer(5,5)
24        self.sizer1 = wx.GridBagSizer(5,5)
25        #self.sizer2 = wx.GridBagSizer(5,5)
26        self.sizer2  = wx.BoxSizer(wx.HORIZONTAL)
27        self.vbox  = wx.BoxSizer(wx.VERTICAL)
28        self.vbox.Add(self.sizer3)
29        self.vbox.Add(self.sizer1)
30        self.vbox.Add(self.sizer2)
31        id = wx.NewId()
32        self.btFit =wx.Button(self,id,'Constraint Fit')
33        self.btFit.Bind(wx.EVT_BUTTON, self.onFit,id=id)
34        self.btFit.SetToolTipString("Perform fit.")
35        ix = 0
36        iy = 1 
37        self.cb1 = wx.CheckBox(self, -1,'Models', (10, 10))
38        self.sizer3.Add(self.cb1,(iy, ix),(1,1),\
39                        wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15)
40        wx.EVT_CHECKBOX(self, self.cb1.GetId(), self.select_all_model_name)
41     
42        text=wx.StaticText(self, -1, 'Constraint')
43        self.sizer2.Add(text,0, wx.LEFT|wx.RIGHT|wx.ADJUST_MINSIZE, 10)
44
45        self.ctl2 = wx.TextCtrl(self, -1, style=wx.TE_MULTILINE)
46       
47        self.sizer2.Add(self.ctl2, 0, wx.LEFT|wx.RIGHT|wx.ADJUST_MINSIZE, 10)
48       
49        self.sizer2.Add(self.btFit, 0, wx.LEFT|wx.RIGHT|wx.ADJUST_MINSIZE, 10)
50        self.params=[]
51        self.model_list=[]
52        self.model_toFit=[]
53        self.page_finder={}
54       
55        self.vbox.Layout()
56        self.vbox.Fit(self) 
57        self.SetSizer(self.vbox)
58        self.SetScrollbars(20,20,55,40)
59        self.Centre()
60       
61       
62    def onFit(self,event):
63        """ signal for fitting"""
64        for page in self.page_finder.iterkeys():
65            page.set_model_parameter()
66           
67        if len(self.model_toFit) ==1 :
68            self.manager._on_single_fit()
69           # print "simfitpage: when here"
70        elif len(self.model_toFit) > 1 :
71            self._onTextEnter()
72            self.set_model()
73            self.manager._on_simul_fit()
74        else:
75            wx.PostEvent(self.parent.Parent, StatusEvent(status=\
76                            "Select at least on model to fit "))
77           
78           
79           
80    def set_manager(self, manager):
81        """
82            set panel manager
83            @param manager: instance of plugin fitting
84        """
85        self.manager = manager
86       
87       
88    def select_all_model_name(self,event):
89        """
90            check all models names
91        """
92        self.model_toFit=[] 
93        if self.cb1.GetValue()==True:
94            for item in self.model_list:
95                item[0].SetValue(True)
96                #item[1].schedule_tofit(1)
97                self.manager.schedule_for_fit( value=1,fitproblem =item[1]) 
98                self.model_toFit.append(item)
99        else:
100            #print"simfit: deselected all"
101           
102            for item in self.model_list:
103                item[0].SetValue(False) 
104                self.manager.schedule_for_fit( value=0,fitproblem =item[1]) 
105               
106            self.model_toFit=[]
107       
108           
109    def add_model(self,page_finder):
110        """
111            Receive a dictionary containing information to display model name
112            @param page_finder: the dictionary containing models information
113        """
114       
115        self.model_list=[]
116        self.model_toFit=[]
117        self.sizer1.Clear(True)
118        self.page_finder=page_finder
119        self.cb1.SetValue(False)
120        ix = 0
121        iy = 1 
122        list=[]
123        for page, value in page_finder.iteritems():
124            try:
125                list = value.get_model()
126                model = list[0]
127                modelname = list[1]
128                cb = wx.CheckBox(self, -1, modelname, (10, 10))
129                cb.SetValue(False)
130                self.sizer1.Add( cb,( iy,ix),(1,1),  wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15)
131                ix = 0
132                iy += 1 
133                wx.EVT_CHECKBOX(self, cb.GetId(), self.select_model_name)
134                self.model_list.append([cb,value,page,modelname])
135            except:
136                #wx.PostEvent(self.parent.GrandParent, StatusEvent(status="Simultaneous fit: %s doesn't have a model selected yet %s" % \
137                #(value.get_data().group_id,sys.exc_value)))
138                pass
139        iy +=1
140        self.sizer1.Add((20,20),( iy,ix),(1,1),  wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15)
141        self.sizer1.Layout()       
142        self.vbox.Layout()
143       
144    def remove_model(self,delpage):
145        """
146             Remove  a checkbox and the name related to a model selected on page delpage
147             @param delpage: the page removed
148        """
149        #print "self.model_list",self.model_list
150       
151        self.model_list=[]
152        self.model_toFit=[]
153        self.sizer1.Clear(True)
154       
155        self.cb1.SetValue(False)
156        ix = 0
157        iy = 1 
158        list=[]
159        for page, value in self.page_finder.iteritems():
160            try:
161                if page!= delpage:
162                    list = value.get_model()
163                    model = list[0]
164                    modelname = list[1]
165                    cb = wx.CheckBox(self, -1, modelname, (10, 10))
166                    cb.SetValue(False)
167                    self.sizer1.Add( cb,( iy,ix),(1,1),  wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15)
168                    ix = 0
169                    iy += 1 
170                    wx.EVT_CHECKBOX(self, cb.GetId(), self.select_model_name)
171                    self.model_list.append([cb,value,page,modelname])
172            except:
173                #wx.PostEvent(self.parent.GrandParent, StatusEvent(status="Simultaneous fit: %s doesn't have a model selected yet %s" % \
174                #(value.get_data().group_id,sys.exc_value)))
175                pass
176        iy +=1
177        self.sizer1.Add((20,20),( iy,ix),(1,1),  wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15)
178        self.sizer1.Layout()       
179        self.vbox.Layout()
180       
181    def select_model_name(self,event):
182        """
183            Save interformation related to checkbox and their states
184        """
185        self.model_toFit=[]
186        for item in self.model_list:
187            if item[0].GetValue()==True:
188                #item[1].schedule_tofit('True')
189                #item[1].schedule_tofit(1)
190                self.model_toFit.append(item)
191                self.manager.schedule_for_fit( value=1,fitproblem =item[1]) 
192            else:
193                #print"simfit: deselected one"
194                self.manager.schedule_for_fit( value=0,fitproblem =item[1]) 
195                if item in self.model_toFit:
196                    self.model_toFit.remove(item)
197                    self.cb1.SetValue(False)
198                   
199        if len(self.model_list)==len(self.model_toFit):
200            self.cb1.SetValue(True)
201        else:
202            self.cb1.SetValue(False)
203     
204       
205   
206    def set_model(self):
207        """
208            set_model take values in self.params which are the values enters by the user
209            and try to assign them into the model concerned in self.manager. page.finder
210        """
211        if len(self.params) >0:
212            for item in self.model_toFit:
213                #print"simfitpage: self.model_toFit",item[1]
214                list=item[1].get_model()
215                #print "simfitpage: list fitpanel2",list,list[0]
216                model=list[0]
217                param_list=model.getParamList()
218                #print "simfitpage: on set_model self.params ",self.params
219                if self.params !=[]:
220                    for element in self.params:
221                        if model.name == str(element[0]):
222                            for item in param_list:
223                                if item==str(element[1]):
224                                    #print "simfitpage: on set_model page 1",param_list
225                                    #print "simfitpage: model name",element[0], model.name
226                                    #print "simfitpage: param name ,param value",element[1],element[2]
227                                    self.manager.set_page_finder(model.name,element[1],\
228                                                                 str(element[2]))
229                            #print "simfitpage:on set_model page 2",model.params['A'],self.params[2]
230   
231    def _onTextEnter(self):
232        """
233            get values from the constrainst textcrtl ,parses them into model name
234            parameter name and parameters values.
235            store them in a list self.params .when when params is not empty set_model uses it
236            to reset the appropriate model and its appropriates parameters
237        """
238        value= self.ctl2.GetValue()
239        if value:
240            self.params=[]
241            #print "simfitpage: value",value
242            try:
243                expression='[\s,;]'
244                if re.search(expression,value) !=None:
245                    word=re.split(expression,value)
246                    #print "simfitpage: when herre",word
247                    for item in word:
248                        self.params.append(self.parser_helper(item))
249                else:
250                    self.params.append(self.parser_helper(value)) 
251            except:
252                raise
253                wx.PostEvent(self.parent.Parent, StatusEvent(status="Constraint Error: %s" % sys.exc_value))
254        #print "simfitpage: self.params",self.params
255       
256       
257       
258    def parser_helper(self,value):
259        """
260             @return  param:a list containing the name of a model ,its parameters
261             value and name extracted from the constrainst controlbox
262        """
263        #print "simfitpage: value",value
264        if string.find(value, "=") !=-1:
265            model_param= re.split("=",value)
266            param_name=model_param[0]
267            param_value=model_param[1]
268            #print"simfitpage: ", param_name
269            #print "simfitpage: ",param_value
270            if string.find(param_name,".")!=-1:
271                param_names= re.split("\.",param_name)
272                model_name=param_names[0]
273                param_name=param_names[1]
274                ##### just added
275                #print "simfitpage: param name",model_name,param_name
276           
277                param=[str(model_name),param_name,str(param_value)]
278                #print "simfitpage: param",param
279                return param
280            else:
281                raise ValueError,"cannot evaluate this expression"
282                return
283        else:
284            raise ValueError,"Missing '=' in expression"
285       
286   
287   
Note: See TracBrowser for help on using the repository browser.