source: sasview/sansview/perspectives/fitting/simfitpage.py @ d250f7d

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

scroll bar added

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