Changeset f668101 in sasview for src/sas/sasgui/perspectives/fitting
- Timestamp:
- Dec 7, 2016 9:16:33 AM (8 years ago)
- Branches:
- master, ESS_GUI, ESS_GUI_Docs, ESS_GUI_batch_fitting, ESS_GUI_bumps_abstraction, ESS_GUI_iss1116, ESS_GUI_iss879, ESS_GUI_iss959, ESS_GUI_opencl, ESS_GUI_ordering, ESS_GUI_sync_sascalc, costrafo411, magnetic_scatt, release-4.1.1, release-4.1.2, release-4.2.2, ticket-1009, ticket-1094-headless, ticket-1242-2d-resolution, ticket-1243, ticket-1249, ticket885, unittest-saveload
- Children:
- c6728e1
- Parents:
- 1cad8a4 (diff), 5231948 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent. - Location:
- src/sas/sasgui/perspectives/fitting
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
src/sas/sasgui/perspectives/fitting/basepage.py
r55db501 rf668101 19 19 20 20 from sas.sasgui.guiframe.panel_base import PanelBase 21 from sas.sasgui.guiframe.utils import format_number, check_float, IdList, check_int 21 from sas.sasgui.guiframe.utils import format_number, check_float, IdList, \ 22 check_int 22 23 from sas.sasgui.guiframe.events import PanelOnFocusEvent 23 24 from sas.sasgui.guiframe.events import StatusEvent … … 42 43 _QMAX_DEFAULT = 0.5 43 44 _NPTS_DEFAULT = 50 44 # Control panel width45 # Control panel width 45 46 if sys.platform.count("win32") > 0: 46 47 PANEL_WIDTH = 450 … … 57 58 This class provide general structure of fitpanel page 58 59 """ 59 # #Internal name for the AUI manager60 # Internal name for the AUI manager 60 61 window_name = "Fit Page" 61 # #Title to appear on top of the window62 # Title to appear on top of the window 62 63 window_caption = "Fit Page " 63 64 … … 75 76 PanelBase.__init__(self, parent) 76 77 self.SetupScrolling() 77 # Set window's font size78 # Set window's font size 78 79 self.SetWindowVariant(variant=FONT_VARIANT) 79 80 self.SetBackgroundColour(color) 80 81 81 82 self._ids = iter(self._id_pool) 82 # #parent of the page83 # parent of the page 83 84 self.parent = parent 84 # #manager is the fitting plugin85 # #owner of the page (fitting plugin)85 # manager is the fitting plugin 86 # owner of the page (fitting plugin) 86 87 self.event_owner = None 87 # #current model88 # current model 88 89 self.model = None 89 90 self.m_name = None 90 91 self.index_model = None 91 92 self.panel = None 92 # #data93 # data 93 94 self.data = None 94 # list of available data95 # list of available data 95 96 self.data_list = [] 96 97 self.mask = None 97 98 self.uid = wx.NewId() 98 99 self.graph_id = None 99 # Q range for data set100 # Q range for data set 100 101 self.qmin_data_set = numpy.inf 101 102 self.qmax_data_set = None 102 103 self.npts_data_set = 0 103 # #Q range104 # Q range 104 105 self.qmin = None 105 106 self.qmax = None … … 107 108 self.qmin_x = _QMIN_DEFAULT 108 109 self.npts_x = _NPTS_DEFAULT 109 # #total number of point: float110 # total number of point: float 110 111 self.npts = None 111 112 self.num_points = None 112 # #smear default113 # smear default 113 114 self.current_smearer = None 114 # #2D smear accuracy default115 # 2D smear accuracy default 115 116 self.smear2d_accuracy = 'Low' 116 # #slit smear:117 # slit smear: 117 118 self.dxl = None 118 119 self.dxw = None 119 # #pinhole smear120 # pinhole smear 120 121 self.dx_min = None 121 122 self.dx_max = None 122 # #semar attrbs123 # smear attrbs 123 124 self.enable_smearer = None 124 125 self.disable_smearer = None 125 126 self.pinhole_smearer = None 126 127 self.slit_smearer = None 127 # #weigthattrbs128 # weight attrbs 128 129 self.dI_noweight = None 129 130 self.dI_didata = None 130 131 self.dI_sqrdata = None 131 132 self.dI_idata = None 132 # #other attrbs133 # other attrbs 133 134 self.dq_l = None 134 135 self.dq_r = None … … 150 151 self.disp_cb_dict = {} 151 152 152 # self.state = PageState(parent=parent)153 # #dictionary containing list of models153 # self.state = PageState(parent=parent) 154 # dictionary containing list of models 154 155 self.model_list_box = {} 155 156 156 # #Data member to store the dispersion object created157 # Data member to store the dispersion object created 157 158 self._disp_obj_dict = {} 158 # #selected parameters to apply dispersion159 # selected parameters to apply dispersion 159 160 self.disp_cb_dict = {} 160 # #smearer object161 # smearer object 161 162 self.enable2D = False 162 163 self._has_magnetic = False … … 166 167 self.structurebox = None 167 168 self.categorybox = None 168 # #list of model parameters. each item must have same length169 # #each item related to a given parameters170 # #[cb state, name, value, "+/-", error of fit, min, max , units]169 # list of model parameters. each item must have same length 170 # each item related to a given parameters 171 # [cb state, name, value, "+/-", error of fit, min, max , units] 171 172 self.parameters = [] 172 173 # non-fittable parameter whose value is astring 173 174 self.str_parameters = [] 174 # #list of parameters to fit , must be like self.parameters175 # list of parameters to fit , must be like self.parameters 175 176 self.param_toFit = [] 176 # #list of looking like parameters but with non fittable parameters info177 # list of looking like parameters but with non fittable parameters info 177 178 self.fixed_param = [] 178 # #list of looking like parameters but with fittable parameters info179 # list of looking like parameters but with fittable parameters info 179 180 self.fittable_param = [] 180 # #list of dispersion parameters181 # list of dispersion parameters 181 182 self.disp_list = [] 182 183 self.disp_name = "" 183 184 184 # #list of orientation parameters185 # list of orientation parameters 185 186 self.orientation_params = [] 186 187 self.orientation_params_disp = [] … … 189 190 # and this - commenting out on 4/8/2014 by PDB. Remove once clear 190 191 # it is pointless. 191 # if self.model !=None:192 # if self.model is not None: 192 193 # self.disp_list = self.model.getDispParamList() 193 194 self.temp_multi_functional = False 194 # #enable model 2D draw195 # enable model 2D draw 195 196 self.enable2D = False 196 # #check that the fit range is correct to plot the model again197 # check that the fit range is correct to plot the model again 197 198 self.fitrange = True 198 # #Create memento to save the current state199 # Create memento to save the current state 199 200 self.state = PageState(parent=self.parent, 200 201 model=self.model, data=self.data) 201 # #flag to determine if state has change202 # flag to determine if state has change 202 203 self.state_change = False 203 # #save customized array204 # save customized array 204 205 self.values = {} # type: Dict[str, List[float, ...]] 205 206 self.weights = {} # type: Dict[str, List[float, ...]] 206 # #retrieve saved state207 # retrieve saved state 207 208 self.number_saved_state = 0 208 # #dictionary of saved state209 # dictionary of saved state 209 210 self.saved_states = {} 210 # #Create context menu for page211 # Create context menu for page 211 212 self.popUpMenu = wx.Menu() 212 213 … … 221 222 self.popUpMenu.AppendSeparator() 222 223 223 # #Default locations224 # Default locations 224 225 self._default_save_location = os.getcwd() 225 # #save initial state on context menu226 # self.onSave(event=None)226 # save initial state on context menu 227 # self.onSave(event=None) 227 228 self.Bind(wx.EVT_CONTEXT_MENU, self.onContextMenu) 228 229 … … 230 231 self.Bind(wx.EVT_LEFT_DOWN, self.on_left_down) 231 232 232 # #create the basic structure of the panel with empty sizer233 # create the basic structure of the panel with empty sizer 233 234 self.define_page_structure() 234 # #drawing Initial dispersion parameters sizer235 # drawing Initial dispersion parameters sizer 235 236 self.set_dispers_sizer() 236 237 237 # #layout238 # layout 238 239 self.set_layout() 239 240 … … 261 262 self._create_default_1d_data() 262 263 263 if self.model !=None:264 if self.model is not None: 264 265 if not self.data.is_data: 265 self._manager.page_finder[self.uid].set_fit_data( data=\266 266 self._manager.page_finder[self.uid].set_fit_data( 267 data=[self.data]) 267 268 self.on_smear_helper(update=True) 268 269 self.state.enable_smearer = self.enable_smearer.GetValue() … … 330 331 self.data.id = str(self.uid) + " data" 331 332 self.data.group_id = str(self.uid) + " Model2D" 332 # #Default values333 # Default values 333 334 self.data.detector.append(Detector()) 334 335 index = len(self.data.detector) - 1 … … 347 348 x = numpy.linspace(start=xmin, stop=xmax, num=qstep, endpoint=True) 348 349 y = numpy.linspace(start=ymin, stop=ymax, num=qstep, endpoint=True) 349 # #use data info instead350 # use data info instead 350 351 new_x = numpy.tile(x, (len(y), 1)) 351 352 new_y = numpy.tile(y, (len(x), 1)) … … 388 389 Update menu1 on cliking the page tap 389 390 """ 390 if self._manager.menu1 !=None:391 chain_menu = self._manager.menu1.FindItemById( \391 if self._manager.menu1 is not None: 392 chain_menu = self._manager.menu1.FindItemById( 392 393 self._manager.id_reset_flag) 393 394 chain_menu.Enable(self.batch_on) 394 395 sim_menu = self._manager.menu1.FindItemById(self._manager.id_simfit) 395 396 flag = self.data.is_data\ 396 and (self.model !=None)397 and (self.model is not None) 397 398 sim_menu.Enable(not self.batch_on and flag) 398 399 batch_menu = \ … … 535 536 fill sizer containing dispersity info 536 537 """ 537 # print "==== entering set_dispers_sizer ==="538 # print "==== entering set_dispers_sizer ===" 538 539 self.sizer4.Clear(True) 539 540 name = "Polydispersity and Orientational Distribution" … … 541 542 box_description.SetForegroundColour(wx.BLUE) 542 543 boxsizer1 = wx.StaticBoxSizer(box_description, wx.VERTICAL) 543 # ----------------------------------------------------544 # ---------------------------------------------------- 544 545 self.disable_disp = wx.RadioButton(self, wx.ID_ANY, 'Off', (10, 10), 545 546 style=wx.RB_GROUP) … … 561 562 self.Bind(wx.EVT_RADIOBUTTON, self._set_dipers_Param, 562 563 id=self.enable_disp.GetId()) 563 # MAC needs SetValue564 # MAC needs SetValue 564 565 self.disable_disp.SetValue(True) 565 566 sizer_dispersion = wx.BoxSizer(wx.HORIZONTAL) … … 573 574 sizer_dispersion.Add(self.disp_help_bt) 574 575 575 # #fill a sizer for dispersion576 # fill a sizer for dispersion 576 577 boxsizer1.Add(sizer_dispersion, 0, 577 578 wx.TOP|wx.BOTTOM|wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, … … 580 581 581 582 boxsizer1.Add(self.sizer4_4) 582 # -----------------------------------------------------583 # ----------------------------------------------------- 583 584 self.sizer4.Add(boxsizer1, 0, wx.EXPAND | wx.ALL, 10) 584 585 self.sizer4_4.Layout() … … 587 588 588 589 self.Refresh() 589 # #saving the state of enable dispersity button590 # saving the state of enable dispersity button 590 591 self.state.enable_disp = self.enable_disp.GetValue() 591 592 self.state.disable_disp = self.disable_disp.GetValue() … … 597 598 """ 598 599 menu = event.GetEventObject() 599 # #post help message for the selected model600 # post help message for the selected model 600 601 msg = menu.GetHelpString(event.GetId()) 601 602 msg += " reloaded" … … 604 605 name = menu.GetLabel(event.GetId()) 605 606 self._on_select_model_helper() 606 if self.model !=None:607 if self.model is not None: 607 608 self.m_name = self.model.name 608 609 if name in self.saved_states.keys(): 609 610 previous_state = self.saved_states[name] 610 # #reset state of checkbox,textcrtl and regular parameters value611 # reset state of checkbox,textcrtl and regular parameters value 611 612 612 613 self.reset_page(previous_state) … … 631 632 # Ask the user the location of the file to write to. 632 633 path = None 633 if self.parent !=None:634 if self.parent is not None: 634 635 self._default_save_location = \ 635 636 self._manager.parent._default_save_location … … 641 642 self._default_save_location = os.path.dirname(path) 642 643 self._manager.parent._default_save_location = \ 643 644 self._default_save_location 644 645 else: 645 646 return None … … 648 649 # Make sure the ext included in the file name 649 650 fName = os.path.splitext(path)[0] + extens 650 # the manager write the state into file651 # the manager write the state into file 651 652 self._manager.save_fit_state(filepath=fName, fitstate=new_state) 652 653 return new_state … … 656 657 Copy Parameter values to the clipboad 657 658 """ 658 if event !=None:659 if event is not None: 659 660 event.Skip() 660 661 # It seems MAC needs wxCallAfter … … 672 673 Paste Parameter values to the panel if possible 673 674 """ 674 # if event !=None:675 # if event is not None: 675 676 # event.Skip() 676 677 # It seems MAC needs wxCallAfter for the setvalues … … 678 679 wx.CallAfter(self.get_paste) 679 680 # messages depending on the flag 680 # self._copy_info(True)681 # self._copy_info(True) 681 682 682 683 def _copy_info(self, flag): … … 687 688 """ 688 689 # messages depending on the flag 689 if flag ==None:690 if flag is None: 690 691 msg = " Parameter values are copied to the clipboard..." 691 692 infor = 'warning' … … 715 716 save history of the data and model 716 717 """ 717 if self.model ==None:718 if self.model is None: 718 719 msg = "Can not bookmark; Please select Data and Model first..." 719 720 wx.MessageBox(msg, 'Info') … … 721 722 self.save_current_state() 722 723 new_state = self.state.clone() 723 # #Add model state on context menu724 # Add model state on context menu 724 725 self.number_saved_state += 1 725 726 current_time, current_date = self._get_time_stamp() 726 # name= self.model.name+"[%g]"%self.number_saved_state727 # name= self.model.name+"[%g]"%self.number_saved_state 727 728 name = "Fitting: %g]" % self.number_saved_state 728 729 name += self.model.__class__.__name__ … … 730 731 self.saved_states[name] = new_state 731 732 732 # #Add item in the context menu733 # Add item in the context menu 733 734 msg = "Model saved at %s on %s" % (current_time, current_date) 734 # #post help message for the selected model735 # post help message for the selected model 735 736 msg += " Saved! right click on this page to retrieve this model" 736 737 wx.PostEvent(self._manager.parent, StatusEvent(status=msg)) … … 766 767 """ 767 768 try: 768 if path ==None:769 if path is None: 769 770 status = " Selected Distribution was not loaded: %s" % path 770 771 wx.PostEvent(self._manager.parent, … … 801 802 Store current state 802 803 """ 803 # #save model option804 if self.model !=None:804 # save model option 805 if self.model is not None: 805 806 self.disp_list = self.model.getDispParamList() 806 807 self.state.disp_list = copy.deepcopy(self.disp_list) 807 808 self.state.model = self.model.clone() 808 809 809 # model combobox: complex code because of mac's silent error810 if self.structurebox !=None:810 # model combobox: complex code because of mac's silent error 811 if self.structurebox is not None: 811 812 if self.structurebox.IsShown(): 812 813 self.state.structurecombobox = 'None' 813 814 s_select = self.structurebox.GetSelection() 814 815 if s_select > 0: 815 self.state.structurecombobox = self.structurebox.\816 GetString(s_select)817 if self.formfactorbox !=None:816 self.state.structurecombobox = \ 817 self.structurebox.GetString(s_select) 818 if self.formfactorbox is not None: 818 819 f_select = self.formfactorbox.GetSelection() 819 820 if f_select > 0: 820 self.state.formfactorcombobox = self.formfactorbox.\821 GetString(f_select)822 if self.categorybox !=None:821 self.state.formfactorcombobox = \ 822 self.formfactorbox.GetString(f_select) 823 if self.categorybox is not None: 823 824 cb_select = self.categorybox.GetSelection() 824 825 if cb_select > 0: 825 self.state.categorycombobox = self.categorybox.\826 GetString(cb_select)826 self.state.categorycombobox = \ 827 self.categorybox.GetString(cb_select) 827 828 828 829 self.state.enable2D = copy.deepcopy(self.enable2D) 829 830 self.state.values = copy.deepcopy(self.values) 830 831 self.state.weights = copy.deepcopy(self.weights) 831 # #save data832 # save data 832 833 self.state.data = copy.deepcopy(self.data) 833 834 self.state.qmax_x = self.qmax_x … … 864 865 self.state.values = copy.deepcopy(self.values) 865 866 self.state.weights = copy.deepcopy(self.weights) 866 # #save plotting range867 # save plotting range 867 868 self._save_plotting_range() 868 869 … … 874 875 self.state.str_parameters = [] 875 876 876 # #save checkbutton state and txtcrtl values877 # save checkbutton state and txtcrtl values 877 878 self._copy_parameters_state(self.str_parameters, 878 879 self.state.str_parameters) … … 886 887 self.state.fittable_param) 887 888 self._copy_parameters_state(self.fixed_param, self.state.fixed_param) 888 # save chisqr889 # save chisqr 889 890 self.state.tcChi = self.tcChi.GetValue() 890 891 … … 893 894 Store current state for fit_page 894 895 """ 895 # #save model option896 if self.model !=None:896 # save model option 897 if self.model is not None: 897 898 self.disp_list = self.model.getDispParamList() 898 899 self.state.disp_list = copy.deepcopy(self.disp_list) … … 902 903 self.state.values = copy.deepcopy(self.values) 903 904 self.state.weights = copy.deepcopy(self.weights) 904 # #save data905 # save data 905 906 self.state.data = copy.deepcopy(self.data) 906 907 … … 923 924 self.state.dI_sqrdata = copy.deepcopy(self.dI_sqrdata.GetValue()) 924 925 self.state.dI_idata = copy.deepcopy(self.dI_idata.GetValue()) 925 if hasattr(self, "disp_box") and self.disp_box !=None:926 if hasattr(self, "disp_box") and self.disp_box is not None: 926 927 self.state.disp_box = self.disp_box.GetCurrentSelection() 927 928 928 929 if len(self.disp_cb_dict) > 0: 929 930 for k, v in self.disp_cb_dict.iteritems(): 930 if v ==None:931 if v is None: 931 932 self.state.disp_cb_dict[k] = v 932 933 else: … … 942 943 self.state.weights = copy.deepcopy(self.weights) 943 944 944 # #save plotting range945 # save plotting range 945 946 self._save_plotting_range() 946 947 947 # #save checkbutton state and txtcrtl values948 # save checkbutton state and txtcrtl values 948 949 self._copy_parameters_state(self.orientation_params, 949 950 self.state.orientation_params) … … 964 965 msg = "Please load Data and select Model to start..." 965 966 wx.MessageBox(msg, 'Info') 966 return 967 return True 967 968 968 969 def set_model_state(self, state): … … 973 974 self.disp_list = state.disp_list 974 975 975 # #fill model combobox976 # fill model combobox 976 977 self._show_combox_helper() 977 # select the current model978 # select the current model 978 979 try: 979 980 # to support older version … … 1014 1015 self.structurebox.SetSelection(structfactor_pos) 1015 1016 1016 if state.multi_factor !=None:1017 if state.multi_factor is not None: 1017 1018 self.multifactorbox.SetSelection(state.multi_factor) 1018 1019 1019 # #reset state of checkbox,textcrtl and regular parameters value1020 # reset state of checkbox,textcrtl and regular parameters value 1020 1021 self._reset_parameters_state(self.orientation_params_disp, 1021 1022 state.orientation_params_disp) … … 1025 1026 state.str_parameters) 1026 1027 self._reset_parameters_state(self.parameters, state.parameters) 1027 # #display dispersion info layer1028 # display dispersion info layer 1028 1029 self.enable_disp.SetValue(state.enable_disp) 1029 1030 self.disable_disp.SetValue(state.disable_disp) 1030 1031 1031 if hasattr(self, "disp_box") and self.disp_box !=None:1032 if hasattr(self, "disp_box") and self.disp_box is not None: 1032 1033 self.disp_box.SetSelection(state.disp_box) 1033 1034 n = self.disp_box.GetCurrentSelection() … … 1041 1042 1042 1043 if hasattr(self.disp_cb_dict[item], "SetValue"): 1043 self.disp_cb_dict[item].SetValue( \1044 self.disp_cb_dict[item].SetValue( 1044 1045 state.disp_cb_dict[item]) 1045 1046 # Create the dispersion objects 1046 1047 disp_model = POLYDISPERSITY_MODELS['array']() 1047 1048 if hasattr(state, "values") and \ 1048 self.disp_cb_dict[item].GetValue() ==True:1049 self.disp_cb_dict[item].GetValue() is True: 1049 1050 if len(state.values) > 0: 1050 1051 self.values = state.values … … 1057 1058 self._disp_obj_dict[item] = disp_model 1058 1059 # Set the new model as the dispersion object 1059 # for the selected parameter1060 # for the selected parameter 1060 1061 self.model.set_dispersion(item, disp_model) 1061 1062 … … 1067 1068 for item in keys: 1068 1069 if item in self.disp_list and \ 1069 not itemin self.model.details:1070 item not in self.model.details: 1070 1071 self.model.details[item] = ["", None, None] 1071 1072 self.disp_cb_dict = copy.deepcopy(state.disp_cb_dict) 1072 1073 self.state.disp_cb_dict = copy.deepcopy(state.disp_cb_dict) 1073 # #smearing info restore1074 # smearing info restore 1074 1075 if hasattr(self, "enable_smearer"): 1075 # #set smearing value whether or not the data1076 # contain the smearing info1076 # set smearing value whether or not the data 1077 # contain the smearing info 1077 1078 self.enable_smearer.SetValue(state.enable_smearer) 1078 1079 self.disable_smearer.SetValue(state.disable_smearer) … … 1086 1087 self.dI_idata.SetValue(state.dI_idata) 1087 1088 1088 # #we have two more options for smearing1089 # we have two more options for smearing 1089 1090 if self.pinhole_smearer.GetValue(): 1090 1091 self.onPinholeSmear(event=None) … … 1092 1093 self.onSlitSmear(event=None) 1093 1094 1094 # #reset state of checkbox,textcrtl and dispersity parameters value1095 # reset state of checkbox,textcrtl and dispersity parameters value 1095 1096 self._reset_parameters_state(self.fittable_param, state.fittable_param) 1096 1097 self._reset_parameters_state(self.fixed_param, state.fixed_param) 1097 1098 1098 # #draw the model with previous parameters value1099 # draw the model with previous parameters value 1099 1100 self._onparamEnter_helper() 1100 1101 self.select_param(event=None) 1101 # Save state_fit1102 # Save state_fit 1102 1103 self.save_current_state_fit() 1103 1104 self._lay_out() … … 1113 1114 if state.formfactorcombobox in list_item: 1114 1115 return self.categorybox.Items.index(key) 1116 return 0 1115 1117 1116 1118 def reset_page_helper(self, state): … … 1123 1125 state of the graphic interface 1124 1126 """ 1125 if state ==None:1127 if state is None: 1126 1128 return 1127 1129 # set data, etc. from the state … … 1132 1134 data = state.data 1133 1135 1134 if data ==None:1136 if data is None: 1135 1137 data_min = state.qmin 1136 1138 data_max = state.qmax … … 1156 1158 self.disp_list = state.disp_list 1157 1159 1158 ## set the state of the radio box 1159 #self.shape_rbutton.SetValue(state.shape_rbutton) 1160 #self.shape_indep_rbutton.SetValue(state.shape_indep_rbutton) 1161 #self.struct_rbutton.SetValue(state.struct_rbutton) 1162 #self.plugin_rbutton.SetValue(state.plugin_rbutton) 1163 1164 ## fill model combobox 1160 # fill model combobox 1165 1161 self._show_combox_helper() 1166 # select the current model1162 # select the current model 1167 1163 try: 1168 1164 # to support older version 1169 1165 category_pos = int(state.categorycombobox) 1170 1166 except: 1171 state.formfactorcombobox = unicode(state.formfactorcombobox.lower()) 1167 state.formfactorcombobox = state.formfactorcombobox.lower() 1168 state.formfactorcombobox = \ 1169 state.formfactorcombobox.replace('model', '') 1170 state.formfactorcombobox = unicode(state.formfactorcombobox) 1172 1171 state.categorycombobox = unicode(state.categorycombobox) 1173 category_pos = 01174 1172 if state.categorycombobox in self.categorybox.Items: 1175 1173 category_pos = self.categorybox.Items.index( … … 1194 1192 self.formfactorbox.Select(formfactor_pos) 1195 1193 1194 structfactor_pos = 0 1196 1195 try: 1197 1196 # to support older version … … 1199 1198 except: 1200 1199 if state.structurecombobox is not None: 1201 structfactor_pos = 01202 1200 state.structurecombobox = unicode(state.structurecombobox) 1203 1201 for ind_struct in range(self.structurebox.GetCount()): 1204 1202 if self.structurebox.GetString(ind_struct) == \ 1205 1203 (state.structurecombobox): 1206 1204 structfactor_pos = int(ind_struct) 1207 1205 break … … 1209 1207 self.structurebox.SetSelection(structfactor_pos) 1210 1208 1211 if state.multi_factor !=None:1209 if state.multi_factor is not None: 1212 1210 self.multifactorbox.SetSelection(state.multi_factor) 1213 1211 1214 # draw the panel according to the new model parameter1212 # draw the panel according to the new model parameter 1215 1213 self._on_select_model(event=None) 1216 1214 1217 1215 # take care of 2D button 1218 if data ==None and self.model_view.IsEnabled():1216 if data is None and self.model_view.IsEnabled(): 1219 1217 if self.enable2D: 1220 1218 self.model_view.SetLabel("2D Mode") … … 1222 1220 self.model_view.SetLabel("1D Mode") 1223 1221 1224 ## set the select all check box to the a given state 1225 self.cb1.SetValue(state.cb1) 1226 1227 ## reset state of checkbox,textcrtl and regular parameters value 1222 # reset state of checkbox,textcrtl and regular parameters value 1228 1223 self._reset_parameters_state(self.orientation_params_disp, 1229 1224 state.orientation_params_disp) … … 1233 1228 state.str_parameters) 1234 1229 self._reset_parameters_state(self.parameters, state.parameters) 1235 # #display dispersion info layer1230 # display dispersion info layer 1236 1231 self.enable_disp.SetValue(state.enable_disp) 1237 1232 self.disable_disp.SetValue(state.disable_disp) … … 1241 1236 self._set_dipers_Param(event=None) 1242 1237 self._reset_page_disp_helper(state) 1243 # #plotting range restore1238 # plotting range restore 1244 1239 self._reset_plotting_range(state) 1245 # #smearing info restore1240 # smearing info restore 1246 1241 if hasattr(self, "enable_smearer"): 1247 # #set smearing value whether or not the data1248 # contain the smearing info1242 # set smearing value whether or not the data 1243 # contain the smearing info 1249 1244 self.enable_smearer.SetValue(state.enable_smearer) 1250 1245 self.disable_smearer.SetValue(state.disable_smearer) … … 1264 1259 self.dI_idata.SetValue(False) 1265 1260 1266 # #we have two more options for smearing1261 # we have two more options for smearing 1267 1262 if self.pinhole_smearer.GetValue(): 1268 1263 self.dx_min = state.dx_min 1269 1264 self.dx_max = state.dx_max 1270 if self.dx_min !=None:1265 if self.dx_min is not None: 1271 1266 self.smear_pinhole_min.SetValue(str(self.dx_min)) 1272 if self.dx_max !=None:1267 if self.dx_max is not None: 1273 1268 self.smear_pinhole_max.SetValue(str(self.dx_max)) 1274 1269 self.onPinholeSmear(event=None) … … 1276 1271 self.dxl = state.dxl 1277 1272 self.dxw = state.dxw 1278 if self.dxl !=None:1273 if self.dxl is not None: 1279 1274 self.smear_slit_height.SetValue(str(self.dxl)) 1280 if self.dxw !=None:1275 if self.dxw is not None: 1281 1276 self.smear_slit_width.SetValue(str(self.dxw)) 1282 1277 else: … … 1284 1279 self.onSlitSmear(event=None) 1285 1280 1286 # #reset state of checkbox,textcrtl and dispersity parameters value1281 # reset state of checkbox,textcrtl and dispersity parameters value 1287 1282 self._reset_parameters_state(self.fittable_param, state.fittable_param) 1288 1283 self._reset_parameters_state(self.fixed_param, state.fixed_param) 1289 1284 1290 # #draw the model with previous parameters value1285 # draw the model with previous parameters value 1291 1286 self._onparamEnter_helper() 1292 # reset the value of chisqr when not consistent with the value computed1287 # reset the value of chisqr when not consistent with the value computed 1293 1288 self.tcChi.SetValue(str(self.state.tcChi)) 1294 # #reset context menu items1289 # reset context menu items 1295 1290 self._reset_context_menu() 1296 1291 1297 # #set the value of the current state to the state given as parameter1292 # set the value of the current state to the state given as parameter 1298 1293 self.state = state.clone() 1299 1294 self.state.m_name = self.m_name … … 1306 1301 for item in keys: 1307 1302 if item in self.disp_list and \ 1308 not itemin self.model.details:1303 item not in self.model.details: 1309 1304 self.model.details[item] = ["", None, None] 1310 # for k,v in self.state.disp_cb_dict.iteritems():1305 # for k,v in self.state.disp_cb_dict.iteritems(): 1311 1306 self.disp_cb_dict = copy.deepcopy(state.disp_cb_dict) 1312 1307 self.state.disp_cb_dict = copy.deepcopy(state.disp_cb_dict) … … 1315 1310 1316 1311 for key, disp_type in state._disp_obj_dict.iteritems(): 1317 # disp_model = disp1312 # disp_model = disp 1318 1313 disp_model = POLYDISPERSITY_MODELS[disp_type]() 1319 1314 self._disp_obj_dict[key] = disp_model … … 1324 1319 self.model.set_dispersion(param_name, disp_model) 1325 1320 self.model._persistency_dict[key] = \ 1326 1321 [state.values, state.weights] 1327 1322 except Exception: 1328 1323 logging.error(traceback.format_exc()) 1329 1324 selection = self._find_polyfunc_selection(disp_model) 1330 1325 for list in self.fittable_param: 1331 if list[1] == key and list[7] !=None:1326 if list[1] == key and list[7] is not None: 1332 1327 list[7].SetSelection(selection) 1333 1328 # For the array disp_model, set the values and weights … … 1362 1357 open a dialog file to selected the customized dispersity 1363 1358 """ 1364 if self.parent !=None:1359 if self.parent is not None: 1365 1360 self._default_save_location = \ 1366 1361 self._manager.parent.get_save_location() … … 1381 1376 for name, _ in self.state.saved_states.iteritems(): 1382 1377 self.number_saved_state += 1 1383 # #Add item in the context menu1378 # Add item in the context menu 1384 1379 wx_id = ids.next() 1385 1380 msg = 'Save model and state %g' % self.number_saved_state … … 1398 1393 save radiobutton containing the type model that can be selected 1399 1394 """ 1400 # self.state.shape_rbutton = self.shape_rbutton.GetValue()1401 # self.state.shape_indep_rbutton = self.shape_indep_rbutton.GetValue()1402 # self.state.struct_rbutton = self.struct_rbutton.GetValue()1403 # self.state.plugin_rbutton = self.plugin_rbutton.GetValue()1395 # self.state.shape_rbutton = self.shape_rbutton.GetValue() 1396 # self.state.shape_indep_rbutton = self.shape_indep_rbutton.GetValue() 1397 # self.state.struct_rbutton = self.struct_rbutton.GetValue() 1398 # self.state.plugin_rbutton = self.plugin_rbutton.GetValue() 1404 1399 self.state.structurecombobox = self.structurebox.GetLabel() 1405 1400 self.state.formfactorcombobox = self.formfactorbox.GetLabel() 1406 1401 self.state.categorycombobox = self.categorybox.GetLabel() 1407 1402 1408 # #post state to fit panel1403 # post state to fit panel 1409 1404 event = PageInfoEvent(page=self) 1410 1405 wx.PostEvent(self.parent, event) … … 1418 1413 self.state.npts = self.npts_x 1419 1414 1420 def _onparamEnter_helper(self, is_modified =False):1415 def _onparamEnter_helper(self, is_modified=False): 1421 1416 """ 1422 1417 check if values entered by the user are changed and valid to replot … … 1424 1419 """ 1425 1420 # Flag to register when a parameter has changed. 1426 # is_modified = False1421 # is_modified = False 1427 1422 self.fitrange = True 1428 1423 is_2Ddata = False 1429 # self._undo.Enable(True)1424 # self._undo.Enable(True) 1430 1425 # check if 2d data 1431 1426 if self.data.__class__.__name__ == "Data2D": 1432 1427 is_2Ddata = True 1433 if self.model !=None:1434 # Either we get a is_modified = True passed in because1435 # _update_paramv_on_fit() has been called already or1428 if self.model is not None: 1429 # Either we get a is_modified = True passed in because 1430 # _update_paramv_on_fit() has been called already or 1436 1431 # we need to check here ourselves. 1437 1432 if not is_modified: … … 1460 1455 self.fitrange = False 1461 1456 1462 if not self.data.is_data: 1463 is_modified = True 1464 1465 ## if any value is modify draw model with new value 1457 # if any value is modify draw model with new value 1466 1458 if not self.fitrange: 1467 # self.btFit.Disable()1459 # self.btFit.Disable() 1468 1460 if is_2Ddata: 1469 1461 self.btEditMask.Disable() … … 1478 1470 self._draw_model() 1479 1471 self.Refresh() 1472 1473 # logging.info("is_modified flag set to %g",is_modified) 1480 1474 return is_modified 1481 1475 … … 1484 1478 make sure that update param values just before the fitting 1485 1479 """ 1486 # flag for qmin qmax check values1480 # flag for qmin qmax check values 1487 1481 flag = True 1488 1482 self.fitrange = True 1489 1483 is_modified = False 1490 1484 1491 # wx.PostEvent(self._manager.parent, StatusEvent(status=" \1492 # updating ... ",type="update"))1493 1494 # #So make sure that update param values on_Fit.1495 # self._undo.Enable(True)1496 if self.model !=None:1485 # wx.PostEvent(self._manager.parent, StatusEvent(status=" \ 1486 # updating ... ",type="update")) 1487 1488 # So make sure that update param values on_Fit. 1489 # self._undo.Enable(True) 1490 if self.model is not None: 1497 1491 if self.Npts_total.GetValue() != self.Npts_fit.GetValue(): 1498 1492 if not self.data.is_data: 1499 self._manager.page_finder[self.uid].set_fit_data( data=\1500 1501 # #Check the values1493 self._manager.page_finder[self.uid].set_fit_data( 1494 data=[self.data]) 1495 # Check the values 1502 1496 is_modified = (self._check_value_enter(self.fittable_param) 1503 1504 1497 or self._check_value_enter(self.fixed_param) 1498 or self._check_value_enter(self.parameters)) 1505 1499 1506 1500 # If qmin and qmax have been modified, update qmin and qmax and … … 1543 1537 enable_smearer=enable_smearer, 1544 1538 draw=False) 1545 if self.data !=None:1546 index_data = ((self.qmin_x <= self.data.x) & \1539 if self.data is not None: 1540 index_data = ((self.qmin_x <= self.data.x) & 1547 1541 (self.data.x <= self.qmax_x)) 1548 val = str(len(self.data.x[index_data ==True]))1542 val = str(len(self.data.x[index_data is True])) 1549 1543 self.Npts_fit.SetValue(val) 1550 1544 else: … … 1566 1560 flag = False 1567 1561 1568 # For invalid q range, disable the mask editor and fit button, vs.1562 # For invalid q range, disable the mask editor and fit button, vs. 1569 1563 if not self.fitrange: 1570 1564 if self._is_2D(): 1571 1565 self.btEditMask.Disable() 1572 1566 else: 1573 if self._is_2D() and 1567 if self._is_2D() and self.data.is_data and not self.batch_on: 1574 1568 self.btEditMask.Enable(True) 1575 1569 … … 1584 1578 logging.error(traceback.format_exc()) 1585 1579 1586 return flag, is_modified1580 return flag, is_modified 1587 1581 1588 1582 def _reset_parameters_state(self, listtorestore, statelist): … … 1598 1592 item_page = listtorestore[j] 1599 1593 item_page_info = statelist[j] 1600 # #change the state of the check box for simple parameters1601 if item_page[0] !=None:1594 # change the state of the check box for simple parameters 1595 if item_page[0] is not None: 1602 1596 item_page[0].SetValue(item_page_info[0]) 1603 if item_page[2] !=None:1597 if item_page[2] is not None: 1604 1598 item_page[2].SetValue(item_page_info[2]) 1605 1599 if item_page[2].__class__.__name__ == "ComboBox": … … 1607 1601 fun_val = self.model.fun_list[item_page_info[2]] 1608 1602 self.model.setParam(item_page_info[1], fun_val) 1609 if item_page[3] !=None:1610 # #show or hide text +/-1603 if item_page[3] is not None: 1604 # show or hide text +/- 1611 1605 if item_page_info[2]: 1612 1606 item_page[3].Show(True) 1613 1607 else: 1614 1608 item_page[3].Hide() 1615 if item_page[4] !=None:1616 # #show of hide the text crtl for fitting error1609 if item_page[4] is not None: 1610 # show of hide the text crtl for fitting error 1617 1611 if item_page_info[4][0]: 1618 1612 item_page[4].Show(True) … … 1620 1614 else: 1621 1615 item_page[3].Hide() 1622 if item_page[5] !=None:1623 # #show of hide the text crtl for fitting error1616 if item_page[5] is not None: 1617 # show of hide the text crtl for fitting error 1624 1618 item_page[5].Show(item_page_info[5][0]) 1625 1619 item_page[5].SetValue(item_page_info[5][1]) 1626 1620 1627 if item_page[6] !=None:1628 # #show of hide the text crtl for fitting error1621 if item_page[6] is not None: 1622 # show of hide the text crtl for fitting error 1629 1623 item_page[6].Show(item_page_info[6][0]) 1630 1624 item_page[6].SetValue(item_page_info[6][1]) … … 1642 1636 item_page = listtorestore[j] 1643 1637 item_page_info = statelist[j] 1644 # #change the state of the check box for simple parameters1645 1646 if item_page[0] !=None:1638 # change the state of the check box for simple parameters 1639 1640 if item_page[0] is not None: 1647 1641 item_page[0].SetValue(format_number(item_page_info[0], True)) 1648 1642 1649 if item_page[2] !=None:1643 if item_page[2] is not None: 1650 1644 param_name = item_page_info[1] 1651 1645 value = item_page_info[2] … … 1670 1664 1671 1665 checkbox_state = None 1672 if item[0] !=None:1666 if item[0] is not None: 1673 1667 checkbox_state = item[0].GetValue() 1674 1668 parameter_name = item[1] 1675 1669 parameter_value = None 1676 if item[2] !=None:1670 if item[2] is not None: 1677 1671 parameter_value = item[2].GetValue() 1678 1672 static_text = None 1679 if item[3] !=None:1673 if item[3] is not None: 1680 1674 static_text = item[3].IsShown() 1681 1675 error_value = None 1682 1676 error_state = None 1683 if item[4] !=None:1677 if item[4] is not None: 1684 1678 error_value = item[4].GetValue() 1685 1679 error_state = item[4].IsShown() … … 1687 1681 min_value = None 1688 1682 min_state = None 1689 if item[5] !=None:1683 if item[5] is not None: 1690 1684 min_value = item[5].GetValue() 1691 1685 min_state = item[5].IsShown() … … 1693 1687 max_value = None 1694 1688 max_state = None 1695 if item[6] !=None:1689 if item[6] is not None: 1696 1690 max_value = item[6].GetValue() 1697 1691 max_state = item[6].IsShown() 1698 1692 unit = None 1699 if item[7] !=None:1693 if item[7] is not None: 1700 1694 unit = item[7].GetLabel() 1701 1695 … … 1705 1699 [max_state, max_value], unit]) 1706 1700 1707 1708 1701 def _draw_model(self, update_chisqr=True, source='model'): 1709 1702 """ … … 1724 1717 :param chisqr: update chisqr value [bool] 1725 1718 """ 1726 # if self.check_invalid_panel():1719 # if self.check_invalid_panel(): 1727 1720 # return 1728 if self.model !=None:1721 if self.model is not None: 1729 1722 temp_smear = None 1730 1723 if hasattr(self, "enable_smearer"): … … 1738 1731 is_2d = self._is_2D() 1739 1732 self._manager.draw_model(self.model, 1740 data=self.data,1741 smearer=temp_smear,1742 qmin=float(self.qmin_x),1743 qmax=float(self.qmax_x),1744 page_id=self.uid,1745 toggle_mode_on=toggle_mode_on,1746 state=self.state,1747 enable2D=is_2d,1748 update_chisqr=update_chisqr,1749 source='model',1750 weight=weight)1733 data=self.data, 1734 smearer=temp_smear, 1735 qmin=float(self.qmin_x), 1736 qmax=float(self.qmax_x), 1737 page_id=self.uid, 1738 toggle_mode_on=toggle_mode_on, 1739 state=self.state, 1740 enable2D=is_2d, 1741 update_chisqr=update_chisqr, 1742 source='model', 1743 weight=weight) 1751 1744 1752 1745 def _on_show_sld(self, event=None): … … 1758 1751 1759 1752 from sas.sasgui.plottools import Data1D as pf_data1d 1760 # from sas.sasgui.perspectives.theory.profile_dialog import SLDPanel1753 # from sas.sasgui.perspectives.theory.profile_dialog import SLDPanel 1761 1754 from sas.sasgui.guiframe.local_perspectives.plotting.profile_dialog \ 1762 import SLDPanel1755 import SLDPanel 1763 1756 sld_data = pf_data1d(x, y) 1764 1757 sld_data.name = 'SLD' … … 1813 1806 self.structurebox.Disable() 1814 1807 self.formfactorbox.Clear() 1815 if mod_cat ==None:1808 if mod_cat is None: 1816 1809 return 1817 1810 m_list = [] … … 1875 1868 """ 1876 1869 tcrtl = event.GetEventObject() 1877 # Clear msg if previously shown.1870 # Clear msg if previously shown. 1878 1871 msg = "" 1879 1872 wx.PostEvent(self.parent, StatusEvent(status=msg)) … … 1894 1887 tcrtl.SetBackgroundColour("pink") 1895 1888 msg = "Model Error: wrong value entered: %s" % \ 1896 1889 sys.exc_info()[1] 1897 1890 wx.PostEvent(self.parent, StatusEvent(status=msg)) 1898 1891 return … … 1902 1895 wx.PostEvent(self.parent, StatusEvent(status=msg)) 1903 1896 return 1904 # Check if # of points for theory model are valid(>0).1905 if self.npts !=None:1897 # Check if # of points for theory model are valid(>0). 1898 if self.npts is not None: 1906 1899 if check_float(self.npts): 1907 1900 temp_npts = float(self.npts.GetValue()) … … 1919 1912 wx.PostEvent(self.parent, event) 1920 1913 self.state_change = False 1921 # Draw the model for a different range1914 # Draw the model for a different range 1922 1915 if not self.data.is_data: 1923 1916 self.create_default_data() … … 1930 1923 1931 1924 tcrtl = event.GetEventObject() 1932 # Clear msg if previously shown.1925 # Clear msg if previously shown. 1933 1926 msg = "" 1934 1927 wx.PostEvent(self._manager.parent, StatusEvent(status=msg)) … … 1951 1944 tcrtl.SetBackgroundColour("pink") 1952 1945 msg = "Model Error: wrong value entered: %s" % \ 1953 1946 sys.exc_info()[1] 1954 1947 wx.PostEvent(self._manager.parent, StatusEvent(status=msg)) 1955 1948 return … … 1959 1952 wx.PostEvent(self._manager.parent, StatusEvent(status=msg)) 1960 1953 return 1961 # Check if # of points for theory model are valid(>0).1954 # Check if # of points for theory model are valid(>0). 1962 1955 if self.Npts_total.IsEditable(): 1963 1956 if check_float(self.Npts_total): … … 1977 1970 wx.PostEvent(self.parent, event) 1978 1971 self.state_change = False 1979 # Draw the model for a different range1972 # Draw the model for a different range 1980 1973 self.create_default_data() 1981 1974 self._draw_model() … … 1985 1978 call back for model selection 1986 1979 """ 1987 # #reset dictionary containing reference to dispersion1980 # reset dictionary containing reference to dispersion 1988 1981 self._disp_obj_dict = {} 1989 1982 self.disp_cb_dict = {} 1990 1983 self.temp_multi_functional = False 1991 1984 f_id = self.formfactorbox.GetCurrentSelection() 1992 # For MAC1985 # For MAC 1993 1986 form_factor = None 1994 1987 if f_id >= 0: … … 1997 1990 if form_factor is None or \ 1998 1991 not hasattr(form_factor, 'is_form_factor') or \ 1999 not form_factor.is_form_factor:1992 not form_factor.is_form_factor: 2000 1993 self.structurebox.Hide() 2001 1994 self.text2.Hide() … … 2009 2002 self.text2.Enable() 2010 2003 2011 if form_factor !=None:2004 if form_factor is not None: 2012 2005 # set multifactor for Mutifunctional models 2013 2006 if form_factor.is_multiplicity_model: … … 2017 2010 self._set_multfactor_combobox(multiplicity) 2018 2011 self._show_multfactor_combobox() 2019 # ToDo:this info should be called directly from the model2012 # ToDo: this info should be called directly from the model 2020 2013 text = form_factor.multiplicity_info[1] # 'No. of Shells: ' 2021 2014 … … 2026 2019 2027 2020 self.multi_factor = self.multifactorbox.GetClientData(m_id) 2028 if self.multi_factor ==None:2021 if self.multi_factor is None: 2029 2022 self.multi_factor = 0 2030 2023 self.multifactorbox.SetSelection(m_id) … … 2032 2025 text = '' 2033 2026 if form_factor.multiplicity_info[0] == \ 2034 2027 len(form_factor.multiplicity_info[2]): 2035 2028 text = form_factor.multiplicity_info[2][self.multi_factor] 2036 2029 self.mutifactor_text1.SetLabel(text) … … 2053 2046 struct_factor = self.structurebox.GetClientData(s_id) 2054 2047 2055 if struct_factor !=None:2056 from sas .sascalc.fit.MultiplicationModel import MultiplicationModel2048 if struct_factor is not None: 2049 from sasmodels.sasview_model import MultiplicationModel 2057 2050 self.model = MultiplicationModel(form_factor(self.multi_factor), 2058 2051 struct_factor()) … … 2060 2053 if len(form_factor.non_fittable) > 0: 2061 2054 self.temp_multi_functional = True 2062 elif form_factor !=None:2055 elif form_factor is not None: 2063 2056 if self.multi_factor is not None: 2064 2057 self.model = form_factor(self.multi_factor) … … 2075 2068 else: 2076 2069 self._has_magnetic = False 2077 # #post state to fit panel2070 # post state to fit panel 2078 2071 self.state.parameters = [] 2079 2072 self.state.model = self.model … … 2085 2078 self.Layout() 2086 2079 2087 2088 2080 def _validate_qrange(self, qmin_ctrl, qmax_ctrl): 2089 2081 """ … … 2105 2097 qmax = float(qmax_ctrl.GetValue()) 2106 2098 if qmin < qmax: 2107 # Make sure to set both colours white.2099 # Make sure to set both colours white. 2108 2100 qmin_ctrl.SetBackgroundColour(wx.WHITE) 2109 2101 qmin_ctrl.Refresh() … … 2125 2117 If valid, setvalues Npts_fit otherwise post msg. 2126 2118 """ 2127 # default flag2119 # default flag 2128 2120 flag = True 2129 2121 # Theory 2130 if self.data ==None and self.enable2D:2122 if self.data is None and self.enable2D: 2131 2123 return flag 2132 2124 for data in self.data_list: … … 2134 2126 radius = numpy.sqrt(data.qx_data * data.qx_data + 2135 2127 data.qy_data * data.qy_data) 2136 # get unmasked index2128 # get unmasked index 2137 2129 index_data = (float(self.qmin.GetValue()) <= radius) & \ 2138 2130 (radius <= float(self.qmax.GetValue())) 2139 2131 index_data = (index_data) & (data.mask) 2140 2132 index_data = (index_data) & (numpy.isfinite(data.data)) … … 2152 2144 flag = False 2153 2145 else: 2154 self.Npts_fit.SetValue(str(len(index_data[index_data ==True])))2146 self.Npts_fit.SetValue(str(len(index_data[index_data is True]))) 2155 2147 self.fitrange = True 2156 2148 … … 2162 2154 If valid, setvalues Npts_fit otherwise post msg. 2163 2155 """ 2164 # default flag2156 # default flag 2165 2157 flag = True 2166 2158 # Theory 2167 if self.data ==None:2159 if self.data is None: 2168 2160 return flag 2169 2161 for data in self.data_list: 2170 2162 # q value from qx and qy 2171 2163 radius = data.x 2172 # get unmasked index2164 # get unmasked index 2173 2165 index_data = (float(self.qmin.GetValue()) <= radius) & \ 2174 2166 (radius <= float(self.qmax.GetValue())) 2175 2167 index_data = (index_data) & (numpy.isfinite(data.y)) 2176 2168 … … 2187 2179 flag = False 2188 2180 else: 2189 self.Npts_fit.SetValue(str(len(index_data[index_data ==True])))2181 self.Npts_fit.SetValue(str(len(index_data[index_data is True]))) 2190 2182 self.fitrange = True 2191 2183 … … 2207 2199 is_modified = False 2208 2200 for item in list: 2209 # skip angle parameters for 1D2201 # skip angle parameters for 1D 2210 2202 if not self.enable2D and item in self.orientation_params: 2211 2203 continue … … 2252 2244 max_ctrl.SetBackgroundColour("pink") 2253 2245 max_ctrl.Refresh() 2254 #msg = "Invalid fit range for %s: min must be smaller than max"%name 2255 #wx.PostEvent(self._manager.parent, StatusEvent(status=msg)) 2246 # msg = "Invalid fit range for %s: min must be smaller 2247 # than max"%name 2248 # wx.PostEvent(self._manager.parent, 2249 # StatusEvent(status=msg)) 2256 2250 continue 2257 2251 … … 2271 2265 # The configuration has changed but it won't change the 2272 2266 # computed curve so no need to set is_modified to True 2273 # is_modified = True2267 # is_modified = True 2274 2268 self.model.details[name][1:3] = low, high 2275 2269 … … 2289 2283 Redraw the model with the default dispersity (Gaussian) 2290 2284 """ 2291 # #On selction if no model exists.2292 if self.model ==None:2285 # On selction if no model exists. 2286 if self.model is None: 2293 2287 self.disable_disp.SetValue(True) 2294 2288 msg = "Please select a Model first..." … … 2300 2294 self._reset_dispersity() 2301 2295 2302 if self.model ==None:2296 if self.model is None: 2303 2297 self.model_disp.Hide() 2304 2298 self.sizer4_4.Clear(True) … … 2306 2300 2307 2301 if self.enable_disp.GetValue(): 2308 # #layout for model containing no dispersity parameters2302 # layout for model containing no dispersity parameters 2309 2303 2310 2304 self.disp_list = self.model.getDispParamList() … … 2313 2307 self._layout_sizer_noDipers() 2314 2308 else: 2315 # #set gaussian sizer2309 # set gaussian sizer 2316 2310 self._on_select_Disp(event=None) 2317 2311 else: 2318 2312 self.sizer4_4.Clear(True) 2319 2313 2320 # #post state to fit panel2314 # post state to fit panel 2321 2315 self.save_current_state() 2322 if event !=None:2316 if event is not None: 2323 2317 event = PageInfoEvent(page=self) 2324 2318 wx.PostEvent(self.parent, event) 2325 # draw the model with the current dispersity2326 2327 # Wojtek P, Oct 8, 2016: Calling draw_model seems to be unessecary.2328 # By comenting it we save an extra Iq calculation2329 # self._draw_model()2330 2331 # #Need to use FitInside again here to replace the next four lines.2332 # #Otherwised polydispersity off does not resize the scrollwindow.2333 # #PDB Nov 28, 20152319 # draw the model with the current dispersity 2320 2321 # Wojtek P, Oct 8, 2016: Calling draw_model seems to be unessecary. 2322 # By comenting it we save an extra Iq calculation 2323 # self._draw_model() 2324 2325 # Need to use FitInside again here to replace the next four lines. 2326 # Otherwised polydispersity off does not resize the scrollwindow. 2327 # PDB Nov 28, 2015 2334 2328 self.FitInside() 2335 2329 # self.sizer4_4.Layout() … … 2375 2369 self.weights = {} 2376 2370 2377 # from sas.models.dispersion_models import GaussianDispersion2371 # from sas.models.dispersion_models import GaussianDispersion 2378 2372 from sasmodels.weights import GaussianDispersion 2379 2373 if len(self.disp_cb_dict) == 0: … … 2396 2390 logging.error(traceback.format_exc()) 2397 2391 2398 # #save state into2392 # save state into 2399 2393 self.save_current_state() 2400 2394 self.Layout() … … 2408 2402 self._set_sizer_dispersion() 2409 2403 2410 # #Redraw the model2404 # Redraw the model 2411 2405 self._draw_model() 2412 # self._undo.Enable(True)2406 # self._undo.Enable(True) 2413 2407 event = PageInfoEvent(page=self) 2414 2408 wx.PostEvent(self.parent, event) … … 2425 2419 """ 2426 2420 # get ready for new event 2427 if event !=None:2421 if event is not None: 2428 2422 event.Skip() 2429 2423 # Get event object … … 2438 2432 dispersity = disp_box.GetClientData(selection) 2439 2433 2440 # disp_model = GaussianDispersion()2434 # disp_model = GaussianDispersion() 2441 2435 disp_model = dispersity() 2442 2436 # Get param names to reset the values of the param … … 2451 2445 else: 2452 2446 self._del_array_values(name1) 2453 # self._reset_array_disp(param_name)2447 # self._reset_array_disp(param_name) 2454 2448 self._disp_obj_dict[name1] = disp_model 2455 2449 self.model.set_dispersion(param_name, disp_model) … … 2537 2531 if path is None: 2538 2532 self.disp_cb_dict[name].SetValue(False) 2539 # self.noDisper_rbox.SetValue(True)2533 # self.noDisper_rbox.SetValue(True) 2540 2534 return 2541 2535 self._default_save_location = os.path.dirname(path) 2542 if self._manager !=None:2536 if self._manager is not None: 2543 2537 self._manager.parent._default_save_location = \ 2544 2538 self._default_save_location … … 2557 2551 wx.PostEvent(self._manager.parent, StatusEvent(status=msg)) 2558 2552 self._set_array_disp_model(name=name, disp=disp, 2559 2553 values=values, weights=weights) 2560 2554 return basename 2561 2555 … … 2576 2570 # Store the object to make it persist outside the 2577 2571 # scope of this method 2578 # TODO: refactor model to clean this up?2572 # TODO: refactor model to clean this up? 2579 2573 self.state.values = {} 2580 2574 self.state.weights = {} … … 2583 2577 2584 2578 # Set the new model as the dispersion object for the 2585 # selected parameter2586 # self.model.set_dispersion(p, disp_model)2579 # selected parameter 2580 # self.model.set_dispersion(p, disp_model) 2587 2581 # Store a reference to the weights in the model object 2588 # so that2582 # so that 2589 2583 # it's not lost when we use the model within another thread. 2590 2584 self.state.model = self.model.clone() 2591 2585 self.model._persistency_dict[name.split('.')[0]] = \ 2592 2586 [values, weights] 2593 2587 self.state.model._persistency_dict[name.split('.')[0]] = \ 2594 2588 [values, weights] 2595 2589 2596 2590 def _del_array_values(self, name=None): … … 2630 2624 Layout after self._draw_model 2631 2625 """ 2632 if ON_MAC ==True:2626 if ON_MAC is True: 2633 2627 time.sleep(1) 2634 2628 … … 2652 2646 """ 2653 2647 flag = True 2654 # #For 3 different cases: Data2D, Data1D, and theory2655 if self.model ==None:2648 # For 3 different cases: Data2D, Data1D, and theory 2649 if self.model is None: 2656 2650 msg = "Please select a model first..." 2657 2651 wx.MessageBox(msg, 'Info') … … 2665 2659 self.qmin_x = data_min 2666 2660 self.qmax_x = math.sqrt(x * x + y * y) 2667 # self.data.mask = numpy.ones(len(self.data.data),dtype=bool)2661 # self.data.mask = numpy.ones(len(self.data.data),dtype=bool) 2668 2662 # check smearing 2669 2663 if not self.disable_smearer.GetValue(): 2670 # #set smearing value whether or2664 # set smearing value whether or 2671 2665 # not the data contain the smearing info 2672 2666 if self.pinhole_smearer.GetValue(): … … 2675 2669 flag = True 2676 2670 2677 elif self.data ==None:2671 elif self.data is None: 2678 2672 self.qmin_x = _QMIN_DEFAULT 2679 2673 self.qmax_x = _QMAX_DEFAULT … … 2686 2680 # check smearing 2687 2681 if not self.disable_smearer.GetValue(): 2688 # #set smearing value whether or2682 # set smearing value whether or 2689 2683 # not the data contain the smearing info 2690 2684 if self.slit_smearer.GetValue(): … … 2697 2691 flag = False 2698 2692 2699 if flag ==False:2693 if flag is False: 2700 2694 msg = "Cannot Plot :Must enter a number!!! " 2701 2695 wx.PostEvent(self._manager.parent, StatusEvent(status=msg)) … … 2714 2708 self.state.qmax = self.qmax_x 2715 2709 2716 # reset the q range values2710 # reset the q range values 2717 2711 self._reset_plotting_range(self.state) 2718 2712 self._draw_model() … … 2755 2749 logging.error(traceback.format_exc()) 2756 2750 # Make sure the resduals plot goes to the last 2757 if res_item !=None:2751 if res_item is not None: 2758 2752 graphs.append(res_item[0]) 2759 2753 canvases.append(res_item[1]) … … 2774 2768 the # to the browser. 2775 2769 2776 :param ev t: on Help Button pressed event2777 """ 2778 2779 if self.model !=None:2770 :param event: on Help Button pressed event 2771 """ 2772 2773 if self.model is not None: 2780 2774 name = self.formfactorbox.GetValue() 2781 _TreeLocation = 'user/models/' + name.lower()+'.html'2775 _TreeLocation = 'user/models/' + name.lower()+'.html' 2782 2776 _doc_viewer = DocumentationWindow(self, wx.ID_ANY, _TreeLocation, 2783 2777 "", name + " Help") … … 2786 2780 _doc_viewer = DocumentationWindow(self, wx.ID_ANY, _TreeLocation, 2787 2781 "", "General Model Help") 2788 2789 2782 2790 2783 def on_model_help_clicked(self, event): … … 2798 2791 give the message that none is available. 2799 2792 2800 :param ev t: on Description Button pressed event2801 """ 2802 2803 if self.model ==None:2793 :param event: on Description Button pressed event 2794 """ 2795 2796 if self.model is None: 2804 2797 name = 'index.html' 2805 2798 else: … … 2808 2801 msg = 'Model description:\n' 2809 2802 info = "Info" 2810 if self.model !=None:2811 #frame.Destroy()2803 if self.model is not None: 2804 # frame.Destroy() 2812 2805 if str(self.model.description).rstrip().lstrip() == '': 2813 2806 msg += "Sorry, no information is available for this model." … … 2878 2871 for key in self.model.magnetic_params: 2879 2872 if key.count('M0') > 0: 2880 # reset mag value to zero fo safety2873 # reset mag value to zero fo safety 2881 2874 self.model.setParam(key, 0.0) 2882 2875 2883 2876 self.Show(False) 2884 2877 self.set_model_param_sizer(self.model) 2885 # self._set_sizer_dispersion()2878 # self._set_sizer_dispersion() 2886 2879 self.state.magnetic_on = self.magnetic_on 2887 2880 self.SetupScrolling() … … 2898 2891 running "file:///...." 2899 2892 2900 :param ev t: Triggers on clicking ? in polydispersity box2893 :param event: Triggers on clicking ? in polydispersity box 2901 2894 """ 2902 2895 … … 2936 2929 content = 'sasview_parameter_values:' 2937 2930 # Do it if params exist 2938 if self.parameters != []:2931 if self.parameters: 2939 2932 2940 2933 # go through the parameters … … 2980 2973 2981 2974 # Do it if params exist 2982 if self.parameters != []:2975 if self.parameters: 2983 2976 2984 2977 for param in self.parameters: 2985 content += param[1] #parameter name2978 content += param[1] # parameter name 2986 2979 content += tab 2987 2980 content += param[1] + "_err" … … 2990 2983 content += crlf 2991 2984 2992 # row of values and errors...2985 # row of values and errors... 2993 2986 for param in self.parameters: 2994 content += param[2].GetValue() #value2987 content += param[2].GetValue() # value 2995 2988 content += tab 2996 content += param[4].GetValue() #error2989 content += param[4].GetValue() # error 2997 2990 content += tab 2998 2991 … … 3000 2993 else: 3001 2994 return False 3002 3003 2995 3004 2996 def get_copy_latex(self): … … 3022 3014 3023 3015 # Do it if params exist 3024 if self.parameters != []:3016 if self.parameters: 3025 3017 3026 3018 content += '{|' … … 3031 3023 3032 3024 for index, param in enumerate(self.parameters): 3033 content += param[1].replace('_', '\_') #parameter name3025 content += param[1].replace('_', '\_') # parameter name 3034 3026 content += ' & ' 3035 3027 content += param[1].replace('_', '\_') + "\_err" … … 3039 3031 content += crlf 3040 3032 3041 # row of values and errors...3033 # row of values and errors... 3042 3034 for index, param in enumerate(self.parameters): 3043 content += param[2].GetValue() #parameter value3035 content += param[2].GetValue() # parameter value 3044 3036 content += ' & ' 3045 content += param[4].GetValue() #parameter error3037 content += param[4].GetValue() # parameter error 3046 3038 if index < len(self.parameters) - 1: 3047 3039 content += ' & ' … … 3054 3046 else: 3055 3047 return False 3056 3057 3048 3058 3049 def set_clipboard(self, content=None): … … 3101 3092 # 1D 3102 3093 else: 3103 # #for 1D all parameters except orientation3094 # for 1D all parameters except orientation 3104 3095 if not item[1] in orient_param: 3105 3096 try: … … 3133 3124 except Exception: 3134 3125 logging.error(traceback.format_exc()) 3135 content += name + ',' + str(check) + ',' +\ 3136 value + disfunc + ',' + bound_lo + ',' +\ 3137 bound_hi + ':' 3126 content += name + ',' + str(check) + ',' + value + disfunc + ',' + \ 3127 bound_lo + ',' + bound_hi + ':' 3138 3128 3139 3129 return content … … 3213 3203 3214 3204 # Do it if params exist 3215 if self.parameters != []:3205 if self.parameters: 3216 3206 # go through the parameters 3217 3207 self._get_paste_helper(self.parameters, … … 3261 3251 pd = int(pd) 3262 3252 except Exception: 3263 # continue3253 # continue 3264 3254 if not pd and pd != '': 3265 3255 continue … … 3289 3279 else: 3290 3280 is_true = None 3291 if is_true !=None:3281 if is_true is not None: 3292 3282 item[0].SetValue(is_true) 3293 3283 # 1D 3294 3284 else: 3295 # #for 1D all parameters except orientation3285 # for 1D all parameters except orientation 3296 3286 if not item[1] in orient_param: 3297 3287 name = item[1] … … 3302 3292 pd = value[0] 3303 3293 if name.count('.') > 0: 3304 # If this is parameter.width, then pd may be a floating 3305 # point value or it may be an array distribution. 3306 # Nothing to do for parameter.npts or parameter.nsigmas. 3294 # If this is parameter.width, then pd may be a 3295 # floating point value or it may be an array 3296 # distribution. Nothing to do for parameter.npts or 3297 # parameter.nsigmas. 3307 3298 try: 3308 3299 pd = float(pd) … … 3310 3301 pd = int(pd) 3311 3302 except: 3312 # continue3303 # continue 3313 3304 if not pd and pd != '': 3314 3305 continue … … 3338 3329 else: 3339 3330 is_true = None 3340 if is_true !=None:3331 if is_true is not None: 3341 3332 item[0].SetValue(is_true) 3333 3334 self.select_param(event=None) 3335 self.Refresh() 3342 3336 3343 3337 def _paste_poly_help(self, item, value): … … 3402 3396 logging.error(traceback.format_exc()) 3403 3397 print "Error in BasePage._paste_poly_help: %s" % \ 3404 3398 sys.exc_info()[1] 3405 3399 3406 3400 def _set_disp_cb(self, isarray, item): … … 3468 3462 self.categorybox.Clear() 3469 3463 cat_list = sorted(self.master_category_dict.keys()) 3470 if not uncat_strin cat_list:3464 if uncat_str not in cat_list: 3471 3465 cat_list.append(uncat_str) 3472 3466 … … 3478 3472 self.categorybox.SetSelection(0) 3479 3473 else: 3480 self.categorybox.SetSelection( \3474 self.categorybox.SetSelection( 3481 3475 self.categorybox.GetSelection()) 3482 # self._on_change_cat(None)3476 # self._on_change_cat(None) 3483 3477 3484 3478 def _on_change_cat(self, event): … … 3488 3482 self.model_name = None 3489 3483 category = self.categorybox.GetStringSelection() 3490 if category ==None:3484 if category is None: 3491 3485 return 3492 3486 self.model_box.Clear() … … 3499 3493 else: 3500 3494 for (model, enabled) in sorted(self.master_category_dict[category], 3501 key=lambda name: name[0]):3495 key=lambda name: name[0]): 3502 3496 if(enabled): 3503 3497 self.model_box.Append(model) … … 3508 3502 """ 3509 3503 # This should only be called once per fit tab 3510 # print "==== Entering _fill_model_sizer"3511 # #Add model function Details button in fitpanel.3512 # #The following 3 lines are for Mac. Let JHC know before modifying...3504 # print "==== Entering _fill_model_sizer" 3505 # Add model function Details button in fitpanel. 3506 # The following 3 lines are for Mac. Let JHC know before modifying... 3513 3507 title = "Model" 3514 3508 self.formfactorbox = None … … 3542 3536 self._populate_listbox() 3543 3537 wx.EVT_COMBOBOX(self.categorybox, wx.ID_ANY, self._show_combox) 3544 # self.shape_rbutton = wx.RadioButton(self, wx.ID_ANY, 'Shapes',3538 # self.shape_rbutton = wx.RadioButton(self, wx.ID_ANY, 'Shapes', 3545 3539 # style=wx.RB_GROUP) 3546 # self.shape_indep_rbutton = wx.RadioButton(self, wx.ID_ANY,3540 # self.shape_indep_rbutton = wx.RadioButton(self, wx.ID_ANY, 3547 3541 # "Shape-Independent") 3548 # self.struct_rbutton = wx.RadioButton(self, wx.ID_ANY,3542 # self.struct_rbutton = wx.RadioButton(self, wx.ID_ANY, 3549 3543 # "Structure Factor ") 3550 # self.plugin_rbutton = wx.RadioButton(self, wx.ID_ANY,3544 # self.plugin_rbutton = wx.RadioButton(self, wx.ID_ANY, 3551 3545 # "Uncategorized") 3552 3546 3553 # self.Bind(wx.EVT_RADIOBUTTON, self._show_combox,3547 # self.Bind(wx.EVT_RADIOBUTTON, self._show_combox, 3554 3548 # id=self.shape_rbutton.GetId()) 3555 # self.Bind(wx.EVT_RADIOBUTTON, self._show_combox,3549 # self.Bind(wx.EVT_RADIOBUTTON, self._show_combox, 3556 3550 # id=self.shape_indep_rbutton.GetId()) 3557 # self.Bind(wx.EVT_RADIOBUTTON, self._show_combox,3551 # self.Bind(wx.EVT_RADIOBUTTON, self._show_combox, 3558 3552 # id=self.struct_rbutton.GetId()) 3559 # self.Bind(wx.EVT_RADIOBUTTON, self._show_combox,3553 # self.Bind(wx.EVT_RADIOBUTTON, self._show_combox, 3560 3554 # id=self.plugin_rbutton.GetId()) 3561 # MAC needs SetValue3555 # MAC needs SetValue 3562 3556 3563 3557 show_cat_button = wx.Button(self, wx.ID_ANY, "Modify") 3564 3558 cat_tip = "Modify model categories \n" 3565 3559 cat_tip += "(also accessible from the menu bar)." 3566 show_cat_button.SetToolTip( wx.ToolTip(cat_tip))3560 show_cat_button.SetToolTip(wx.ToolTip(cat_tip)) 3567 3561 show_cat_button.Bind(wx.EVT_BUTTON, self._on_modify_cat) 3568 3562 sizer_cat_box.Add(self.categorybox, 1, wx.RIGHT, 3) 3569 sizer_cat_box.Add((10, 10))3563 sizer_cat_box.Add((10, 10)) 3570 3564 sizer_cat_box.Add(show_cat_button) 3571 # self.shape_rbutton.SetValue(True)3565 # self.shape_rbutton.SetValue(True) 3572 3566 3573 3567 sizer_radiobutton = wx.GridSizer(2, 2, 5, 5) 3574 # sizer_radiobutton.Add(self.shape_rbutton)3575 # sizer_radiobutton.Add(self.shape_indep_rbutton)3576 sizer_radiobutton.Add((5, 5))3568 # sizer_radiobutton.Add(self.shape_rbutton) 3569 # sizer_radiobutton.Add(self.shape_indep_rbutton) 3570 sizer_radiobutton.Add((5, 5)) 3577 3571 sizer_radiobutton.Add(self.model_view, 1, wx.RIGHT, 5) 3578 # sizer_radiobutton.Add(self.plugin_rbutton)3579 # sizer_radiobutton.Add(self.struct_rbutton)3580 #sizer_radiobutton.Add((5,5))3572 # sizer_radiobutton.Add(self.plugin_rbutton) 3573 # sizer_radiobutton.Add(self.struct_rbutton) 3574 # sizer_radiobutton.Add((5,5)) 3581 3575 sizer_radiobutton.Add(self.model_help, 1, wx.RIGHT | wx.LEFT, 5) 3582 #sizer_radiobutton.Add((5,5))3576 # sizer_radiobutton.Add((5,5)) 3583 3577 sizer_radiobutton.Add(self.model_func, 1, wx.RIGHT, 5) 3584 3578 sizer_cat.Add(sizer_cat_box, 1, wx.LEFT, 2.5) … … 3596 3590 self.formfactorbox = wx.ComboBox(self, wx.ID_ANY, style=wx.CB_READONLY) 3597 3591 self.formfactorbox.SetToolTip(wx.ToolTip("Select a Model")) 3598 if self.model !=None:3592 if self.model is not None: 3599 3593 self.formfactorbox.SetValue(self.model.name) 3600 3594 self.structurebox = wx.ComboBox(self, wx.ID_ANY, style=wx.CB_READONLY) … … 3605 3599 wx.EVT_COMBOBOX(self.structurebox, wx.ID_ANY, self._on_select_model) 3606 3600 wx.EVT_COMBOBOX(self.multifactorbox, wx.ID_ANY, self._on_select_model) 3607 # #check model type to show sizer3608 if self.model !=None:3601 # check model type to show sizer 3602 if self.model is not None: 3609 3603 print "_set_model_sizer_selection: disabled." 3610 # self._set_model_sizer_selection(self.model)3604 # self._set_model_sizer_selection(self.model) 3611 3605 3612 3606 sizer_selection.Add(self.text1) … … 3707 3701 """ 3708 3702 3703 3709 3704 class ModelTextCtrl(wx.TextCtrl): 3710 3705 """ … … 3719 3714 3720 3715 """ 3721 # #Set to True when the mouse is clicked while whole string is selected3716 # Set to True when the mouse is clicked while whole string is selected 3722 3717 full_selection = False 3723 # #Call back for EVT_SET_FOCUS events3718 # Call back for EVT_SET_FOCUS events 3724 3719 _on_set_focus_callback = None 3725 3720 … … 3743 3738 if set_focus_callback is None else set_focus_callback 3744 3739 self.Bind(wx.EVT_SET_FOCUS, self._on_set_focus) 3745 self.Bind(wx.EVT_KILL_FOCUS, self._silent_kill_focus \3746 3747 self.Bind(wx.EVT_TEXT_ENTER, parent._onparamEnter \3748 3740 self.Bind(wx.EVT_KILL_FOCUS, self._silent_kill_focus 3741 if kill_focus_callback is None else kill_focus_callback) 3742 self.Bind(wx.EVT_TEXT_ENTER, parent._onparamEnter 3743 if text_enter_callback is None else text_enter_callback) 3749 3744 if not ON_MAC: 3750 self.Bind(wx.EVT_LEFT_UP, self._highlight_text \3751 3745 self.Bind(wx.EVT_LEFT_UP, self._highlight_text 3746 if mouse_up_callback is None else mouse_up_callback) 3752 3747 3753 3748 def _on_set_focus(self, event): … … 3789 3784 3790 3785 event.Skip() 3791 # pass3786 # pass -
src/sas/sasgui/perspectives/fitting/fitpage.py
r55db501 rf668101 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 … … 186 185 187 186 :return: True or False 188 189 187 """ 190 188 if self.data.__class__.__name__ == "Data2D" or \ … … 200 198 buttons, xi^2, number of points etc. 201 199 """ 202 is_2 Ddata = False200 is_2d_data = False 203 201 204 202 # Check if data is 2D 205 203 if self.data.__class__.__name__ == "Data2D" or \ 206 204 self.enable2D: 207 is_2 Ddata = True205 is_2d_data = True 208 206 209 207 title = "Fitting" 210 # smear messages & titles208 # smear messages & titles 211 209 smear_message_none = "No smearing is selected..." 212 210 smear_message_dqdata = "The dQ data is being used for smearing..." … … 226 224 self._get_smear_info() 227 225 228 # Sizers226 # Sizers 229 227 box_description_range = wx.StaticBox(self, wx.ID_ANY, str(title)) 230 228 box_description_range.SetForegroundColour(wx.BLUE) … … 245 243 sizer_weighting = wx.BoxSizer(wx.HORIZONTAL) 246 244 weighting_box.SetMinSize((_DATA_BOX_WIDTH, 40)) 247 # Filling the sizer containing weighting info.245 # Filling the sizer containing weighting info. 248 246 self.dI_noweight = wx.RadioButton(self, wx.ID_ANY, 249 247 'No Weighting', style=wx.RB_GROUP) … … 287 285 self._on_select_accuracy) 288 286 289 # Fit button287 # Fit button 290 288 self.btFit = wx.Button(self, self._ids.next(), 'Fit') 291 289 self.default_bt_colour = self.btFit.GetDefaultAttributes() … … 293 291 self.btFit.SetToolTipString("Start fitting.") 294 292 295 # General Help button293 # General Help button 296 294 self.btFitHelp = wx.Button(self, wx.ID_ANY, 'Help') 297 295 self.btFitHelp.SetToolTipString("General fitting help.") 298 296 self.btFitHelp.Bind(wx.EVT_BUTTON, self._onFitHelp) 299 297 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.1298 # Resolution Smearing Help button (for now use same technique as 299 # used for dI help to get tiniest possible button that works 300 # both on MAC and PC. Should completely rewrite the fitting sizer 301 # in future. This is minimum to get out release 3.1 304 302 # comment June 14, 2015 --- PDB 305 303 if sys.platform.count("win32") > 0: 306 size_q = (20, 15) # on PC304 size_q = (20, 15) # on PC 307 305 else: 308 size_q = (30, 20) # on MAC306 size_q = (30, 20) # on MAC 309 307 self.btSmearHelp = wx.Button(self, wx.ID_ANY, '?', 310 308 style=wx.BU_EXACTFIT, size=size_q) … … 312 310 self.btSmearHelp.Bind(wx.EVT_BUTTON, self._onSmearHelp) 313 311 314 # textcntrl for custom resolution312 # textcntrl for custom resolution 315 313 self.smear_pinhole_max = ModelTextCtrl(self, wx.ID_ANY, 316 314 size=(_BOX_WIDTH - 25, 20), … … 330 328 text_enter_callback=self.onSlitSmear) 331 329 332 # #smear330 # smear 333 331 self.smear_data_left = BGTextCtrl(self, wx.ID_ANY, 334 332 size=(_BOX_WIDTH - 25, 20), style=0) … … 338 336 self.smear_data_right.SetValue(str(self.dq_r)) 339 337 340 # set default values for smear338 # set default values for smear 341 339 self.smear_pinhole_max.SetValue(str(self.dx_max)) 342 340 self.smear_pinhole_min.SetValue(str(self.dx_min)) … … 344 342 self.smear_slit_width.SetValue(str(self.dxw)) 345 343 346 # Filling the sizer containing instruments smearing info.344 # Filling the sizer containing instruments smearing info. 347 345 self.disable_smearer = wx.RadioButton(self, wx.ID_ANY, 348 346 'None', style=wx.RB_GROUP) 349 347 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.")348 # self.enable_smearer.SetToolTipString( 349 # "Click to use the loaded dQ data for smearing.") 352 350 self.pinhole_smearer = wx.RadioButton(self, wx.ID_ANY, 353 351 'Custom Pinhole Smear') 354 # self.pinhole_smearer.SetToolTipString355 # ("Click to input custom resolution for pinhole smearing.")352 # self.pinhole_smearer.SetToolTipString 353 # ("Click to input custom resolution for pinhole smearing.") 356 354 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.")355 # self.slit_smearer.SetToolTipString 356 # ("Click to input custom resolution for slit smearing.") 359 357 self.Bind(wx.EVT_RADIOBUTTON, self.onSmear, 360 358 id=self.disable_smearer.GetId()) … … 379 377 self.Npts_fit = BGTextCtrl(self, wx.ID_ANY, "-", size=(75, 20), style=0) 380 378 self.Npts_fit.SetToolTipString( 381 379 " Npts : number of points selected for fitting") 382 380 self.Npts_total = ModelTextCtrl(self, wx.ID_ANY, size=(_BOX_WIDTH, 20), 383 style=wx.TE_PROCESS_ENTER,384 text_enter_callback=self._onQrangeEnter)381 style=wx.TE_PROCESS_ENTER, 382 text_enter_callback=self._onQrangeEnter) 385 383 self.Npts_total.SetValue(format_number(self.npts_x)) 386 self.Npts_total.SetToolTipString( \387 384 self.Npts_total.SetToolTipString( 385 " Total Npts : total number of data points") 388 386 389 387 # Update and Draw button … … 430 428 self.smear_description_2d_y = wx.StaticText(self, wx.ID_ANY, 431 429 smear_message_2d_y_title, style=wx.ALIGN_LEFT) 432 self.smear_description_2d_y.SetToolTipString( \430 self.smear_description_2d_y.SetToolTipString( 433 431 " dQs(perpendicular) in q_phi direction.") 434 432 self.smear_description_pin_min = wx.StaticText(self, wx.ID_ANY, … … 441 439 smear_message_slit_width_title, style=wx.ALIGN_LEFT) 442 440 443 # arrange sizers441 # arrange sizers 444 442 self.sizer_set_smearer.Add(sizer_smearer) 445 443 self.sizer_set_smearer.Add((10, 10)) 446 444 self.sizer_set_smearer.Add(self.smear_description_none, 447 445 0, wx.CENTER, 10) 448 446 self.sizer_set_smearer.Add(self.smear_description_dqdata, 449 447 0, wx.CENTER, 10) 450 448 self.sizer_set_smearer.Add(self.smear_description_2d, 451 449 0, wx.CENTER, 10) 452 450 self.sizer_new_smear.Add(self.smear_description_type, 453 451 0, wx.CENTER, 10) 454 452 self.sizer_new_smear.Add(self.smear_description_accuracy_type, 455 453 0, wx.CENTER, 10) 456 454 self.sizer_new_smear.Add(self.smear_accuracy) 457 455 self.sizer_new_smear.Add(self.smear_description_smear_type, 458 456 0, wx.CENTER, 10) 459 457 self.sizer_new_smear.Add((15, -1)) 460 self.sizer_new_smear.Add(self.smear_description_2d_x, 461 0, wx.CENTER, 10) 458 self.sizer_new_smear.Add(self.smear_description_2d_x, 0, wx.CENTER, 10) 462 459 self.sizer_new_smear.Add(self.smear_description_pin_min, 463 460 0, wx.CENTER, 10) 464 461 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) 462 0, wx.CENTER, 10) 463 464 self.sizer_new_smear.Add(self.smear_pinhole_min, 0, wx.CENTER, 10) 465 self.sizer_new_smear.Add(self.smear_slit_height, 0, wx.CENTER, 10) 466 self.sizer_new_smear.Add(self.smear_data_left, 0, wx.CENTER, 10) 473 467 self.sizer_new_smear.Add((20, -1)) 474 468 self.sizer_new_smear.Add(self.smear_description_2d_y, 475 469 0, wx.CENTER, 10) 476 470 self.sizer_new_smear.Add(self.smear_description_pin_max, 477 471 0, wx.CENTER, 10) 478 472 self.sizer_new_smear.Add(self.smear_description_slit_width, 479 473 0, wx.CENTER, 10) 480 474 481 475 self.sizer_new_smear.Add(self.smear_pinhole_max, 0, wx.CENTER, 10) … … 502 496 503 497 # Show only the relevant smear messages, etc 504 if self.current_smearer ==None:505 if not is_2 Ddata:498 if self.current_smearer is None: 499 if not is_2d_data: 506 500 self.smear_description_none.Show(True) 507 501 self.enable_smearer.Disable() … … 509 503 self.smear_description_none.Show(True) 510 504 self.slit_smearer.Disable() 511 if self.data ==None:505 if self.data is None: 512 506 self.slit_smearer.Disable() 513 507 self.pinhole_smearer.Disable() … … 516 510 self._show_smear_sizer() 517 511 boxsizer_range.Add(self.sizer_set_masking) 518 # 2D data? default519 is_2 Ddata = False520 521 # check if it is 2D data512 # 2D data? default 513 is_2d_data = False 514 515 # check if it is 2D data 522 516 if self.data.__class__.__name__ == "Data2D" or self.enable2D: 523 is_2 Ddata = True517 is_2d_data = True 524 518 525 519 self.sizer5.Clear(True) … … 569 563 sizer.Add(wx.StaticText(self, wx.ID_ANY, ' Max[1/A]')) 570 564 sizer.Add(self.EditMask_title) 571 sizer.Add((-1, 5))565 sizer.Add((-1, 5)) 572 566 573 567 sizer.Add(self.reset_qrange) … … 575 569 sizer.Add(self.qmax) 576 570 sizer.Add(self.btEditMask) 577 sizer.Add((-1, 5))578 579 sizer.AddMany(5*[(-1, 5)])571 sizer.Add((-1, 5)) 572 573 sizer.AddMany(5*[(-1, 5)]) 580 574 581 575 sizer.Add(box_description_1, 0, 0) … … 583 577 sizer.Add(self.points_sizer, 0, 0) 584 578 sizer.Add(self.draw_button, 0, 0) 585 sizer.Add((-1, 5))579 sizer.Add((-1, 5)) 586 580 587 581 sizer.Add(self.tcChi, 0, 0) … … 593 587 boxsizer_range.Add(sizer_chi2) 594 588 boxsizer_range.Add(sizer) 595 if is_2 Ddata:589 if is_2d_data: 596 590 self.btEditMask.Enable() 597 591 self.EditMask_title.Enable() … … 599 593 self.btEditMask.Disable() 600 594 self.EditMask_title.Disable() 601 # #save state595 # save state 602 596 self.save_current_state() 603 597 self.sizer5.Add(boxsizer_range, 0, wx.EXPAND | wx.ALL, 10) 604 598 self.sizer5.Layout() 605 599 606 607 600 def _set_sizer_dispersion(self): 608 601 """ … … 614 607 615 608 self.sizer4_4.Clear(True) 616 if self.model ==None:617 # #no model is selected609 if self.model is None: 610 # no model is selected 618 611 return 619 612 if not self.enable_disp.GetValue(): 620 # #the user didn't select dispersity display613 # the user didn't select dispersity display 621 614 return 622 615 623 616 self._reset_dispersity() 624 617 625 # #fill a sizer with the combobox to select dispersion type618 # fill a sizer with the combobox to select dispersion type 626 619 model_disp = wx.StaticText(self, wx.ID_ANY, 'Function') 627 620 CHECK_STATE = self.cb1.GetValue() … … 646 639 err_text = '' 647 640 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), \641 self.sizer4_4.Add(self.text_disp_1, (iy, ix), (1, 1), 649 642 wx.EXPAND | wx.ADJUST_MINSIZE, 0) 650 643 651 644 ix += 1 652 645 self.text_disp_min = wx.StaticText(self, wx.ID_ANY, 'Min') 653 self.sizer4_4.Add(self.text_disp_min, (iy, ix), (1, 1), \646 self.sizer4_4.Add(self.text_disp_min, (iy, ix), (1, 1), 654 647 wx.EXPAND | wx.ADJUST_MINSIZE, 0) 655 648 … … 684 677 if item in self.model.magnetic_params: 685 678 continue 686 if not itemin self.model.orientation_params:687 if not itemin self.disp_cb_dict:679 if item not in self.model.orientation_params: 680 if item not in self.disp_cb_dict: 688 681 self.disp_cb_dict[item] = None 689 682 name0 = "Distribution of " + item … … 691 684 name2 = item + ".npts" 692 685 name3 = item + ".nsigmas" 693 if n ot name1in self.model.details:686 if name1 not in self.model.details: 694 687 self.model.details[name1] = ["", None, None] 695 688 … … 717 710 ctl1.SetValue(str(format_number(value, True))) 718 711 self.sizer4_4.Add(ctl1, (iy, ix), (1, 1), wx.EXPAND) 719 # #text to show error sign712 # text to show error sign 720 713 ix = 2 721 714 text2 = wx.StaticText(self, wx.ID_ANY, '+/-') … … 777 770 Tct2.SetValue(str(format_number(value))) 778 771 self.sizer4_4.Add(Tct2, (iy, ix), (1, 1), 779 772 wx.EXPAND | wx.ADJUST_MINSIZE, 0) 780 773 self.fixed_param.append([None, name3, Tct2, 781 774 None, None, None, … … 803 796 if item in self.model.magnetic_params: 804 797 continue 805 if 806 if not itemin self.disp_cb_dict:798 if item in self.model.orientation_params: 799 if item not in self.disp_cb_dict: 807 800 self.disp_cb_dict[item] = None 808 801 name0 = "Distribution of " + item … … 811 804 name3 = item + ".nsigmas" 812 805 813 if n ot name1in self.model.details:806 if name1 not in self.model.details: 814 807 self.model.details[name1] = ["", None, None] 815 808 … … 856 849 857 850 self.sizer4_4.Add(ctl1, (iy, ix), (1, 1), wx.EXPAND) 858 # #text to show error sign851 # text to show error sign 859 852 ix = 2 860 853 text2 = wx.StaticText(self, wx.ID_ANY, '+/-') … … 969 962 970 963 self.state.model = self.model.clone() 971 ## save state into 972 self.state.cb1 = self.cb1.GetValue()964 965 # save state into 973 966 self._copy_parameters_state(self.parameters, self.state.parameters) 974 967 self._copy_parameters_state(self.orientation_params_disp, … … 980 973 wx.PostEvent(self.parent, 981 974 StatusEvent(status=" Selected Distribution: Gaussian")) 982 #Fill the list of fittable parameters 983 # self.select_all_param(event=None)975 976 # Fill the list of fittable parameters 984 977 self.get_all_checked_params() 985 978 self.Layout() … … 989 982 Update and Draw the model 990 983 """ 991 if self.model ==None:984 if self.model is None: 992 985 msg = "Please select a Model first..." 993 986 wx.MessageBox(msg, 'Info') … … 999 992 self.create_default_data() 1000 993 """ 1001 flag, is_modified = self._update_paramv_on_fit()1002 1003 wx.CallAfter(self._onparamEnter_helper, is_modified)994 flag, is_modified = self._update_paramv_on_fit() 995 996 wx.CallAfter(self._onparamEnter_helper, is_modified) 1004 997 if not flag: 1005 998 msg = "The parameters are invalid" … … 1011 1004 Allow to fit 1012 1005 """ 1013 if event !=None:1006 if event is not None: 1014 1007 event.Skip() 1015 1008 if self.fit_started: … … 1051 1044 return 1052 1045 1053 self.select_param( event=None)1046 self.select_param() 1054 1047 1055 1048 # Remove or do not allow fitting on the Q=0 point, especially … … 1062 1055 qmax=self.qmax_x) 1063 1056 1064 # single fit1065 # self._manager.onFit(uid=self.uid)1057 # single fit 1058 # self._manager.onFit(uid=self.uid) 1066 1059 self.fit_started = self._manager.onFit(uid=self.uid) 1067 1060 wx.CallAfter(self.set_fitbutton) … … 1076 1069 versions of Wx (before 2.9) and thus not the release version of 1077 1070 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 is1071 web browser does not pass anything past the # to the browser when it is 1079 1072 running "file:///...." 1080 1073 1081 :param evt: Triggers on clicking the help button1082 """1074 :param evt: Triggers on clicking the help button 1075 """ 1083 1076 1084 1077 _TreeLocation = "user/sasgui/perspectives/fitting/fitting_help.html" … … 1095 1088 versions of Wx (before 2.9) and thus not the release version of 1096 1089 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 is1090 web browser does not pass anything past the # to the browser when it is 1098 1091 running "file:///...." 1099 1092 1100 :param evt: Triggers on clicking the help button1101 """1093 :param evt: Triggers on clicking the help button 1094 """ 1102 1095 1103 1096 _TreeLocation = "user/sasgui/perspectives/fitting/sm_help.html" … … 1111 1104 """ 1112 1105 # Skip this feature if we are not on Windows 1113 # NOTE: the is_mac data member actually means "is no Windows".1106 # NOTE: the is_mac data member actually means "is no Windows". 1114 1107 if self.is_mac: 1115 1108 return … … 1121 1114 label = "Fit" 1122 1115 color = "black" 1123 # self.btFit.Enable(False)1116 # self.btFit.Enable(False) 1124 1117 self.btFit.SetLabel(label) 1125 1118 self.btFit.SetForegroundColour(color) … … 1152 1145 Stop fit 1153 1146 """ 1154 if event !=None:1147 if event is not None: 1155 1148 event.Skip() 1156 1149 self._manager.stop_fit(self.uid) … … 1172 1165 copy_flag = False 1173 1166 is_poly_enabled = None 1174 if event !=None:1175 if (event.GetEventObject() == self.formfactorbox \1167 if event is not None: 1168 if (event.GetEventObject() == self.formfactorbox 1176 1169 and self.structurebox.GetLabel() != 'None')\ 1177 1170 or event.GetEventObject() == self.structurebox\ … … 1186 1179 self._keep.Enable(False) 1187 1180 self._set_save_flag(False) 1188 # TODO: why do we have to variables for one flag??1189 1181 self.enable_disp.SetValue(False) 1190 1182 self.disable_disp.SetValue(True) … … 1216 1208 self._keep.Enable(not self.batch_on) 1217 1209 self._set_save_flag(True) 1210 self._set_smear(self.data) 1218 1211 1219 1212 # more disables for 2D … … 1229 1222 except: 1230 1223 raise 1231 # #error occured on chisqr computation1232 # pass1233 # #event to post model to fit to fitting plugins1224 # error occured on chisqr computation 1225 # pass 1226 # event to post model to fit to fitting plugins 1234 1227 (ModelEventbox, EVT_MODEL_BOX) = wx.lib.newevent.NewEvent() 1235 1228 1236 ## set smearing value whether or not 1237 # the data contain the smearing info 1229 # set smearing value whether or not data contain the smearing info 1238 1230 evt = ModelEventbox(model=self.model, 1239 1231 smearer=temp_smear, … … 1245 1237 1246 1238 self._manager._on_model_panel(evt=evt) 1247 self.mbox_description.SetLabel("Model [ %s ]" % str(self.model.name)) 1239 self.mbox_description.SetLabel("Model [ %s ]" % 1240 str(self.model.name)) 1248 1241 self.mbox_description.SetForegroundColour(wx.BLUE) 1249 1242 self.state.model = self.model.clone() 1250 1243 self.state.model.name = self.model.name 1251 1244 1252 if event !=None:1253 # #post state to fit panel1245 if event is not None: 1246 # post state to fit panel 1254 1247 new_event = PageInfoEvent(page=self) 1255 1248 wx.PostEvent(self.parent, new_event) 1256 # update list of plugins if new plugin is available1249 # update list of plugins if new plugin is available 1257 1250 custom_model = 'Customized Models' 1258 1251 mod_cat = self.categorybox.GetStringSelection() … … 1267 1260 self.formfactorbox.SetValue(current_val) 1268 1261 # when select a model only from guictr/button 1269 if is_poly_enabled !=None:1262 if is_poly_enabled is not None: 1270 1263 self.enable_disp.SetValue(is_poly_enabled) 1271 1264 self.disable_disp.SetValue(not is_poly_enabled) … … 1295 1288 when enter value on panel redraw model according to changed 1296 1289 """ 1297 if self.model ==None:1290 if self.model is None: 1298 1291 msg = "Please select a Model first..." 1299 1292 wx.MessageBox(msg, 'Info') 1300 1293 return 1301 1294 1302 # default flag1295 # default flag 1303 1296 flag = False 1304 1297 self.fitrange = True 1305 # get event object1298 # get event object 1306 1299 tcrtl = event.GetEventObject() 1307 # Clear msg if previously shown.1300 # Clear msg if previously shown. 1308 1301 msg = "" 1309 1302 wx.PostEvent(self._manager.parent, StatusEvent(status=msg)) … … 1316 1309 if not self.disable_smearer.GetValue(): 1317 1310 temp_smearer = self.current_smearer 1318 # # set smearing value whether or not1319 # the data contain thesmearing info1311 # set smearing value whether or not data contain the 1312 # smearing info 1320 1313 if self.slit_smearer.GetValue(): 1321 1314 flag1 = self.update_slit_smear() … … 1334 1327 enable_smearer=enable_smearer) 1335 1328 if flag: 1336 # self.compute_chisqr(smearer= temp_smearer)1337 1338 # #new state posted1329 # self.compute_chisqr(smearer= temp_smearer) 1330 1331 # new state posted 1339 1332 if self.state_change: 1340 # self._undo.Enable(True)1333 # self._undo.Enable(True) 1341 1334 event = PageInfoEvent(page=self) 1342 1335 wx.PostEvent(self.parent, event) … … 1348 1341 else: 1349 1342 self.save_current_state() 1350 msg = "Cannot Plot :Must enter a number!!! "1343 msg = "Cannot Plot: Must enter a number!!! " 1351 1344 wx.PostEvent(self._manager.parent, StatusEvent(status=msg)) 1352 1345 … … 1359 1352 """ 1360 1353 tcrtl = event.GetEventObject() 1361 # Clear msg if previously shown.1354 # Clear msg if previously shown. 1362 1355 msg = "" 1363 1356 wx.PostEvent(self._manager.parent, StatusEvent(status=msg)) … … 1377 1370 tcrtl.SetBackgroundColour(wx.WHITE) 1378 1371 1379 # self._undo.Enable(True)1372 # self._undo.Enable(True) 1380 1373 self.save_current_state() 1381 1374 event = PageInfoEvent(page=self) … … 1387 1380 ON Qrange focus 1388 1381 """ 1389 if event !=None:1382 if event is not None: 1390 1383 event.Skip() 1391 # tcrtl = event.GetEventObject()1384 # tcrtl = event.GetEventObject() 1392 1385 self._validate_qrange(self.qmin, self.qmax) 1393 1386 … … 1396 1389 On Qrange textctrl click, make the qrange lines in the plot 1397 1390 """ 1398 if event !=None:1391 if event is not None: 1399 1392 event.Skip() 1400 1393 if self.data.__class__.__name__ == "Data2D": … … 1414 1407 #On q range value updated. DO not combine with qrange_click(). 1415 1408 """ 1416 if event !=None:1409 if event is not None: 1417 1410 event.Skip() 1418 1411 if self.data.__class__.__name__ == "Data2D": … … 1442 1435 length = len(self.data.x) 1443 1436 indx = (numpy.abs(self.data.x - x_data)).argmin() 1444 # return array.flat[idx]1437 # return array.flat[idx] 1445 1438 if key == wx.WXK_PAGEUP or key == wx.WXK_NUMPAD_PAGEUP: 1446 1439 indx += 1 … … 1461 1454 """ 1462 1455 tcrtl = event.GetEventObject() 1463 # Clear msg if previously shown.1456 # Clear msg if previously shown. 1464 1457 msg = "" 1465 1458 wx.PostEvent(self._manager.parent, StatusEvent(status=msg)) … … 1491 1484 wx.PostEvent(self._manager.parent, StatusEvent(status=msg)) 1492 1485 return 1493 # Check if # of points for theory model are valid(>0).1486 # Check if # of points for theory model are valid(>0). 1494 1487 # check for 2d 1495 1488 if self.data.__class__.__name__ == "Data2D" or \ … … 1498 1491 radius = numpy.sqrt(self.data.qx_data * self.data.qx_data + 1499 1492 self.data.qy_data * self.data.qy_data) 1500 index_data = ((self.qmin_x <= radius) & \ 1501 (radius <= self.qmax_x)) 1493 index_data = ((self.qmin_x <= radius) & (radius <= self.qmax_x)) 1502 1494 index_data = (index_data) & (self.data.mask) 1503 1495 index_data = (index_data) & (numpy.isfinite(self.data.data)) … … 1509 1501 return 1510 1502 else: 1511 # self.data.mask = index_data1512 # self.Npts_fit.SetValue(str(len(self.data.mask)))1503 # self.data.mask = index_data 1504 # self.Npts_fit.SetValue(str(len(self.data.mask))) 1513 1505 self.show_npts2fit() 1514 1506 else: 1515 index_data = ((self.qmin_x <= self.data.x) & \1507 index_data = ((self.qmin_x <= self.data.x) & 1516 1508 (self.data.x <= self.qmax_x)) 1517 1509 self.Npts_fit.SetValue(str(len(self.data.x[index_data]))) … … 1546 1538 for item in self.parameters: 1547 1539 if item[0].IsShown(): 1548 # Skip the angle parameters if 1D data1540 # Skip the angle parameters if 1D data 1549 1541 if self.data.__class__.__name__ != "Data2D" and \ 1550 1542 not self.enable2D: … … 1553 1545 if item in self.param_toFit: 1554 1546 continue 1555 # #hide statictext +/-1547 # hide statictext +/- 1556 1548 if len(item) < 4: 1557 1549 continue 1558 if item[3] !=None and item[3].IsShown():1550 if item[3] is not None and item[3].IsShown(): 1559 1551 item[3].Hide() 1560 # #hide textcrtl for error after fit1561 if item[4] !=None and item[4].IsShown():1552 # hide textcrtl for error after fit 1553 if item[4] is not None and item[4].IsShown(): 1562 1554 item[4].Hide() 1563 1555 … … 1565 1557 for item in self.fittable_param: 1566 1558 if item[0].IsShown(): 1567 # Skip the angle parameters if 1D data1559 # Skip the angle parameters if 1D data 1568 1560 if self.data.__class__.__name__ != "Data2D" and \ 1569 1561 not self.enable2D: … … 1574 1566 if len(item) < 4: 1575 1567 continue 1576 # #hide statictext +/-1577 if item[3] !=None and item[3].IsShown():1568 # hide statictext +/- 1569 if item[3] is not None and item[3].IsShown(): 1578 1570 item[3].Hide() 1579 # #hide textcrtl for error after fit1580 if item[4] !=None and item[4].IsShown():1571 # hide textcrtl for error after fit 1572 if item[4] is not None and item[4].IsShown(): 1581 1573 item[4].Hide() 1582 1574 return … … 1587 1579 """ 1588 1580 # get the default values 1589 if self.dxl ==None:1581 if self.dxl is None: 1590 1582 self.dxl = 0.0 1591 if self.dxw ==None:1583 if self.dxw is None: 1592 1584 self.dxw = "" 1593 if self.dx_min ==None:1585 if self.dx_min is None: 1594 1586 self.dx_min = SMEAR_SIZE_L 1595 if self.dx_max ==None:1587 if self.dx_max is None: 1596 1588 self.dx_max = SMEAR_SIZE_H 1597 1589 … … 1614 1606 elif self.data.__class__.__name__ == "Data2D" or \ 1615 1607 self.enable2D: 1616 if data.dqx_data == None or data.dqy_data ==None:1608 if data.dqx_data is None or data.dqy_data is None: 1617 1609 return 1618 elif self.current_smearer !=None \1610 elif self.current_smearer is not None \ 1619 1611 and data.dqx_data.any() != 0 \ 1620 1612 and data.dqx_data.any() != 0: … … 1626 1618 return 1627 1619 # check if it is pinhole smear and get min max if it is. 1628 if data.dx != None and all(data.dx != 0):1620 if data.dx is not None and not numpy.any(data.dx): 1629 1621 self.smear_type = "Pinhole" 1630 1622 self.dq_l = data.dx[0] … … 1632 1624 1633 1625 # check if it is slit smear and get min max if it is. 1634 elif data.dxl != None or data.dxw !=None:1626 elif data.dxl is not None or data.dxw is not None: 1635 1627 self.smear_type = "Slit" 1636 if data.dxl != None and all(data.dxl !=0):1628 if data.dxl is not None and not numpy.all(data.dxl, 0): 1637 1629 self.dq_l = data.dxl[0] 1638 if data.dxw != None and all(data.dxw !=0):1630 if data.dxw is not None and not numpy.all(data.dxw, 0): 1639 1631 self.dq_r = data.dxw[0] 1640 # return self.smear_type,self.dq_l,self.dq_r1632 # return self.smear_type,self.dq_l,self.dq_r 1641 1633 1642 1634 def _show_smear_sizer(self): … … 1662 1654 1663 1655 self.smear_description_dqdata.Show(True) 1664 if self.smear_type !=None:1656 if self.smear_type is not None: 1665 1657 self.smear_description_smear_type.Show(True) 1666 1658 if self.smear_type == 'Slit': … … 1753 1745 Select an accuracy in 2D custom smear: Xhigh, High, Med, or Low 1754 1746 """ 1755 # event.Skip()1747 # event.Skip() 1756 1748 # Check if the accuracy is same as before 1757 # self.smear2d_accuracy = event.GetEventObject().GetValue()1749 # self.smear2d_accuracy = event.GetEventObject().GetValue() 1758 1750 self.smear2d_accuracy = self.smear_accuracy.GetValue() 1759 1751 if self.pinhole_smearer.GetValue(): … … 1761 1753 else: 1762 1754 self.onSmear(event=None) 1763 if self.current_smearer !=None:1755 if self.current_smearer is not None: 1764 1756 self.current_smearer.set_accuracy(accuracy=\ 1765 1757 self.smear2d_accuracy) … … 1793 1785 Build a panel to allow to edit Mask 1794 1786 """ 1795 from sas.sasgui.guiframe.local_perspectives.plotting.masking \1796 importMaskPanel as MaskDialog1787 from sas.sasgui.guiframe.local_perspectives.plotting.masking import \ 1788 MaskPanel as MaskDialog 1797 1789 1798 1790 self.panel = MaskDialog(base=self, data=self.data, id=wx.NewId()) … … 1805 1797 is_valid_qrange = self._update_paramv_on_fit() 1806 1798 1807 if is_valid_qrange and self.model !=None:1799 if is_valid_qrange and self.model is not None: 1808 1800 self.panel.MakeModal(False) 1809 1801 event.Skip() … … 1811 1803 self._draw_model() 1812 1804 self.show_npts2fit() 1813 elif self.model ==None:1805 elif self.model is None: 1814 1806 self.panel.MakeModal(False) 1815 1807 event.Skip() … … 1878 1870 npts = len(data.x) 1879 1871 except: 1880 msg = "Unable to find min/max/length of \n data named %s" % 1872 msg = "Unable to find min/max/length of \n data named %s" %\ 1881 1873 data.filename 1882 1874 wx.PostEvent(self._manager.parent, StatusEvent(status=msg, … … 1895 1887 info="error")) 1896 1888 raise ValueError, msg 1897 # #Maximum value of data1889 # Maximum value of data 1898 1890 qmax = math.sqrt(x * x + y * y) 1899 1891 npts = len(data.data) … … 1907 1899 flag = False 1908 1900 is_data = False 1901 npts = 0 1909 1902 try: 1910 1903 old_id = self.data.id … … 1918 1911 flag = True 1919 1912 if data is not None: 1920 id = data.id1921 1913 if is_data: 1922 1914 self.graph_id = self.data.group_id … … 1933 1925 self._set_save_flag(False) 1934 1926 else: 1935 if self.model !=None:1927 if self.model is not None: 1936 1928 self._set_bookmark_flag(not self.batch_on) 1937 1929 self._keep.Enable(not self.batch_on) … … 1940 1932 self._set_preview_flag(True) 1941 1933 1942 self._set_smear(data)1943 1934 # more disables for 2D 1944 1935 if self.data.__class__.__name__ == "Data2D" or \ … … 1947 1938 self.pinhole_smearer.Enable(True) 1948 1939 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():1940 if self.data.err_data is None or\ 1941 numpy.all(err == 1 for err in self.data.err_data) or \ 1942 not numpy.any(self.data.err_data): 1952 1943 self.dI_didata.Enable(False) 1953 1944 self.dI_noweight.SetValue(True) … … 1960 1951 self.slit_smearer.Enable(True) 1961 1952 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(): 1953 1954 if self.data.dy is None or\ 1955 numpy.all(self.data.dy == 1) or\ 1956 not numpy.any(self.data.dy): 1965 1957 self.dI_didata.Enable(False) 1966 1958 self.dI_noweight.SetValue(True) … … 1970 1962 self.dI_didata.SetValue(True) 1971 1963 self.weightbt_string = self.dI_didata.GetLabelText() 1972 # Enable weighting radio uttons1964 # Enable weighting radio buttons 1973 1965 self.dI_noweight.Enable(True) 1974 1966 self.dI_sqrdata.Enable(True) … … 1979 1971 data_name = self.data.name 1980 1972 _, _, npts = self.compute_data_range(self.data) 1981 # set maximum range for x in linear scale1973 # set maximum range for x in linear scale 1982 1974 if not hasattr(self.data, "data"): # Display only for 1D data fit 1983 1975 self.btEditMask.Disable() … … 1988 1980 1989 1981 self.Npts_total.SetValue(str(npts)) 1990 # default:number of data points selected to fit1982 # default:number of data points selected to fit 1991 1983 self.Npts_fit.SetValue(str(npts)) 1992 1984 self.Npts_total.SetEditable(False) 1993 self.Npts_total.SetBackgroundColour( \1985 self.Npts_total.SetBackgroundColour( 1994 1986 self.GetParent().GetBackgroundColour()) 1995 1987 … … 2001 1993 # send graph_id to page_finder 2002 1994 self._manager.set_graph_id(uid=self.uid, graph_id=self.graph_id) 2003 # focus the page1995 # focus the page 2004 1996 if check_data_validity(data): 2005 1997 self.data_box_description.SetForegroundColour(wx.BLUE) … … 2013 2005 self.on_set_focus(None) 2014 2006 self.Refresh() 2015 # update model plot with new data information2007 # update model plot with new data information 2016 2008 if flag: 2017 #set model view button2018 self.onSmear(None)2019 2020 2009 if self.data.__class__.__name__ == "Data2D": 2021 2010 self.enable2D = True … … 2025 2014 self.model_view.SetLabel("1D Mode") 2026 2015 self.model_view.Disable() 2027 # replace data plot on combo box selection2028 # by removing the previous selected data2016 # replace data plot on combo box selection 2017 # by removing the previous selected data 2029 2018 try: 2030 2019 wx.PostEvent(self._manager.parent, … … 2033 2022 except: 2034 2023 pass 2035 # plot the current selected data2024 # plot the current selected data 2036 2025 wx.PostEvent(self._manager.parent, 2037 2026 NewPlotEvent(action="check", plot=self.data, … … 2053 2042 self.reset_page_helper(state) 2054 2043 2055 self.select_param( event=None)2056 # Save state_fit2044 self.select_param() 2045 # Save state_fit 2057 2046 self.save_current_state_fit() 2058 2047 except: … … 2093 2082 else: 2094 2083 for qx in self.data.x: 2095 if q x >= qmin and qx <= qmax:2084 if qmax >= qx >= qmin: 2096 2085 npts2fit += 1 2097 2086 return npts2fit … … 2122 2111 # make sure stop button to fit button all the time 2123 2112 self._on_fit_complete() 2124 if out ==None or not numpy.isfinite(chisqr):2113 if out is None or not numpy.isfinite(chisqr): 2125 2114 raise ValueError, "Fit error occured..." 2126 2115 … … 2129 2118 dispersity = '' 2130 2119 2131 # Hide textctrl boxes of errors.2120 # Hide textctrl boxes of errors. 2132 2121 self._clear_Err_on_Fit() 2133 2122 2134 # Check if chi2 is finite2135 if chisqr !=None and numpy.isfinite(chisqr):2136 # format chi22123 # Check if chi2 is finite 2124 if chisqr is not None and numpy.isfinite(chisqr): 2125 # format chi2 2137 2126 chi2 = format_number(chisqr, True) 2138 2127 self.tcChi.SetValue(chi2) … … 2141 2130 self.tcChi.SetValue("-") 2142 2131 2143 # Hide error title2132 # Hide error title 2144 2133 if self.text2_3.IsShown() and not self.is_mac: 2145 2134 self.text2_3.Hide() … … 2148 2137 if self.enable_disp.GetValue(): 2149 2138 if hasattr(self, "text_disp_1"): 2150 if self.text_disp_1 !=None and not self.is_mac:2139 if self.text_disp_1 is not None and not self.is_mac: 2151 2140 self.text_disp_1.Hide() 2152 2141 except: … … 2155 2144 2156 2145 i = 0 2157 # Set the panel when fit result are list2146 # Set the panel when fit result are list 2158 2147 2159 2148 for item in self.param_toFit: 2160 if len(item) > 5 and item !=None:2149 if len(item) > 5 and item is not None: 2161 2150 2162 2151 if item[0].IsShown(): 2163 # #reset error value to initial state2152 # reset error value to initial state 2164 2153 if not self.is_mac: 2165 2154 item[3].Hide() … … 2168 2157 if item[1] == p_name[ind]: 2169 2158 break 2170 if len(out) > 0 and out[ind] !=None:2159 if len(out) > 0 and out[ind] is not None: 2171 2160 val_out = format_number(out[ind], True) 2172 2161 item[2].SetValue(val_out) 2173 2162 2174 if(cov !=None and len(cov) == len(out)):2163 if(cov is not None and len(cov) == len(out)): 2175 2164 try: 2176 if dispersity !=None:2165 if dispersity is not None: 2177 2166 if self.enable_disp.GetValue(): 2178 2167 if hasattr(self, "text_disp_1"): 2179 if self.text_disp_1 !=None:2168 if self.text_disp_1 is not None: 2180 2169 if not self.text_disp_1.IsShown()\ 2181 and not self.is_mac:2170 and not self.is_mac: 2182 2171 self.text_disp_1.Show(True) 2183 2172 except: 2184 2173 pass 2185 2174 2186 if cov[ind] !=None:2175 if cov[ind] is not None: 2187 2176 if numpy.isfinite(float(cov[ind])): 2188 2177 val_err = format_number(cov[ind], True) 2189 2178 item[4].SetForegroundColour(wx.BLACK) 2190 2179 else: 2191 2180 val_err = 'NaN' … … 2199 2188 else: 2200 2189 raise ValueError, "onsetValues: Invalid parameters..." 2201 # Show error title when any errors displayed2190 # Show error title when any errors displayed 2202 2191 if has_error: 2203 2192 if not self.text2_3.IsShown(): 2204 2193 self.text2_3.Show(True) 2205 # #save current state2194 # save current state 2206 2195 self.save_current_state() 2207 2196 … … 2210 2199 self.Refresh() 2211 2200 self._mac_sleep(0.1) 2212 # plot model ( when drawing, do not update chisqr value again)2201 # plot model ( when drawing, do not update chisqr value again) 2213 2202 self._draw_model(update_chisqr=False, source='fit') 2214 2203 … … 2226 2215 # compute weight for the current data 2227 2216 flag_weight = self.get_weight_flag() 2228 if is_2D ==None:2217 if is_2D is None: 2229 2218 is_2D = self._is_2D() 2230 2219 self._manager.set_fit_weight(uid=self.uid, … … 2245 2234 self._update_paramv_on_fit() 2246 2235 2247 if event !=None:2236 if event is not None: 2248 2237 tcrtl = event.GetEventObject() 2249 2238 # event case of radio button 2250 if tcrtl.GetValue() == True:2239 if tcrtl.GetValue(): 2251 2240 self.dx_min = 0.0 2252 2241 self.dx_max = 0.0 … … 2266 2255 2267 2256 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.2257 # we need FitInside here not just self.Layout to ensure all the sizers 2258 # end up with the necessasary space to in the scroll panel. In 2259 # particular the compute and fit buttons end up on top of each other 2260 # PDB Nov 28 2015. 2272 2261 self.FitInside() 2273 2262 2274 if event !=None:2263 if event is not None: 2275 2264 event.Skip() 2276 # self._undo.Enable(True)2265 # self._undo.Enable(True) 2277 2266 self.save_current_state() 2278 2267 event = PageInfoEvent(page=self) … … 2349 2338 get_pin_max.SetBackgroundColour("pink") 2350 2339 msg = "Model Error:This value can not be negative!!!" 2351 elif self.dx_min != None and self.dx_max !=None:2340 elif self.dx_min is not None and self.dx_max is not None: 2352 2341 if self._is_2D(): 2353 2342 data.dqx_data[data.dqx_data == 0] = self.dx_min … … 2360 2349 self.dx_max + step / 1.1, 2361 2350 step) 2362 elif self.dx_min !=None:2351 elif self.dx_min is not None: 2363 2352 if self._is_2D(): 2364 2353 data.dqx_data[data.dqx_data == 0] = self.dx_min 2365 2354 else: 2366 2355 data.dx[data.dx == 0] = self.dx_min 2367 elif self.dx_max !=None:2356 elif self.dx_max is not None: 2368 2357 if self._is_2D(): 2369 2358 data.dqy_data[data.dqy_data == 0] = self.dx_max … … 2373 2362 # 2D need to set accuracy 2374 2363 if self._is_2D(): 2375 self.current_smearer.set_accuracy( accuracy=\2376 2377 2378 if msg !=None:2364 self.current_smearer.set_accuracy( 2365 accuracy=self.smear2d_accuracy) 2366 2367 if msg is not None: 2379 2368 wx.PostEvent(self._manager.parent, StatusEvent(status=msg)) 2380 2369 else: 2381 2370 get_pin_min.SetBackgroundColour("white") 2382 2371 get_pin_max.SetBackgroundColour("white") 2383 # #set smearing value whether or not the data contain the smearing info2372 # set smearing value whether or not the data contain the smearing info 2384 2373 2385 2374 enable_smearer = not self.disable_smearer.GetValue() … … 2407 2396 wx.CallAfter(self.save_current_state) 2408 2397 2409 if msg !=None:2398 if msg is not None: 2410 2399 return False 2411 2400 else: … … 2423 2412 msg = None 2424 2413 # for event given 2425 if event !=None:2414 if event is not None: 2426 2415 tcrtl = event.GetEventObject() 2427 2416 # event case of radio button … … 2444 2433 self._show_smear_sizer() 2445 2434 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.2435 # we need FitInside here not just self.Layout to ensure all the sizers 2436 # end up with the necessasary space to in the scroll panel. In 2437 # particular the compute and fit buttons end up on top of each other 2438 # PDB Nov 28 2015. 2450 2439 self.FitInside() 2451 2440 2452 if event !=None:2441 if event is not None: 2453 2442 event.Skip() 2454 2443 self.save_current_state() 2455 2444 event = PageInfoEvent(page=self) 2456 2445 wx.PostEvent(self.parent, event) 2457 if msg !=None:2446 if msg is not None: 2458 2447 wx.PostEvent(self._manager.parent, StatusEvent(status=msg)) 2459 2448 … … 2544 2533 2545 2534 self.current_smearer = smear_selection(data, self.model) 2546 # #set smearing value whether or not the data contain the smearing info2535 # set smearing value whether or not the data contain the smearing info 2547 2536 enable_smearer = not self.disable_smearer.GetValue() 2548 2537 self._manager.set_smearer(smearer=self.current_smearer, … … 2567 2556 if self._is_changed_slit(): 2568 2557 msg = self._set_slit_smear() 2569 # self._undo.Enable(True)2558 # self._undo.Enable(True) 2570 2559 self.save_current_state() 2571 2560 2572 if msg !=None:2561 if msg is not None: 2573 2562 return False 2574 2563 else: … … 2580 2569 are computed when fitting 2581 2570 """ 2582 if event !=None:2571 if event is not None: 2583 2572 event.Skip() 2584 2573 if self.data is None: … … 2593 2582 2594 2583 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.2584 # we need FitInside here not just self.Layout to ensure all the sizers 2585 # end up with the necessasary space to in the scroll panel. In 2586 # particular the compute and fit buttons end up on top of each other 2587 # PDB Nov 28 2015. 2599 2588 self.FitInside() 2600 2589 self._set_weight() 2601 2590 2602 # #set smearing value whether or not the data contain the smearing info2591 # set smearing value whether or not the data contain the smearing info 2603 2592 enable_smearer = not self.disable_smearer.GetValue() 2604 2593 wx.CallAfter(self._manager.set_smearer, uid=self.uid, … … 2621 2610 """ 2622 2611 self._get_smear_info() 2623 # renew smear sizer2612 # renew smear sizer 2624 2613 if self.smear_type is not None: 2625 2614 self.smear_description_smear_type.SetValue(str(self.smear_type)) … … 2661 2650 """ 2662 2651 try: 2663 if event ==None:2652 if event is None: 2664 2653 output = "-" 2665 2654 elif not numpy.isfinite(event.output): … … 2696 2685 self._manager.set_param2fit(self.uid, param2fit) 2697 2686 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): 2687 2688 def select_param(self, event=None): 2766 2689 """ 2767 2690 Select TextCtrl checked for fitting purpose and stores them … … 2770 2693 self.param_toFit = [] 2771 2694 for item in self.parameters: 2772 # Skip t ifhe angle parameters if 1D data2695 # Skip t ifhe angle parameters if 1D data 2773 2696 if self.data.__class__.__name__ != "Data2D" and\ 2774 2697 not self.enable2D: 2775 2698 if item in self.orientation_params: 2776 2699 continue 2777 # Select parameters to fit for list of primary parameters2700 # Select parameters to fit for list of primary parameters 2778 2701 if item[0].GetValue() and item[0].IsShown(): 2779 2702 if not (item in self.param_toFit): … … 2784 2707 self.param_toFit.remove(item) 2785 2708 2786 # Select parameters to fit for list of fittable parameters2709 # Select parameters to fit for list of fittable parameters 2787 2710 # with dispersion 2788 2711 for item in self.fittable_param: 2789 # Skip t ifhe angle parameters if 1D data2712 # Skip t ifhe angle parameters if 1D data 2790 2713 if self.data.__class__.__name__ != "Data2D" and\ 2791 2714 not self.enable2D: … … 2796 2719 self.param_toFit.append(item) 2797 2720 else: 2798 # remove parameters from the fitting list2721 # remove parameters from the fitting list 2799 2722 if item in self.param_toFit: 2800 2723 self.param_toFit.remove(item) 2801 2724 2802 # Calculate num. of angle parameters2725 # Calculate num. of angle parameters 2803 2726 if self.data.__class__.__name__ == "Data2D" or \ 2804 2727 self.enable2D: … … 2806 2729 else: 2807 2730 len_orient_para = len(self.orientation_params) # assume even len 2808 # Total num. of angle parameters2731 # Total num. of angle parameters 2809 2732 if len(self.fittable_param) > 0: 2810 2733 len_orient_para *= 2 … … 2817 2740 2818 2741 self.save_current_state_fit() 2819 if event !=None:2820 # #post state to fit panel2742 if event is not None: 2743 # post state to fit panel 2821 2744 event = PageInfoEvent(page=self) 2822 2745 wx.PostEvent(self.parent, event) … … 2844 2767 self.orientation_params_disp = [] 2845 2768 2846 if model ==None:2769 if model is None: 2847 2770 self.sizer3.Layout() 2848 2771 self.SetupScrolling() … … 2852 2775 boxsizer1 = wx.StaticBoxSizer(box_description, wx.VERTICAL) 2853 2776 sizer = wx.GridBagSizer(5, 5) 2854 # #save the current model2777 # save the current model 2855 2778 self.model = model 2856 2779 2857 2780 keys = self.model.getParamList() 2858 2781 2859 # list of dispersion parameters2782 # list of dispersion parameters 2860 2783 self.disp_list = self.model.getDispParamList() 2861 2784 … … 2890 2813 return -1 2891 2814 # both have a number 2892 if num_a != None and num_b !=None:2815 if num_a is not None and num_b is not None: 2893 2816 if num_a > num_b: 2894 2817 return -1 … … 2903 2826 return 1 2904 2827 # one of them has a number 2905 elif num_a !=None:2828 elif num_a is not None: 2906 2829 return 1 2907 elif num_b !=None:2830 elif num_b is not None: 2908 2831 return -1 2909 2832 # no numbers … … 2911 2834 return cmp(a.lower(), b.lower()) 2912 2835 2913 # keys obtained now from ordered dict, so commenting alphabetical ordering2914 # keys.sort(custom_compare)2836 # keys obtained now from ordered dict, so commenting alphabetical 2837 # ordering keys.sort(custom_compare) 2915 2838 2916 2839 iy = 0 … … 2926 2849 ix += 1 2927 2850 self.text2_2 = wx.StaticText(self, wx.ID_ANY, 'Value') 2928 sizer.Add(self.text2_2, (iy, ix), (1, 1), \2851 sizer.Add(self.text2_2, (iy, ix), (1, 1), 2929 2852 wx.EXPAND | wx.ADJUST_MINSIZE, 0) 2930 2853 ix += 2 2931 2854 self.text2_3 = wx.StaticText(self, wx.ID_ANY, 'Error') 2932 sizer.Add(self.text2_3, (iy, ix), (1, 1), \2933 2855 sizer.Add(self.text2_3, (iy, ix), (1, 1), 2856 wx.EXPAND | wx.ADJUST_MINSIZE, 0) 2934 2857 if not self.is_mac: 2935 2858 self.text2_3.Hide() 2936 2859 ix += 1 2937 2860 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()2861 sizer.Add(self.text2_min, (iy, ix), (1, 1), 2862 wx.EXPAND | wx.ADJUST_MINSIZE, 0) 2863 # self.text2_min.Hide() 2941 2864 ix += 1 2942 2865 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()2866 sizer.Add(self.text2_max, (iy, ix), (1, 1), 2867 wx.EXPAND | wx.ADJUST_MINSIZE, 0) 2868 # self.text2_max.Hide() 2946 2869 ix += 1 2947 2870 self.text2_4 = wx.StaticText(self, wx.ID_ANY, '[Units]') 2948 sizer.Add(self.text2_4, (iy, ix), (1, 1), \2949 2871 sizer.Add(self.text2_4, (iy, ix), (1, 1), 2872 wx.EXPAND | wx.ADJUST_MINSIZE, 0) 2950 2873 self.text2_4.Hide() 2951 2874 … … 2953 2876 for item in keys: 2954 2877 2955 if not itemin self.disp_list and not item in \2878 if item not in self.disp_list and not item in \ 2956 2879 self.model.orientation_params: 2957 2880 2958 # #prepare a spot to store errors2959 if not itemin self.model.details:2881 # prepare a spot to store errors 2882 if item not in self.model.details: 2960 2883 self.model.details[item] = ["", None, None] 2961 2884 2962 2885 iy += 1 2963 2886 ix = 0 2964 if (self.model.__class__ in \2965 self.model_list_box["Multi-Functions"] or \2887 if (self.model.__class__ in 2888 self.model_list_box["Multi-Functions"] or 2966 2889 self.temp_multi_functional)\ 2967 2890 and (item in self.model.non_fittable): 2968 2891 non_fittable_name = wx.StaticText(self, wx.ID_ANY, item) 2969 sizer.Add(non_fittable_name, (iy, ix), (1, 1), \2892 sizer.Add(non_fittable_name, (iy, ix), (1, 1), 2970 2893 wx.LEFT | wx.EXPAND | wx.ADJUST_MINSIZE, 21) 2971 # #add parameter value2894 # add parameter value 2972 2895 ix += 1 2973 2896 value = self.model.getParam(item) 2974 2897 if len(self.model.fun_list) > 0: 2975 # num = item.split('_')[1][5:7]2898 # num = item.split('_')[1][5:7] 2976 2899 fun_box = wx.ComboBox(self, wx.ID_ANY, size=(100, -1), 2977 2900 style=wx.CB_READONLY, name='%s' % item) 2978 2901 self._set_fun_box_list(fun_box) 2979 2902 fun_box.SetSelection(0) 2980 # self.fun_box.SetToolTipString("A function2903 # self.fun_box.SetToolTipString("A function 2981 2904 # describing the interface") 2982 2905 wx.EVT_COMBOBOX(fun_box, wx.ID_ANY, self._on_fun_box) … … 2985 2908 size=(_BOX_WIDTH, 20), 2986 2909 style=wx.TE_PROCESS_ENTER, name='%s' % item) 2987 fun_box.SetToolTipString( \2910 fun_box.SetToolTipString( 2988 2911 "Hit 'Enter' after typing to update the plot.") 2989 2912 fun_box.SetValue(format_number(value, True)) … … 2993 2916 None, None]) 2994 2917 else: 2995 # #add parameters name with checkbox for selecting to fit2918 # add parameters name with checkbox for selecting to fit 2996 2919 cb = wx.CheckBox(self, wx.ID_ANY, item) 2997 2920 cb.SetValue(CHECK_STATE) 2998 2921 cb.SetToolTipString(" Check mark to fit.") 2999 # cb.SetValue(True)2922 # cb.SetValue(True) 3000 2923 wx.EVT_CHECKBOX(self, cb.GetId(), self.select_param) 3001 2924 … … 3003 2926 wx.LEFT | wx.EXPAND | wx.ADJUST_MINSIZE, 5) 3004 2927 3005 # #add parameter value2928 # add parameter value 3006 2929 ix += 1 3007 2930 value = self.model.getParam(item) 3008 2931 ctl1 = ModelTextCtrl(self, wx.ID_ANY, size=(_BOX_WIDTH, 20), 3009 2932 style=wx.TE_PROCESS_ENTER) 3010 ctl1.SetToolTipString( \2933 ctl1.SetToolTipString( 3011 2934 "Hit 'Enter' after typing to update the plot.") 3012 2935 ctl1.SetValue(format_number(value, True)) 3013 2936 sizer.Add(ctl1, (iy, ix), (1, 1), wx.EXPAND) 3014 # #text to show error sign2937 # text to show error sign 3015 2938 ix += 1 3016 2939 text2 = wx.StaticText(self, wx.ID_ANY, '+/-') 3017 sizer.Add(text2, (iy, ix), (1, 1), \2940 sizer.Add(text2, (iy, ix), (1, 1), 3018 2941 wx.EXPAND | wx.ADJUST_MINSIZE, 0) 3019 2942 if not self.is_mac: … … 3076 2999 iy += 1 3077 3000 ix = 0 3078 # Add tile for orientational angle3001 # Add tile for orientational angle 3079 3002 for item in keys: 3080 3003 if item in self.model.orientation_params: … … 3083 3006 mag_on_button.SetToolTipString("Turn Pol Beam/Mag scatt on/off") 3084 3007 mag_on_button.Bind(wx.EVT_BUTTON, self._on_mag_on) 3085 mag_angle_help_button = wx.Button(self, wx.ID_ANY, "Magnetic angles?") 3008 mag_angle_help_button = wx.Button(self, wx.ID_ANY, 3009 "Magnetic angles?") 3086 3010 mag_angle_help_button.SetToolTipString("see angle definitions") 3087 3011 mag_help_button = wx.Button(self, wx.ID_ANY, "Mag HELP") 3088 3012 mag_help_button.SetToolTipString("Help on pol beam/mag fitting") 3089 3013 mag_help_button.Bind(wx.EVT_BUTTON, self._on_mag_help) 3090 mag_angle_help_button.Bind(wx.EVT_BUTTON, \3014 mag_angle_help_button.Bind(wx.EVT_BUTTON, 3091 3015 self._on_mag_angle_help) 3092 3016 sizer.Add(orient_angle, (iy, ix), (1, 1), … … 3101 3025 wx.LEFT | wx.EXPAND | wx.ADJUST_MINSIZE, 15) 3102 3026 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 2D3027 # handle the magnetic buttons 3028 # clean this up so that assume mag is off then turn 3029 # all buttons on IF mag has mag and has 2D 3106 3030 if not self._has_magnetic: 3107 3031 mag_on_button.Show(False) … … 3129 3053 break 3130 3054 3131 # For Gaussian only3055 # For Gaussian only 3132 3056 if type.lower() != "array": 3133 3057 for item in self.model.orientation_params: … … 3135 3059 if item in self.model.magnetic_params: 3136 3060 continue 3137 if not itemin self.disp_list:3138 # #prepare a spot to store min max3139 if not itemin self.model.details:3061 if item not in self.disp_list: 3062 # prepare a spot to store min max 3063 if item not in self.model.details: 3140 3064 self.model.details[item] = ["", None, None] 3141 3065 3142 3066 iy += 1 3143 3067 ix = 0 3144 # #add parameters name with checkbox for selecting to fit3068 # add parameters name with checkbox for selecting to fit 3145 3069 cb = wx.CheckBox(self, wx.ID_ANY, item) 3146 3070 cb.SetValue(CHECK_STATE) … … 3155 3079 wx.LEFT | wx.EXPAND | wx.ADJUST_MINSIZE, 5) 3156 3080 3157 # #add parameter value3081 # add parameter value 3158 3082 ix += 1 3159 3083 value = self.model.getParam(item) 3160 3084 ctl1 = ModelTextCtrl(self, -1, size=(_BOX_WIDTH, 20), 3161 3085 style=wx.TE_PROCESS_ENTER) 3162 ctl1.SetToolTipString( \3086 ctl1.SetToolTipString( 3163 3087 "Hit 'Enter' after typing to update the plot.") 3164 3088 ctl1.SetValue(format_number(value, True)) … … 3169 3093 ctl1.Hide() 3170 3094 sizer.Add(ctl1, (iy, ix), (1, 1), wx.EXPAND) 3171 # #text to show error sign3095 # text to show error sign 3172 3096 ix += 1 3173 3097 text2 = wx.StaticText(self, -1, '+/-') 3174 sizer.Add(text2, (iy, ix), (1, 1), \3098 sizer.Add(text2, (iy, ix), (1, 1), 3175 3099 wx.EXPAND | wx.ADJUST_MINSIZE, 0) 3176 3100 … … 3237 3161 iy += 1 3238 3162 box_description.SetForegroundColour(wx.BLUE) 3239 # Display units text on panel3163 # Display units text on panel 3240 3164 for item in keys: 3241 3165 if item in self.model.details: 3242 3166 self.text2_4.Show() 3243 # Fill the list of fittable parameters3167 # Fill the list of fittable parameters 3244 3168 self.get_all_checked_params() 3245 3169 self.save_current_state_fit() … … 3253 3177 Get key stroke event 3254 3178 """ 3255 if self.data ==None:3179 if self.data is None: 3256 3180 return 3257 3181 # Figuring out key combo: Cmd for copy, Alt for paste -
src/sas/sasgui/perspectives/fitting/fitpanel.py
re6de6b8 rc8e1996 187 187 """ 188 188 189 # get number of pages190 nop = self.GetPageCount()191 189 # use while-loop, for-loop will not do the job well. 192 while ( nop> 0):190 while (self.GetPageCount() > 0): 193 191 # delete the first page until no page exists 194 192 page = self.GetPage(0) … … 197 195 self._close_helper(selected_page=page) 198 196 self.DeletePage(0) 199 nop = self.GetPageCount()200 197 # Clear list of names 201 198 self.fit_page_name = {} … … 240 237 # close all panels only when svs file opened 241 238 self.close_all() 242 self._manager.mypanels = []243 239 self.sim_page = None 244 240 self.batch_page = None … … 248 244 close page and remove all references to the closed page 249 245 """ 250 nbr_page = self.GetPageCount()251 246 selected_page = self.GetPage(self.GetSelection()) 252 if nbr_page== 1:247 if self.GetPageCount() == 1: 253 248 if selected_page.get_data() is not None: 254 249 if event is not None: … … 293 288 copy a dictionary of model into its own dictionary 294 289 295 :param m_dict: dictionnary made of model name as key and model class290 :param dict: dictionnary made of model name as key and model class 296 291 as value 297 292 """ … … 320 315 if caption == "Const & Simul Fit": 321 316 self.sim_page = SimultaneousFitPage(self, page_finder=page_finder, 322 id= 317 id=wx.ID_ANY, batch_on=False) 323 318 self.sim_page.window_caption = caption 324 319 self.sim_page.window_name = caption … … 397 392 raise ValueError, "Fitpanel delete_data expect list of id" 398 393 else: 399 n = self.GetPageCount()400 394 for page in self.opened_pages.values(): 401 395 pos = self.GetPageIndex(page) … … 441 435 if data_1d_list and data_2d_list: 442 436 # need to warning the user that this batch is a special case 443 from sas.sasgui.perspectives.fitting.fitting_widgets import BatchDataDialog 437 from sas.sasgui.perspectives.fitting.fitting_widgets import \ 438 BatchDataDialog 444 439 dlg = BatchDataDialog(self) 445 440 if dlg.ShowModal() == wx.ID_OK: … … 461 456 page = self.add_empty_page() 462 457 if data_1d_list and not data_2d_list: 463 # only on type of data458 # only on type of data 464 459 page.fill_data_combobox(data_1d_list) 465 460 elif not data_1d_list and data_2d_list: … … 477 472 Add a fitting page on the notebook contained by fitpanel 478 473 479 :param data : data to fit474 :param data_list: data to fit 480 475 481 476 :return panel : page just added for further used. -
src/sas/sasgui/perspectives/fitting/fitting.py
rec72ceb r1a5d5f2 1521 1521 for uid in page_id: 1522 1522 res = result[index] 1523 fit_msg = res.mesg 1523 1524 if res.fitness is None or \ 1524 1525 not numpy.isfinite(res.fitness) or \ 1525 1526 numpy.any(res.pvec == None) or \ 1526 1527 not numpy.all(numpy.isfinite(res.pvec)): 1527 msg = "Fitting did not converge!!!" 1528 evt = StatusEvent(status=msg, info="warning", type="stop") 1529 wx.PostEvent(self.parent, evt) 1528 fit_msg += "\nFitting did not converge!!!" 1530 1529 wx.CallAfter(self._update_fit_button, page_id) 1531 1530 else: … … 1550 1549 wx.CallAfter(cpage._on_fit_complete) 1551 1550 except KeyboardInterrupt: 1552 msg = "Singular point: Fitting Stoped." 1553 evt = StatusEvent(status=msg, info="info", type="stop") 1554 wx.PostEvent(self.parent, evt) 1551 fit_msg += "\nSingular point: Fitting stopped." 1555 1552 except: 1556 msg = "Singular point: Fitting Error occurred." 1557 evt = StatusEvent(status=msg, info="error", type="stop") 1558 wx.PostEvent(self.parent, evt) 1553 fit_msg += "\nSingular point: Fitting error occurred." 1554 if fit_msg: 1555 evt = StatusEvent(status=fit_msg, info="warning", type="stop") 1556 wx.PostEvent(self.parent, evt) 1559 1557 1560 1558 except: -
src/sas/sasgui/perspectives/fitting/media/fitting_help.rst
r3e1c9e5 r26c8be3 163 163 ^^^^^^^^^^^^^^^^ 164 164 165 Relatively straightforward models can be programmed directly from the SasView GUI 166 using the *New Plugin Model Function*. 167 165 168 .. image:: new_model.bmp 166 169 167 A model template generated by this option can be viewed and further modified using 170 When using this feature, be aware that even if your code has errors, including 171 syntax errors, a model file is still generated. When you then correct the errors 172 and click 'Apply' again to re-compile you will get an error informing you that 173 the model already exists if the 'Overwrite' box is not checked. In this case you 174 will need to supply a new model function name. By default the 'Overwrite' box is 175 *checked*\ . 176 177 Also note that the 'Fit Parameters' have been split into two sections: those which 178 can be polydisperse (shape and orientation parameters) and those which are not 179 (eg, scattering length densities). 180 181 A model file generated by this option can be viewed and further modified using 168 182 the :ref:`Advanced_Plugin_Editor` . 169 170 *NB: "Fit Parameters" has been split into two sections, those which can be171 polydisperse (shape and orientation parameters) and those which are not172 (scattering length densities, for example).*173 183 174 184 Sum|Multi(p1,p2) -
src/sas/sasgui/perspectives/fitting/media/plugin.rst
r3e1c9e5 r20cfa23 11 11 There are essentially three ways to generate new fitting models for SasView: 12 12 13 * Using the SasView :ref:`New_Plugin_Model` helper dialog (best for beginners and/or relatively simple models) 14 * By copying/editing an existing model (this can include models generated by the *New Plugin Model* dialog) in the :ref:`Python_shell` or :ref:`Advanced_Plugin_Editor` as described below (suitable for all use cases) 15 * By writing a model from scratch outside of SasView (only recommended for code monkeys!) 13 * Using the SasView :ref:`New_Plugin_Model` helper dialog (best for beginners 14 and/or relatively simple models) 15 * By copying/editing an existing model (this can include models generated by 16 the *New Plugin Model* dialog) in the :ref:`Python_shell` or 17 :ref:`Advanced_Plugin_Editor` as described below (suitable for all use cases) 18 * By writing a model from scratch outside of SasView (only recommended for 19 code monkeys!) 16 20 17 21 Overview … … 23 27 24 28 the next time SasView is started it will compile the plugin and add 25 it to the list of * PluginModels* in a FitPage.29 it to the list of *Customized Models* in a FitPage. 26 30 27 31 SasView models can be of three types: … … 57 61 - If necessary use underscore to separate words (i.e. barbell not BarBell or 58 62 broad_peak not BroadPeak) 59 - Do not include ââ¬Åmodelââ¬ï¿œin the name (i.e. barbell not BarBellModel)63 - Do not include "model" in the name (i.e. barbell not BarBellModel) 60 64 61 65 … … 479 483 } 480 484 481 The C model operates on a single $q$ value at a time. The code will be482 run in parallel across different $q$ values, either on the graphics card483 or the processor.484 485 Rather than returning NAN from Iq, you must define the *INVALID(v)*. The486 *v* parameter lets you access all the parameters in the model using487 *v.par1*, *v.par2*, etc. For example::488 489 #define INVALID(v) (v.bell_radius < v.radius)490 491 485 *Iqxy* is similar to *Iq*, except it uses parameters *qx, qy* instead of *q*, 492 and it includes orientation parameters. As in python models, *form_volume* 493 includes only the volume parameters. *Iqxy* will default to 494 *Iq(sqrt(qx**2 + qy**2), par1, ...)* and *form_volume* will default to 1.0. 495 496 The C code follows the C99 standard, including the usual math functions, 497 as defined in 498 `OpenCL <https://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/mathFunctions.html>`_. 499 500 The standard constants and functions include the following:: 501 502 M_PI = pi 503 M_PI_2 = pi/2 504 M_PI_4 = pi/4 505 M_E = e 506 M_SQRT1_2 = 1/sqrt(2) 507 NAN = NaN 508 INFINITY = 1/0 509 erf(x) = error function 510 erfc(x) = 1-erf(x) 511 expm1(x) = exp(x) - 1 512 tgamma(x) = gamma function 513 514 Some non-standard constants and functions are also provided:: 515 516 M_PI_180 = pi/180 517 M_4PI_3 = 4pi/3 518 square(x) = x*x 519 cube(x) = x*x*x 520 sinc(x) = sin(x)/x, with sin(0)/0 -> 1 521 SINCOS(x, s, c) sets s=sin(angle) and c=cos(angle) 522 powr(x, y) = x^y for x >= 0 523 pown(x, n) = x^n for n integer 524 525 **source=['lib/fn.c', ...]** includes the listed C source files in the 486 and it includes orientation parameters. 487 488 *form_volume* defines the volume of the shape. As in python models, it 489 includes only the volume parameters. 490 491 *Iqxy* will default to *Iq(sqrt(qx**2 + qy**2), par1, ...)* and 492 *form_volume* will default to 1.0. 493 494 **source=['fn.c', ...]** includes the listed C source files in the 526 495 program before *Iq* and *Iqxy* are defined. This allows you to extend the 527 library of available C functions. Additional special functions and 528 scattering calculations are defined in 529 `sasmodels/models/lib <https://github.com/SasView/sasmodels/tree/master/sasmodels/models/lib>`_, 530 including:: 531 532 sph_j1c(x) = 3 j1(x)/x = 3 (sin(x) - x cos(x))/x^3 [spherical bessel function] 533 sas_J1c(x) = 2 J1(x)/x [bessel function of the first kind] 534 sas_gamma(x) = gamma function [tgamma is unstable below 1] 535 sas_erf(x) = error function [erf is broken on some Intel OpenCL drivers] 536 sas_erfc(x) = 1-erf(x) 537 sas_J0(x) = J0(x) 538 sas_J1(x) = J1(x) 539 sas_JN(x) = JN(x) 540 Si(x) = integral sin(z)/z from 0 to x 541 Gauss76Wt = gaussian quadrature weights for 76 point integral 542 Gauss76Z = gaussian quadrature values for 76 point integral 543 544 These functions have been tuned to be fast and numerically stable down 545 to $q=0$ even in single precision. In some cases they work around bugs 546 which appear on some platforms but not others. So use them where needed!!! 496 library of C functions available to your model. 547 497 548 498 Models are defined using double precision declarations for the 549 parameters and return values. Declarations and constants will be converted 550 to float or long double depending on the precision requested. 499 parameters and return values. When a model is run using single 500 precision or long double precision, each variable is converted 501 to the target type, depending on the precision requested. 551 502 552 503 **Floating point constants must include the decimal point.** This allows us … … 558 509 use the builtin constant M_PI rather than 4*atan(1); it is faster and smaller! 559 510 560 FLOAT_SIZE is the number of bytes in the converted variables. If your 561 algorithm depends on precision (which is not uncommon for numerical 562 algorithms), use the following:: 563 564 #if FLOAT_SIZE>4 565 ... code for double precision ... 566 #else 567 ... code for single precision ... 568 #endif 569 570 A value defined as SAS_DOUBLE will stay double precision; this should 571 not be used since some graphics cards do not support double precision. 572 511 The C model operates on a single $q$ value at a time. The code will be 512 run in parallel across different $q$ values, either on the graphics card 513 or the processor. 514 515 Rather than returning NAN from Iq, you must define the *INVALID(v)*. The 516 *v* parameter lets you access all the parameters in the model using 517 *v.par1*, *v.par2*, etc. For example:: 518 519 #define INVALID(v) (v.bell_radius < v.radius) 520 521 Special Functions 522 ................. 523 524 The C code follows the C99 standard, with the usual math functions, 525 as defined in 526 `OpenCL <https://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/mathFunctions.html>`_. 527 This includes the following: 528 529 M_PI, M_PI_2, M_PI_4, M_SQRT1_2, M_E: 530 $\pi$, $\pi/2$, $\pi/4$, $1/\sqrt{2}$ and Euler's constant $e$ 531 exp, log, pow(x,y), expm1, sqrt: 532 Power functions $e^x$, $\ln x$, $x^y$, $e^x - 1$, $\sqrt{x}$. 533 The function expm1(x) is accurate across all $x$, including $x$ 534 very close to zero. 535 sin, cos, tan, asin, acos, atan: 536 Trigonometry functions and inverses, operating on radians. 537 sinh, cos, tanh, asinh, acosh, atanh: 538 Hyperbolic trigonometry functions. 539 atan2(y,x): 540 Angle from the $x$\ -axis to the point $(x,y)$, which is equal to 541 $\tan^{-1}(y/x)$ corrected for quadrant. That is, if $x$ and $y$ are 542 both negative, then atan2(y,x) returns a value in quadrant III where 543 atan(y/x) would return a value in quadrant I. Similarly for 544 quadrants II and IV when $x$ and $y$ have opposite sign. 545 fmin(x,y), fmax(x,y), trunc, rint: 546 Floating point functions. rint(x) returns the nearest integer. 547 NAN: 548 NaN, Not a Number, $0/0$. Use isnan(x) to test for NaN. Note that 549 you cannot use :code:`x == NAN` to test for NaN values since that 550 will always return false. NAN does not equal NAN! 551 INFINITY: 552 $\infty, 1/0$. Use isinf(x) to test for infinity, or isfinite(x) 553 to test for finite and not NaN. 554 erf, erfc, tgamma, lgamma: **do not use** 555 Special functions that should be part of the standard, but are missing 556 or inaccurate on some platforms. Use sas_erf, sas_erfc and sas_gamma 557 instead (see below). Note: lgamma(x) has not yet been tested. 558 559 Some non-standard constants and functions are also provided: 560 561 M_PI_180, M_4PI_3: 562 $\pi/{180}$, $\tfrac{4}{3}\pi$ 563 SINCOS(x, s, c): 564 Macro which sets s=sin(x) and c=cos(x). The variables *c* and *s* 565 must be declared first. 566 square(x): 567 $x^2$ 568 cube(x): 569 $x^3$ 570 sinc(x): 571 $\sin(x)/x$, with limit $\sin(0)/0 = 1$. 572 powr(x, y): 573 $x^y$ for $x \ge 0$; this is faster than general $x^y$ on some GPUs. 574 pown(x, n): 575 $x^n$ for $n$ integer; this is faster than general $x^n$ on some GPUs. 576 FLOAT_SIZE: 577 The number of bytes in a floating point value. Even though all 578 variables are declared double, they may be converted to single 579 precision float before running. If your algorithm depends on 580 precision (which is not uncommon for numerical algorithms), use 581 the following:: 582 583 #if FLOAT_SIZE>4 584 ... code for double precision ... 585 #else 586 ... code for single precision ... 587 #endif 588 SAS_DOUBLE: 589 A replacement for :code:`double` so that the declared variable will 590 stay double precision; this should generally not be used since some 591 graphics cards do not support double precision. There is no provision 592 for forcing a constant to stay double precision. 593 594 The following special functions and scattering calculations are defined in 595 `sasmodels/models/lib <https://github.com/SasView/sasmodels/tree/master/sasmodels/models/lib>`_. 596 These functions have been tuned to be fast and numerically stable down 597 to $q=0$ even in single precision. In some cases they work around bugs 598 which appear on some platforms but not others. So use them where needed!!! 599 600 polevl(x, c, n): 601 Polynomial evaluation $p(x) = \sum_{i=0}^n c_i x^{n-i}$ using Horner's 602 method so it is faster and more accurate. 603 604 :code:`source = ["lib/polevl.c", ...]` 605 606 sas_gamma: 607 Gamma function $\text{sas_gamma}(x) = \Gamma(x)$. The standard math 608 library gamma function, tgamma(x) is unstable below 1 on some platforms. 609 610 :code:`source = ["lib/sasgamma.c", ...]` 611 612 erf, erfc: 613 Error function 614 $\text{erf}(x) = \frac{1}{\sqrt\pi}\int_0^x e^{-t^2}\,dt$ 615 and complementary error function 616 $\text{erfc}(x) = \frac{1}{\sqrt\pi}\int_x^\inf e^{-t^2}\,dt$. 617 The standard math library erf and erfc are slower and broken 618 on some platforms. 619 620 :code:`source = ["lib/polevl.c", "lib/sas_erf.c", ...]` 621 622 sas_J0: 623 Bessel function of the first kind where 624 $J_0(x) = \frac{1}{\pi}\int_0^\pi \cos(x\sin(\tau))\,d\tau$. 625 626 :code:`source = ["lib/polevl.c", "lib/sas_J0.c", ...]` 627 628 sas_J1: 629 Bessel function of the first kind where 630 $J_1(x) = \frac{1}{\pi}\int_0^\pi \cos(\tau - x\sin(\tau))\,d\tau$. 631 632 :code:`source = ["lib/polevl.c", "lib/sas_J1.c", ...]` 633 634 sas_JN: 635 Bessel function of the first kind where 636 $J_n(x) = \frac{1}{\pi}\int_0^\pi \cos(n\tau - x\sin(\tau))\,d\tau$. 637 638 :code:`source = ["lib/polevl.c", "lib/sas_J0.c", "lib/sas_J1.c", "lib/sas_JN.c", ...]` 639 640 Si: 641 Sine integral $\text{Si}(x) = \int_0^x \tfrac{\sin t}{t}\,dt$. 642 643 :code:`soure = ["lib/Si.c", ...]` 644 645 sph_j1c(qr): 646 Spherical Bessel form 647 $F(qr) = 3 j_1(qr)/(qr) = 3 (\sin(qr) - qr \cos(qr))/{(qr)^3}$, 648 with a limiting value of 1 at $qr=0$. This function uses a Taylor 649 series for small $qr$ for numerical accuracy. 650 651 :code:`source = ["lib/sph_j1c.c", ...]` 652 653 sas_J1c(qr): 654 Bessel form $F(qr) = 2 J_1(qr)/{(qr)}$, with a limiting value of 1 at $qr=0$. 655 656 :code:`source = ["lib/polevl.c", "lib/sas_J1.c", ...]` 657 658 Gauss76z[i], Gauss76Wt[i]: 659 Points $z_i$ and weights $w_i$ for 76-point Gaussian quadrature, 660 computing $\int_{-1}^1 f(z)\,dz \approx \sum_{i=1}^{76} w_i f(z_i)$. 661 Similar arrays are available in :code:`gauss20.c` for 20 point 662 quadrature and in :code:`gauss150.c` for 150 point quadrature. 663 664 :code:`source = ["gauss76.c", ...]` 665 666 Problems with C models 667 ...................... 668 669 The graphics processor (GPU) in your computer is a specialized computer tuned 670 for certain kinds of problems. This leads to strange restrictions that you 671 need to be aware of. Your code may work fine on some platforms or for some 672 models, but then return bad values on other platforms. Some examples of 673 particular problems: 674 675 **(1) Code is too complex, or uses too much memory.** GPU devices only have a 676 limited amount of memory available for each processor. If you run programs 677 which take too much memory, then rather than running multiple values in parallel 678 as it usually does, the GPU may only run a single version of the code at a 679 time, making it slower than running on the CPU. It may fail to run on 680 some platforms, or worse, cause the screen to go blank or the system to reboot. 681 682 **(2) Code takes too long.** Because GPU devices are used for the computer 683 display, the OpenCL drivers are very careful about the amount of time they 684 will allow any code to run. For example, on OS X, the model will stop running 685 after 5 seconds regardless of whether the computation is complete. You may end up 686 with only some of your 2D array defined, with the rest containing random 687 data. Or it may cause the screen to go blank or the system to reboot. 688 689 **(3) Memory is not aligned**. The GPU hardware is specialized to operate on 690 multiple values simultaneously. To keep the GPU simple the values in memory 691 must be aligned with the different GPU compute engines. Not following these 692 rules can lead to unexpected values being loaded into memory, and wrong answers 693 computed. The conclusion from a very long and strange debugging session was 694 that any arrays that you declare in your model should be a multiple of four. 695 For example:: 696 697 double Iq(q, p1, p2, ...) 698 { 699 double vector[8]; // Only going to use seven slots, but declare 8 700 ... 701 } 702 703 The first step when your model is behaving strangely is to set **single=False**. 704 This automatically restricts the model to only run on the CPU, or on high-end 705 GPU cards. There can still be problems even on high-end cards, so you can force 706 the model off the GPU by setting **opencl=False**. This runs the model 707 as a normal C program without any GPU restrictions so you know that 708 strange results are probably from your code rather than the environment. Once 709 the code is debugged, you can compare your output to the output on the GPU. 710 711 Although it can be difficult to get your model to work on the GPU, the reward 712 can be a model that runs 1000x faster on a good card. Even your laptop may 713 show a 50x improvement or more over the equivalent pure python model. 573 714 574 715 External C Models … … 577 718 External C models are very much like embedded C models, except that 578 719 *Iq*, *Iqxy* and *form_volume* are defined in an external source file 579 loaded using the *source=[...]* method. You need to supply the function720 loaded using the *source=[...]* statement. You need to supply the function 580 721 declarations for each of these that you need instead of building them 581 722 automatically from the parameter table. … … 804 945 .. ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ 805 946 806 .. note:: This help document was last changed by Steve King, 10Oct2016947 .. note:: This help document was last changed by Steve King, 25Oct2016 -
src/sas/sasgui/perspectives/fitting/models.py
r5de7f69 r313c5c9 356 356 """ 357 357 if int(evt.GetId()) in self.form_factor_dict.keys(): 358 from sas .sascalc.fit.MultiplicationModel import MultiplicationModel358 from sasmodels.sasview_model import MultiplicationModel 359 359 self.model_dictionary[MultiplicationModel.__name__] = MultiplicationModel 360 360 model1, model2 = self.form_factor_dict[int(evt.GetId())] -
src/sas/sasgui/perspectives/fitting/pagestate.py
r467202f rc8e1996 46 46 ["npts", "npts", "float"], 47 47 ["categorycombobox", "categorycombobox", "string"], 48 ["formfactorcombobox", "formfactorcombobox", "string"], 49 ["structurecombobox", "structurecombobox", "string"], 48 ["formfactorcombobox", "formfactorcombobox", 49 "string"], 50 ["structurecombobox", "structurecombobox", 51 "string"], 50 52 ["multi_factor", "multi_factor", "float"], 51 53 ["magnetic_on", "magnetic_on", "bool"], … … 65 67 ["smearer", "smearer", "float"], 66 68 ["smear_type", "smear_type", "string"], 67 ["dq_l", "dq_l", " string"],68 ["dq_r", "dq_r", " string"],69 ["dq_l", "dq_l", "float"], 70 ["dq_r", "dq_r", "float"], 69 71 ["dx_max", "dx_max", "float"], 70 72 ["dx_min", "dx_min", "float"], … … 80 82 ["str_parameters", "str_parameters"], 81 83 ["orientation_parameters", "orientation_params"], 82 ["dispersity_parameters", "orientation_params_disp"], 84 ["dispersity_parameters", 85 "orientation_params_disp"], 83 86 ["fixed_param", "fixed_param"], 84 87 ["fittable_param", "fittable_param"]] … … 120 123 try: 121 124 return node.get(item[0]).strip() == "True" 122 except :125 except Exception: 123 126 return None 124 127 else: 125 128 try: 126 129 return float(node.get(item[0])) 127 except :130 except Exception: 128 131 return None 129 132 … … 188 191 # page name 189 192 self.page_name = "" 190 # Contains link between model, allits parameters, and panel organization193 # Contains link between model, its parameters, and panel organization 191 194 self.parameters = [] 192 195 # String parameter list that can not be fitted … … 305 308 obj.fittable_param = copy.deepcopy(self.fittable_param) 306 309 obj.orientation_params = copy.deepcopy(self.orientation_params) 307 obj.orientation_params_disp = copy.deepcopy(self.orientation_params_disp) 310 obj.orientation_params_disp = \ 311 copy.deepcopy(self.orientation_params_disp) 308 312 obj.enable_disp = copy.deepcopy(self.enable_disp) 309 313 obj.disable_disp = copy.deepcopy(self.disable_disp) … … 397 401 rep += "data : %s\n" % str(self.data) 398 402 rep += "Plotting Range: min: %s, max: %s, steps: %s\n" % \ 399 (str(self.qmin), str(self.qmax), str(self.npts))403 (str(self.qmin), str(self.qmax), str(self.npts)) 400 404 rep += "Dispersion selection : %s\n" % str(self.disp_box) 401 405 rep += "Smearing enable : %s\n" % str(self.enable_smearer) … … 413 417 414 418 rep += "2D enable : %s\n" % str(self.enable2D) 415 rep += "All parameters checkbox selected: %s\n" % s tr(self.cb1)419 rep += "All parameters checkbox selected: %s\n" % self.cb1 416 420 rep += "Value of Chisqr : %s\n" % str(self.tcChi) 417 rep += "Smear object : %s\n" % s tr(self.smearer)418 rep += "Smear type : %s\n" % s tr(self.smear_type)421 rep += "Smear object : %s\n" % self.smearer 422 rep += "Smear type : %s\n" % self.smear_type 419 423 rep += "dq_l : %s\n" % self.dq_l 420 424 rep += "dq_r : %s\n" % self.dq_r … … 478 482 value = content[1] 479 483 except Exception: 480 msg = "Report string expected 'name: value' but got %r" %line484 msg = "Report string expected 'name: value' but got %r" % line 481 485 logging.error(msg) 482 486 if name.count("State created"): … … 493 497 if name == "value": 494 498 param_string += value + ',' 499 fixed_parameter = False 495 500 if name == "selected": 496 501 if value == u' False': 497 502 fixed_parameter = True 498 else:499 fixed_parameter = False500 503 if name == "error value": 501 504 if fixed_parameter: … … 617 620 dialog.Show() 618 621 619 def _to XML_helper(self, thelist, element, newdoc):622 def _to_xml_helper(self, thelist, element, newdoc): 620 623 """ 621 624 Helper method to create xml file for saving state … … 635 638 element.appendChild(sub_element) 636 639 637 def to XML(self, file="fitting_state.fitv", doc=None,638 entry_node=None, batch_fit_state=None):640 def to_xml(self, file="fitting_state.fitv", doc=None, 641 entry_node=None, batch_fit_state=None): 639 642 """ 640 643 Writes the state of the fit panel to file, as XML. … … 648 651 :param entry_node: XML node within the XML document at which we 649 652 will append the data [optional] 653 :param batch_fit_state: simultaneous fit state 650 654 """ 651 655 from xml.dom.minidom import getDOMImplementation … … 746 750 for item in LIST_OF_STATE_PARAMETERS: 747 751 element = newdoc.createElement(item[0]) 748 self._to XML_helper(thelist=getattr(self, item[1]),749 element=element, newdoc=newdoc)752 self._to_xml_helper(thelist=getattr(self, item[1]), 753 element=element, newdoc=newdoc) 750 754 inputs.appendChild(element) 751 755 … … 765 769 for constraint in batch_fit_state.constraints_list: 766 770 if constraint.model_cbox.GetValue() != "": 767 # model_cbox, param_cbox, egal_txt, constraint, btRemove, sizer 771 # model_cbox, param_cbox, egal_txt, constraint, 772 # btRemove, sizer 768 773 doc_cons = newdoc.createElement('constraint') 769 774 doc_cons.setAttribute('model_cbox', … … 808 813 return newdoc 809 814 810 def _from XML_helper(self, node, list):815 def _from_xml_helper(self, node, list): 811 816 """ 812 817 Helper function to write state to xml … … 858 863 [maximum_displayed, maximum_value], unit]) 859 864 860 def from XML(self, file=None, node=None):865 def from_xml(self, file=None, node=None): 861 866 """ 862 867 Load fitting state from a file … … 887 892 logging.error(msg) 888 893 889 # Parse fitting attributes890 entry = get_content('ns:Attributes', node)891 for item in LIST_OF_DATA_ATTRIBUTES:892 node = get_content('ns:%s' % item[0], entry)893 setattr(self, item[0], parse_entry_helper(node, item))894 895 894 if entry is not None: 895 # Parse fitting attributes 896 entry = get_content('ns:Attributes', node) 897 for item in LIST_OF_DATA_ATTRIBUTES: 898 node = get_content('ns:%s' % item[0], entry) 899 setattr(self, item[0], parse_entry_helper(node, item)) 900 896 901 for item in LIST_OF_STATE_ATTRIBUTES: 897 902 node = get_content('ns:%s' % item[0], entry) … … 900 905 for item in LIST_OF_STATE_PARAMETERS: 901 906 node = get_content("ns:%s" % item[0], entry) 902 self._fromXML_helper(node=node, list=getattr(self, item[1])) 907 self._from_xml_helper(node=node, 908 list=getattr(self, item[1])) 903 909 904 910 # Recover _disp_obj_dict from xml file … … 950 956 """ 951 957 images = [] 952 # some imports953 import wx954 958 955 959 # Reset memory … … 958 962 959 963 # For no figures in the list, prepare empty plot 960 if figs ==None or len(figs) == 0:964 if figs is None or len(figs) == 0: 961 965 figs = [None] 962 966 … … 965 969 self.imgRAM = wx.MemoryFSHandler() 966 970 for fig in figs: 967 if fig s !=None:971 if fig is not None: 968 972 ind = figs.index(fig) 969 973 canvas = canvases[ind] 970 974 971 # store the image in wx.FileSystem Object975 # store the image in wx.FileSystem Object 972 976 wx.FileSystem.AddHandler(wx.MemoryFSHandler()) 973 977 … … 975 979 ind = figs.index(fig) 976 980 977 # AddFile, image can be retrieved with 'memory:filename'981 # AddFile, image can be retrieved with 'memory:filename' 978 982 self.imgRAM.AddFile('img_fit%s.png' % ind, 979 983 canvas.bitmap, wx.BITMAP_TYPE_PNG) 980 984 981 # append figs985 # append figs 982 986 images.append(fig) 983 987 … … 989 993 Class to load a .fitv fitting file 990 994 """ 991 # #File type995 # File type 992 996 type_name = "Fitting" 993 997 994 # #Wildcards998 # Wildcards 995 999 type = ["Fitting files (*.fitv)|*.fitv" 996 1000 "SASView file (*.svs)|*.svs"] 997 # #List of allowed extensions1001 # List of allowed extensions 998 1002 ext = ['.fitv', '.FITV', '.svs', 'SVS'] 999 1003 … … 1009 1013 1010 1014 """ 1011 # #Call back method to be executed after a file is read1015 # Call back method to be executed after a file is read 1012 1016 self.call_back = call_back 1013 # #CanSAS format flag1017 # CanSAS format flag 1014 1018 self.cansas = cansas 1015 1019 self.state = None … … 1027 1031 1028 1032 """ 1029 if self.cansas == True:1033 if self.cansas: 1030 1034 return self._read_cansas(path) 1031 1035 … … 1061 1065 for item in datainfo.run: 1062 1066 runname = {} 1063 if datainfo.run_name.has_key(item)and \1067 if item in datainfo.run_name and \ 1064 1068 len(str(datainfo.run_name[item])) > 1: 1065 1069 runname = {'name': datainfo.run_name[item]} … … 1076 1080 root_node = doc.createElement(item[0]) 1077 1081 new_node.appendChild(root_node) 1078 temp_list = None1079 1082 temp_list = getattr(datainfo, item[1]) 1080 1083 … … 1113 1116 datainfo.sample.position.z, 1114 1117 {"unit": datainfo.sample.position_unit}) 1115 if written == True:1118 if written: 1116 1119 sample.appendChild(pos) 1117 1120 … … 1121 1124 written = written | write_node(doc, ori, "pitch", 1122 1125 datainfo.sample.orientation.y, 1123 {"unit": datainfo.sample.orientation_unit}) 1126 {"unit": 1127 datainfo.sample.orientation_unit}) 1124 1128 written = written | write_node(doc, ori, "yaw", 1125 1129 datainfo.sample.orientation.z, 1126 {"unit": datainfo.sample.orientation_unit}) 1127 if written == True: 1130 {"unit": 1131 datainfo.sample.orientation_unit}) 1132 if written: 1128 1133 sample.appendChild(ori) 1129 1134 … … 1153 1158 datainfo.source.beam_size.z, 1154 1159 {"unit": datainfo.source.beam_size_unit}) 1155 if written == True:1160 if written: 1156 1161 source.appendChild(size) 1157 1162 … … 1198 1203 written = written | write_node(doc, size, "z", apert.size.z, 1199 1204 {"unit": apert.size_unit}) 1200 if written == True:1205 if written: 1201 1206 ap.appendChild(size) 1202 1207 … … 1210 1215 item.slit_length, 1211 1216 {"unit": item.slit_length_unit}) 1212 if written == True:1217 if written: 1213 1218 instr.appendChild(det) 1214 1219 … … 1220 1225 written = written | write_node(doc, off, "z", item.offset.z, 1221 1226 {"unit": item.offset_unit}) 1222 if written == True:1227 if written: 1223 1228 det.appendChild(off) 1224 1229 … … 1232 1237 item.beam_center.z, 1233 1238 {"unit": item.beam_center_unit}) 1234 if written == True:1239 if written: 1235 1240 det.appendChild(center) 1236 1241 … … 1242 1247 written = written | write_node(doc, pix, "z", item.pixel_size.z, 1243 1248 {"unit": item.pixel_size_unit}) 1244 if written == True:1249 if written: 1245 1250 det.appendChild(pix) 1246 1251 … … 1253 1258 written = written | write_node(doc, ori, "yaw", item.orientation.z, 1254 1259 {"unit": item.orientation_unit}) 1255 if written == True:1260 if written: 1256 1261 det.appendChild(ori) 1257 1262 … … 1290 1295 # Create an empty state 1291 1296 state = PageState() 1292 state.from XML(node=nodes[0])1297 state.from_xml(node=nodes[0]) 1293 1298 1294 1299 except: … … 1314 1319 simfitstate_0 = simfitstate[0] 1315 1320 all = simfitstate_0.xpath('ns:select_all', 1316 namespaces={'ns': CANSAS_NS})1321 namespaces={'ns': CANSAS_NS}) 1317 1322 atts = all[0].attrib 1318 1323 checked = atts.get('checked') 1319 1324 sim_fit_state.select_all = bool(checked) 1320 1325 model_list = simfitstate_0.xpath('ns:model_list', 1321 namespaces={'ns': CANSAS_NS})1326 namespaces={'ns': CANSAS_NS}) 1322 1327 model_list_items = model_list[0].xpath('ns:model_list_item', 1323 namespaces={'ns': CANSAS_NS}) 1328 namespaces={'ns': 1329 CANSAS_NS}) 1324 1330 for model in model_list_items: 1325 1331 attrs = model.attrib … … 1368 1374 return return_value, _ 1369 1375 1370 # Parse 2D1376 # Parse 2D 1371 1377 data_info = Data2D() 1372 1378 … … 1590 1596 for entry in nodes: 1591 1597 for item in LIST_OF_DATA_2D_ATTR: 1592 # get node1598 # get node 1593 1599 node = get_content('ns:%s' % item[0], entry) 1594 1600 setattr(data_info, item[1], parse_entry_helper(node, item)) … … 1633 1639 entry_list = root.xpath('ns:SASentry', 1634 1640 namespaces={'ns': CANSAS_NS}) 1635 name_map = {}1636 1641 for entry in entry_list: 1637 1642 try: … … 1679 1684 state.data.is_data = state.is_data 1680 1685 if output[ind].run_name is not None\ 1681 and len(output[ind].run_name) != 0:1686 and len(output[ind].run_name) != 0: 1682 1687 if isinstance(output[ind].run_name, dict): 1683 1688 name = output[ind].run_name.keys()[0] … … 1715 1720 # Write the XML document 1716 1721 else: 1717 doc = fitstate.to XML(file=filename)1722 doc = fitstate.to_xml(file=filename) 1718 1723 1719 1724 # Save the document no matter the type … … 1749 1754 1750 1755 if state is not None: 1751 doc = state.to XML(doc=doc, file=data.filename, entry_node=sasentry,1752 batch_fit_state=self.batchfit_params)1756 doc = state.to_xml(doc=doc, file=data.filename, entry_node=sasentry, 1757 batch_fit_state=self.batchfit_params) 1753 1758 1754 1759 return doc
Note: See TracChangeset
for help on using the changeset viewer.