source: sasview/sansview/perspectives/fitting/simfitpage.py @ 3c37ba2

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

fixed bugs in constraint error note

  • 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    def onFit(self,event):
62        """ signal for fitting"""
63        for page in self.page_finder.iterkeys():
64            page.set_model_parameter()
65           
66        if len(self.model_toFit) ==1 :
67            self.manager._on_single_fit()
68           # print "simfitpage: when here"
69        elif len(self.model_toFit) > 1 :
70            self._onTextEnter()
71            self.set_model()
72            self.manager._on_simul_fit()
73        else:
74            wx.PostEvent(self.parent.Parent, StatusEvent(status=\
75                            "Select at least on model to fit... "))
76           
77           
78    def set_manager(self, manager):
79        """
80            set panel manager
81            @param manager: instance of plugin fitting
82        """
83        self.manager = manager
84       
85       
86    def select_all_model_name(self,event):
87        """
88            check all models names
89        """
90        self.model_toFit=[] 
91        if self.cb1.GetValue()==True:
92            for item in self.model_list:
93                item[0].SetValue(True)
94                #item[1].schedule_tofit(1)
95                self.manager.schedule_for_fit( value=1,fitproblem =item[1]) 
96                self.model_toFit.append(item)
97        else:
98            #print"simfit: deselected all"
99           
100            for item in self.model_list:
101                item[0].SetValue(False) 
102                self.manager.schedule_for_fit( value=0,fitproblem =item[1]) 
103               
104            self.model_toFit=[]
105       
106           
107    def add_model(self,page_finder):
108        """
109            Receive a dictionary containing information to display model name
110            @param page_finder: the dictionary containing models information
111        """
112       
113        self.model_list=[]
114        self.model_toFit=[]
115        self.sizer1.Clear(True)
116        self.page_finder=page_finder
117        self.cb1.SetValue(False)
118        ix = 0
119        iy = 1 
120        list=[]
121        for page, value in page_finder.iteritems():
122            try:
123                list = value.get_model()
124                model = list[0]
125                modelname = list[1]
126                cb = wx.CheckBox(self, -1, modelname, (10, 10))
127                cb.SetValue(False)
128                self.sizer1.Add( cb,( iy,ix),(1,1),  wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15)
129                ix = 0
130                iy += 1 
131                wx.EVT_CHECKBOX(self, cb.GetId(), self.select_model_name)
132                self.model_list.append([cb,value,page,modelname])
133            except:
134                #wx.PostEvent(self.parent.GrandParent, StatusEvent(status="Simultaneous fit: %s doesn't have a model selected yet %s" % \
135                #(value.get_data().group_id,sys.exc_value)))
136                pass
137        iy +=1
138        self.sizer1.Add((20,20),( iy,ix),(1,1),  wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15)
139        self.sizer1.Layout()       
140        self.vbox.Layout()
141       
142    def remove_model(self,delpage):
143        """
144             Remove  a checkbox and the name related to a model selected on page delpage
145             @param delpage: the page removed
146        """
147        #print "self.model_list",self.model_list
148       
149        self.model_list=[]
150        self.model_toFit=[]
151        self.sizer1.Clear(True)
152       
153        self.cb1.SetValue(False)
154        ix = 0
155        iy = 1 
156        list=[]
157        for page, value in self.page_finder.iteritems():
158            try:
159                if page!= delpage:
160                    list = value.get_model()
161                    model = list[0]
162                    modelname = list[1]
163                    cb = wx.CheckBox(self, -1, modelname, (10, 10))
164                    cb.SetValue(False)
165                    self.sizer1.Add( cb,( iy,ix),(1,1),  wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15)
166                    ix = 0
167                    iy += 1 
168                    wx.EVT_CHECKBOX(self, cb.GetId(), self.select_model_name)
169                    self.model_list.append([cb,value,page,modelname])
170            except:
171                #wx.PostEvent(self.parent.GrandParent, StatusEvent(status="Simultaneous fit: %s doesn't have a model selected yet %s" % \
172                #(value.get_data().group_id,sys.exc_value)))
173                pass
174        iy +=1
175        self.sizer1.Add((20,20),( iy,ix),(1,1),  wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15)
176        self.sizer1.Layout()       
177        self.vbox.Layout()
178       
179    def select_model_name(self,event):
180        """
181            Save interformation related to checkbox and their states
182        """
183        self.model_toFit=[]
184        for item in self.model_list:
185            if item[0].GetValue()==True:
186                #item[1].schedule_tofit('True')
187                #item[1].schedule_tofit(1)
188                self.model_toFit.append(item)
189                print "simultaneous fit ",item[1]
190                self.manager.schedule_for_fit( value=1,fitproblem =item[1]) 
191            else:
192                #print"simfit: deselected one"
193                self.manager.schedule_for_fit( value=0,fitproblem =item[1]) 
194                if item in self.model_toFit:
195                    self.model_toFit.remove(item)
196                    self.cb1.SetValue(False)
197                   
198        if len(self.model_list)==len(self.model_toFit):
199            self.cb1.SetValue(True)
200        else:
201            self.cb1.SetValue(False)
202     
203       
204   
205    def set_model(self):
206        """
207            set_model take values in self.params which are the values enters by the user
208            and try to assign them into the model concerned in self.manager. page.finder
209        """
210        if len(self.params) >0:
211            for item in self.model_toFit:
212                #print"simfitpage: self.model_toFit",item[1]
213                list=item[1].get_model()
214                #print "simfitpage: list fitpanel2",list,list[0]
215                model=list[0]
216                param_list=model.getParamList()
217                #print "simfitpage: on set_model self.params ",self.params
218                if self.params !=[]:
219                    for element in self.params:
220                        if model.name == str(element[0]):
221                            for item in param_list:
222                                if item==str(element[1]):
223                                    #print "simfitpage: on set_model page 1",param_list
224                                    #print "simfitpage: model name",element[0], model.name
225                                    #print "simfitpage: param name ,param value",element[1],element[2]
226                                    self.manager.set_page_finder(model.name,element[1],\
227                                                                 str(element[2]))
228                            #print "simfitpage:on set_model page 2",model.params['A'],self.params[2]
229   
230    def _onTextEnter(self):
231        """
232            get values from the constrainst textcrtl ,parses them into model name
233            parameter name and parameters values.
234            store them in a list self.params .when when params is not empty set_model uses it
235            to reset the appropriate model and its appropriates parameters
236        """
237        value= self.ctl2.GetValue()
238        if value:
239            self.params=[]
240            #print "simfitpage: value",value
241            try:
242                expression='[\s,;]'
243                if re.search(expression,value) !=None:
244                    word=re.split(expression,value)
245                    #print "simfitpage: when herre",word
246                    for item in word:
247                        self.params.append(self.parser_helper(item))
248                else:
249                    self.params.append(self.parser_helper(value)) 
250            except:
251                raise
252                wx.PostEvent(self.parent.Parent, StatusEvent(status="Constraint Error: %s" % sys.exc_value))
253        #print "simfitpage: self.params",self.params
254       
255       
256       
257    def parser_helper(self,value):
258        """
259             @return  param:a list containing the name of a model ,its parameters
260             value and name extracted from the constrainst controlbox
261        """
262        #print "simfitpage: value",value
263        if string.find(value, "=") !=-1:
264            model_param= re.split("=",value)
265            param_name=model_param[0]
266            param_value=model_param[1]
267            #print"simfitpage: ", param_name
268            #print "simfitpage: ",param_value
269            if string.find(param_name,".")!=-1:
270                param_names= re.split("\.",param_name)
271                model_name=param_names[0]
272                param_name=param_names[1]
273                ##### just added
274                #print "simfitpage: param name",model_name,param_name
275           
276                param=[str(model_name),param_name,str(param_value)]
277                #print "simfitpage: param",param
278                return param
279            else:
280                raise ValueError,"cannot evaluate this expression"
281                return
282        else:
283            raise ValueError,"Missing '=' in expression"
284       
285   
286   
Note: See TracBrowser for help on using the repository browser.