source: sasview/sansview/perspectives/fitting/simfitpage.py @ 0f7b597

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 0f7b597 was 925a30e, checked in by Gervaise Alina <gervyh@…>, 15 years ago

comments added to class

  • Property mode set to 100644
File size: 9.7 KB
RevLine 
[d89f09b]1
2import sys,re,string, wx   
3from sans.guicomm.events import StatusEvent   
4
[3aae6b6]5class SimultaneousFitPage(wx.ScrolledWindow):
[d89f09b]6    """
7        Simultaneous fitting panel
8        All that needs to be defined are the
9        two data members window_name and window_caption
10    """
[925a30e]11    ## Internal name for the AUI manager
[d89f09b]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):
[3aae6b6]18        wx.ScrolledWindow.__init__(self, parent, *args, **kwargs)
[d89f09b]19        """
20             Simultaneous page display
21        """
22        self.parent = parent
[51d47b5]23        self.page_finder={}
[d89f09b]24        self.sizer3 = wx.GridBagSizer(5,5)
25        self.sizer1 = wx.GridBagSizer(5,5)
[55fd102]26        self.sizer2  = wx.BoxSizer(wx.HORIZONTAL)
[d89f09b]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)
[442895f]41     
[d89f09b]42        text=wx.StaticText(self, -1, 'Constraint')
[55fd102]43        self.sizer2.Add(text,0, wx.LEFT|wx.RIGHT|wx.ADJUST_MINSIZE, 10)
[442895f]44
[d89f09b]45        self.ctl2 = wx.TextCtrl(self, -1, style=wx.TE_MULTILINE)
[948add7]46       
[55fd102]47        self.sizer2.Add(self.ctl2, 0, wx.LEFT|wx.RIGHT|wx.ADJUST_MINSIZE, 10)
[442895f]48       
[55fd102]49        self.sizer2.Add(self.btFit, 0, wx.LEFT|wx.RIGHT|wx.ADJUST_MINSIZE, 10)
[d89f09b]50        self.params=[]
51        self.model_list=[]
52        self.model_toFit=[]
[51d47b5]53       
[d89f09b]54        self.vbox.Layout()
55        self.vbox.Fit(self) 
56        self.SetSizer(self.vbox)
[3aae6b6]57        self.SetScrollbars(20,20,55,40)
[d89f09b]58        self.Centre()
59       
[f343069]60       
[d89f09b]61    def onFit(self,event):
[1b07935d]62        """ signal for fitting"""
[8e81af0]63        for page in self.page_finder.iterkeys():
64            page.set_model_parameter()
[3215d32]65        if len(self.model_toFit) >= 1 :
[8e81af0]66            self._onTextEnter()
67            self.set_model()
[1b07935d]68            self.manager._on_simul_fit()
69        else:
[3c37ba2]70            wx.PostEvent(self.parent.Parent, StatusEvent(status=\
[2fe03d5]71                            "Select at least one model to fit "))
[f343069]72           
[00561739]73           
74           
[d89f09b]75    def set_manager(self, manager):
76        """
77            set panel manager
78            @param manager: instance of plugin fitting
79        """
80        self.manager = manager
[51d47b5]81        self.add_model( self.manager.page_finder)
[d89f09b]82       
[925a30e]83       
[d89f09b]84    def select_all_model_name(self,event):
85        """
86            check all models names
87        """
88        self.model_toFit=[] 
89        if self.cb1.GetValue()==True:
90            for item in self.model_list:
91                item[0].SetValue(True)
[948add7]92                self.manager.schedule_for_fit( value=1,fitproblem =item[1]) 
[d89f09b]93                self.model_toFit.append(item)
94        else:
95            for item in self.model_list:
96                item[0].SetValue(False) 
[89fef2c]97                self.manager.schedule_for_fit( value=0,fitproblem =item[1]) 
[948add7]98               
[d89f09b]99            self.model_toFit=[]
100       
101           
102    def add_model(self,page_finder):
103        """
104            Receive a dictionary containing information to display model name
105            @param page_finder: the dictionary containing models information
106        """
[3215d32]107        if len(self.model_list)>0:
108            for item in self.model_list:
109                item[0].SetValue(False) 
110                self.manager.schedule_for_fit( value=0,fitproblem =item[1])
[d89f09b]111        self.model_list=[]
112        self.model_toFit=[]
113        self.sizer1.Clear(True)
[1b07935d]114        self.page_finder=page_finder
[948add7]115        self.cb1.SetValue(False)
[d89f09b]116        ix = 0
117        iy = 1 
118        list=[]
119        for page, value in page_finder.iteritems():
120            try:
[442895f]121                list = value.get_model()
122                model = list[0]
123                modelname = list[1]
[d89f09b]124                cb = wx.CheckBox(self, -1, modelname, (10, 10))
125                cb.SetValue(False)
126                self.sizer1.Add( cb,( iy,ix),(1,1),  wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15)
127                ix = 0
128                iy += 1 
129                wx.EVT_CHECKBOX(self, cb.GetId(), self.select_model_name)
130                self.model_list.append([cb,value,page,modelname])
131            except:
132                pass
[442895f]133        iy +=1
134        self.sizer1.Add((20,20),( iy,ix),(1,1),  wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15)
[d89f09b]135        self.sizer1.Layout()       
136        self.vbox.Layout()
137       
[925a30e]138       
[d89f09b]139    def remove_model(self,delpage):
140        """
[948add7]141             Remove  a checkbox and the name related to a model selected on page delpage
[d89f09b]142             @param delpage: the page removed
143        """
[6bcdad1]144        self.model_list=[]
145        self.model_toFit=[]
[d89f09b]146        self.sizer1.Clear(True)
[6bcdad1]147       
148        self.cb1.SetValue(False)
[d89f09b]149        ix = 0
150        iy = 1 
[6bcdad1]151        list=[]
152        for page, value in self.page_finder.iteritems():
[d89f09b]153            try:
[6bcdad1]154                if page!= delpage:
155                    list = value.get_model()
156                    model = list[0]
157                    modelname = list[1]
158                    cb = wx.CheckBox(self, -1, modelname, (10, 10))
[d89f09b]159                    cb.SetValue(False)
160                    self.sizer1.Add( cb,( iy,ix),(1,1),  wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15)
161                    ix = 0
162                    iy += 1 
163                    wx.EVT_CHECKBOX(self, cb.GetId(), self.select_model_name)
[6bcdad1]164                    self.model_list.append([cb,value,page,modelname])
[d89f09b]165            except:
[6bcdad1]166                pass
167        iy +=1
168        self.sizer1.Add((20,20),( iy,ix),(1,1),  wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15)
[d89f09b]169        self.sizer1.Layout()       
170        self.vbox.Layout()
171       
[925a30e]172       
[d89f09b]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                self.model_toFit.append(item)
[948add7]181                self.manager.schedule_for_fit( value=1,fitproblem =item[1]) 
[d89f09b]182            else:
[948add7]183                self.manager.schedule_for_fit( value=0,fitproblem =item[1]) 
[d89f09b]184                if item in self.model_toFit:
185                    self.model_toFit.remove(item)
186                    self.cb1.SetValue(False)
[8e81af0]187                   
[d89f09b]188        if len(self.model_list)==len(self.model_toFit):
189            self.cb1.SetValue(True)
190        else:
191            self.cb1.SetValue(False)
[948add7]192     
193       
[d89f09b]194   
195    def set_model(self):
196        """
[925a30e]197            set_model take values in self.params which are the values
198            entered by the user and try to assign them into the model
199            concerned in self.manager. page.finder
[d89f09b]200        """
201        if len(self.params) >0:
202            for item in self.model_toFit:
203                list=item[1].get_model()
204                model=list[0]
[1b07935d]205                param_list=model.getParamList()
[d89f09b]206                if self.params !=[]:
207                    for element in self.params:
[1b07935d]208                        if model.name == str(element[0]):
[d89f09b]209                            for item in param_list:
210                                if item==str(element[1]):
[925a30e]211                                    self.manager.set_page_finder(model.name,element[1],
[d89f09b]212                                                                 str(element[2]))
[925a30e]213                           
[1b07935d]214   
[00561739]215    def _onTextEnter(self):
[d89f09b]216        """
217            get values from the constrainst textcrtl ,parses them into model name
218            parameter name and parameters values.
[925a30e]219            store them in a list self.params .when when params is not empty set_model
220            uses it to reset the appropriate model and its appropriates parameters
[d89f09b]221        """
222        value= self.ctl2.GetValue()
[8e81af0]223        if value:
224            self.params=[]
225            try:
226                expression='[\s,;]'
227                if re.search(expression,value) !=None:
228                    word=re.split(expression,value)
229                    for item in word:
[d89f09b]230                        self.params.append(self.parser_helper(item))
[8e81af0]231                else:
232                    self.params.append(self.parser_helper(value)) 
233            except:
[3c37ba2]234                wx.PostEvent(self.parent.Parent, StatusEvent(status="Constraint Error: %s" % sys.exc_value))
[925a30e]235     
[d89f09b]236       
237    def parser_helper(self,value):
238        """
239             @return  param:a list containing the name of a model ,its parameters
240             value and name extracted from the constrainst controlbox
241        """
242        if string.find(value, "=") !=-1:
243            model_param= re.split("=",value)
244            param_name=model_param[0]
245            param_value=model_param[1]
[925a30e]246           
[d89f09b]247            if string.find(param_name,".")!=-1:
248                param_names= re.split("\.",param_name)
249                model_name=param_names[0]
250                param_name=param_names[1]
[8e81af0]251                param=[str(model_name),param_name,str(param_value)]
[d89f09b]252                return param
253            else:
[51d47b5]254                wx.PostEvent(self.parent.Parent,
255                              StatusEvent(status="cannot evaluate this expression"))
[d89f09b]256                return
257        else:
[51d47b5]258            wx.PostEvent(self.parent.Parent, StatusEvent(status="Missing '=' in expression"))
[ed2ea6a]259           
[d89f09b]260   
261   
Note: See TracBrowser for help on using the repository browser.