source: sasview/sansview/perspectives/fitting/simfitpage.py @ 2139c3f

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 2139c3f was 8e81af0, checked in by Gervaise Alina <gervyh@…>, 16 years ago

working on simultaneous fit

  • Property mode set to 100644
File size: 10.9 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        self.vbox.Layout()
56        self.vbox.Fit(self) 
57        self.SetSizer(self.vbox)
58        self.Centre()
59       
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.GrandParent, 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            self.manager.schedule_for_fit( value=0,fitproblem =item[1]) 
100            for item in self.model_list:
101                item[0].SetValue(False) 
102                #item[1].schedule_tofit(0)
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        self.sizer1.Clear(True)
148        ix = 0
149        iy = 1 
150        for item in self.model_list:
151            try:
152                # redraw the panel without the name of the model associated
153                # with the page to delete
154                if not delpage in item:
155                    #print "simfitpage:  redraw modelname",item[3]
156                    cb = wx.CheckBox(self, -1, item[3], (10, 10))
157                    cb.SetValue(False)
158                    self.sizer1.Add( cb,( iy,ix),(1,1),  wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15)
159                    ix = 0
160                    iy += 1 
161                    wx.EVT_CHECKBOX(self, cb.GetId(), self.select_model_name)
162                else:
163                    # if the page to delete in item remove it from the model list
164                    self.model_list.remove(item)
165            except:
166                 wx.PostEvent(self.parent.GrandParent, StatusEvent(status="Page deletion Error: %s" % sys.exc_value))
167                 
168        self.sizer1.Layout()       
169        self.vbox.Layout()
170           
171       
172    def select_model_name(self,event):
173        """
174            Save interformation related to checkbox and their states
175        """
176        self.model_toFit=[]
177        for item in self.model_list:
178            if item[0].GetValue()==True:
179                item[1].schedule_tofit('True')
180                self.model_toFit.append(item)
181                self.manager.schedule_for_fit( value=1,fitproblem =item[1]) 
182            else:
183                #print"simfit: deselected one"
184                self.manager.schedule_for_fit( value=0,fitproblem =item[1]) 
185                if item in self.model_toFit:
186                    self.model_toFit.remove(item)
187                    self.cb1.SetValue(False)
188                   
189        if len(self.model_list)==len(self.model_toFit):
190            self.cb1.SetValue(True)
191        else:
192            self.cb1.SetValue(False)
193     
194       
195   
196    def set_model(self):
197        """
198            set_model take values in self.params which are the values enters by the user
199            and try to assign them into the model concerned in self.manager. page.finder
200        """
201        if len(self.params) >0:
202            for item in self.model_toFit:
203                #print"simfitpage: self.model_toFit",item[1]
204                list=item[1].get_model()
205                #print "simfitpage: list fitpanel2",list,list[0]
206                model=list[0]
207                param_list=model.getParamList()
208                print "simfitpage: on set_model self.params ",self.params
209                if self.params !=[]:
210                    for element in self.params:
211                        if model.name == str(element[0]):
212                            for item in param_list:
213                                if item==str(element[1]):
214                                    print "simfitpage: on set_model page 1",param_list
215                                    print "simfitpage: model name",element[0], model.name
216                                    print "simfitpage: param name ,param value",element[1],element[2]
217                                    self.manager.set_page_finder(model.name,element[1],\
218                                                                 str(element[2]))
219                            #print "simfitpage:on set_model page 2",model.params['A'],self.params[2]
220   
221    def _onTextEnter(self):
222        """
223            get values from the constrainst textcrtl ,parses them into model name
224            parameter name and parameters values.
225            store them in a list self.params .when when params is not empty set_model uses it
226            to reset the appropriate model and its appropriates parameters
227        """
228        value= self.ctl2.GetValue()
229        if value:
230            self.params=[]
231            #print "simfitpage: value",value
232            try:
233                expression='[\s,;]'
234                if re.search(expression,value) !=None:
235                    word=re.split(expression,value)
236                    #print "simfitpage: when herre",word
237                    for item in word:
238                        self.params.append(self.parser_helper(item))
239                else:
240                    self.params.append(self.parser_helper(value)) 
241            except:
242                raise
243                wx.PostEvent(self.parent.GrandParent, StatusEvent(status="Constraint Error: %s" % sys.exc_value))
244        #print "simfitpage: self.params",self.params
245       
246       
247       
248    def parser_helper(self,value):
249        """
250             @return  param:a list containing the name of a model ,its parameters
251             value and name extracted from the constrainst controlbox
252        """
253        #print "simfitpage: value",value
254        if string.find(value, "=") !=-1:
255            model_param= re.split("=",value)
256            param_name=model_param[0]
257            param_value=model_param[1]
258            #print"simfitpage: ", param_name
259            #print "simfitpage: ",param_value
260            if string.find(param_name,".")!=-1:
261                param_names= re.split("\.",param_name)
262                model_name=param_names[0]
263                param_name=param_names[1]
264                ##### just added
265                print "simfitpage: param name",model_name,param_name
266           
267                param=[str(model_name),param_name,str(param_value)]
268                #print "simfitpage: param",param
269                return param
270            else:
271                raise ValueError,"cannot evaluate this expression"
272                return
273        else:
274            raise ValueError,"Missing '=' in expression"
275       
276   
277   
Note: See TracBrowser for help on using the repository browser.