Changeset 26bf293 in sasview for sansview/perspectives/fitting/fitpage1D.py
- Timestamp:
- Feb 2, 2009 7:28:06 PM (16 years ago)
- Branches:
- master, ESS_GUI, ESS_GUI_Docs, ESS_GUI_batch_fitting, ESS_GUI_bumps_abstraction, ESS_GUI_iss1116, ESS_GUI_iss879, ESS_GUI_iss959, ESS_GUI_opencl, ESS_GUI_ordering, ESS_GUI_sync_sascalc, costrafo411, magnetic_scatt, release-4.1.1, release-4.1.2, release-4.2.2, release_4.0.1, ticket-1009, ticket-1094-headless, ticket-1242-2d-resolution, ticket-1243, ticket-1249, ticket885, unittest-saveload
- Children:
- ca88b2e
- Parents:
- 2cf2b87
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
sansview/perspectives/fitting/fitpage1D.py
r00d083c r26bf293 5 5 import copy 6 6 import sans.models.dispersion_models 7 from sans.guicomm.events import StatusEvent 7 from sans.guicomm.events import StatusEvent 8 from sans.guiframe.utils import format_number 9 from modelpage import ModelPage 10 from modelpage import format_number 8 11 (ModelEventbox, EVT_MODEL_BOX) = wx.lib.newevent.NewEvent() 9 12 _BOX_WIDTH = 80 10 13 11 def format_number(value, high=False):12 """13 Return a float in a standardized, human-readable formatted string14 """15 try:16 value = float(value)17 except:18 print "returning 0"19 return "0"20 21 if high:22 return "%-6.4g" % value23 else:24 return "%-5.3g" % value25 14 26 from modelpage import format_number 27 from modelpage import ModelPage 15 28 16 class FitPage1D(ModelPage): 29 17 """ … … 45 33 Initialization of the Panel 46 34 """ 47 #self.scroll = wx.ScrolledWindow(self)48 35 self.data = data 36 self.enable2D=False 49 37 self.manager = None 50 38 self.parent = parent … … 52 40 #panel interface 53 41 self.vbox = wx.BoxSizer(wx.VERTICAL) 42 self.sizer10 = wx.GridBagSizer(5,5) 43 self.sizer9 = wx.GridBagSizer(5,5) 44 self.sizer8 = wx.GridBagSizer(5,5) 45 self.sizer7 = wx.GridBagSizer(5,5) 54 46 self.sizer6 = wx.GridBagSizer(5,5) 55 47 self.sizer5 = wx.GridBagSizer(5,5) … … 58 50 self.sizer2 = wx.GridBagSizer(5,5) 59 51 self.sizer1 = wx.GridBagSizer(5,5) 60 61 52 # Add layer 53 #data info layer 54 self.vbox.Add(self.sizer1) 55 #data range 56 self.vbox.Add(self.sizer2) 57 #instrument smearing selection layer 58 self.vbox.Add(self.sizer3) 59 #model selection 60 self.vbox.Add(wx.StaticLine(self, -1), 0, wx.EXPAND, 0) 61 self.vbox.Add(self.sizer4) 62 #model paramaters layer 63 self.vbox.Add(self.sizer5) 64 #polydispersion selected 65 self.vbox.Add(wx.StaticLine(self, -1), 0, wx.EXPAND, 0) 66 self.vbox.Add(self.sizer6) 67 #combox box for type of dispersion 68 self.vbox.Add(self.sizer7) 69 #dispersion parameters layer 70 self.vbox.Add(self.sizer8) 71 #fit info layer 72 self.vbox.Add(wx.StaticLine(self, -1), 0, wx.EXPAND, 0) 73 self.vbox.Add(self.sizer9) 74 #close layer 75 self.vbox.Add(wx.StaticLine(self, -1), 0, wx.EXPAND, 0) 76 self.vbox.Add(self.sizer10) 77 78 #---------sizer 1 draw-------------------------------- 62 79 self.DataSource =wx.StaticText(self, -1,str(data.name)) 63 80 self.smearer_box = wx.ComboBox(self, -1) … … 74 91 self.smearer_box.Insert(str(v),i) 75 92 i+=1 93 94 # Minimum value of data 95 self.data_min = wx.StaticText(self, -1,str(format_number(numpy.min(data.x)))) 96 # Maximum value of data 97 self.data_max = wx.StaticText(self, -1,str(format_number(numpy.max(data.x)))) 98 #Filing the sizer containing data related fields 99 ix = 0 100 iy = 1 101 self.sizer1.Add(wx.StaticText(self, -1, 'Data Source Name : '),(iy,ix),\ 102 (1,1), wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15) 103 104 ix += 1 105 self.sizer1.Add(self.DataSource,(iy,ix),(1,1), wx.EXPAND|wx.ADJUST_MINSIZE, 0) 106 107 #---------sizer 2 draw-------------------------------- 108 ix = 0 109 iy = 1 110 #set maximum range for x in linear scale 111 self.text4_3 = wx.StaticText(self, -1, 'Maximum Data Range(Linear)', style=wx.ALIGN_LEFT) 112 self.sizer2.Add(self.text4_3,(iy,ix),(1,1),\ 113 wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15) 114 ix += 2 115 self.sizer2.Add(wx.StaticText(self, -1, 'Min :'),(iy, ix),(1,1),\ 116 wx.EXPAND|wx.ADJUST_MINSIZE, 0) 117 ix += 1 118 self.sizer2.Add(self.data_min,(iy, ix),(1,1),\ 119 wx.EXPAND|wx.ADJUST_MINSIZE, 0) 120 ix += 1 121 self.sizer2.Add(wx.StaticText(self, -1, 'Max : '),(iy, ix),(1,1),\ 122 wx.EXPAND|wx.ADJUST_MINSIZE, 0) 123 ix += 1 124 self.sizer2.Add(self.data_max,(iy,ix),(1,1), wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 0) 125 126 #----sizer 3 draw-------------------------------- 127 ix = 0 128 iy = 1 129 self.sizer3.Add(wx.StaticText(self,-1,'Instrument Smearing'),(iy,ix),(1,1)\ 130 , wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15) 131 ix += 1 132 self.sizer3.Add(self.smearer_box,(iy,ix),(1,1), wx.EXPAND|wx.ADJUST_MINSIZE, 0) 133 ix =0 134 iy+=1 135 self.sizer3.Add((20,20),(iy,ix),(1,1),wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15) 136 137 #------------------ sizer 4 draw------------------------ 76 138 self.modelbox = wx.ComboBox(self, -1) 139 140 #filling sizer2 141 ix = 0 142 iy = 1 143 self.sizer4.Add(wx.StaticText(self,-1,'Model'),(iy,ix),(1,1)\ 144 , wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15) 145 ix += 1 146 self.sizer4.Add(self.modelbox,(iy,ix),(1,1), wx.EXPAND|wx.ADJUST_MINSIZE, 0) 147 148 #----------sizer6------------------------------------------------- 149 self.disable_disp = wx.RadioButton(self, -1, 'No', (10, 10), style=wx.RB_GROUP) 150 self.enable_disp = wx.RadioButton(self, -1, 'Yes', (10, 30)) 151 self.Bind(wx.EVT_RADIOBUTTON, self.Set_DipersParam, id=self.disable_disp.GetId()) 152 self.Bind(wx.EVT_RADIOBUTTON, self.Set_DipersParam, id=self.enable_disp.GetId()) 153 ix= 0 154 iy=1 155 self.sizer6.Add(wx.StaticText(self,-1,'Polydispersity: '),(iy,ix),(1,1)\ 156 , wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15) 157 ix += 1 158 self.sizer6.Add(self.enable_disp ,(iy,ix),(1,1), wx.EXPAND|wx.ADJUST_MINSIZE, 0) 159 ix += 1 160 self.sizer6.Add(self.disable_disp ,(iy,ix),(1,1), wx.EXPAND|wx.ADJUST_MINSIZE, 0) 161 ix =0 162 iy+=1 163 self.sizer6.Add((20,20),(iy,ix),(1,1),wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15) 164 165 166 #---------sizer 9 draw---------------------------------------- 167 self.tcChi = wx.StaticText(self, -1, str(0), style=wx.ALIGN_LEFT) 168 self.tcChi.Hide() 169 self.text1_1 = wx.StaticText(self, -1, 'Chi2/dof', style=wx.ALIGN_LEFT) 170 self.text1_1.Hide() 171 77 172 id = wx.NewId() 78 173 self.btFit =wx.Button(self,id,'Fit') 79 174 self.btFit.Bind(wx.EVT_BUTTON, self.onFit,id=id) 80 175 self.btFit.SetToolTipString("Perform fit.") 81 self.static_line_1 = wx.StaticLine(self, -1) 82 83 self.vbox.Add(self.sizer3) 84 self.vbox.Add(self.sizer2) 85 self.vbox.Add(self.static_line_1, 0, wx.EXPAND, 0) 86 self.vbox.Add(self.sizer5) 87 self.vbox.Add(self.sizer6) 88 self.vbox.Add(self.sizer4) 89 self.vbox.Add(self.sizer1) 90 176 ## Q range 177 print "self.data fitpage1D" , self.data,hasattr(self.data,"data") 178 if not hasattr(self.data,"data"): 179 self.qmin_x= numpy.min(self.data.x) 180 self.qmax_x= numpy.max(self.data.x) 181 else: 182 radius1= math.sqrt(math.pow(self.data.xmin, 2)+ math.pow(self.data.ymin, 2)) 183 radius2= math.sqrt(math.pow(self.data.xmax, 2)+ math.pow(self.data.ymin, 2)) 184 radius3= math.sqrt(math.pow(self.data.xmin, 2)+ math.pow(self.data.ymax, 2)) 185 radius4= math.sqrt(math.pow(self.data.xmax, 2)+ math.pow(self.data.ymax, 2)) 186 self.qmin_x =0 187 self.qmax_x= max(radius1, radius2, radius3, radius4) 188 print "data2D range",self.qmax_x 189 self.num_points= 100 190 191 192 193 self.qmin = wx.TextCtrl(self, -1,size=(_BOX_WIDTH,20)) 194 self.qmin.SetValue(str(format_number(self.qmin_x))) 195 self.qmin.SetToolTipString("Minimun value of x in linear scale.") 196 self.qmin.Bind(wx.EVT_KILL_FOCUS, self._onparamEnter) 197 self.qmin.Bind(wx.EVT_TEXT_ENTER, self._onparamEnter) 198 self.qmin.Disable() 199 200 self.qmax = wx.TextCtrl(self, -1,size=(_BOX_WIDTH,20)) 201 self.qmax.SetValue(str(format_number(self.qmax_x))) 202 self.qmax.SetToolTipString("Maximum value of x in linear scale.") 203 self.qmax.Bind(wx.EVT_KILL_FOCUS, self._onparamEnter) 204 self.qmax.Bind(wx.EVT_TEXT_ENTER, self._onparamEnter) 205 self.qmax.Disable() 206 207 self.npts = wx.TextCtrl(self, -1,size=(_BOX_WIDTH,20)) 208 self.npts.SetValue(format_number(self.num_points)) 209 self.npts.SetToolTipString("Number of point to plot.") 210 self.npts.Bind(wx.EVT_KILL_FOCUS, self._onparamEnter) 211 self.npts.Bind(wx.EVT_TEXT_ENTER, self._onparamEnter) 212 self.npts.Disable() 213 self.npts.Hide() 214 ix = 0 215 iy = 1 216 self.sizer9.Add(wx.StaticText(self, -1, 'Fitting Range'),(iy, ix),(1,1),\ 217 wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15) 218 ix += 1 219 self.sizer9.Add(wx.StaticText(self, -1, 'Min'),(iy, ix),(1,1),\ 220 wx.EXPAND|wx.ADJUST_MINSIZE, 0) 221 ix += 1 222 self.sizer9.Add(wx.StaticText(self, -1, 'Max'),(iy, ix),(1,1),\ 223 wx.EXPAND|wx.ADJUST_MINSIZE, 0) 224 #ix += 1 225 #self.sizer9.Add(wx.StaticText(self, -1, 'Npts'),(iy, ix),(1,1),\ 226 # wx.EXPAND|wx.ADJUST_MINSIZE, 0) 227 ix = 0 228 iy += 1 229 self.sizer9.Add(wx.StaticText(self, -1, 'x range'),(iy, ix),(1,1),\ 230 wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15) 231 ix += 1 232 self.sizer9.Add(self.qmin,(iy, ix),(1,1), wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 0) 233 ix += 1 234 self.sizer9.Add(self.qmax,(iy,ix),(1,1), wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 0) 235 ix += 1 236 self.sizer9.Add(self.npts,(iy,ix),(1,1), wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 0) 237 ix = 0 238 iy += 1 239 self.sizer9.Add(self.text1_1,(iy,ix),(1,1),\ 240 wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15) 241 ix += 1 242 self.sizer9.Add(self.tcChi,(iy,ix),(1,1), wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 0) 243 ix +=2 244 self.sizer9.Add(self.btFit,(iy,ix),(1,1), wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 0) 245 ix =0 246 iy+=1 247 self.sizer9.Add((20,20),(iy,ix),(1,1), wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 0) 248 #----------sizer 10 draw------------------------------------------------------ 91 249 id = wx.NewId() 92 250 self.btClose =wx.Button(self,id,'Close') 93 251 self.btClose.Bind(wx.EVT_BUTTON, self.onClose,id=id) 94 252 self.btClose.SetToolTipString("Close page.") 95 ix = 0 96 iy = 1 97 self.sizer3.Add(wx.StaticText(self, -1, 'Data Source Name : '),(iy,ix),\ 98 (1,1), wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15) 99 ix += 1 100 self.sizer3.Add(self.DataSource,(iy,ix),(1,1), wx.EXPAND|wx.ADJUST_MINSIZE, 0) 101 ix += 1 102 self.sizer3.Add((20,20),(iy,ix),(1,1),wx.RIGHT|wx.EXPAND|wx.ADJUST_MINSIZE,0) 103 ix = 0 104 iy += 1 105 self.sizer3.Add(wx.StaticText(self,-1,'Instrument Smearing'),(iy,ix),(1,1)\ 106 , wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15) 107 ix += 1 108 self.sizer3.Add(self.smearer_box,(iy,ix),(1,1), wx.EXPAND|wx.ADJUST_MINSIZE, 0) 109 110 ix = 0 111 iy += 1 112 self.sizer3.Add(wx.StaticText(self,-1,'Model'),(iy,ix),(1,1)\ 113 , wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15) 114 ix += 1 115 self.sizer3.Add(self.modelbox,(iy,ix),(1,1), wx.EXPAND|wx.ADJUST_MINSIZE, 0) 116 117 ix = 0 118 iy = 1 119 #set maximum range for x in linear scale 120 self.text4_3 = wx.StaticText(self, -1, 'Maximum Data Range(Linear)', style=wx.ALIGN_LEFT) 121 self.sizer4.Add(self.text4_3,(iy,ix),(1,1),\ 122 wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15) 123 ix += 1 124 self.sizer4.Add(wx.StaticText(self, -1, 'Min'),(iy, ix),(1,1),\ 125 wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15) 126 ix += 2 127 self.sizer4.Add(wx.StaticText(self, -1, 'Max'),(iy, ix),(1,1),\ 128 wx.EXPAND|wx.ADJUST_MINSIZE, 0) 129 ix = 0 130 iy += 1 131 self.sizer4.Add(wx.StaticText(self, -1, 'x range'),(iy, ix),(1,1),\ 132 wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15) 133 ix += 1 134 self.xmin = wx.TextCtrl(self, -1,size=(_BOX_WIDTH,20)) 135 self.xmin.SetValue(format_number(numpy.min(data.x))) 136 self.xmin.SetToolTipString("Minimun value of x in linear scale.") 137 self.xmin.Bind(wx.EVT_KILL_FOCUS, self._onTextEnter) 138 self.xmin.Bind(wx.EVT_TEXT_ENTER, self._onTextEnter) 139 self.xmin.Disable() 140 self.sizer4.Add(self.xmin,(iy, ix),(1,1), wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15) 141 142 143 ix += 2 144 self.xmax = wx.TextCtrl(self, -1,size=(_BOX_WIDTH,20)) 145 self.xmax.SetValue(format_number(numpy.max(data.x))) 146 self.xmax.SetToolTipString("Maximum value of x in linear scale.") 147 self.xmax.Bind(wx.EVT_KILL_FOCUS, self._onTextEnter) 148 self.xmax.Bind(wx.EVT_TEXT_ENTER, self._onTextEnter) 149 self.xmax.Disable() 150 self.sizer4.Add(self.xmax,(iy,ix),(1,1), wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 0) 253 254 ix= 3 255 iy= 1 256 self.sizer10.Add((20,20),(iy,ix),(1,1),wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15) 257 ix +=1 258 self.sizer10.Add( self.btClose,(iy,ix),(1,1), wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 0) 151 259 ix =0 152 260 iy+=1 153 self.sizer4.Add((20,20),(iy,ix),(1,1),wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15) 154 #Set chisqr result into TextCtrl 155 ix = 0 156 iy = 1 157 158 self.text1_1 = wx.StaticText(self, -1, 'Chi2/dof', style=wx.ALIGN_LEFT) 159 #self.sizer1.Add(self.text1_1,1) 160 self.sizer1.Add(self.text1_1,(iy,ix),(1,1),\ 161 wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15) 162 ix += 1 163 self.tcChi = wx.TextCtrl(self, -1,size=(_BOX_WIDTH,20)) 164 self.tcChi.SetToolTipString("Chi^2 over degrees of freedom.") 165 #self.sizer1.Add(self.tcChi, 1, wx.R | wx.BOTTOM , 5) 166 self.sizer1.Add(self.tcChi,(iy,ix),(1,1), wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 0) 167 ix +=2 168 #self.sizer1.Add(self.btFit, 1, wx.LEFT | wx.BOTTOM , 5) 169 self.sizer1.Add(self.btFit,(iy,ix),(1,1), wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 0) 170 ix+= 2 171 self.sizer1.Add( self.btClose,(iy,ix),(1,1), wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 0) 172 #self.sizer1.Add( self.btClose,1, wx.LEFT | wx.BOTTOM , 5) 173 self.tcChi.Disable() 174 ix= 0 175 iy+=1 176 self.sizer1.Add((20,20),(iy,ix),(1,1), wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 0) 177 #self.sizer1.Add((20,20), 0) 261 self.sizer10.Add((20,20),(iy,ix),(1,1),wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15) 262 178 263 # contains link between model ,all its parameters, and panel organization 179 264 self.parameters=[] 180 265 self.fixed_param=[] 266 #list of dispersion paramaters 267 self.disp_list=None 181 268 #contains link between a model and selected parameters to fit 182 269 self.param_toFit=[] … … 185 272 #dictionary of model name and model class 186 273 self.model_list_box={} 187 self.data = data 188 ## Q range 189 self.qmin= 0.001 190 self.qmax= 0.1 274 275 191 276 192 277 self.vbox.Layout() … … 198 283 self.Layout() 199 284 self.GrandParent.GetSizer().Layout() 200 201 202 203 204 205 206 def compute_chisqr(self): 285 286 def compute_chisqr2D(self): 207 287 """ @param fn: function that return model value 208 288 @return residuals 209 289 """ 210 211 290 flag=self.checkFitRange() 291 res=[] 212 292 if flag== True: 213 293 try: 214 qmin = float(self.xmin.GetValue()) 215 qmax = float(self.xmax.GetValue()) 216 x,y,dy = [numpy.asarray(v) for v in (self.data.x,self.data.y,self.data.dy)] 217 if qmin==None and qmax==None: 218 fx =numpy.asarray([self.model.run(v) for v in x]) 219 res=(y - fx)/dy 220 else: 221 idx = (x>= qmin) & (x <=qmax) 222 fx = numpy.asarray([self.model.run(item)for item in x[idx ]]) 223 res= (y[idx] - fx)/dy[idx] 294 self.qmin_x = float(self.qmin.GetValue()) 295 self.qmax_x = float(self.qmax.GetValue()) 224 296 297 for i in range(len(self.data.x_bins)): 298 if self.data.x_bins[i]>= self.qmin_x and self.data.x_bins[i]<= self.qmax_x: 299 for j in range(len(self.data.y_bins)): 300 if self.data.y_bins[j]>= self.qmin_x and self.data.y_bins[j]<= self.qmax_x: 301 res.append( (self.data.data[j][i]- self.model.runXY(\ 302 [self.data.x_bins[i],self.data.y_bins[j]]))\ 303 /self.data.err_data[j][i] ) 304 sum=0 225 305 226 sum=0227 306 for item in res: 228 307 if numpy.isfinite(item): 229 308 sum +=item 309 #print "chisqr : sum 2D", xmin, xmax, ymin, ymax,sum 310 #print res 230 311 self.tcChi.SetValue(format_number(math.fabs(sum))) 231 312 except: 232 313 wx.PostEvent(self.parent.GrandParent, StatusEvent(status=\ 233 314 "Chisqr cannot be compute: %s"% sys.exc_value)) 234 235 236 def onFit(self,event): 237 """ signal for fitting""" 238 315 316 317 def compute_chisqr(self): 318 """ @param fn: function that return model value 319 @return residuals 320 """ 321 239 322 flag=self.checkFitRange() 240 self.set_manager(self.manager) 241 242 qmin=float(self.xmin.GetValue()) 243 qmax =float( self.xmax.GetValue()) 244 if len(self.param_toFit) >0 and flag==True: 245 self.manager.schedule_for_fit( value=1,fitproblem =None) 246 self.manager._on_single_fit(qmin=qmin,qmax=qmax) 247 else: 248 wx.PostEvent(self.parent.GrandParent, StatusEvent(status=\ 249 "Select at least on parameter to fit ")) 250 251 323 if flag== True: 324 try: 325 if hasattr(self.data,"data"): 326 self.compute_chisqr2D() 327 return 328 else: 329 self.qmin_x = float(self.qmin.GetValue()) 330 self.qmax_x = float(self.qmax.GetValue()) 331 x,y,dy = [numpy.asarray(v) for v in (self.data.x,self.data.y,self.data.dy)] 332 if self.qmin_x==None and self.qmax_x==None: 333 fx =numpy.asarray([self.model.run(v) for v in x]) 334 res=(y - fx)/dy 335 else: 336 idx = (x>= self.qmin_x) & (x <=self.qmax_x) 337 fx = numpy.asarray([self.model.run(item)for item in x[idx ]]) 338 res= (y[idx] - fx)/dy[idx] 339 340 341 sum=0 342 for item in res: 343 if numpy.isfinite(item): 344 sum +=item 345 self.tcChi.SetLabel(format_number(math.fabs(sum))) 346 except: 347 wx.PostEvent(self.parent.GrandParent, StatusEvent(status=\ 348 "Chisqr cannot be compute: %s"% sys.exc_value)) 349 252 350 def _on_select_model(self,event): 253 351 """ … … 256 354 """ 257 355 self.btFit.SetFocus() 356 self.disable_disp.SetValue(True) 357 self.sizer8.Clear(True) 358 self.sizer7.Clear(True) 359 self.vbox.Layout() 360 self.SetScrollbars(20,20,55,40) 361 self.Layout() 362 self.parent.GetSizer().Layout() 258 363 for item in self.model_list_box.itervalues(): 259 364 name = item.__name__ … … 270 375 except: 271 376 raise #ValueError,"model.name is not equal to model class name" 272 break 273 377 break 378 def onFit(self,event): 379 """ signal for fitting""" 380 381 flag=self.checkFitRange() 382 self.set_manager(self.manager) 383 384 self.qmin_x=float(self.qmin.GetValue()) 385 self.qmax_x =float( self.qmax.GetValue()) 386 if len(self.param_toFit) >0 and flag==True: 387 self.manager.schedule_for_fit( value=1,fitproblem =None) 388 self.manager._on_single_fit(qmin=self.qmin_x,qmax=self.qmax_x) 389 else: 390 wx.PostEvent(self.parent.GrandParent, StatusEvent(status=\ 391 "Select at least on parameter to fit ")) 392 393 274 394 def _onTextEnter(self,event): 275 395 """ … … 288 408 "Drawing Error:wrong value entered %s"% sys.exc_value)) 289 409 290 def checkFitRange(self): 291 """ 292 Check the validity of fitting range 293 @note: xmin should always be less than xmax or else each control box 294 background is colored in pink. 295 """ 296 297 flag = True 298 valueMin = self.xmin.GetValue() 299 valueMax = self.xmax.GetValue() 300 # Check for possible values entered 301 #print "fitpage: checkfitrange:",valueMin,valueMax 302 try: 303 if (float(valueMax)> float(valueMin)): 304 self.xmax.SetBackgroundColour(wx.WHITE) 305 self.xmin.SetBackgroundColour(wx.WHITE) 306 else: 307 flag = False 308 self.xmin.SetBackgroundColour("pink") 309 self.xmax.SetBackgroundColour("pink") 310 except: 311 flag = False 312 self.xmin.SetBackgroundColour("pink") 313 self.xmax.SetBackgroundColour("pink") 314 315 self.xmin.Refresh() 316 self.xmax.Refresh() 317 return flag 318 319 410 320 411 321 412 def get_param_list(self): … … 331 422 raise ValueError,"missing parameter to fit" 332 423 333 334 def set_panel(self,model): 424 425 426 def old_set_panel(self,model): 335 427 """ 336 428 Build the panel from the model content 337 429 @param model: the model selected in combo box for fitting purpose 338 430 """ 339 self.sizer2.Clear(True)340 431 self.sizer5.Clear(True) 341 self.sizer6.Clear(True)342 432 self.parameters = [] 343 433 self.param_toFit=[] … … 346 436 #print "fitpage1D : dispersion list",self.model.getDispParamList() 347 437 keys.sort() 348 disp_list=self.model.getDispParamList()349 fixed=self.model.fixed350 print "fixed",fixed351 #model.setParam("scale", 2)352 #print "model sphere scale fixed?", self.model.is_fittable("scale")353 ip=0354 iq=1355 356 438 ik=0 357 439 im=1 358 if len(disp_list)>0: 359 disp = wx.StaticText(self, -1, 'Dispersion') 360 self.sizer5.Add(disp,( iq, ip),(1,1), wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15) 361 ip += 1 362 values = wx.StaticText(self, -1, 'Values') 363 self.sizer5.Add(values,( iq, ip),(1,1), wx.EXPAND|wx.ADJUST_MINSIZE, 0) 364 365 disp_list.sort() 440 366 441 iy = 1 367 442 ix = 0 368 443 self.cb1 = wx.CheckBox(self, -1,"Select all", (10, 10)) 369 444 wx.EVT_CHECKBOX(self, self.cb1.GetId(), self.select_all_param) 370 self.sizer 2.Add(self.cb1,(iy, ix),(1,1),\445 self.sizer5.Add(self.cb1,(iy, ix),(1,1),\ 371 446 wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15) 372 447 ix +=1 373 448 self.text2_2 = wx.StaticText(self, -1, 'Values') 374 self.sizer 2.Add(self.text2_2,(iy, ix),(1,1),\449 self.sizer5.Add(self.text2_2,(iy, ix),(1,1),\ 375 450 wx.EXPAND|wx.ADJUST_MINSIZE, 0) 376 451 ix +=2 377 452 self.text2_3 = wx.StaticText(self, -1, 'Errors') 378 self.sizer 2.Add(self.text2_3,(iy, ix),(1,1),\453 self.sizer5.Add(self.text2_3,(iy, ix),(1,1),\ 379 454 wx.EXPAND|wx.ADJUST_MINSIZE, 0) 380 455 self.text2_3.Hide() 381 456 ix +=1 382 457 self.text2_4 = wx.StaticText(self, -1, 'Units') 383 self.sizer 2.Add(self.text2_4,(iy, ix),(1,1),\458 self.sizer5.Add(self.text2_4,(iy, ix),(1,1),\ 384 459 wx.EXPAND|wx.ADJUST_MINSIZE, 0) 385 460 self.text2_4.Hide() 386 #print "keys", keys 387 #print "disp_list", disp_list 388 #print "fix_list",fixed 461 disp_list=self.model.getDispParamList() 389 462 for item in keys: 390 463 if not item in disp_list: … … 394 467 cb = wx.CheckBox(self, -1, item, (10, 10)) 395 468 cb.SetValue(False) 396 self.sizer 2.Add( cb,( iy, ix),(1,1), wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15)469 self.sizer5.Add( cb,( iy, ix),(1,1), wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15) 397 470 wx.EVT_CHECKBOX(self, cb.GetId(), self.select_param) 398 471 … … 403 476 ctl1.Bind(wx.EVT_KILL_FOCUS, self._onparamEnter) 404 477 ctl1.Bind(wx.EVT_TEXT_ENTER,self._onparamEnter) 405 self.sizer 2.Add(ctl1, (iy,ix),(1,1), wx.EXPAND)478 self.sizer5.Add(ctl1, (iy,ix),(1,1), wx.EXPAND) 406 479 407 480 ix += 1 408 481 text2=wx.StaticText(self, -1, '+/-') 409 self.sizer 2.Add(text2,(iy, ix),(1,1),\482 self.sizer5.Add(text2,(iy, ix),(1,1),\ 410 483 wx.EXPAND|wx.ADJUST_MINSIZE, 0) 411 484 text2.Hide() 412 485 ix += 1 413 486 ctl2 = wx.TextCtrl(self, -1, size=(_BOX_WIDTH,20), style=wx.TE_PROCESS_ENTER) 414 self.sizer 2.Add(ctl2, (iy,ix),(1,1), wx.EXPAND|wx.ADJUST_MINSIZE, 0)487 self.sizer5.Add(ctl2, (iy,ix),(1,1), wx.EXPAND|wx.ADJUST_MINSIZE, 0) 415 488 ctl2.Hide() 416 489 ix +=1 … … 420 493 except: 421 494 units = wx.StaticText(self, -1, "", style=wx.ALIGN_LEFT) 422 self.sizer2.Add(units, (iy,ix),(1,1), wx.EXPAND|wx.ADJUST_MINSIZE, 0) 495 self.sizer5.Add(units, (iy,ix),(1,1), wx.EXPAND|wx.ADJUST_MINSIZE, 0) 496 """ 423 497 else: 424 if item in fixed:498 if not item in fixed: 425 499 ip = 0 426 500 iq += 1 … … 452 526 im += 1 453 527 #save data 454 528 """ 455 529 self.parameters.append([cb,ctl1,text2,ctl2]) 456 530 457 531 iy+=1 458 self.sizer 2.Add((20,20),(iy,ix),(1,1), wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15)532 self.sizer5.Add((20,20),(iy,ix),(1,1), wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15) 459 533 460 534 #Display units text on panel … … 499 573 item[3].Hide() 500 574 except: 501 wx.PostEvent(self.parent.GrandParent, StatusEvent(status=\502 "Drawing Error:wrong value entered : %s"% sys.exc_value))575 #enter dispersion value 576 pass 503 577 self.set_model_parameter() 504 578 505 def set_model_parameter(self): 506 if len(self.parameters) !=0 and self.model !=None: 507 # Flag to register when a parameter has changed. 508 is_modified = False 509 for item in self.fixed_param: 510 511 try: 512 name=str(item[0]) 513 value= float(item[1].GetValue()) 514 # print "model para", name,value 515 # If the value of the parameter has changed, 516 # update the model and set the is_modified flag 517 if value != self.model.getParam(name): 518 self.model.setParam(name,value) 519 is_modified = True 520 except: 521 wx.PostEvent(self.parent.GrandParent, StatusEvent(status=\ 522 "Model Drawing Error:wrong value entered : %s"% sys.exc_value)) 523 524 for item in self.parameters: 525 # print "paramters",str(item[0].GetLabelText()) 526 try: 527 name=str(item[0].GetLabelText()) 528 value= float(item[1].GetValue()) 529 # print "model para", name,value 530 # If the value of the parameter has changed, 531 # update the model and set the is_modified flag 532 if value != self.model.getParam(name): 533 self.model.setParam(name,value) 534 is_modified = True 535 except: 536 wx.PostEvent(self.parent.GrandParent, StatusEvent(status=\ 537 "Model Drawing Error:wrong value entered : %s"% sys.exc_value)) 538 539 # Here we should check whether the boundaries have been modified. 540 # If qmin and qmax have been modified, update qmin and qmax and 541 # set the is_modified flag to True 542 if float(self.xmin.GetValue()) != self.qmin: 543 self.qmin = float(self.xmin.GetValue()) 544 is_modified = True 545 if float(self.xmax.GetValue()) != self.qmax: 546 self.qmax = float(self.xmax.GetValue()) 547 is_modified = True 548 549 if is_modified: 550 self.manager.redraw_model(qmin=self.qmin, qmax=self.qmax) 551 579 552 580 def select_all_param(self,event): 553 581 """ … … 597 625 598 626 if not (len(self.param_toFit ) >0): 599 self. xmin.Disable()600 self. xmax.Disable()627 self.qmin.Disable() 628 self.qmax.Disable() 601 629 else: 602 self. xmin.Enable()603 self. xmax.Enable()630 self.qmin.Enable() 631 self.qmax.Enable() 604 632 605 633 … … 615 643 """ 616 644 #print "fitting : onsetvalues out",out 617 self.tcChi.Clear() 618 self.tcChi.SetValue(format_number(chisqr)) 645 self.tcChi.SetLabel(format_number(chisqr)) 619 646 params = {} 620 647 is_modified = False
Note: See TracChangeset
for help on using the changeset viewer.