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