source: sasview/sansview/perspectives/fitting/simfitpage.py @ 4e5f660

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 4e5f660 was 6bcdad1, checked in by Gervaise Alina <gervyh@…>, 16 years ago

close page bug fixed

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