Changes in src/sas/sasgui/perspectives/fitting/fitpage.py [c8e1996:55db501] in sasview
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/sas/sasgui/perspectives/fitting/fitpage.py
rc8e1996 r55db501 14 14 from sasmodels.weights import MODELS as POLYDISPERSITY_MODELS 15 15 16 from sas.sasgui.guiframe.events import StatusEvent, NewPlotEvent, \ 17 PlotQrangeEvent 16 from sas.sasgui.guiframe.events import StatusEvent 17 from sas.sasgui.guiframe.events import NewPlotEvent 18 from sas.sasgui.guiframe.events import PlotQrangeEvent 18 19 from sas.sasgui.guiframe.dataFitting import check_data_validity 19 from sas.sasgui.guiframe.utils import format_number, check_float 20 from sas.sasgui.guiframe.utils import format_number 21 from sas.sasgui.guiframe.utils import check_float 20 22 from sas.sasgui.guiframe.documentation_window import DocumentationWindow 21 22 from sas.sasgui.perspectives.fitting.basepage import BasicPage as BasicPage23 from sas.sasgui.perspectives.fitting.basepage import PageInfoEvent as \24 PageInfoEvent25 from sas.sascalc.data_util.qsmearing import smear_selection26 from .basepage import ModelTextCtrl27 23 28 24 (Chi2UpdateEvent, EVT_CHI2_UPDATE) = wx.lib.newevent.NewEvent() … … 32 28 SMEAR_SIZE_H = 0.00 33 29 30 from sas.sasgui.perspectives.fitting.basepage import BasicPage as BasicPage 31 from sas.sasgui.perspectives.fitting.basepage import PageInfoEvent as PageInfoEvent 32 from sas.sascalc.data_util.qsmearing import smear_selection 33 from .basepage import ModelTextCtrl 34 34 35 35 36 class FitPage(BasicPage): … … 48 49 BasicPage.__init__(self, parent, color=color) 49 50 50 # draw sizer51 ## draw sizer 51 52 self._fill_data_sizer() 52 53 self.is_2D = None … … 71 72 self.enable_fit_button() 72 73 self.fill_data_combobox(data_list=self.data_list) 73 # 74 #create a default data for an empty panel 74 75 self.create_default_data() 75 76 self._manager.frame.Bind(wx.EVT_SET_FOCUS, self.on_set_focus) … … 104 105 self.data_box_description.SetForegroundColour(dname_color) 105 106 boxsizer1 = wx.StaticBoxSizer(self.data_box_description, wx.VERTICAL) 106 # 107 #---------------------------------------------------------- 107 108 sizer_data = wx.BoxSizer(wx.HORIZONTAL) 108 109 self.dataSource = wx.ComboBox(self, wx.ID_ANY, style=wx.CB_READONLY) … … 133 134 self.enable_datasource() 134 135 if len(data_list) > 0: 135 # 136 #find the maximum range covering all data 136 137 qmin, qmax, npts = self.compute_data_set_range(data_list) 137 138 self.qmin_data_set = qmin … … 168 169 self.set_data(data) 169 170 elif self.dataSource.GetCount() > 0: 171 170 172 pos = self.dataSource.GetSelection() 171 173 data = self.dataSource.GetClientData(pos) … … 184 186 185 187 :return: True or False 188 186 189 """ 187 190 if self.data.__class__.__name__ == "Data2D" or \ … … 197 200 buttons, xi^2, number of points etc. 198 201 """ 199 is_2 d_data = False202 is_2Ddata = False 200 203 201 204 # Check if data is 2D 202 205 if self.data.__class__.__name__ == "Data2D" or \ 203 206 self.enable2D: 204 is_2 d_data = True207 is_2Ddata = True 205 208 206 209 title = "Fitting" 207 # 210 #smear messages & titles 208 211 smear_message_none = "No smearing is selected..." 209 212 smear_message_dqdata = "The dQ data is being used for smearing..." … … 223 226 self._get_smear_info() 224 227 225 # 228 #Sizers 226 229 box_description_range = wx.StaticBox(self, wx.ID_ANY, str(title)) 227 230 box_description_range.SetForegroundColour(wx.BLUE) … … 242 245 sizer_weighting = wx.BoxSizer(wx.HORIZONTAL) 243 246 weighting_box.SetMinSize((_DATA_BOX_WIDTH, 40)) 244 # 247 #Filling the sizer containing weighting info. 245 248 self.dI_noweight = wx.RadioButton(self, wx.ID_ANY, 246 249 'No Weighting', style=wx.RB_GROUP) … … 284 287 self._on_select_accuracy) 285 288 286 # 289 #Fit button 287 290 self.btFit = wx.Button(self, self._ids.next(), 'Fit') 288 291 self.default_bt_colour = self.btFit.GetDefaultAttributes() … … 290 293 self.btFit.SetToolTipString("Start fitting.") 291 294 292 # 295 #General Help button 293 296 self.btFitHelp = wx.Button(self, wx.ID_ANY, 'Help') 294 297 self.btFitHelp.SetToolTipString("General fitting help.") 295 298 self.btFitHelp.Bind(wx.EVT_BUTTON, self._onFitHelp) 296 299 297 # 298 # 299 # both on MAC and PC. Should completely rewrite the fitting sizer300 # 300 #Resolution Smearing Help button (for now use same technique as 301 #used for dI help to get tiniest possible button that works 302 #both on MAC and PC. Should completely rewrite the fitting sizer 303 #in future. This is minimum to get out release 3.1 301 304 # comment June 14, 2015 --- PDB 302 305 if sys.platform.count("win32") > 0: 303 size_q = (20, 15) # 306 size_q = (20, 15) #on PC 304 307 else: 305 size_q = (30, 20) # 308 size_q = (30, 20) #on MAC 306 309 self.btSmearHelp = wx.Button(self, wx.ID_ANY, '?', 307 310 style=wx.BU_EXACTFIT, size=size_q) … … 309 312 self.btSmearHelp.Bind(wx.EVT_BUTTON, self._onSmearHelp) 310 313 311 # 314 #textcntrl for custom resolution 312 315 self.smear_pinhole_max = ModelTextCtrl(self, wx.ID_ANY, 313 316 size=(_BOX_WIDTH - 25, 20), … … 327 330 text_enter_callback=self.onSlitSmear) 328 331 329 # smear332 ## smear 330 333 self.smear_data_left = BGTextCtrl(self, wx.ID_ANY, 331 334 size=(_BOX_WIDTH - 25, 20), style=0) … … 335 338 self.smear_data_right.SetValue(str(self.dq_r)) 336 339 337 # 340 #set default values for smear 338 341 self.smear_pinhole_max.SetValue(str(self.dx_max)) 339 342 self.smear_pinhole_min.SetValue(str(self.dx_min)) … … 341 344 self.smear_slit_width.SetValue(str(self.dxw)) 342 345 343 # 346 #Filling the sizer containing instruments smearing info. 344 347 self.disable_smearer = wx.RadioButton(self, wx.ID_ANY, 345 348 'None', style=wx.RB_GROUP) 346 349 self.enable_smearer = wx.RadioButton(self, wx.ID_ANY, 'Use dQ Data') 347 # 348 # 350 #self.enable_smearer.SetToolTipString( 351 #"Click to use the loaded dQ data for smearing.") 349 352 self.pinhole_smearer = wx.RadioButton(self, wx.ID_ANY, 350 353 'Custom Pinhole Smear') 351 # 352 # 354 #self.pinhole_smearer.SetToolTipString 355 #("Click to input custom resolution for pinhole smearing.") 353 356 self.slit_smearer = wx.RadioButton(self, wx.ID_ANY, 'Custom Slit Smear') 354 # 355 # 357 #self.slit_smearer.SetToolTipString 358 #("Click to input custom resolution for slit smearing.") 356 359 self.Bind(wx.EVT_RADIOBUTTON, self.onSmear, 357 360 id=self.disable_smearer.GetId()) … … 376 379 self.Npts_fit = BGTextCtrl(self, wx.ID_ANY, "-", size=(75, 20), style=0) 377 380 self.Npts_fit.SetToolTipString( 378 " Npts : number of points selected for fitting")381 " Npts : number of points selected for fitting") 379 382 self.Npts_total = ModelTextCtrl(self, wx.ID_ANY, size=(_BOX_WIDTH, 20), 380 381 383 style=wx.TE_PROCESS_ENTER, 384 text_enter_callback=self._onQrangeEnter) 382 385 self.Npts_total.SetValue(format_number(self.npts_x)) 383 self.Npts_total.SetToolTipString( 384 " Total Npts : total number of data points")386 self.Npts_total.SetToolTipString(\ 387 " Total Npts : total number of data points") 385 388 386 389 # Update and Draw button … … 427 430 self.smear_description_2d_y = wx.StaticText(self, wx.ID_ANY, 428 431 smear_message_2d_y_title, style=wx.ALIGN_LEFT) 429 self.smear_description_2d_y.SetToolTipString( 432 self.smear_description_2d_y.SetToolTipString(\ 430 433 " dQs(perpendicular) in q_phi direction.") 431 434 self.smear_description_pin_min = wx.StaticText(self, wx.ID_ANY, … … 438 441 smear_message_slit_width_title, style=wx.ALIGN_LEFT) 439 442 440 # 443 #arrange sizers 441 444 self.sizer_set_smearer.Add(sizer_smearer) 442 445 self.sizer_set_smearer.Add((10, 10)) 443 446 self.sizer_set_smearer.Add(self.smear_description_none, 444 0, wx.CENTER, 10)447 0, wx.CENTER, 10) 445 448 self.sizer_set_smearer.Add(self.smear_description_dqdata, 446 0, wx.CENTER, 10)449 0, wx.CENTER, 10) 447 450 self.sizer_set_smearer.Add(self.smear_description_2d, 448 0, wx.CENTER, 10)451 0, wx.CENTER, 10) 449 452 self.sizer_new_smear.Add(self.smear_description_type, 450 0, wx.CENTER, 10)453 0, wx.CENTER, 10) 451 454 self.sizer_new_smear.Add(self.smear_description_accuracy_type, 452 0, wx.CENTER, 10)455 0, wx.CENTER, 10) 453 456 self.sizer_new_smear.Add(self.smear_accuracy) 454 457 self.sizer_new_smear.Add(self.smear_description_smear_type, 455 0, wx.CENTER, 10)458 0, wx.CENTER, 10) 456 459 self.sizer_new_smear.Add((15, -1)) 457 self.sizer_new_smear.Add(self.smear_description_2d_x, 0, wx.CENTER, 10) 460 self.sizer_new_smear.Add(self.smear_description_2d_x, 461 0, wx.CENTER, 10) 458 462 self.sizer_new_smear.Add(self.smear_description_pin_min, 459 0, wx.CENTER, 10)463 0, wx.CENTER, 10) 460 464 self.sizer_new_smear.Add(self.smear_description_slit_height, 461 0, wx.CENTER, 10) 462 463 self.sizer_new_smear.Add(self.smear_pinhole_min, 0, wx.CENTER, 10) 464 self.sizer_new_smear.Add(self.smear_slit_height, 0, wx.CENTER, 10) 465 self.sizer_new_smear.Add(self.smear_data_left, 0, wx.CENTER, 10) 465 0, wx.CENTER, 10) 466 467 self.sizer_new_smear.Add(self.smear_pinhole_min, 468 0, wx.CENTER, 10) 469 self.sizer_new_smear.Add(self.smear_slit_height, 470 0, wx.CENTER, 10) 471 self.sizer_new_smear.Add(self.smear_data_left, 472 0, wx.CENTER, 10) 466 473 self.sizer_new_smear.Add((20, -1)) 467 474 self.sizer_new_smear.Add(self.smear_description_2d_y, 468 0, wx.CENTER, 10)475 0, wx.CENTER, 10) 469 476 self.sizer_new_smear.Add(self.smear_description_pin_max, 470 0, wx.CENTER, 10)477 0, wx.CENTER, 10) 471 478 self.sizer_new_smear.Add(self.smear_description_slit_width, 472 0, wx.CENTER, 10)479 0, wx.CENTER, 10) 473 480 474 481 self.sizer_new_smear.Add(self.smear_pinhole_max, 0, wx.CENTER, 10) … … 495 502 496 503 # Show only the relevant smear messages, etc 497 if self.current_smearer isNone:498 if not is_2 d_data:504 if self.current_smearer == None: 505 if not is_2Ddata: 499 506 self.smear_description_none.Show(True) 500 507 self.enable_smearer.Disable() … … 502 509 self.smear_description_none.Show(True) 503 510 self.slit_smearer.Disable() 504 if self.data isNone:511 if self.data == None: 505 512 self.slit_smearer.Disable() 506 513 self.pinhole_smearer.Disable() … … 509 516 self._show_smear_sizer() 510 517 boxsizer_range.Add(self.sizer_set_masking) 511 # 512 is_2 d_data = False513 514 # 518 #2D data? default 519 is_2Ddata = False 520 521 #check if it is 2D data 515 522 if self.data.__class__.__name__ == "Data2D" or self.enable2D: 516 is_2 d_data = True523 is_2Ddata = True 517 524 518 525 self.sizer5.Clear(True) … … 562 569 sizer.Add(wx.StaticText(self, wx.ID_ANY, ' Max[1/A]')) 563 570 sizer.Add(self.EditMask_title) 564 sizer.Add((-1, 571 sizer.Add((-1,5)) 565 572 566 573 sizer.Add(self.reset_qrange) … … 568 575 sizer.Add(self.qmax) 569 576 sizer.Add(self.btEditMask) 570 sizer.Add((-1, 571 572 sizer.AddMany(5*[(-1, 577 sizer.Add((-1,5)) 578 579 sizer.AddMany(5*[(-1,5)]) 573 580 574 581 sizer.Add(box_description_1, 0, 0) … … 576 583 sizer.Add(self.points_sizer, 0, 0) 577 584 sizer.Add(self.draw_button, 0, 0) 578 sizer.Add((-1, 585 sizer.Add((-1,5)) 579 586 580 587 sizer.Add(self.tcChi, 0, 0) … … 586 593 boxsizer_range.Add(sizer_chi2) 587 594 boxsizer_range.Add(sizer) 588 if is_2 d_data:595 if is_2Ddata: 589 596 self.btEditMask.Enable() 590 597 self.EditMask_title.Enable() … … 592 599 self.btEditMask.Disable() 593 600 self.EditMask_title.Disable() 594 # save state601 ## save state 595 602 self.save_current_state() 596 603 self.sizer5.Add(boxsizer_range, 0, wx.EXPAND | wx.ALL, 10) 597 604 self.sizer5.Layout() 598 605 606 599 607 def _set_sizer_dispersion(self): 600 608 """ … … 606 614 607 615 self.sizer4_4.Clear(True) 608 if self.model isNone:609 # 616 if self.model == None: 617 ##no model is selected 610 618 return 611 619 if not self.enable_disp.GetValue(): 612 # the user didn't select dispersity display620 ## the user didn't select dispersity display 613 621 return 614 622 615 623 self._reset_dispersity() 616 624 617 # fill a sizer with the combobox to select dispersion type625 ## fill a sizer with the combobox to select dispersion type 618 626 model_disp = wx.StaticText(self, wx.ID_ANY, 'Function') 619 CHECK_STATE = False627 CHECK_STATE = self.cb1.GetValue() 620 628 621 629 ix = 0 … … 638 646 err_text = '' 639 647 self.text_disp_1 = wx.StaticText(self, wx.ID_ANY, err_text) 640 self.sizer4_4.Add(self.text_disp_1, (iy, ix), (1, 1), 648 self.sizer4_4.Add(self.text_disp_1, (iy, ix), (1, 1), \ 641 649 wx.EXPAND | wx.ADJUST_MINSIZE, 0) 642 650 643 651 ix += 1 644 652 self.text_disp_min = wx.StaticText(self, wx.ID_ANY, 'Min') 645 self.sizer4_4.Add(self.text_disp_min, (iy, ix), (1, 1), 653 self.sizer4_4.Add(self.text_disp_min, (iy, ix), (1, 1), \ 646 654 wx.EXPAND | wx.ADJUST_MINSIZE, 0) 647 655 … … 676 684 if item in self.model.magnetic_params: 677 685 continue 678 if item notin self.model.orientation_params:679 if item notin self.disp_cb_dict:686 if not item in self.model.orientation_params: 687 if not item in self.disp_cb_dict: 680 688 self.disp_cb_dict[item] = None 681 689 name0 = "Distribution of " + item … … 683 691 name2 = item + ".npts" 684 692 name3 = item + ".nsigmas" 685 if n ame1 notin self.model.details:693 if not name1 in self.model.details: 686 694 self.model.details[name1] = ["", None, None] 687 695 … … 709 717 ctl1.SetValue(str(format_number(value, True))) 710 718 self.sizer4_4.Add(ctl1, (iy, ix), (1, 1), wx.EXPAND) 711 # text to show error sign719 ## text to show error sign 712 720 ix = 2 713 721 text2 = wx.StaticText(self, wx.ID_ANY, '+/-') … … 769 777 Tct2.SetValue(str(format_number(value))) 770 778 self.sizer4_4.Add(Tct2, (iy, ix), (1, 1), 771 wx.EXPAND | wx.ADJUST_MINSIZE, 0)779 wx.EXPAND | wx.ADJUST_MINSIZE, 0) 772 780 self.fixed_param.append([None, name3, Tct2, 773 781 None, None, None, … … 795 803 if item in self.model.magnetic_params: 796 804 continue 797 if item in self.model.orientation_params:798 if item notin self.disp_cb_dict:805 if item in self.model.orientation_params: 806 if not item in self.disp_cb_dict: 799 807 self.disp_cb_dict[item] = None 800 808 name0 = "Distribution of " + item … … 803 811 name3 = item + ".nsigmas" 804 812 805 if n ame1 notin self.model.details:813 if not name1 in self.model.details: 806 814 self.model.details[name1] = ["", None, None] 807 815 … … 848 856 849 857 self.sizer4_4.Add(ctl1, (iy, ix), (1, 1), wx.EXPAND) 850 # text to show error sign858 ## text to show error sign 851 859 ix = 2 852 860 text2 = wx.StaticText(self, wx.ID_ANY, '+/-') … … 961 969 962 970 self.state.model = self.model.clone() 963 # save state into 971 ## save state into 972 self.state.cb1 = self.cb1.GetValue() 964 973 self._copy_parameters_state(self.parameters, self.state.parameters) 965 974 self._copy_parameters_state(self.orientation_params_disp, … … 971 980 wx.PostEvent(self.parent, 972 981 StatusEvent(status=" Selected Distribution: Gaussian")) 973 # Fill the list of fittable parameters 982 #Fill the list of fittable parameters 983 #self.select_all_param(event=None) 974 984 self.get_all_checked_params() 975 985 self.Layout() … … 979 989 Update and Draw the model 980 990 """ 981 if self.model isNone:991 if self.model == None: 982 992 msg = "Please select a Model first..." 983 993 wx.MessageBox(msg, 'Info') … … 989 999 self.create_default_data() 990 1000 """ 991 flag, 992 993 wx.CallAfter(self._onparamEnter_helper, 1001 flag,is_modified = self._update_paramv_on_fit() 1002 1003 wx.CallAfter(self._onparamEnter_helper,is_modified) 994 1004 if not flag: 995 1005 msg = "The parameters are invalid" … … 1001 1011 Allow to fit 1002 1012 """ 1003 if event is notNone:1013 if event != None: 1004 1014 event.Skip() 1005 1015 if self.fit_started: … … 1041 1051 return 1042 1052 1043 self.select_param( )1053 self.select_param(event=None) 1044 1054 1045 1055 # Remove or do not allow fitting on the Q=0 point, especially … … 1052 1062 qmax=self.qmax_x) 1053 1063 1054 # 1055 # 1064 #single fit 1065 #self._manager.onFit(uid=self.uid) 1056 1066 self.fit_started = self._manager.onFit(uid=self.uid) 1057 1067 wx.CallAfter(self.set_fitbutton) … … 1066 1076 versions of Wx (before 2.9) and thus not the release version of 1067 1077 installers, the help comes up at the top level of the file as 1068 web 1078 webbrowser does not pass anything past the # to the browser when it is 1069 1079 running "file:///...." 1070 1080 1071 1072 1081 :param evt: Triggers on clicking the help button 1082 """ 1073 1083 1074 1084 _TreeLocation = "user/sasgui/perspectives/fitting/fitting_help.html" … … 1085 1095 versions of Wx (before 2.9) and thus not the release version of 1086 1096 installers, the help comes up at the top level of the file as 1087 web 1097 webbrowser does not pass anything past the # to the browser when it is 1088 1098 running "file:///...." 1089 1099 1090 1091 1100 :param evt: Triggers on clicking the help button 1101 """ 1092 1102 1093 1103 _TreeLocation = "user/sasgui/perspectives/fitting/sm_help.html" … … 1101 1111 """ 1102 1112 # Skip this feature if we are not on Windows 1103 # 1113 #NOTE: the is_mac data member actually means "is no Windows". 1104 1114 if self.is_mac: 1105 1115 return … … 1111 1121 label = "Fit" 1112 1122 color = "black" 1113 # 1123 #self.btFit.Enable(False) 1114 1124 self.btFit.SetLabel(label) 1115 1125 self.btFit.SetForegroundColour(color) … … 1142 1152 Stop fit 1143 1153 """ 1144 if event is notNone:1154 if event != None: 1145 1155 event.Skip() 1146 1156 self._manager.stop_fit(self.uid) … … 1162 1172 copy_flag = False 1163 1173 is_poly_enabled = None 1164 if event is notNone:1165 if (event.GetEventObject() == self.formfactorbox 1174 if event != None: 1175 if (event.GetEventObject() == self.formfactorbox\ 1166 1176 and self.structurebox.GetLabel() != 'None')\ 1167 1177 or event.GetEventObject() == self.structurebox\ … … 1176 1186 self._keep.Enable(False) 1177 1187 self._set_save_flag(False) 1188 # TODO: why do we have to variables for one flag?? 1178 1189 self.enable_disp.SetValue(False) 1179 1190 self.disable_disp.SetValue(True) … … 1205 1216 self._keep.Enable(not self.batch_on) 1206 1217 self._set_save_flag(True) 1207 self._set_smear(self.data)1208 1218 1209 1219 # more disables for 2D … … 1219 1229 except: 1220 1230 raise 1221 # error occured on chisqr computation1222 # 1223 # event to post model to fit to fitting plugins1231 ## error occured on chisqr computation 1232 #pass 1233 ## event to post model to fit to fitting plugins 1224 1234 (ModelEventbox, EVT_MODEL_BOX) = wx.lib.newevent.NewEvent() 1225 1235 1226 # set smearing value whether or not data contain the smearing info 1236 ## set smearing value whether or not 1237 # the data contain the smearing info 1227 1238 evt = ModelEventbox(model=self.model, 1228 1239 smearer=temp_smear, … … 1234 1245 1235 1246 self._manager._on_model_panel(evt=evt) 1236 self.mbox_description.SetLabel("Model [ %s ]" % 1237 str(self.model.name)) 1247 self.mbox_description.SetLabel("Model [ %s ]" % str(self.model.name)) 1238 1248 self.mbox_description.SetForegroundColour(wx.BLUE) 1239 1249 self.state.model = self.model.clone() 1240 1250 self.state.model.name = self.model.name 1241 1251 1242 if event is notNone:1243 # post state to fit panel1252 if event != None: 1253 ## post state to fit panel 1244 1254 new_event = PageInfoEvent(page=self) 1245 1255 wx.PostEvent(self.parent, new_event) 1246 # 1256 #update list of plugins if new plugin is available 1247 1257 custom_model = 'Customized Models' 1248 1258 mod_cat = self.categorybox.GetStringSelection() … … 1257 1267 self.formfactorbox.SetValue(current_val) 1258 1268 # when select a model only from guictr/button 1259 if is_poly_enabled is notNone:1269 if is_poly_enabled != None: 1260 1270 self.enable_disp.SetValue(is_poly_enabled) 1261 1271 self.disable_disp.SetValue(not is_poly_enabled) … … 1285 1295 when enter value on panel redraw model according to changed 1286 1296 """ 1287 if self.model isNone:1297 if self.model == None: 1288 1298 msg = "Please select a Model first..." 1289 1299 wx.MessageBox(msg, 'Info') 1290 1300 return 1291 1301 1292 # 1302 #default flag 1293 1303 flag = False 1294 1304 self.fitrange = True 1295 # 1305 #get event object 1296 1306 tcrtl = event.GetEventObject() 1297 # 1307 #Clear msg if previously shown. 1298 1308 msg = "" 1299 1309 wx.PostEvent(self._manager.parent, StatusEvent(status=msg)) … … 1306 1316 if not self.disable_smearer.GetValue(): 1307 1317 temp_smearer = self.current_smearer 1308 # set smearing value whether or not data contain the1309 # smearing info1318 ## set smearing value whether or not 1319 # the data contain the smearing info 1310 1320 if self.slit_smearer.GetValue(): 1311 1321 flag1 = self.update_slit_smear() … … 1324 1334 enable_smearer=enable_smearer) 1325 1335 if flag: 1326 # 1327 1328 # new state posted1336 #self.compute_chisqr(smearer= temp_smearer) 1337 1338 ## new state posted 1329 1339 if self.state_change: 1330 # 1340 #self._undo.Enable(True) 1331 1341 event = PageInfoEvent(page=self) 1332 1342 wx.PostEvent(self.parent, event) … … 1338 1348 else: 1339 1349 self.save_current_state() 1340 msg = "Cannot Plot :Must enter a number!!! "1350 msg = "Cannot Plot :Must enter a number!!! " 1341 1351 wx.PostEvent(self._manager.parent, StatusEvent(status=msg)) 1342 1352 … … 1349 1359 """ 1350 1360 tcrtl = event.GetEventObject() 1351 # 1361 #Clear msg if previously shown. 1352 1362 msg = "" 1353 1363 wx.PostEvent(self._manager.parent, StatusEvent(status=msg)) … … 1367 1377 tcrtl.SetBackgroundColour(wx.WHITE) 1368 1378 1369 # 1379 #self._undo.Enable(True) 1370 1380 self.save_current_state() 1371 1381 event = PageInfoEvent(page=self) … … 1377 1387 ON Qrange focus 1378 1388 """ 1379 if event is notNone:1389 if event != None: 1380 1390 event.Skip() 1381 # 1391 #tcrtl = event.GetEventObject() 1382 1392 self._validate_qrange(self.qmin, self.qmax) 1383 1393 … … 1386 1396 On Qrange textctrl click, make the qrange lines in the plot 1387 1397 """ 1388 if event is notNone:1398 if event != None: 1389 1399 event.Skip() 1390 1400 if self.data.__class__.__name__ == "Data2D": … … 1404 1414 #On q range value updated. DO not combine with qrange_click(). 1405 1415 """ 1406 if event is notNone:1416 if event != None: 1407 1417 event.Skip() 1408 1418 if self.data.__class__.__name__ == "Data2D": … … 1432 1442 length = len(self.data.x) 1433 1443 indx = (numpy.abs(self.data.x - x_data)).argmin() 1434 # 1444 #return array.flat[idx] 1435 1445 if key == wx.WXK_PAGEUP or key == wx.WXK_NUMPAD_PAGEUP: 1436 1446 indx += 1 … … 1451 1461 """ 1452 1462 tcrtl = event.GetEventObject() 1453 # 1463 #Clear msg if previously shown. 1454 1464 msg = "" 1455 1465 wx.PostEvent(self._manager.parent, StatusEvent(status=msg)) … … 1481 1491 wx.PostEvent(self._manager.parent, StatusEvent(status=msg)) 1482 1492 return 1483 # 1493 #Check if # of points for theory model are valid(>0). 1484 1494 # check for 2d 1485 1495 if self.data.__class__.__name__ == "Data2D" or \ … … 1488 1498 radius = numpy.sqrt(self.data.qx_data * self.data.qx_data + 1489 1499 self.data.qy_data * self.data.qy_data) 1490 index_data = ((self.qmin_x <= radius) & (radius <= self.qmax_x)) 1500 index_data = ((self.qmin_x <= radius) & \ 1501 (radius <= self.qmax_x)) 1491 1502 index_data = (index_data) & (self.data.mask) 1492 1503 index_data = (index_data) & (numpy.isfinite(self.data.data)) … … 1498 1509 return 1499 1510 else: 1500 # 1501 # 1511 #self.data.mask = index_data 1512 #self.Npts_fit.SetValue(str(len(self.data.mask))) 1502 1513 self.show_npts2fit() 1503 1514 else: 1504 index_data = ((self.qmin_x <= self.data.x) & 1515 index_data = ((self.qmin_x <= self.data.x) & \ 1505 1516 (self.data.x <= self.qmax_x)) 1506 1517 self.Npts_fit.SetValue(str(len(self.data.x[index_data]))) … … 1535 1546 for item in self.parameters: 1536 1547 if item[0].IsShown(): 1537 # 1548 #Skip the angle parameters if 1D data 1538 1549 if self.data.__class__.__name__ != "Data2D" and \ 1539 1550 not self.enable2D: … … 1542 1553 if item in self.param_toFit: 1543 1554 continue 1544 # hide statictext +/-1555 ## hide statictext +/- 1545 1556 if len(item) < 4: 1546 1557 continue 1547 if item[3] is notNone and item[3].IsShown():1558 if item[3] != None and item[3].IsShown(): 1548 1559 item[3].Hide() 1549 # hide textcrtl for error after fit1550 if item[4] is notNone and item[4].IsShown():1560 ## hide textcrtl for error after fit 1561 if item[4] != None and item[4].IsShown(): 1551 1562 item[4].Hide() 1552 1563 … … 1554 1565 for item in self.fittable_param: 1555 1566 if item[0].IsShown(): 1556 # 1567 #Skip the angle parameters if 1D data 1557 1568 if self.data.__class__.__name__ != "Data2D" and \ 1558 1569 not self.enable2D: … … 1563 1574 if len(item) < 4: 1564 1575 continue 1565 # hide statictext +/-1566 if item[3] is notNone and item[3].IsShown():1576 ## hide statictext +/- 1577 if item[3] != None and item[3].IsShown(): 1567 1578 item[3].Hide() 1568 # hide textcrtl for error after fit1569 if item[4] is notNone and item[4].IsShown():1579 ## hide textcrtl for error after fit 1580 if item[4] != None and item[4].IsShown(): 1570 1581 item[4].Hide() 1571 1582 return … … 1576 1587 """ 1577 1588 # get the default values 1578 if self.dxl isNone:1589 if self.dxl == None: 1579 1590 self.dxl = 0.0 1580 if self.dxw isNone:1591 if self.dxw == None: 1581 1592 self.dxw = "" 1582 if self.dx_min isNone:1593 if self.dx_min == None: 1583 1594 self.dx_min = SMEAR_SIZE_L 1584 if self.dx_max isNone:1595 if self.dx_max == None: 1585 1596 self.dx_max = SMEAR_SIZE_H 1586 1597 … … 1603 1614 elif self.data.__class__.__name__ == "Data2D" or \ 1604 1615 self.enable2D: 1605 if data.dqx_data is None or data.dqy_data isNone:1616 if data.dqx_data == None or data.dqy_data == None: 1606 1617 return 1607 elif self.current_smearer is notNone \1618 elif self.current_smearer != None \ 1608 1619 and data.dqx_data.any() != 0 \ 1609 1620 and data.dqx_data.any() != 0: … … 1615 1626 return 1616 1627 # check if it is pinhole smear and get min max if it is. 1617 if data.dx is not None and not numpy.any(data.dx):1628 if data.dx != None and all(data.dx != 0): 1618 1629 self.smear_type = "Pinhole" 1619 1630 self.dq_l = data.dx[0] … … 1621 1632 1622 1633 # check if it is slit smear and get min max if it is. 1623 elif data.dxl is not None or data.dxw is notNone:1634 elif data.dxl != None or data.dxw != None: 1624 1635 self.smear_type = "Slit" 1625 if data.dxl is not None and not numpy.all(data.dxl,0):1636 if data.dxl != None and all(data.dxl != 0): 1626 1637 self.dq_l = data.dxl[0] 1627 if data.dxw is not None and not numpy.all(data.dxw,0):1638 if data.dxw != None and all(data.dxw != 0): 1628 1639 self.dq_r = data.dxw[0] 1629 # 1640 #return self.smear_type,self.dq_l,self.dq_r 1630 1641 1631 1642 def _show_smear_sizer(self): … … 1651 1662 1652 1663 self.smear_description_dqdata.Show(True) 1653 if self.smear_type is notNone:1664 if self.smear_type != None: 1654 1665 self.smear_description_smear_type.Show(True) 1655 1666 if self.smear_type == 'Slit': … … 1742 1753 Select an accuracy in 2D custom smear: Xhigh, High, Med, or Low 1743 1754 """ 1744 # 1755 #event.Skip() 1745 1756 # Check if the accuracy is same as before 1746 # 1757 #self.smear2d_accuracy = event.GetEventObject().GetValue() 1747 1758 self.smear2d_accuracy = self.smear_accuracy.GetValue() 1748 1759 if self.pinhole_smearer.GetValue(): … … 1750 1761 else: 1751 1762 self.onSmear(event=None) 1752 if self.current_smearer is notNone:1763 if self.current_smearer != None: 1753 1764 self.current_smearer.set_accuracy(accuracy=\ 1754 1765 self.smear2d_accuracy) … … 1782 1793 Build a panel to allow to edit Mask 1783 1794 """ 1784 from sas.sasgui.guiframe.local_perspectives.plotting.masking import\1785 1795 from sas.sasgui.guiframe.local_perspectives.plotting.masking \ 1796 import MaskPanel as MaskDialog 1786 1797 1787 1798 self.panel = MaskDialog(base=self, data=self.data, id=wx.NewId()) … … 1794 1805 is_valid_qrange = self._update_paramv_on_fit() 1795 1806 1796 if is_valid_qrange and self.model is notNone:1807 if is_valid_qrange and self.model != None: 1797 1808 self.panel.MakeModal(False) 1798 1809 event.Skip() … … 1800 1811 self._draw_model() 1801 1812 self.show_npts2fit() 1802 elif self.model isNone:1813 elif self.model == None: 1803 1814 self.panel.MakeModal(False) 1804 1815 event.Skip() … … 1867 1878 npts = len(data.x) 1868 1879 except: 1869 msg = "Unable to find min/max/length of \n data named %s" % \1880 msg = "Unable to find min/max/length of \n data named %s" % \ 1870 1881 data.filename 1871 1882 wx.PostEvent(self._manager.parent, StatusEvent(status=msg, … … 1884 1895 info="error")) 1885 1896 raise ValueError, msg 1886 # Maximum value of data1897 ## Maximum value of data 1887 1898 qmax = math.sqrt(x * x + y * y) 1888 1899 npts = len(data.data) … … 1896 1907 flag = False 1897 1908 is_data = False 1898 npts = 01899 1909 try: 1900 1910 old_id = self.data.id … … 1908 1918 flag = True 1909 1919 if data is not None: 1920 id = data.id 1910 1921 if is_data: 1911 1922 self.graph_id = self.data.group_id … … 1922 1933 self._set_save_flag(False) 1923 1934 else: 1924 if self.model is notNone:1935 if self.model != None: 1925 1936 self._set_bookmark_flag(not self.batch_on) 1926 1937 self._keep.Enable(not self.batch_on) … … 1929 1940 self._set_preview_flag(True) 1930 1941 1942 self._set_smear(data) 1931 1943 # more disables for 2D 1932 1944 if self.data.__class__.__name__ == "Data2D" or \ … … 1935 1947 self.pinhole_smearer.Enable(True) 1936 1948 self.default_mask = copy.deepcopy(self.data.mask) 1937 if self.data.err_data isNone or\1938 numpy.all(err == 1 for err in self.data.err_data) or\1939 not numpy.any(self.data.err_data):1949 if self.data.err_data == None or\ 1950 (self.data.err_data == 1).all() or\ 1951 (self.data.err_data == 0).all(): 1940 1952 self.dI_didata.Enable(False) 1941 1953 self.dI_noweight.SetValue(True) … … 1948 1960 self.slit_smearer.Enable(True) 1949 1961 self.pinhole_smearer.Enable(True) 1950 1951 if self.data.dy is None or\ 1952 numpy.all(self.data.dy == 1) or\ 1953 not numpy.any(self.data.dy): 1962 if self.data.dy == None or\ 1963 (self.data.dy == 1).all() or\ 1964 (self.data.dy == 0).all(): 1954 1965 self.dI_didata.Enable(False) 1955 1966 self.dI_noweight.SetValue(True) … … 1959 1970 self.dI_didata.SetValue(True) 1960 1971 self.weightbt_string = self.dI_didata.GetLabelText() 1961 # Enable weighting radio buttons1972 # Enable weighting radio uttons 1962 1973 self.dI_noweight.Enable(True) 1963 1974 self.dI_sqrdata.Enable(True) … … 1968 1979 data_name = self.data.name 1969 1980 _, _, npts = self.compute_data_range(self.data) 1970 # 1981 #set maximum range for x in linear scale 1971 1982 if not hasattr(self.data, "data"): # Display only for 1D data fit 1972 1983 self.btEditMask.Disable() … … 1977 1988 1978 1989 self.Npts_total.SetValue(str(npts)) 1979 # 1990 #default:number of data points selected to fit 1980 1991 self.Npts_fit.SetValue(str(npts)) 1981 1992 self.Npts_total.SetEditable(False) 1982 self.Npts_total.SetBackgroundColour( 1993 self.Npts_total.SetBackgroundColour(\ 1983 1994 self.GetParent().GetBackgroundColour()) 1984 1995 … … 1990 2001 # send graph_id to page_finder 1991 2002 self._manager.set_graph_id(uid=self.uid, graph_id=self.graph_id) 1992 # 2003 #focus the page 1993 2004 if check_data_validity(data): 1994 2005 self.data_box_description.SetForegroundColour(wx.BLUE) … … 2002 2013 self.on_set_focus(None) 2003 2014 self.Refresh() 2004 # 2015 #update model plot with new data information 2005 2016 if flag: 2017 #set model view button 2018 self.onSmear(None) 2019 2006 2020 if self.data.__class__.__name__ == "Data2D": 2007 2021 self.enable2D = True … … 2011 2025 self.model_view.SetLabel("1D Mode") 2012 2026 self.model_view.Disable() 2013 # 2014 # 2027 #replace data plot on combo box selection 2028 #by removing the previous selected data 2015 2029 try: 2016 2030 wx.PostEvent(self._manager.parent, … … 2019 2033 except: 2020 2034 pass 2021 # 2035 #plot the current selected data 2022 2036 wx.PostEvent(self._manager.parent, 2023 2037 NewPlotEvent(action="check", plot=self.data, … … 2039 2053 self.reset_page_helper(state) 2040 2054 2041 self.select_param( )2042 # 2055 self.select_param(event=None) 2056 #Save state_fit 2043 2057 self.save_current_state_fit() 2044 2058 except: … … 2079 2093 else: 2080 2094 for qx in self.data.x: 2081 if q max >= qx >= qmin:2095 if qx >= qmin and qx <= qmax: 2082 2096 npts2fit += 1 2083 2097 return npts2fit … … 2108 2122 # make sure stop button to fit button all the time 2109 2123 self._on_fit_complete() 2110 if out isNone or not numpy.isfinite(chisqr):2124 if out == None or not numpy.isfinite(chisqr): 2111 2125 raise ValueError, "Fit error occured..." 2112 2126 … … 2115 2129 dispersity = '' 2116 2130 2117 # 2131 #Hide textctrl boxes of errors. 2118 2132 self._clear_Err_on_Fit() 2119 2133 2120 # 2121 if chisqr is notNone and numpy.isfinite(chisqr):2122 # 2134 #Check if chi2 is finite 2135 if chisqr != None and numpy.isfinite(chisqr): 2136 #format chi2 2123 2137 chi2 = format_number(chisqr, True) 2124 2138 self.tcChi.SetValue(chi2) … … 2127 2141 self.tcChi.SetValue("-") 2128 2142 2129 # 2143 #Hide error title 2130 2144 if self.text2_3.IsShown() and not self.is_mac: 2131 2145 self.text2_3.Hide() … … 2134 2148 if self.enable_disp.GetValue(): 2135 2149 if hasattr(self, "text_disp_1"): 2136 if self.text_disp_1 is notNone and not self.is_mac:2150 if self.text_disp_1 != None and not self.is_mac: 2137 2151 self.text_disp_1.Hide() 2138 2152 except: … … 2141 2155 2142 2156 i = 0 2143 # 2157 #Set the panel when fit result are list 2144 2158 2145 2159 for item in self.param_toFit: 2146 if len(item) > 5 and item is notNone:2160 if len(item) > 5 and item != None: 2147 2161 2148 2162 if item[0].IsShown(): 2149 # reset error value to initial state2163 ## reset error value to initial state 2150 2164 if not self.is_mac: 2151 2165 item[3].Hide() … … 2154 2168 if item[1] == p_name[ind]: 2155 2169 break 2156 if len(out) > 0 and out[ind] is notNone:2170 if len(out) > 0 and out[ind] != None: 2157 2171 val_out = format_number(out[ind], True) 2158 2172 item[2].SetValue(val_out) 2159 2173 2160 if(cov is notNone and len(cov) == len(out)):2174 if(cov != None and len(cov) == len(out)): 2161 2175 try: 2162 if dispersity is notNone:2176 if dispersity != None: 2163 2177 if self.enable_disp.GetValue(): 2164 2178 if hasattr(self, "text_disp_1"): 2165 if self.text_disp_1 is notNone:2179 if self.text_disp_1 != None: 2166 2180 if not self.text_disp_1.IsShown()\ 2167 2181 and not self.is_mac: 2168 2182 self.text_disp_1.Show(True) 2169 2183 except: 2170 2184 pass 2171 2185 2172 if cov[ind] is notNone:2186 if cov[ind] != None: 2173 2187 if numpy.isfinite(float(cov[ind])): 2174 2188 val_err = format_number(cov[ind], True) 2175 2189 item[4].SetForegroundColour(wx.BLACK) 2176 2190 else: 2177 2191 val_err = 'NaN' … … 2185 2199 else: 2186 2200 raise ValueError, "onsetValues: Invalid parameters..." 2187 # 2201 #Show error title when any errors displayed 2188 2202 if has_error: 2189 2203 if not self.text2_3.IsShown(): 2190 2204 self.text2_3.Show(True) 2191 # save current state2205 ## save current state 2192 2206 self.save_current_state() 2193 2207 … … 2196 2210 self.Refresh() 2197 2211 self._mac_sleep(0.1) 2198 # 2212 #plot model ( when drawing, do not update chisqr value again) 2199 2213 self._draw_model(update_chisqr=False, source='fit') 2200 2214 … … 2212 2226 # compute weight for the current data 2213 2227 flag_weight = self.get_weight_flag() 2214 if is_2D isNone:2228 if is_2D == None: 2215 2229 is_2D = self._is_2D() 2216 2230 self._manager.set_fit_weight(uid=self.uid, … … 2231 2245 self._update_paramv_on_fit() 2232 2246 2233 if event is notNone:2247 if event != None: 2234 2248 tcrtl = event.GetEventObject() 2235 2249 # event case of radio button 2236 if tcrtl.GetValue() :2250 if tcrtl.GetValue() == True: 2237 2251 self.dx_min = 0.0 2238 2252 self.dx_max = 0.0 … … 2252 2266 2253 2267 self.sizer_set_smearer.Layout() 2254 # we need FitInside here not just self.Layout to ensure all the sizers2255 # end up with the necessasary space to in the scroll panel. In2256 # particular the compute and fit buttons end up on top of each other2257 # PDB Nov 28 2015.2268 ## we need FitInside here not just self.Layout to ensure all the sizers 2269 ## end up with the necessasary space to in the scroll panel. In 2270 ## particular the compute and fit buttons end up on top of each other 2271 ## PDB Nov 28 2015. 2258 2272 self.FitInside() 2259 2273 2260 if event is notNone:2274 if event != None: 2261 2275 event.Skip() 2262 # 2276 #self._undo.Enable(True) 2263 2277 self.save_current_state() 2264 2278 event = PageInfoEvent(page=self) … … 2335 2349 get_pin_max.SetBackgroundColour("pink") 2336 2350 msg = "Model Error:This value can not be negative!!!" 2337 elif self.dx_min is not None and self.dx_max is notNone:2351 elif self.dx_min != None and self.dx_max != None: 2338 2352 if self._is_2D(): 2339 2353 data.dqx_data[data.dqx_data == 0] = self.dx_min … … 2346 2360 self.dx_max + step / 1.1, 2347 2361 step) 2348 elif self.dx_min is notNone:2362 elif self.dx_min != None: 2349 2363 if self._is_2D(): 2350 2364 data.dqx_data[data.dqx_data == 0] = self.dx_min 2351 2365 else: 2352 2366 data.dx[data.dx == 0] = self.dx_min 2353 elif self.dx_max is notNone:2367 elif self.dx_max != None: 2354 2368 if self._is_2D(): 2355 2369 data.dqy_data[data.dqy_data == 0] = self.dx_max … … 2359 2373 # 2D need to set accuracy 2360 2374 if self._is_2D(): 2361 self.current_smearer.set_accuracy( 2362 accuracy=self.smear2d_accuracy)2363 2364 if msg is notNone:2375 self.current_smearer.set_accuracy(accuracy=\ 2376 self.smear2d_accuracy) 2377 2378 if msg != None: 2365 2379 wx.PostEvent(self._manager.parent, StatusEvent(status=msg)) 2366 2380 else: 2367 2381 get_pin_min.SetBackgroundColour("white") 2368 2382 get_pin_max.SetBackgroundColour("white") 2369 # set smearing value whether or not the data contain the smearing info2383 ## set smearing value whether or not the data contain the smearing info 2370 2384 2371 2385 enable_smearer = not self.disable_smearer.GetValue() … … 2393 2407 wx.CallAfter(self.save_current_state) 2394 2408 2395 if msg is notNone:2409 if msg != None: 2396 2410 return False 2397 2411 else: … … 2409 2423 msg = None 2410 2424 # for event given 2411 if event is notNone:2425 if event != None: 2412 2426 tcrtl = event.GetEventObject() 2413 2427 # event case of radio button … … 2430 2444 self._show_smear_sizer() 2431 2445 self.sizer_set_smearer.Layout() 2432 # we need FitInside here not just self.Layout to ensure all the sizers2433 # end up with the necessasary space to in the scroll panel. In2434 # particular the compute and fit buttons end up on top of each other2435 # PDB Nov 28 2015.2446 ## we need FitInside here not just self.Layout to ensure all the sizers 2447 ## end up with the necessasary space to in the scroll panel. In 2448 ## particular the compute and fit buttons end up on top of each other 2449 ## PDB Nov 28 2015. 2436 2450 self.FitInside() 2437 2451 2438 if event is notNone:2452 if event != None: 2439 2453 event.Skip() 2440 2454 self.save_current_state() 2441 2455 event = PageInfoEvent(page=self) 2442 2456 wx.PostEvent(self.parent, event) 2443 if msg is notNone:2457 if msg != None: 2444 2458 wx.PostEvent(self._manager.parent, StatusEvent(status=msg)) 2445 2459 … … 2530 2544 2531 2545 self.current_smearer = smear_selection(data, self.model) 2532 # set smearing value whether or not the data contain the smearing info2546 ## set smearing value whether or not the data contain the smearing info 2533 2547 enable_smearer = not self.disable_smearer.GetValue() 2534 2548 self._manager.set_smearer(smearer=self.current_smearer, … … 2553 2567 if self._is_changed_slit(): 2554 2568 msg = self._set_slit_smear() 2555 # 2569 #self._undo.Enable(True) 2556 2570 self.save_current_state() 2557 2571 2558 if msg is notNone:2572 if msg != None: 2559 2573 return False 2560 2574 else: … … 2566 2580 are computed when fitting 2567 2581 """ 2568 if event is notNone:2582 if event != None: 2569 2583 event.Skip() 2570 2584 if self.data is None: … … 2579 2593 2580 2594 self.sizer_set_smearer.Layout() 2581 # we need FitInside here not just self.Layout to ensure all the sizers2582 # end up with the necessasary space to in the scroll panel. In2583 # particular the compute and fit buttons end up on top of each other2584 # PDB Nov 28 2015.2595 ## we need FitInside here not just self.Layout to ensure all the sizers 2596 ## end up with the necessasary space to in the scroll panel. In 2597 ## particular the compute and fit buttons end up on top of each other 2598 ## PDB Nov 28 2015. 2585 2599 self.FitInside() 2586 2600 self._set_weight() 2587 2601 2588 # set smearing value whether or not the data contain the smearing info2602 ## set smearing value whether or not the data contain the smearing info 2589 2603 enable_smearer = not self.disable_smearer.GetValue() 2590 2604 wx.CallAfter(self._manager.set_smearer, uid=self.uid, … … 2607 2621 """ 2608 2622 self._get_smear_info() 2609 # 2623 #renew smear sizer 2610 2624 if self.smear_type is not None: 2611 2625 self.smear_description_smear_type.SetValue(str(self.smear_type)) … … 2647 2661 """ 2648 2662 try: 2649 if event isNone:2663 if event == None: 2650 2664 output = "-" 2651 2665 elif not numpy.isfinite(event.output): … … 2682 2696 self._manager.set_param2fit(self.uid, param2fit) 2683 2697 2684 def select_param(self, event=None): 2698 def select_all_param(self, event): 2699 """ 2700 set to true or false all checkBox given the main checkbox value cb1 2701 """ 2702 self.param_toFit = [] 2703 if self.parameters != []: 2704 if self.cb1.GetValue(): 2705 for item in self.parameters: 2706 if item[0].IsShown(): 2707 ## for data2D select all to fit 2708 if self.data.__class__.__name__ == "Data2D" or \ 2709 self.enable2D: 2710 item[0].SetValue(True) 2711 self.param_toFit.append(item) 2712 else: 2713 ## for 1D all parameters except orientation 2714 if not item in self.orientation_params: 2715 item[0].SetValue(True) 2716 self.param_toFit.append(item) 2717 else: 2718 item[0].SetValue(False) 2719 #if len(self.fittable_param)>0: 2720 for item in self.fittable_param: 2721 if item[0].IsShown(): 2722 if self.data.__class__.__name__ == "Data2D" or \ 2723 self.enable2D: 2724 item[0].SetValue(True) 2725 self.param_toFit.append(item) 2726 try: 2727 if len(self.values[item[1]]) > 0: 2728 item[0].SetValue(False) 2729 except: 2730 pass 2731 2732 else: 2733 ## for 1D all parameters except orientation 2734 if not item in self.orientation_params_disp: 2735 item[0].SetValue(True) 2736 self.param_toFit.append(item) 2737 try: 2738 if len(self.values[item[1]]) > 0: 2739 item[0].SetValue(False) 2740 except: 2741 pass 2742 else: 2743 item[0].SetValue(False) 2744 2745 else: 2746 for item in self.parameters: 2747 item[0].SetValue(False) 2748 for item in self.fittable_param: 2749 item[0].SetValue(False) 2750 self.param_toFit = [] 2751 2752 self.save_current_state_fit() 2753 2754 if event != None: 2755 #self._undo.Enable(True) 2756 ## post state to fit panel 2757 event = PageInfoEvent(page=self) 2758 wx.PostEvent(self.parent, event) 2759 param2fit = [] 2760 for item in self.param_toFit: 2761 if item[0] and item[0].IsShown(): 2762 param2fit.append(item[1]) 2763 self.parent._manager.set_param2fit(self.uid, param2fit) 2764 2765 def select_param(self, event): 2685 2766 """ 2686 2767 Select TextCtrl checked for fitting purpose and stores them … … 2689 2770 self.param_toFit = [] 2690 2771 for item in self.parameters: 2691 # 2772 #Skip t ifhe angle parameters if 1D data 2692 2773 if self.data.__class__.__name__ != "Data2D" and\ 2693 2774 not self.enable2D: 2694 2775 if item in self.orientation_params: 2695 2776 continue 2696 # 2777 #Select parameters to fit for list of primary parameters 2697 2778 if item[0].GetValue() and item[0].IsShown(): 2698 2779 if not (item in self.param_toFit): … … 2703 2784 self.param_toFit.remove(item) 2704 2785 2705 # 2786 #Select parameters to fit for list of fittable parameters 2706 2787 # with dispersion 2707 2788 for item in self.fittable_param: 2708 # 2789 #Skip t ifhe angle parameters if 1D data 2709 2790 if self.data.__class__.__name__ != "Data2D" and\ 2710 2791 not self.enable2D: … … 2715 2796 self.param_toFit.append(item) 2716 2797 else: 2717 # 2798 #remove parameters from the fitting list 2718 2799 if item in self.param_toFit: 2719 2800 self.param_toFit.remove(item) 2720 2801 2721 # 2802 #Calculate num. of angle parameters 2722 2803 if self.data.__class__.__name__ == "Data2D" or \ 2723 2804 self.enable2D: … … 2725 2806 else: 2726 2807 len_orient_para = len(self.orientation_params) # assume even len 2727 # 2808 #Total num. of angle parameters 2728 2809 if len(self.fittable_param) > 0: 2729 2810 len_orient_para *= 2 2811 #Set the value of checkbox that selected every checkbox or not 2812 if len(self.parameters) + len(self.fittable_param) - len_orient_para \ 2813 == len(self.param_toFit): 2814 self.cb1.SetValue(True) 2815 else: 2816 self.cb1.SetValue(False) 2730 2817 2731 2818 self.save_current_state_fit() 2732 if event is notNone:2733 # post state to fit panel2819 if event != None: 2820 ## post state to fit panel 2734 2821 event = PageInfoEvent(page=self) 2735 2822 wx.PostEvent(self.parent, event) … … 2757 2844 self.orientation_params_disp = [] 2758 2845 2759 if model isNone:2846 if model == None: 2760 2847 self.sizer3.Layout() 2761 2848 self.SetupScrolling() … … 2765 2852 boxsizer1 = wx.StaticBoxSizer(box_description, wx.VERTICAL) 2766 2853 sizer = wx.GridBagSizer(5, 5) 2767 # save the current model2854 ## save the current model 2768 2855 self.model = model 2769 2856 2770 2857 keys = self.model.getParamList() 2771 2858 2772 # 2859 #list of dispersion parameters 2773 2860 self.disp_list = self.model.getDispParamList() 2774 2861 … … 2803 2890 return -1 2804 2891 # both have a number 2805 if num_a is not None and num_b is notNone:2892 if num_a != None and num_b != None: 2806 2893 if num_a > num_b: 2807 2894 return -1 … … 2816 2903 return 1 2817 2904 # one of them has a number 2818 elif num_a is notNone:2905 elif num_a != None: 2819 2906 return 1 2820 elif num_b is notNone:2907 elif num_b != None: 2821 2908 return -1 2822 2909 # no numbers … … 2824 2911 return cmp(a.lower(), b.lower()) 2825 2912 2826 # keys obtained now from ordered dict, so commenting alphabetical 2827 # orderingkeys.sort(custom_compare)2913 # keys obtained now from ordered dict, so commenting alphabetical ordering 2914 #keys.sort(custom_compare) 2828 2915 2829 2916 iy = 0 2830 2917 ix = 0 2831 sizer.Add(wx.StaticText(self, wx.ID_ANY, 'Parameter'), 2832 (iy, ix), (1, 1), wx.EXPAND | wx.ADJUST_MINSIZE, 0) 2918 select_text = "Select All" 2919 self.cb1 = wx.CheckBox(self, wx.ID_ANY, str(select_text), (10, 10)) 2920 wx.EVT_CHECKBOX(self, self.cb1.GetId(), self.select_all_param) 2921 self.cb1.SetToolTipString("To check/uncheck all the boxes below.") 2922 self.cb1.SetValue(True) 2923 2924 sizer.Add(self.cb1, (iy, ix), (1, 1), \ 2925 wx.LEFT | wx.EXPAND | wx.ADJUST_MINSIZE, 5) 2833 2926 ix += 1 2834 2927 self.text2_2 = wx.StaticText(self, wx.ID_ANY, 'Value') 2835 sizer.Add(self.text2_2, (iy, ix), (1, 1), 2928 sizer.Add(self.text2_2, (iy, ix), (1, 1), \ 2836 2929 wx.EXPAND | wx.ADJUST_MINSIZE, 0) 2837 2930 ix += 2 2838 2931 self.text2_3 = wx.StaticText(self, wx.ID_ANY, 'Error') 2839 sizer.Add(self.text2_3, (iy, ix), (1, 1), 2840 wx.EXPAND | wx.ADJUST_MINSIZE, 0)2932 sizer.Add(self.text2_3, (iy, ix), (1, 1), \ 2933 wx.EXPAND | wx.ADJUST_MINSIZE, 0) 2841 2934 if not self.is_mac: 2842 2935 self.text2_3.Hide() 2843 2936 ix += 1 2844 2937 self.text2_min = wx.StaticText(self, wx.ID_ANY, 'Min') 2845 sizer.Add(self.text2_min, (iy, ix), (1, 1), 2846 wx.EXPAND | wx.ADJUST_MINSIZE, 0)2847 # 2938 sizer.Add(self.text2_min, (iy, ix), (1, 1), \ 2939 wx.EXPAND | wx.ADJUST_MINSIZE, 0) 2940 #self.text2_min.Hide() 2848 2941 ix += 1 2849 2942 self.text2_max = wx.StaticText(self, wx.ID_ANY, 'Max') 2850 sizer.Add(self.text2_max, (iy, ix), (1, 1), 2851 wx.EXPAND | wx.ADJUST_MINSIZE, 0)2852 # 2943 sizer.Add(self.text2_max, (iy, ix), (1, 1), \ 2944 wx.EXPAND | wx.ADJUST_MINSIZE, 0) 2945 #self.text2_max.Hide() 2853 2946 ix += 1 2854 2947 self.text2_4 = wx.StaticText(self, wx.ID_ANY, '[Units]') 2855 sizer.Add(self.text2_4, (iy, ix), (1, 1), 2856 wx.EXPAND | wx.ADJUST_MINSIZE, 0)2948 sizer.Add(self.text2_4, (iy, ix), (1, 1), \ 2949 wx.EXPAND | wx.ADJUST_MINSIZE, 0) 2857 2950 self.text2_4.Hide() 2858 2951 2859 CHECK_STATE = False2952 CHECK_STATE = self.cb1.GetValue() 2860 2953 for item in keys: 2861 2954 2862 if item notin self.disp_list and not item in \2955 if not item in self.disp_list and not item in \ 2863 2956 self.model.orientation_params: 2864 2957 2865 # 2866 if item notin self.model.details:2958 ##prepare a spot to store errors 2959 if not item in self.model.details: 2867 2960 self.model.details[item] = ["", None, None] 2868 2961 2869 2962 iy += 1 2870 2963 ix = 0 2871 if (self.model.__class__ in 2872 self.model_list_box["Multi-Functions"] or 2964 if (self.model.__class__ in \ 2965 self.model_list_box["Multi-Functions"] or \ 2873 2966 self.temp_multi_functional)\ 2874 2967 and (item in self.model.non_fittable): 2875 2968 non_fittable_name = wx.StaticText(self, wx.ID_ANY, item) 2876 sizer.Add(non_fittable_name, (iy, ix), (1, 1), 2969 sizer.Add(non_fittable_name, (iy, ix), (1, 1), \ 2877 2970 wx.LEFT | wx.EXPAND | wx.ADJUST_MINSIZE, 21) 2878 # add parameter value2971 ## add parameter value 2879 2972 ix += 1 2880 2973 value = self.model.getParam(item) 2881 2974 if len(self.model.fun_list) > 0: 2882 # 2975 #num = item.split('_')[1][5:7] 2883 2976 fun_box = wx.ComboBox(self, wx.ID_ANY, size=(100, -1), 2884 2977 style=wx.CB_READONLY, name='%s' % item) 2885 2978 self._set_fun_box_list(fun_box) 2886 2979 fun_box.SetSelection(0) 2887 # 2980 #self.fun_box.SetToolTipString("A function 2888 2981 # describing the interface") 2889 2982 wx.EVT_COMBOBOX(fun_box, wx.ID_ANY, self._on_fun_box) … … 2892 2985 size=(_BOX_WIDTH, 20), 2893 2986 style=wx.TE_PROCESS_ENTER, name='%s' % item) 2894 fun_box.SetToolTipString( 2987 fun_box.SetToolTipString(\ 2895 2988 "Hit 'Enter' after typing to update the plot.") 2896 2989 fun_box.SetValue(format_number(value, True)) … … 2900 2993 None, None]) 2901 2994 else: 2902 # add parameters name with checkbox for selecting to fit2995 ## add parameters name with checkbox for selecting to fit 2903 2996 cb = wx.CheckBox(self, wx.ID_ANY, item) 2904 2997 cb.SetValue(CHECK_STATE) 2905 2998 cb.SetToolTipString(" Check mark to fit.") 2906 # 2999 #cb.SetValue(True) 2907 3000 wx.EVT_CHECKBOX(self, cb.GetId(), self.select_param) 2908 3001 … … 2910 3003 wx.LEFT | wx.EXPAND | wx.ADJUST_MINSIZE, 5) 2911 3004 2912 # add parameter value3005 ## add parameter value 2913 3006 ix += 1 2914 3007 value = self.model.getParam(item) 2915 3008 ctl1 = ModelTextCtrl(self, wx.ID_ANY, size=(_BOX_WIDTH, 20), 2916 3009 style=wx.TE_PROCESS_ENTER) 2917 ctl1.SetToolTipString( 3010 ctl1.SetToolTipString(\ 2918 3011 "Hit 'Enter' after typing to update the plot.") 2919 3012 ctl1.SetValue(format_number(value, True)) 2920 3013 sizer.Add(ctl1, (iy, ix), (1, 1), wx.EXPAND) 2921 # text to show error sign3014 ## text to show error sign 2922 3015 ix += 1 2923 3016 text2 = wx.StaticText(self, wx.ID_ANY, '+/-') 2924 sizer.Add(text2, (iy, ix), (1, 1), 3017 sizer.Add(text2, (iy, ix), (1, 1), \ 2925 3018 wx.EXPAND | wx.ADJUST_MINSIZE, 0) 2926 3019 if not self.is_mac: … … 2983 3076 iy += 1 2984 3077 ix = 0 2985 # 3078 #Add tile for orientational angle 2986 3079 for item in keys: 2987 3080 if item in self.model.orientation_params: … … 2990 3083 mag_on_button.SetToolTipString("Turn Pol Beam/Mag scatt on/off") 2991 3084 mag_on_button.Bind(wx.EVT_BUTTON, self._on_mag_on) 2992 mag_angle_help_button = wx.Button(self, wx.ID_ANY, 2993 "Magnetic angles?") 3085 mag_angle_help_button = wx.Button(self, wx.ID_ANY, "Magnetic angles?") 2994 3086 mag_angle_help_button.SetToolTipString("see angle definitions") 2995 3087 mag_help_button = wx.Button(self, wx.ID_ANY, "Mag HELP") 2996 3088 mag_help_button.SetToolTipString("Help on pol beam/mag fitting") 2997 3089 mag_help_button.Bind(wx.EVT_BUTTON, self._on_mag_help) 2998 mag_angle_help_button.Bind(wx.EVT_BUTTON, 3090 mag_angle_help_button.Bind(wx.EVT_BUTTON, \ 2999 3091 self._on_mag_angle_help) 3000 3092 sizer.Add(orient_angle, (iy, ix), (1, 1), … … 3009 3101 wx.LEFT | wx.EXPAND | wx.ADJUST_MINSIZE, 15) 3010 3102 3011 # 3012 # clean this up so that assume mag is off then turn3013 # 3103 #handle the magnetic buttons 3104 #clean this up so that assume mag is off then turn 3105 #all buttons on IF mag has mag and has 2D 3014 3106 if not self._has_magnetic: 3015 3107 mag_on_button.Show(False) … … 3037 3129 break 3038 3130 3039 # 3131 #For Gaussian only 3040 3132 if type.lower() != "array": 3041 3133 for item in self.model.orientation_params: … … 3043 3135 if item in self.model.magnetic_params: 3044 3136 continue 3045 if item notin self.disp_list:3046 # 3047 if item notin self.model.details:3137 if not item in self.disp_list: 3138 ##prepare a spot to store min max 3139 if not item in self.model.details: 3048 3140 self.model.details[item] = ["", None, None] 3049 3141 3050 3142 iy += 1 3051 3143 ix = 0 3052 # add parameters name with checkbox for selecting to fit3144 ## add parameters name with checkbox for selecting to fit 3053 3145 cb = wx.CheckBox(self, wx.ID_ANY, item) 3054 3146 cb.SetValue(CHECK_STATE) … … 3063 3155 wx.LEFT | wx.EXPAND | wx.ADJUST_MINSIZE, 5) 3064 3156 3065 # add parameter value3157 ## add parameter value 3066 3158 ix += 1 3067 3159 value = self.model.getParam(item) 3068 3160 ctl1 = ModelTextCtrl(self, -1, size=(_BOX_WIDTH, 20), 3069 3161 style=wx.TE_PROCESS_ENTER) 3070 ctl1.SetToolTipString( 3162 ctl1.SetToolTipString(\ 3071 3163 "Hit 'Enter' after typing to update the plot.") 3072 3164 ctl1.SetValue(format_number(value, True)) … … 3077 3169 ctl1.Hide() 3078 3170 sizer.Add(ctl1, (iy, ix), (1, 1), wx.EXPAND) 3079 # text to show error sign3171 ## text to show error sign 3080 3172 ix += 1 3081 3173 text2 = wx.StaticText(self, -1, '+/-') 3082 sizer.Add(text2, (iy, ix), (1, 1), 3174 sizer.Add(text2, (iy, ix), (1, 1), \ 3083 3175 wx.EXPAND | wx.ADJUST_MINSIZE, 0) 3084 3176 … … 3145 3237 iy += 1 3146 3238 box_description.SetForegroundColour(wx.BLUE) 3147 # 3239 #Display units text on panel 3148 3240 for item in keys: 3149 3241 if item in self.model.details: 3150 3242 self.text2_4.Show() 3151 # 3243 #Fill the list of fittable parameters 3152 3244 self.get_all_checked_params() 3153 3245 self.save_current_state_fit() … … 3161 3253 Get key stroke event 3162 3254 """ 3163 if self.data isNone:3255 if self.data == None: 3164 3256 return 3165 3257 # Figuring out key combo: Cmd for copy, Alt for paste
Note: See TracChangeset
for help on using the changeset viewer.