source: sasview/sansview/perspectives/fitting/simfitpage.py @ 948add7

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

perform single fit when selecting one model on simul_page

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