Changeset 51a71a3 in sasview for sansview/perspectives/fitting/fitpage.py
- Timestamp:
- Apr 14, 2010 12:29:30 PM (14 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:
- 6318298
- Parents:
- c5874f2
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
sansview/perspectives/fitting/fitpage.py
r6747217 r51a71a3 12 12 from sans.guicomm.events import StatusEvent 13 13 from sans.guiframe.utils import format_number,check_float 14 #from sans.guiframe.local_perspectives.plotting.Masking import ModelPanel2D as panel2D 14 15 15 16 ## event to post model to fit to fitting plugins … … 44 45 Initialization of the Panel 45 46 """ 46 ## fit page does not content npts txtcrtl47 ## total number of point: float 47 48 self.npts=None 48 49 ## thread for compute Chisqr … … 77 78 if self.smearer ==None: 78 79 self.enable_smearer.Disable() 79 #self.disable_smearer.Disable() 80 if self.data.__class__.__name__ =="Data2D": 81 if self.model != None: 82 self.smear_description_2d.Show(True) 83 self.npts = len(self.data.data) 84 else: 85 self.npts = len(self.data.x) 86 80 87 81 88 self.disp_cb_dict = {} … … 169 176 add access to npts 170 177 """ 178 is_2Ddata = False 179 180 # Check if data is 2D 181 if self.data.__class__.__name__ != 'Data1D': 182 is_2Ddata = True 183 171 184 title = "Fitting" 172 185 #smear messages & titles … … 180 193 smear_message_slit_height_title = "Slit height[1/A]:" 181 194 smear_message_slit_width_title = "Slit width[1/A]:" 195 #Fit button 196 self.btFit = wx.Button(self,wx.NewId(),'Fit', size=(88,25)) 197 self.btFit.Bind(wx.EVT_BUTTON, self._onFit,id= self.btFit.GetId()) 198 self.btFit.SetToolTipString("Start fitting.") 182 199 183 200 self._get_smear_info() 184 201 202 #Sizers 185 203 box_description_range = wx.StaticBox(self, -1,str(title)) 186 boxsizer_range = wx.StaticBoxSizer(box_description_range, wx.VERTICAL) 187 188 sizer_fit = wx.GridSizer(1, 1,0, 0) 189 190 self.btFit = wx.Button(self,wx.NewId(),'Fit', size=(80,23)) 191 self.btFit.Bind(wx.EVT_BUTTON, self._onFit,id= self.btFit.GetId()) 192 self.btFit.SetToolTipString("Perform fit.") 193 194 195 204 boxsizer_range = wx.StaticBoxSizer(box_description_range, wx.VERTICAL) 196 205 self.sizer_set_smearer = wx.BoxSizer(wx.VERTICAL) 197 206 sizer_smearer = wx.BoxSizer(wx.HORIZONTAL) … … 247 256 sizer_smearer.Add((10,10)) 248 257 249 # static box for chi2 250 box_description= wx.StaticBox(self, -1,'Chi2/dof') 251 boxsizer1 = wx.StaticBoxSizer(box_description, wx.VERTICAL) 252 boxsizer1.SetMinSize((70,40)) 253 254 255 256 # StaticText for chi2 and smear 257 self.tcChi = wx.StaticText(self, -1, "-", style=wx.ALIGN_LEFT) 258 # StaticText for chi2, N(for fitting), Npts 259 self.tcChi = BGTextCtrl(self, -1, "-", size=(75,20), style=0) 260 self.tcChi.SetToolTipString("Chi2/Npts") 261 self.Npts_fit = BGTextCtrl(self, -1, "-", size=(75,20), style=0) 262 self.Npts_fit.SetToolTipString(" Npts : number of points selected for fitting") 263 self.Npts_total = BGTextCtrl(self, -1, "-", size=(75,20), style=0) 264 self.Npts_total.SetValue(str(self.npts)) 265 self.Npts_total.SetToolTipString(" Total Npts : total number of data points") 266 box_description_1= wx.StaticText(self, -1,' Chi2/Npts') 267 box_description_2= wx.StaticText(self, -1,' Npts') 268 box_description_3= wx.StaticText(self, -1,' Total Npts') 269 box_description_4= wx.StaticText(self, -1,' ') 270 271 sizer_fit = wx.GridSizer(2, 4,2,6) 272 sizer_fit.Add(box_description_1,0,0) 273 sizer_fit.Add(box_description_2,0,0) 274 sizer_fit.Add(box_description_3,0,0) 275 sizer_fit.Add(box_description_4,0,0) 276 sizer_fit.Add(self.tcChi,0,0) 277 sizer_fit.Add(self.Npts_fit ,0,0) 278 sizer_fit.Add(self.Npts_total,0,0) 279 sizer_fit.Add(self.btFit,0,0) 280 281 # StaticText for smear 282 #self.tcChi = wx.StaticText(self, -1, "-", style=wx.ALIGN_LEFT) 258 283 self.smear_description_none = wx.StaticText(self, -1, smear_message_none , style=wx.ALIGN_LEFT) 259 284 self.smear_description_dqdata = wx.StaticText(self, -1, smear_message_dqdata , style=wx.ALIGN_LEFT) … … 271 296 272 297 #arrange sizers 273 boxsizer1.Add( self.tcChi )298 #boxsizer1.Add( self.tcChi ) 274 299 self.sizer_set_smearer.Add(sizer_smearer ) 275 300 self.sizer_set_smearer.Add((10,10)) … … 297 322 self.sizer_set_smearer.Add( self.sizer_new_smear,0, wx.CENTER, 10 ) 298 323 299 # add all to chi2 sizer 300 301 sizer_smearer_box.Add(self.sizer_set_smearer) 302 324 # add all to chi2 sizer 325 sizer_smearer_box.Add(self.sizer_set_smearer) 303 326 sizer_chi2.Add(sizer_smearer_box) 304 327 sizer_chi2.Add((-1,5)) 305 self.sizer_set_masking.Add((305,-1)) 306 #self.sizer_set_masking.Add(boxsizer1,0, wx.RIGHT, 10) 307 sizer_chi2.Add(self.sizer_set_masking ) 308 309 sizer_fit.Add(boxsizer1,0, wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 63) 310 #sizer_fit.Add((-1,1),0, wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 1) 311 sizer_fit.Add(self.btFit,0, wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 63) 312 sizer_fit.Layout() 313 #sizer_smearer_box.Add(sizer_chi2) 328 314 329 # hide all smear messages and textctrl 315 330 self._hide_all_smear_info() … … 320 335 # Show only the relevant smear messages, etc 321 336 if self.current_smearer == None: 322 if self.data.__class__.__name__ != 'Data2D':337 if not is_2Ddata: 323 338 self.smear_description_none.Show(True) 324 339 self.enable_smearer.Disable() … … 329 344 self.enable_smearer.Disable() 330 345 else: self._show_smear_sizer() 331 346 boxsizer_range.Add(self.sizer_set_masking) 332 347 333 348 #Set sizer for Fitting section … … 814 829 when enter value on panel redraw model according to changed 815 830 """ 831 #default flag 816 832 flag = False 833 self.fitrange = True 834 #get event object 817 835 tcrtl= event.GetEventObject() 818 836 … … 822 840 823 841 if check_float(tcrtl): 824 flag = self._onparamEnter_helper() 825 temp_smearer = None 826 if not self.disable_smearer.GetValue(): 827 temp_smearer= self.current_smearer 828 ## set smearing value whether or not the data contain the smearing info 829 if self.slit_smearer.GetValue(): 830 flag1 = self.update_slit_smear() 831 flag = flag or flag1 832 elif self.pinhole_smearer.GetValue(): 833 flag1 = self.update_pinhole_smear() 834 flag = flag or flag1 835 elif self.data.__class__.__name__ !="Data2D": 836 self.manager.set_smearer(smearer=temp_smearer, qmin= float(self.qmin_x), 837 qmax= float(self.qmax_x)) 838 if flag: 839 self.compute_chisqr(smearer= temp_smearer) 840 841 ## new state posted 842 if self.state_change: 843 #self._undo.Enable(True) 844 event = PageInfoEvent(page = self) 845 wx.PostEvent(self.parent, event) 846 self.state_change= False 842 flag = self._onparamEnter_helper() 843 if self.fitrange: 844 temp_smearer = None 845 if not self.disable_smearer.GetValue(): 846 temp_smearer= self.current_smearer 847 ## set smearing value whether or not the data contain the smearing info 848 if self.slit_smearer.GetValue(): 849 flag1 = self.update_slit_smear() 850 flag = flag or flag1 851 elif self.pinhole_smearer.GetValue(): 852 flag1 = self.update_pinhole_smear() 853 flag = flag or flag1 854 elif self.data.__class__.__name__ !="Data2D": 855 self.manager.set_smearer(smearer=temp_smearer, qmin= float(self.qmin_x), 856 qmax= float(self.qmax_x)) 857 if flag: 858 self.compute_chisqr(smearer= temp_smearer) 859 860 ## new state posted 861 if self.state_change: 862 #self._undo.Enable(True) 863 event = PageInfoEvent(page = self) 864 wx.PostEvent(self.parent, event) 865 self.state_change= False 866 else: 867 return # invalid fit range: do nothing here: msg already displayed in validate 847 868 else: 848 869 self.save_current_state() … … 923 944 return 924 945 #Check if # of points for theory model are valid(>0). 925 if self.npts != None: 926 if check_float(self.npts): 927 temp_npts = float(self.npts.GetValue()) 928 if temp_npts != self.num_points: 929 self.num_points = temp_npts 930 is_modified = True 946 # check for 2d 947 if self.data.__class__.__name__ =="Data2D": 948 # set mask 949 radius= numpy.sqrt( self.data.qx_data*self.data.qx_data + self.data.qy_data*self.data.qy_data ) 950 index_data = ((self.qmin <= radius)&(radius<= self.qmax)) 951 index_data = (index_data)&(self.data.mask) 952 index_data = (index_data)&(numpy.isfinite(self.data.data)) 953 if len(index_data[index_data]) < 10: 954 msg= "Cannot Plot :No or too little npts in that data range!!! " 955 wx.PostEvent(self.parent.parent, StatusEvent(status = msg )) 956 return 931 957 else: 932 msg= "Cannot Plot :No npts in that Qrange!!! " 933 wx.PostEvent(self.parent.parent, StatusEvent(status = msg )) 958 self.data.mask = index_data 959 self.Npts_fit.Setvalue(str(len(self.data.mask))) 960 else: 961 index_data = ((self.qmin <= self.data.x)&(self.data.x <= self.qmax)) 962 self.Npts_fit.SetValue(str(len(self.data.x[index_data]))) 934 963 935 964 else: … … 945 974 self.state_change= False 946 975 self._draw_model() 947 976 return 948 977 def _clear_Err_on_Fit(self): 949 978 """ … … 1086 1115 self.smear_message_new_s.Hide() 1087 1116 1117 def _onMask(self, event): 1118 """ 1119 Build a panel to allow to edit Mask 1120 """ 1121 1122 from sans.guiframe.local_perspectives.plotting.masking import MaskPanel as MaskDialog 1123 1124 self.panel = MaskDialog(self, data=self.data,id =-1 ) 1125 self.panel.Bind(wx.EVT_CLOSE, self._draw_masked_model) 1126 self.panel.ShowModal() 1127 #wx.PostEvent(self.parent, event) 1128 1129 def _draw_masked_model(self,event): 1130 event.Skip() 1131 1132 is_valid_qrange = self._update_paramv_on_fit() 1133 if is_valid_qrange: 1134 self._draw_model() 1135 self.panel.Destroy() # frame 1136 self.set_npts2fit() 1137 else: 1138 msg = ' Please consider your Q range.' 1139 self.panel.ShowMessage(msg) 1088 1140 1089 1141 def set_data(self, data): … … 1092 1144 """ 1093 1145 self.data = data 1146 1147 1094 1148 if self.data is None: 1095 1149 data_min = "" … … 1105 1159 else: 1106 1160 self.enable_smearer.Enable() 1107 1161 1108 1162 # more disables for 2D 1109 1163 if self.data.__class__.__name__ =="Data2D": … … 1113 1167 self.pinhole_smearer.Disable() 1114 1168 self.slit_smearer.Disable() 1169 self.default_mask = copy.deepcopy(self.data.mask) 1115 1170 1116 1171 … … 1124 1179 # Maximum value of data 1125 1180 data_max = max(self.data.x) 1181 #number of total data points 1182 self.Npts_total.SetValue(str(len(self.data.x))) 1183 #default:number of data points selected to fit 1184 self.Npts_fit.SetValue(str(len(self.data.x))) 1126 1185 else: 1127 1186 ## Minimum value of data … … 1131 1190 ## Maximum value of data 1132 1191 data_max = math.sqrt(x*x + y*y) 1133 1192 #number of total data points 1193 self.Npts_total.SetValue(str(len(self.data.data))) 1194 #default:number of data points selected to fit 1195 self.Npts_fit.SetValue(str(len(self.data.data))) 1196 1134 1197 self.dataSource.SetValue(data_name) 1135 1198 self.qmin_x = data_min … … 1177 1240 npts2fit = 0 1178 1241 qmin,qmax = self.get_range() 1179 if self.data.__class__.__name__ =="Data2D": 1180 npts2fit = len(self.data.data[self.mask]) 1242 if self.data.__class__.__name__ =="Data2D": 1243 radius= numpy.sqrt( self.data.qx_data*self.data.qx_data + self.data.qy_data*self.data.qy_data ) 1244 index_data = (self.qmin_x <= radius)&(radius<= self.qmax_x) 1245 index_data= (index_data)&(self.data.mask) 1246 index_data = (index_data)&(numpy.isfinite(self.data.data)) 1247 npts2fit = len(self.data.data[index_data]) 1181 1248 else: 1182 1249 for qx in self.data.x: … … 1185 1252 return npts2fit 1186 1253 1187 1254 def set_npts2fit(self): 1255 """ 1256 setValue Npts for fitting 1257 """ 1258 self.Npts_fit.SetValue(str(self.get_npts2fit())) 1259 1260 1188 1261 def get_chi2(self): 1189 1262 """
Note: See TracChangeset
for help on using the changeset viewer.