source: sasview/sansview/perspectives/fitting/simfitpage.py @ 65b788b2

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

constraint fitting is not working yet

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