Ignore:
Timestamp:
Dec 7, 2016 9:16:33 AM (7 years ago)
Author:
jhbakker
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.
Message:

Merge branch 'master' into Jurtest

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/sas/sasgui/perspectives/fitting/fitpage.py

    r55db501 rf668101  
    1414from sasmodels.weights import MODELS as POLYDISPERSITY_MODELS 
    1515 
    16 from sas.sasgui.guiframe.events import StatusEvent 
    17 from sas.sasgui.guiframe.events import NewPlotEvent 
    18 from sas.sasgui.guiframe.events import PlotQrangeEvent 
     16from sas.sasgui.guiframe.events import StatusEvent, NewPlotEvent, \ 
     17    PlotQrangeEvent 
    1918from 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 
     19from sas.sasgui.guiframe.utils import format_number, check_float 
    2220from sas.sasgui.guiframe.documentation_window import DocumentationWindow 
     21 
     22from sas.sasgui.perspectives.fitting.basepage import BasicPage as BasicPage 
     23from sas.sasgui.perspectives.fitting.basepage import PageInfoEvent as \ 
     24    PageInfoEvent 
     25from sas.sascalc.data_util.qsmearing import smear_selection 
     26from .basepage import ModelTextCtrl 
    2327 
    2428(Chi2UpdateEvent, EVT_CHI2_UPDATE) = wx.lib.newevent.NewEvent() 
     
    2832SMEAR_SIZE_H = 0.00 
    2933 
    30 from sas.sasgui.perspectives.fitting.basepage import BasicPage as BasicPage 
    31 from sas.sasgui.perspectives.fitting.basepage import PageInfoEvent as PageInfoEvent 
    32 from sas.sascalc.data_util.qsmearing import smear_selection 
    33 from .basepage import ModelTextCtrl 
    34  
    3534 
    3635class FitPage(BasicPage): 
     
    4948        BasicPage.__init__(self, parent, color=color) 
    5049 
    51         ## draw sizer 
     50        # draw sizer 
    5251        self._fill_data_sizer() 
    5352        self.is_2D = None 
     
    7271        self.enable_fit_button() 
    7372        self.fill_data_combobox(data_list=self.data_list) 
    74         #create a default data for an empty panel 
     73        # create a default data for an empty panel 
    7574        self.create_default_data() 
    7675        self._manager.frame.Bind(wx.EVT_SET_FOCUS, self.on_set_focus) 
     
    105104        self.data_box_description.SetForegroundColour(dname_color) 
    106105        boxsizer1 = wx.StaticBoxSizer(self.data_box_description, wx.VERTICAL) 
    107         #---------------------------------------------------------- 
     106        # ---------------------------------------------------------- 
    108107        sizer_data = wx.BoxSizer(wx.HORIZONTAL) 
    109108        self.dataSource = wx.ComboBox(self, wx.ID_ANY, style=wx.CB_READONLY) 
     
    134133        self.enable_datasource() 
    135134        if len(data_list) > 0: 
    136             #find the maximum range covering all data 
     135            # find the maximum range covering all data 
    137136            qmin, qmax, npts = self.compute_data_set_range(data_list) 
    138137            self.qmin_data_set = qmin 
     
    186185 
    187186        :return: True or False 
    188  
    189187        """ 
    190188        if self.data.__class__.__name__ == "Data2D" or \ 
     
    200198        buttons, xi^2, number of points etc. 
    201199        """ 
    202         is_2Ddata = False 
     200        is_2d_data = False 
    203201 
    204202        # Check if data is 2D 
    205203        if self.data.__class__.__name__ == "Data2D" or \ 
    206204                        self.enable2D: 
    207             is_2Ddata = True 
     205            is_2d_data = True 
    208206 
    209207        title = "Fitting" 
    210         #smear messages & titles 
     208        # smear messages & titles 
    211209        smear_message_none = "No smearing is selected..." 
    212210        smear_message_dqdata = "The dQ data is being used for smearing..." 
     
    226224        self._get_smear_info() 
    227225 
    228         #Sizers 
     226        # Sizers 
    229227        box_description_range = wx.StaticBox(self, wx.ID_ANY, str(title)) 
    230228        box_description_range.SetForegroundColour(wx.BLUE) 
     
    245243        sizer_weighting = wx.BoxSizer(wx.HORIZONTAL) 
    246244        weighting_box.SetMinSize((_DATA_BOX_WIDTH, 40)) 
    247         #Filling the sizer containing weighting info. 
     245        # Filling the sizer containing weighting info. 
    248246        self.dI_noweight = wx.RadioButton(self, wx.ID_ANY, 
    249247                                          'No Weighting', style=wx.RB_GROUP) 
     
    287285                        self._on_select_accuracy) 
    288286 
    289         #Fit button 
     287        # Fit button 
    290288        self.btFit = wx.Button(self, self._ids.next(), 'Fit') 
    291289        self.default_bt_colour = self.btFit.GetDefaultAttributes() 
     
    293291        self.btFit.SetToolTipString("Start fitting.") 
    294292 
    295         #General Help button 
     293        # General Help button 
    296294        self.btFitHelp = wx.Button(self, wx.ID_ANY, 'Help') 
    297295        self.btFitHelp.SetToolTipString("General fitting help.") 
    298296        self.btFitHelp.Bind(wx.EVT_BUTTON, self._onFitHelp) 
    299297         
    300         #Resolution Smearing Help button (for now use same technique as 
    301         #used for dI help to get tiniest possible button that works 
    302         #both on MAC and PC.  Should completely rewrite the fitting sizer  
    303         #in future.  This is minimum to get out release 3.1 
     298        # 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 
    304302        #        comment June 14, 2015     --- PDB 
    305303        if sys.platform.count("win32") > 0: 
    306             size_q = (20, 15)  #on PC 
     304            size_q = (20, 15)  # on PC 
    307305        else: 
    308             size_q = (30, 20)  #on MAC 
     306            size_q = (30, 20)  # on MAC 
    309307        self.btSmearHelp = wx.Button(self, wx.ID_ANY, '?', 
    310308                                     style=wx.BU_EXACTFIT, size=size_q) 
     
    312310        self.btSmearHelp.Bind(wx.EVT_BUTTON, self._onSmearHelp) 
    313311         
    314         #textcntrl for custom resolution 
     312        # textcntrl for custom resolution 
    315313        self.smear_pinhole_max = ModelTextCtrl(self, wx.ID_ANY, 
    316314                            size=(_BOX_WIDTH - 25, 20), 
     
    330328                            text_enter_callback=self.onSlitSmear) 
    331329 
    332         ## smear 
     330        # smear 
    333331        self.smear_data_left = BGTextCtrl(self, wx.ID_ANY, 
    334332                                          size=(_BOX_WIDTH - 25, 20), style=0) 
     
    338336        self.smear_data_right.SetValue(str(self.dq_r)) 
    339337 
    340         #set default values for smear 
     338        # set default values for smear 
    341339        self.smear_pinhole_max.SetValue(str(self.dx_max)) 
    342340        self.smear_pinhole_min.SetValue(str(self.dx_min)) 
     
    344342        self.smear_slit_width.SetValue(str(self.dxw)) 
    345343 
    346         #Filling the sizer containing instruments smearing info. 
     344        # Filling the sizer containing instruments smearing info. 
    347345        self.disable_smearer = wx.RadioButton(self, wx.ID_ANY, 
    348346                                              'None', style=wx.RB_GROUP) 
    349347        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.") 
    352350        self.pinhole_smearer = wx.RadioButton(self, wx.ID_ANY, 
    353351                                              'Custom Pinhole Smear') 
    354         #self.pinhole_smearer.SetToolTipString 
    355         #("Click to input custom resolution for pinhole smearing.") 
     352        # self.pinhole_smearer.SetToolTipString 
     353        # ("Click to input custom resolution for pinhole smearing.") 
    356354        self.slit_smearer = wx.RadioButton(self, wx.ID_ANY, 'Custom Slit Smear') 
    357         #self.slit_smearer.SetToolTipString 
    358         #("Click to input custom resolution for slit smearing.") 
     355        # self.slit_smearer.SetToolTipString 
     356        # ("Click to input custom resolution for slit smearing.") 
    359357        self.Bind(wx.EVT_RADIOBUTTON, self.onSmear, 
    360358                  id=self.disable_smearer.GetId()) 
     
    379377        self.Npts_fit = BGTextCtrl(self, wx.ID_ANY, "-", size=(75, 20), style=0) 
    380378        self.Npts_fit.SetToolTipString( 
    381                             " Npts : number of points selected for fitting") 
     379            " Npts : number of points selected for fitting") 
    382380        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) 
    385383        self.Npts_total.SetValue(format_number(self.npts_x)) 
    386         self.Npts_total.SetToolTipString(\ 
    387                                 " Total Npts : total number of data points") 
     384        self.Npts_total.SetToolTipString( 
     385            " Total Npts : total number of data points") 
    388386 
    389387        # Update and Draw button 
     
    430428        self.smear_description_2d_y = wx.StaticText(self, wx.ID_ANY, 
    431429                            smear_message_2d_y_title, style=wx.ALIGN_LEFT) 
    432         self.smear_description_2d_y.SetToolTipString(\ 
     430        self.smear_description_2d_y.SetToolTipString( 
    433431                                    " dQs(perpendicular) in q_phi direction.") 
    434432        self.smear_description_pin_min = wx.StaticText(self, wx.ID_ANY, 
     
    441439                        smear_message_slit_width_title, style=wx.ALIGN_LEFT) 
    442440 
    443         #arrange sizers 
     441        # arrange sizers 
    444442        self.sizer_set_smearer.Add(sizer_smearer) 
    445443        self.sizer_set_smearer.Add((10, 10)) 
    446444        self.sizer_set_smearer.Add(self.smear_description_none, 
    447                                     0, wx.CENTER, 10) 
     445                                   0, wx.CENTER, 10) 
    448446        self.sizer_set_smearer.Add(self.smear_description_dqdata, 
    449                                     0, wx.CENTER, 10) 
     447                                   0, wx.CENTER, 10) 
    450448        self.sizer_set_smearer.Add(self.smear_description_2d, 
    451                                     0, wx.CENTER, 10) 
     449                                   0, wx.CENTER, 10) 
    452450        self.sizer_new_smear.Add(self.smear_description_type, 
    453                                   0, wx.CENTER, 10) 
     451                                 0, wx.CENTER, 10) 
    454452        self.sizer_new_smear.Add(self.smear_description_accuracy_type, 
    455                                   0, wx.CENTER, 10) 
     453                                 0, wx.CENTER, 10) 
    456454        self.sizer_new_smear.Add(self.smear_accuracy) 
    457455        self.sizer_new_smear.Add(self.smear_description_smear_type, 
    458                                   0, wx.CENTER, 10) 
     456                                 0, wx.CENTER, 10) 
    459457        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) 
    462459        self.sizer_new_smear.Add(self.smear_description_pin_min, 
    463                                   0, wx.CENTER, 10) 
     460                                 0, wx.CENTER, 10) 
    464461        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) 
    473467        self.sizer_new_smear.Add((20, -1)) 
    474468        self.sizer_new_smear.Add(self.smear_description_2d_y, 
    475                                   0, wx.CENTER, 10) 
     469                                 0, wx.CENTER, 10) 
    476470        self.sizer_new_smear.Add(self.smear_description_pin_max, 
    477                                   0, wx.CENTER, 10) 
     471                                 0, wx.CENTER, 10) 
    478472        self.sizer_new_smear.Add(self.smear_description_slit_width, 
    479                                   0, wx.CENTER, 10) 
     473                                 0, wx.CENTER, 10) 
    480474 
    481475        self.sizer_new_smear.Add(self.smear_pinhole_max, 0, wx.CENTER, 10) 
     
    502496 
    503497        # Show only the relevant smear messages, etc 
    504         if self.current_smearer == None: 
    505             if not is_2Ddata: 
     498        if self.current_smearer is None: 
     499            if not is_2d_data: 
    506500                self.smear_description_none.Show(True) 
    507501                self.enable_smearer.Disable() 
     
    509503                self.smear_description_none.Show(True) 
    510504                self.slit_smearer.Disable() 
    511             if self.data == None: 
     505            if self.data is None: 
    512506                self.slit_smearer.Disable() 
    513507                self.pinhole_smearer.Disable() 
     
    516510            self._show_smear_sizer() 
    517511        boxsizer_range.Add(self.sizer_set_masking) 
    518         #2D data? default 
    519         is_2Ddata = False 
    520  
    521         #check if it is 2D data 
     512        # 2D data? default 
     513        is_2d_data = False 
     514 
     515        # check if it is 2D data 
    522516        if self.data.__class__.__name__ == "Data2D" or self.enable2D: 
    523             is_2Ddata = True 
     517            is_2d_data = True 
    524518 
    525519        self.sizer5.Clear(True) 
     
    569563        sizer.Add(wx.StaticText(self, wx.ID_ANY, ' Max[1/A]')) 
    570564        sizer.Add(self.EditMask_title) 
    571         sizer.Add((-1,5)) 
     565        sizer.Add((-1, 5)) 
    572566 
    573567        sizer.Add(self.reset_qrange) 
     
    575569        sizer.Add(self.qmax) 
    576570        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)]) 
    580574 
    581575        sizer.Add(box_description_1, 0, 0) 
     
    583577        sizer.Add(self.points_sizer, 0, 0) 
    584578        sizer.Add(self.draw_button, 0, 0) 
    585         sizer.Add((-1,5)) 
     579        sizer.Add((-1, 5)) 
    586580         
    587581        sizer.Add(self.tcChi, 0, 0) 
     
    593587        boxsizer_range.Add(sizer_chi2) 
    594588        boxsizer_range.Add(sizer) 
    595         if is_2Ddata: 
     589        if is_2d_data: 
    596590            self.btEditMask.Enable() 
    597591            self.EditMask_title.Enable() 
     
    599593            self.btEditMask.Disable() 
    600594            self.EditMask_title.Disable() 
    601         ## save state 
     595        # save state 
    602596        self.save_current_state() 
    603597        self.sizer5.Add(boxsizer_range, 0, wx.EXPAND | wx.ALL, 10) 
    604598        self.sizer5.Layout() 
    605599 
    606  
    607600    def _set_sizer_dispersion(self): 
    608601        """ 
     
    614607 
    615608        self.sizer4_4.Clear(True) 
    616         if self.model == None: 
    617             ##no model is selected 
     609        if self.model is None: 
     610            # no model is selected 
    618611            return 
    619612        if not self.enable_disp.GetValue(): 
    620             ## the user didn't select dispersity display 
     613            # the user didn't select dispersity display 
    621614            return 
    622615 
    623616        self._reset_dispersity() 
    624617 
    625         ## fill a sizer with the combobox to select dispersion type 
     618        # fill a sizer with the combobox to select dispersion type 
    626619        model_disp = wx.StaticText(self, wx.ID_ANY, 'Function') 
    627620        CHECK_STATE = self.cb1.GetValue() 
     
    646639            err_text = '' 
    647640        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), 
    649642                          wx.EXPAND | wx.ADJUST_MINSIZE, 0) 
    650643 
    651644        ix += 1 
    652645        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), 
    654647                            wx.EXPAND | wx.ADJUST_MINSIZE, 0) 
    655648 
     
    684677                if item in self.model.magnetic_params: 
    685678                    continue 
    686             if not item in self.model.orientation_params: 
    687                 if not item in self.disp_cb_dict: 
     679            if item not in self.model.orientation_params: 
     680                if item not in self.disp_cb_dict: 
    688681                    self.disp_cb_dict[item] = None 
    689682                name0 = "Distribution of " + item 
     
    691684                name2 = item + ".npts" 
    692685                name3 = item + ".nsigmas" 
    693                 if not name1 in self.model.details: 
     686                if name1 not in self.model.details: 
    694687                    self.model.details[name1] = ["", None, None] 
    695688 
     
    717710                        ctl1.SetValue(str(format_number(value, True))) 
    718711                        self.sizer4_4.Add(ctl1, (iy, ix), (1, 1), wx.EXPAND) 
    719                         ## text to show error sign 
     712                        # text to show error sign 
    720713                        ix = 2 
    721714                        text2 = wx.StaticText(self, wx.ID_ANY, '+/-') 
     
    777770                        Tct2.SetValue(str(format_number(value))) 
    778771                        self.sizer4_4.Add(Tct2, (iy, ix), (1, 1), 
    779                                            wx.EXPAND | wx.ADJUST_MINSIZE, 0) 
     772                                          wx.EXPAND | wx.ADJUST_MINSIZE, 0) 
    780773                        self.fixed_param.append([None, name3, Tct2, 
    781774                                                 None, None, None, 
     
    803796                if item in self.model.magnetic_params: 
    804797                    continue 
    805             if  item in self.model.orientation_params: 
    806                 if not item in self.disp_cb_dict: 
     798            if item in self.model.orientation_params: 
     799                if item not in self.disp_cb_dict: 
    807800                    self.disp_cb_dict[item] = None 
    808801                name0 = "Distribution of " + item 
     
    811804                name3 = item + ".nsigmas" 
    812805 
    813                 if not name1 in self.model.details: 
     806                if name1 not in self.model.details: 
    814807                    self.model.details[name1] = ["", None, None] 
    815808 
     
    856849 
    857850                        self.sizer4_4.Add(ctl1, (iy, ix), (1, 1), wx.EXPAND) 
    858                         ## text to show error sign 
     851                        # text to show error sign 
    859852                        ix = 2 
    860853                        text2 = wx.StaticText(self, wx.ID_ANY, '+/-') 
     
    969962 
    970963        self.state.model = self.model.clone() 
    971         ## save state into 
    972         self.state.cb1 = self.cb1.GetValue() 
     964 
     965        # save state into 
    973966        self._copy_parameters_state(self.parameters, self.state.parameters) 
    974967        self._copy_parameters_state(self.orientation_params_disp, 
     
    980973        wx.PostEvent(self.parent, 
    981974                     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 
    984977        self.get_all_checked_params() 
    985978        self.Layout() 
     
    989982        Update and Draw the model 
    990983        """ 
    991         if self.model == None: 
     984        if self.model is None: 
    992985            msg = "Please select a Model first..." 
    993986            wx.MessageBox(msg, 'Info') 
     
    999992            self.create_default_data() 
    1000993        """ 
    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) 
    1004997        if not flag: 
    1005998            msg = "The parameters are invalid" 
     
    10111004        Allow to fit 
    10121005        """ 
    1013         if event != None: 
     1006        if event is not None: 
    10141007            event.Skip() 
    10151008        if self.fit_started: 
     
    10511044            return 
    10521045 
    1053         self.select_param(event=None) 
     1046        self.select_param() 
    10541047 
    10551048        # Remove or do not allow fitting on the Q=0 point, especially 
     
    10621055                                    qmax=self.qmax_x) 
    10631056 
    1064         #single fit 
    1065         #self._manager.onFit(uid=self.uid) 
     1057        # single fit 
     1058        # self._manager.onFit(uid=self.uid) 
    10661059        self.fit_started = self._manager.onFit(uid=self.uid) 
    10671060        wx.CallAfter(self.set_fitbutton) 
     
    10761069        versions of Wx (before 2.9) and thus not the release version of 
    10771070        installers, the help comes up at the top level of the file as 
    1078         webbrowser does not pass anything past the # to the browser when it is 
     1071        web browser does not pass anything past the # to the browser when it is 
    10791072        running "file:///...." 
    10801073 
    1081     :param evt: Triggers on clicking the help button 
    1082     """ 
     1074        :param evt: Triggers on clicking the help button 
     1075        """ 
    10831076 
    10841077        _TreeLocation = "user/sasgui/perspectives/fitting/fitting_help.html" 
     
    10951088        versions of Wx (before 2.9) and thus not the release version of 
    10961089        installers, the help comes up at the top level of the file as 
    1097         webbrowser does not pass anything past the # to the browser when it is 
     1090        web browser does not pass anything past the # to the browser when it is 
    10981091        running "file:///...." 
    10991092 
    1100     :param evt: Triggers on clicking the help button 
    1101     """ 
     1093        :param evt: Triggers on clicking the help button 
     1094        """ 
    11021095 
    11031096        _TreeLocation = "user/sasgui/perspectives/fitting/sm_help.html" 
     
    11111104        """ 
    11121105        # 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". 
    11141107        if self.is_mac: 
    11151108            return 
     
    11211114            label = "Fit" 
    11221115            color = "black" 
    1123         #self.btFit.Enable(False) 
     1116        # self.btFit.Enable(False) 
    11241117        self.btFit.SetLabel(label) 
    11251118        self.btFit.SetForegroundColour(color) 
     
    11521145        Stop fit 
    11531146        """ 
    1154         if event != None: 
     1147        if event is not None: 
    11551148            event.Skip() 
    11561149        self._manager.stop_fit(self.uid) 
     
    11721165        copy_flag = False 
    11731166        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 
    11761169                        and self.structurebox.GetLabel() != 'None')\ 
    11771170                        or event.GetEventObject() == self.structurebox\ 
     
    11861179            self._keep.Enable(False) 
    11871180            self._set_save_flag(False) 
    1188         # TODO: why do we have to variables for one flag?? 
    11891181        self.enable_disp.SetValue(False) 
    11901182        self.disable_disp.SetValue(True) 
     
    12161208                    self._keep.Enable(not self.batch_on) 
    12171209                    self._set_save_flag(True) 
     1210                    self._set_smear(self.data) 
    12181211 
    12191212            # more disables for 2D 
     
    12291222            except: 
    12301223                raise 
    1231                 ## error occured on chisqr computation 
    1232                 #pass 
    1233             ## event to post model to fit to fitting plugins 
     1224                # error occured on chisqr computation 
     1225                # pass 
     1226            # event to post model to fit to fitting plugins 
    12341227            (ModelEventbox, EVT_MODEL_BOX) = wx.lib.newevent.NewEvent() 
    12351228 
    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 
    12381230            evt = ModelEventbox(model=self.model, 
    12391231                            smearer=temp_smear, 
     
    12451237 
    12461238            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)) 
    12481241            self.mbox_description.SetForegroundColour(wx.BLUE) 
    12491242            self.state.model = self.model.clone() 
    12501243            self.state.model.name = self.model.name 
    12511244 
    1252         if event != None: 
    1253             ## post state to fit panel 
     1245        if event is not None: 
     1246            # post state to fit panel 
    12541247            new_event = PageInfoEvent(page=self) 
    12551248            wx.PostEvent(self.parent, new_event) 
    1256             #update list of plugins if new plugin is available 
     1249            # update list of plugins if new plugin is available 
    12571250            custom_model = 'Customized Models' 
    12581251            mod_cat = self.categorybox.GetStringSelection() 
     
    12671260                    self.formfactorbox.SetValue(current_val) 
    12681261            # when select a model only from guictr/button 
    1269             if is_poly_enabled != None: 
     1262            if is_poly_enabled is not None: 
    12701263                self.enable_disp.SetValue(is_poly_enabled) 
    12711264                self.disable_disp.SetValue(not is_poly_enabled) 
     
    12951288        when enter value on panel redraw model according to changed 
    12961289        """ 
    1297         if self.model == None: 
     1290        if self.model is None: 
    12981291            msg = "Please select a Model first..." 
    12991292            wx.MessageBox(msg, 'Info') 
    13001293            return 
    13011294 
    1302         #default flag 
     1295        # default flag 
    13031296        flag = False 
    13041297        self.fitrange = True 
    1305         #get event object 
     1298        # get event object 
    13061299        tcrtl = event.GetEventObject() 
    1307         #Clear msg if previously shown. 
     1300        # Clear msg if previously shown. 
    13081301        msg = "" 
    13091302        wx.PostEvent(self._manager.parent, StatusEvent(status=msg)) 
     
    13161309                if not self.disable_smearer.GetValue(): 
    13171310                    temp_smearer = self.current_smearer 
    1318                     ## set smearing value whether or not 
    1319                     #        the data contain the smearing info 
     1311                    # set smearing value whether or not data contain the 
     1312                    # smearing info 
    13201313                    if self.slit_smearer.GetValue(): 
    13211314                        flag1 = self.update_slit_smear() 
     
    13341327                                              enable_smearer=enable_smearer) 
    13351328                if flag: 
    1336                     #self.compute_chisqr(smearer= temp_smearer) 
    1337  
    1338                     ## new state posted 
     1329                    # self.compute_chisqr(smearer= temp_smearer) 
     1330 
     1331                    # new state posted 
    13391332                    if self.state_change: 
    1340                         #self._undo.Enable(True) 
     1333                        # self._undo.Enable(True) 
    13411334                        event = PageInfoEvent(page=self) 
    13421335                        wx.PostEvent(self.parent, event) 
     
    13481341        else: 
    13491342            self.save_current_state() 
    1350             msg = "Cannot Plot :Must enter a number!!!  " 
     1343            msg = "Cannot Plot: Must enter a number!!!  " 
    13511344            wx.PostEvent(self._manager.parent, StatusEvent(status=msg)) 
    13521345 
     
    13591352        """ 
    13601353        tcrtl = event.GetEventObject() 
    1361         #Clear msg if previously shown. 
     1354        # Clear msg if previously shown. 
    13621355        msg = "" 
    13631356        wx.PostEvent(self._manager.parent, StatusEvent(status=msg)) 
     
    13771370            tcrtl.SetBackgroundColour(wx.WHITE) 
    13781371 
    1379         #self._undo.Enable(True) 
     1372        # self._undo.Enable(True) 
    13801373        self.save_current_state() 
    13811374        event = PageInfoEvent(page=self) 
     
    13871380        ON Qrange focus 
    13881381        """ 
    1389         if event != None: 
     1382        if event is not None: 
    13901383            event.Skip() 
    1391         #tcrtl = event.GetEventObject() 
     1384        # tcrtl = event.GetEventObject() 
    13921385        self._validate_qrange(self.qmin, self.qmax) 
    13931386 
     
    13961389        On Qrange textctrl click, make the qrange lines in the plot 
    13971390        """ 
    1398         if event != None: 
     1391        if event is not None: 
    13991392            event.Skip() 
    14001393        if self.data.__class__.__name__ == "Data2D": 
     
    14141407        #On q range value updated. DO not combine with qrange_click(). 
    14151408        """ 
    1416         if event != None: 
     1409        if event is not None: 
    14171410            event.Skip() 
    14181411        if self.data.__class__.__name__ == "Data2D": 
     
    14421435        length = len(self.data.x) 
    14431436        indx = (numpy.abs(self.data.x - x_data)).argmin() 
    1444         #return array.flat[idx] 
     1437        # return array.flat[idx] 
    14451438        if key == wx.WXK_PAGEUP or key == wx.WXK_NUMPAD_PAGEUP: 
    14461439            indx += 1 
     
    14611454        """ 
    14621455        tcrtl = event.GetEventObject() 
    1463         #Clear msg if previously shown. 
     1456        # Clear msg if previously shown. 
    14641457        msg = "" 
    14651458        wx.PostEvent(self._manager.parent, StatusEvent(status=msg)) 
     
    14911484                wx.PostEvent(self._manager.parent, StatusEvent(status=msg)) 
    14921485                return 
    1493             #Check if # of points for theory model are valid(>0). 
     1486            # Check if # of points for theory model are valid(>0). 
    14941487            # check for 2d 
    14951488            if self.data.__class__.__name__ == "Data2D" or \ 
     
    14981491                radius = numpy.sqrt(self.data.qx_data * self.data.qx_data + 
    14991492                                    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)) 
    15021494                index_data = (index_data) & (self.data.mask) 
    15031495                index_data = (index_data) & (numpy.isfinite(self.data.data)) 
     
    15091501                    return 
    15101502                else: 
    1511                     #self.data.mask = index_data 
    1512                     #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))) 
    15131505                    self.show_npts2fit() 
    15141506            else: 
    1515                 index_data = ((self.qmin_x <= self.data.x) & \ 
     1507                index_data = ((self.qmin_x <= self.data.x) & 
    15161508                              (self.data.x <= self.qmax_x)) 
    15171509                self.Npts_fit.SetValue(str(len(self.data.x[index_data]))) 
     
    15461538            for item in self.parameters: 
    15471539                if item[0].IsShown(): 
    1548                     #Skip the angle parameters if 1D data 
     1540                    # Skip the angle parameters if 1D data 
    15491541                    if self.data.__class__.__name__ != "Data2D" and \ 
    15501542                            not self.enable2D: 
     
    15531545                    if item in self.param_toFit: 
    15541546                        continue 
    1555                     ## hide statictext +/- 
     1547                    # hide statictext +/- 
    15561548                    if len(item) < 4: 
    15571549                        continue 
    1558                     if item[3] != None and item[3].IsShown(): 
     1550                    if item[3] is not None and item[3].IsShown(): 
    15591551                        item[3].Hide() 
    1560                     ## hide textcrtl  for error after fit 
    1561                     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(): 
    15621554                        item[4].Hide() 
    15631555 
     
    15651557            for item in self.fittable_param: 
    15661558                if item[0].IsShown(): 
    1567                     #Skip the angle parameters if 1D data 
     1559                    # Skip the angle parameters if 1D data 
    15681560                    if self.data.__class__.__name__ != "Data2D" and \ 
    15691561                            not self.enable2D: 
     
    15741566                    if len(item) < 4: 
    15751567                        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(): 
    15781570                        item[3].Hide() 
    1579                     ## hide textcrtl  for error after fit 
    1580                     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(): 
    15811573                        item[4].Hide() 
    15821574        return 
     
    15871579        """ 
    15881580        # get the default values 
    1589         if self.dxl == None: 
     1581        if self.dxl is None: 
    15901582            self.dxl = 0.0 
    1591         if self.dxw == None: 
     1583        if self.dxw is None: 
    15921584            self.dxw = "" 
    1593         if self.dx_min == None: 
     1585        if self.dx_min is None: 
    15941586            self.dx_min = SMEAR_SIZE_L 
    1595         if self.dx_max == None: 
     1587        if self.dx_max is None: 
    15961588            self.dx_max = SMEAR_SIZE_H 
    15971589 
     
    16141606        elif self.data.__class__.__name__ == "Data2D" or \ 
    16151607            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: 
    16171609                return 
    1618             elif self.current_smearer != None \ 
     1610            elif self.current_smearer is not None \ 
    16191611                and data.dqx_data.any() != 0 \ 
    16201612                and data.dqx_data.any() != 0: 
     
    16261618                return 
    16271619        # 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): 
    16291621            self.smear_type = "Pinhole" 
    16301622            self.dq_l = data.dx[0] 
     
    16321624 
    16331625        # 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: 
    16351627            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): 
    16371629                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): 
    16391631                self.dq_r = data.dxw[0] 
    1640         #return self.smear_type,self.dq_l,self.dq_r 
     1632        # return self.smear_type,self.dq_l,self.dq_r 
    16411633 
    16421634    def _show_smear_sizer(self): 
     
    16621654 
    16631655            self.smear_description_dqdata.Show(True) 
    1664             if self.smear_type != None: 
     1656            if self.smear_type is not None: 
    16651657                self.smear_description_smear_type.Show(True) 
    16661658                if self.smear_type == 'Slit': 
     
    17531745        Select an accuracy in 2D custom smear: Xhigh, High, Med, or Low 
    17541746        """ 
    1755         #event.Skip() 
     1747        # event.Skip() 
    17561748        # Check if the accuracy is same as before 
    1757         #self.smear2d_accuracy = event.GetEventObject().GetValue() 
     1749        # self.smear2d_accuracy = event.GetEventObject().GetValue() 
    17581750        self.smear2d_accuracy = self.smear_accuracy.GetValue() 
    17591751        if self.pinhole_smearer.GetValue(): 
     
    17611753        else: 
    17621754            self.onSmear(event=None) 
    1763             if self.current_smearer != None: 
     1755            if self.current_smearer is not None: 
    17641756                self.current_smearer.set_accuracy(accuracy=\ 
    17651757                                                  self.smear2d_accuracy) 
     
    17931785        Build a panel to allow to edit Mask 
    17941786        """ 
    1795         from sas.sasgui.guiframe.local_perspectives.plotting.masking \ 
    1796         import MaskPanel as MaskDialog 
     1787        from sas.sasgui.guiframe.local_perspectives.plotting.masking import \ 
     1788            MaskPanel as MaskDialog 
    17971789 
    17981790        self.panel = MaskDialog(base=self, data=self.data, id=wx.NewId()) 
     
    18051797        is_valid_qrange = self._update_paramv_on_fit() 
    18061798 
    1807         if is_valid_qrange and self.model != None: 
     1799        if is_valid_qrange and self.model is not None: 
    18081800            self.panel.MakeModal(False) 
    18091801            event.Skip() 
     
    18111803            self._draw_model() 
    18121804            self.show_npts2fit() 
    1813         elif self.model == None: 
     1805        elif self.model is None: 
    18141806            self.panel.MakeModal(False) 
    18151807            event.Skip() 
     
    18781870                    npts = len(data.x) 
    18791871                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" %\ 
    18811873                                data.filename 
    18821874                    wx.PostEvent(self._manager.parent, StatusEvent(status=msg, 
     
    18951887                                               info="error")) 
    18961888                    raise ValueError, msg 
    1897                 ## Maximum value of data 
     1889                # Maximum value of data 
    18981890                qmax = math.sqrt(x * x + y * y) 
    18991891                npts = len(data.data) 
     
    19071899        flag = False 
    19081900        is_data = False 
     1901        npts = 0 
    19091902        try: 
    19101903            old_id = self.data.id 
     
    19181911                flag = True 
    19191912        if data is not None: 
    1920             id = data.id 
    19211913            if is_data: 
    19221914                self.graph_id = self.data.group_id 
     
    19331925            self._set_save_flag(False) 
    19341926        else: 
    1935             if self.model != None: 
     1927            if self.model is not None: 
    19361928                self._set_bookmark_flag(not self.batch_on) 
    19371929                self._keep.Enable(not self.batch_on) 
     
    19401932                self._set_preview_flag(True) 
    19411933 
    1942             self._set_smear(data) 
    19431934            # more disables for 2D 
    19441935            if self.data.__class__.__name__ == "Data2D" or \ 
     
    19471938                self.pinhole_smearer.Enable(True) 
    19481939                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): 
    19521943                    self.dI_didata.Enable(False) 
    19531944                    self.dI_noweight.SetValue(True) 
     
    19601951                self.slit_smearer.Enable(True) 
    19611952                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): 
    19651957                    self.dI_didata.Enable(False) 
    19661958                    self.dI_noweight.SetValue(True) 
     
    19701962                    self.dI_didata.SetValue(True) 
    19711963                    self.weightbt_string = self.dI_didata.GetLabelText() 
    1972             # Enable weighting radio uttons 
     1964            # Enable weighting radio buttons 
    19731965            self.dI_noweight.Enable(True) 
    19741966            self.dI_sqrdata.Enable(True) 
     
    19791971            data_name = self.data.name 
    19801972            _, _, npts = self.compute_data_range(self.data) 
    1981             #set maximum range for x in linear scale 
     1973            # set maximum range for x in linear scale 
    19821974            if not hasattr(self.data, "data"):  # Display only for 1D data fit 
    19831975                self.btEditMask.Disable() 
     
    19881980 
    19891981        self.Npts_total.SetValue(str(npts)) 
    1990         #default:number of data points selected to fit 
     1982        # default:number of data points selected to fit 
    19911983        self.Npts_fit.SetValue(str(npts)) 
    19921984        self.Npts_total.SetEditable(False) 
    1993         self.Npts_total.SetBackgroundColour(\ 
     1985        self.Npts_total.SetBackgroundColour( 
    19941986                                    self.GetParent().GetBackgroundColour()) 
    19951987 
     
    20011993        # send graph_id to page_finder 
    20021994        self._manager.set_graph_id(uid=self.uid, graph_id=self.graph_id) 
    2003         #focus the page 
     1995        # focus the page 
    20041996        if check_data_validity(data): 
    20051997            self.data_box_description.SetForegroundColour(wx.BLUE) 
     
    20132005        self.on_set_focus(None) 
    20142006        self.Refresh() 
    2015         #update model plot with new data information 
     2007        # update model plot with new data information 
    20162008        if flag: 
    2017             #set model view button 
    2018             self.onSmear(None) 
    2019  
    20202009            if self.data.__class__.__name__ == "Data2D": 
    20212010                self.enable2D = True 
     
    20252014                self.model_view.SetLabel("1D Mode") 
    20262015            self.model_view.Disable() 
    2027             #replace data plot on combo box selection 
    2028             #by removing the previous selected data 
     2016            #  replace data plot on combo box selection 
     2017            # by removing the previous selected data 
    20292018            try: 
    20302019                wx.PostEvent(self._manager.parent, 
     
    20332022            except: 
    20342023                pass 
    2035             #plot the current selected data 
     2024            # plot the current selected data 
    20362025            wx.PostEvent(self._manager.parent, 
    20372026                         NewPlotEvent(action="check", plot=self.data, 
     
    20532042            self.reset_page_helper(state) 
    20542043 
    2055             self.select_param(event=None) 
    2056             #Save state_fit 
     2044            self.select_param() 
     2045            # Save state_fit 
    20572046            self.save_current_state_fit() 
    20582047        except: 
     
    20932082        else: 
    20942083            for qx in self.data.x: 
    2095                 if qx >= qmin and qx <= qmax: 
     2084                if qmax >= qx >= qmin: 
    20962085                    npts2fit += 1 
    20972086        return npts2fit 
     
    21222111        # make sure stop button to fit button all the time 
    21232112        self._on_fit_complete() 
    2124         if out == None or not numpy.isfinite(chisqr): 
     2113        if out is None or not numpy.isfinite(chisqr): 
    21252114            raise ValueError, "Fit error occured..." 
    21262115 
     
    21292118        dispersity = '' 
    21302119 
    2131         #Hide textctrl boxes of errors. 
     2120        # Hide textctrl boxes of errors. 
    21322121        self._clear_Err_on_Fit() 
    21332122 
    2134         #Check if chi2 is finite 
    2135         if chisqr != None and numpy.isfinite(chisqr): 
    2136             #format chi2 
     2123        # Check if chi2 is finite 
     2124        if chisqr is not None and numpy.isfinite(chisqr): 
     2125            # format chi2 
    21372126            chi2 = format_number(chisqr, True) 
    21382127            self.tcChi.SetValue(chi2) 
     
    21412130            self.tcChi.SetValue("-") 
    21422131 
    2143         #Hide error title 
     2132        # Hide error title 
    21442133        if self.text2_3.IsShown() and not self.is_mac: 
    21452134            self.text2_3.Hide() 
     
    21482137            if self.enable_disp.GetValue(): 
    21492138                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: 
    21512140                        self.text_disp_1.Hide() 
    21522141        except: 
     
    21552144 
    21562145        i = 0 
    2157         #Set the panel when fit result are list 
     2146        # Set the panel when fit result are list 
    21582147 
    21592148        for item in self.param_toFit: 
    2160             if len(item) > 5 and item != None: 
     2149            if len(item) > 5 and item is not None: 
    21612150 
    21622151                if item[0].IsShown(): 
    2163                     ## reset error value to initial state 
     2152                    # reset error value to initial state 
    21642153                    if not self.is_mac: 
    21652154                        item[3].Hide() 
     
    21682157                        if item[1] == p_name[ind]: 
    21692158                            break 
    2170                     if len(out) > 0 and out[ind] != None: 
     2159                    if len(out) > 0 and out[ind] is not None: 
    21712160                        val_out = format_number(out[ind], True) 
    21722161                        item[2].SetValue(val_out) 
    21732162 
    2174                     if(cov != None and len(cov) == len(out)): 
     2163                    if(cov is not None and len(cov) == len(out)): 
    21752164                        try: 
    2176                             if dispersity != None: 
     2165                            if dispersity is not None: 
    21772166                                if self.enable_disp.GetValue(): 
    21782167                                    if hasattr(self, "text_disp_1"): 
    2179                                         if self.text_disp_1 != None: 
     2168                                        if self.text_disp_1 is not None: 
    21802169                                            if not self.text_disp_1.IsShown()\ 
    2181                                                 and not self.is_mac: 
     2170                                                  and not self.is_mac: 
    21822171                                                self.text_disp_1.Show(True) 
    21832172                        except: 
    21842173                            pass 
    21852174 
    2186                         if cov[ind] != None: 
     2175                        if cov[ind] is not None: 
    21872176                            if numpy.isfinite(float(cov[ind])): 
    21882177                                val_err = format_number(cov[ind], True) 
    2189                                 item[4].SetForegroundColour(wx.BLACK) 
     2178                                item[4].SetForegroundColour(wx.BLACK) 
    21902179                            else: 
    21912180                                val_err = 'NaN' 
     
    21992188            else: 
    22002189                raise ValueError, "onsetValues: Invalid parameters..." 
    2201         #Show error title when any errors displayed 
     2190        # Show error title when any errors displayed 
    22022191        if has_error: 
    22032192            if not self.text2_3.IsShown(): 
    22042193                self.text2_3.Show(True) 
    2205         ## save current state 
     2194        # save current state 
    22062195        self.save_current_state() 
    22072196 
     
    22102199            self.Refresh() 
    22112200        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) 
    22132202        self._draw_model(update_chisqr=False, source='fit') 
    22142203 
     
    22262215        # compute weight for the current data 
    22272216        flag_weight = self.get_weight_flag() 
    2228         if is_2D == None: 
     2217        if is_2D is None: 
    22292218            is_2D = self._is_2D() 
    22302219        self._manager.set_fit_weight(uid=self.uid, 
     
    22452234        self._update_paramv_on_fit() 
    22462235 
    2247         if event != None: 
     2236        if event is not None: 
    22482237            tcrtl = event.GetEventObject() 
    22492238            # event case of radio button 
    2250             if tcrtl.GetValue() == True: 
     2239            if tcrtl.GetValue(): 
    22512240                self.dx_min = 0.0 
    22522241                self.dx_max = 0.0 
     
    22662255 
    22672256        self.sizer_set_smearer.Layout() 
    2268         ## we need FitInside here not just self.Layout to ensure all the sizers 
    2269         ## end up with the necessasary space to in the scroll panel. In 
    2270         ## particular the compute and fit buttons end up on top of each other 
    2271         ## PDB Nov 28 2015.  
     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. 
    22722261        self.FitInside() 
    22732262 
    2274         if event != None: 
     2263        if event is not None: 
    22752264            event.Skip() 
    2276         #self._undo.Enable(True) 
     2265        # self._undo.Enable(True) 
    22772266        self.save_current_state() 
    22782267        event = PageInfoEvent(page=self) 
     
    23492338                get_pin_max.SetBackgroundColour("pink") 
    23502339                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: 
    23522341                if self._is_2D(): 
    23532342                    data.dqx_data[data.dqx_data == 0] = self.dx_min 
     
    23602349                                           self.dx_max + step / 1.1, 
    23612350                                           step) 
    2362             elif self.dx_min != None: 
     2351            elif self.dx_min is not None: 
    23632352                if self._is_2D(): 
    23642353                    data.dqx_data[data.dqx_data == 0] = self.dx_min 
    23652354                else: 
    23662355                    data.dx[data.dx == 0] = self.dx_min 
    2367             elif self.dx_max != None: 
     2356            elif self.dx_max is not None: 
    23682357                if self._is_2D(): 
    23692358                    data.dqy_data[data.dqy_data == 0] = self.dx_max 
     
    23732362            # 2D need to set accuracy 
    23742363            if self._is_2D(): 
    2375                 self.current_smearer.set_accuracy(accuracy=\ 
    2376                                                   self.smear2d_accuracy) 
    2377  
    2378         if msg != None: 
     2364                self.current_smearer.set_accuracy( 
     2365                    accuracy=self.smear2d_accuracy) 
     2366 
     2367        if msg is not None: 
    23792368            wx.PostEvent(self._manager.parent, StatusEvent(status=msg)) 
    23802369        else: 
    23812370            get_pin_min.SetBackgroundColour("white") 
    23822371            get_pin_max.SetBackgroundColour("white") 
    2383         ## set smearing value whether or not the data contain the smearing info 
     2372        # set smearing value whether or not the data contain the smearing info 
    23842373 
    23852374        enable_smearer = not self.disable_smearer.GetValue() 
     
    24072396        wx.CallAfter(self.save_current_state) 
    24082397 
    2409         if msg != None: 
     2398        if msg is not None: 
    24102399            return False 
    24112400        else: 
     
    24232412        msg = None 
    24242413        # for event given 
    2425         if event != None: 
     2414        if event is not None: 
    24262415            tcrtl = event.GetEventObject() 
    24272416            # event case of radio button 
     
    24442433        self._show_smear_sizer() 
    24452434        self.sizer_set_smearer.Layout() 
    2446         ## we need FitInside here not just self.Layout to ensure all the sizers 
    2447         ## end up with the necessasary space to in the scroll panel. In 
    2448         ## particular the compute and fit buttons end up on top of each other 
    2449         ## PDB Nov 28 2015.  
     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. 
    24502439        self.FitInside() 
    24512440 
    2452         if event != None: 
     2441        if event is not None: 
    24532442            event.Skip() 
    24542443        self.save_current_state() 
    24552444        event = PageInfoEvent(page=self) 
    24562445        wx.PostEvent(self.parent, event) 
    2457         if msg != None: 
     2446        if msg is not None: 
    24582447            wx.PostEvent(self._manager.parent, StatusEvent(status=msg)) 
    24592448 
     
    25442533 
    25452534        self.current_smearer = smear_selection(data, self.model) 
    2546         ## set smearing value whether or not the data contain the smearing info 
     2535        # set smearing value whether or not the data contain the smearing info 
    25472536        enable_smearer = not self.disable_smearer.GetValue() 
    25482537        self._manager.set_smearer(smearer=self.current_smearer, 
     
    25672556        if self._is_changed_slit(): 
    25682557            msg = self._set_slit_smear() 
    2569         #self._undo.Enable(True) 
     2558        # self._undo.Enable(True) 
    25702559        self.save_current_state() 
    25712560 
    2572         if msg != None: 
     2561        if msg is not None: 
    25732562            return False 
    25742563        else: 
     
    25802569        are computed when fitting 
    25812570        """ 
    2582         if event != None: 
     2571        if event is not None: 
    25832572            event.Skip() 
    25842573        if self.data is None: 
     
    25932582 
    25942583        self.sizer_set_smearer.Layout() 
    2595         ## we need FitInside here not just self.Layout to ensure all the sizers 
    2596         ## end up with the necessasary space to in the scroll panel. In 
    2597         ## particular the compute and fit buttons end up on top of each other 
    2598         ## PDB Nov 28 2015.  
     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. 
    25992588        self.FitInside() 
    26002589        self._set_weight() 
    26012590 
    2602         ## set smearing value whether or not the data contain the smearing info 
     2591        # set smearing value whether or not the data contain the smearing info 
    26032592        enable_smearer = not self.disable_smearer.GetValue() 
    26042593        wx.CallAfter(self._manager.set_smearer, uid=self.uid, 
     
    26212610        """ 
    26222611        self._get_smear_info() 
    2623         #renew smear sizer 
     2612        # renew smear sizer 
    26242613        if self.smear_type is not None: 
    26252614            self.smear_description_smear_type.SetValue(str(self.smear_type)) 
     
    26612650        """ 
    26622651        try: 
    2663             if event == None: 
     2652            if event is None: 
    26642653                output = "-" 
    26652654            elif not numpy.isfinite(event.output): 
     
    26962685        self._manager.set_param2fit(self.uid, param2fit) 
    26972686 
    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): 
    27662689        """ 
    27672690        Select TextCtrl  checked for fitting purpose and stores them 
     
    27702693        self.param_toFit = [] 
    27712694        for item in self.parameters: 
    2772             #Skip t ifhe angle parameters if 1D data 
     2695            # Skip t ifhe angle parameters if 1D data 
    27732696            if self.data.__class__.__name__ != "Data2D" and\ 
    27742697                        not self.enable2D: 
    27752698                if item in self.orientation_params: 
    27762699                    continue 
    2777             #Select parameters to fit for list of primary parameters 
     2700            # Select parameters to fit for list of primary parameters 
    27782701            if item[0].GetValue() and item[0].IsShown(): 
    27792702                if not (item in self.param_toFit): 
     
    27842707                    self.param_toFit.remove(item) 
    27852708 
    2786         #Select parameters to fit for list of fittable parameters 
     2709        # Select parameters to fit for list of fittable parameters 
    27872710        #        with dispersion 
    27882711        for item in self.fittable_param: 
    2789             #Skip t ifhe angle parameters if 1D data 
     2712            # Skip t ifhe angle parameters if 1D data 
    27902713            if self.data.__class__.__name__ != "Data2D" and\ 
    27912714                        not self.enable2D: 
     
    27962719                    self.param_toFit.append(item) 
    27972720            else: 
    2798                 #remove parameters from the fitting list 
     2721                # remove parameters from the fitting list 
    27992722                if item in self.param_toFit: 
    28002723                    self.param_toFit.remove(item) 
    28012724 
    2802         #Calculate num. of angle parameters 
     2725        # Calculate num. of angle parameters 
    28032726        if self.data.__class__.__name__ == "Data2D" or \ 
    28042727                       self.enable2D: 
     
    28062729        else: 
    28072730            len_orient_para = len(self.orientation_params)  # assume even len 
    2808         #Total num. of angle parameters 
     2731        # Total num. of angle parameters 
    28092732        if len(self.fittable_param) > 0: 
    28102733            len_orient_para *= 2 
     
    28172740 
    28182741        self.save_current_state_fit() 
    2819         if event != None: 
    2820             ## post state to fit panel 
     2742        if event is not None: 
     2743            # post state to fit panel 
    28212744            event = PageInfoEvent(page=self) 
    28222745            wx.PostEvent(self.parent, event) 
     
    28442767        self.orientation_params_disp = [] 
    28452768 
    2846         if model == None: 
     2769        if model is None: 
    28472770            self.sizer3.Layout() 
    28482771            self.SetupScrolling() 
     
    28522775        boxsizer1 = wx.StaticBoxSizer(box_description, wx.VERTICAL) 
    28532776        sizer = wx.GridBagSizer(5, 5) 
    2854         ## save the current model 
     2777        # save the current model 
    28552778        self.model = model 
    28562779 
    28572780        keys = self.model.getParamList() 
    28582781 
    2859         #list of dispersion parameters 
     2782        # list of dispersion parameters 
    28602783        self.disp_list = self.model.getDispParamList() 
    28612784 
     
    28902813                return -1 
    28912814            # 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: 
    28932816                if num_a > num_b: 
    28942817                    return -1 
     
    29032826                    return 1 
    29042827            # one of them has a number 
    2905             elif num_a != None: 
     2828            elif num_a is not None: 
    29062829                return 1 
    2907             elif num_b != None: 
     2830            elif num_b is not None: 
    29082831                return -1 
    29092832            # no numbers 
     
    29112834                return cmp(a.lower(), b.lower()) 
    29122835         
    2913         # keys obtained now from ordered dict, so commenting alphabetical ordering 
    2914         #keys.sort(custom_compare) 
     2836        # keys obtained now from ordered dict, so commenting alphabetical 
     2837        # ordering keys.sort(custom_compare) 
    29152838 
    29162839        iy = 0 
     
    29262849        ix += 1 
    29272850        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), 
    29292852                            wx.EXPAND | wx.ADJUST_MINSIZE, 0) 
    29302853        ix += 2 
    29312854        self.text2_3 = wx.StaticText(self, wx.ID_ANY, 'Error') 
    2932         sizer.Add(self.text2_3, (iy, ix), (1, 1), \ 
    2933                             wx.EXPAND | wx.ADJUST_MINSIZE, 0) 
     2855        sizer.Add(self.text2_3, (iy, ix), (1, 1), 
     2856                  wx.EXPAND | wx.ADJUST_MINSIZE, 0) 
    29342857        if not self.is_mac: 
    29352858            self.text2_3.Hide() 
    29362859        ix += 1 
    29372860        self.text2_min = wx.StaticText(self, wx.ID_ANY, 'Min') 
    2938         sizer.Add(self.text2_min, (iy, ix), (1, 1), \ 
    2939                             wx.EXPAND | wx.ADJUST_MINSIZE, 0) 
    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() 
    29412864        ix += 1 
    29422865        self.text2_max = wx.StaticText(self, wx.ID_ANY, 'Max') 
    2943         sizer.Add(self.text2_max, (iy, ix), (1, 1), \ 
    2944                             wx.EXPAND | wx.ADJUST_MINSIZE, 0) 
    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() 
    29462869        ix += 1 
    29472870        self.text2_4 = wx.StaticText(self, wx.ID_ANY, '[Units]') 
    2948         sizer.Add(self.text2_4, (iy, ix), (1, 1), \ 
    2949                             wx.EXPAND | wx.ADJUST_MINSIZE, 0) 
     2871        sizer.Add(self.text2_4, (iy, ix), (1, 1), 
     2872                  wx.EXPAND | wx.ADJUST_MINSIZE, 0) 
    29502873        self.text2_4.Hide() 
    29512874 
     
    29532876        for item in keys: 
    29542877 
    2955             if not item in self.disp_list and not item in \ 
     2878            if item not in self.disp_list and not item in \ 
    29562879                    self.model.orientation_params: 
    29572880 
    2958                 ##prepare a spot to store errors 
    2959                 if not item in self.model.details: 
     2881                # prepare a spot to store errors 
     2882                if item not in self.model.details: 
    29602883                    self.model.details[item] = ["", None, None] 
    29612884 
    29622885                iy += 1 
    29632886                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 
    29662889                    self.temp_multi_functional)\ 
    29672890                    and (item in self.model.non_fittable): 
    29682891                    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), 
    29702893                            wx.LEFT | wx.EXPAND | wx.ADJUST_MINSIZE, 21) 
    2971                     ## add parameter value 
     2894                    # add parameter value 
    29722895                    ix += 1 
    29732896                    value = self.model.getParam(item) 
    29742897                    if len(self.model.fun_list) > 0: 
    2975                         #num = item.split('_')[1][5:7] 
     2898                        # num = item.split('_')[1][5:7] 
    29762899                        fun_box = wx.ComboBox(self, wx.ID_ANY, size=(100, -1), 
    29772900                                    style=wx.CB_READONLY, name='%s' % item) 
    29782901                        self._set_fun_box_list(fun_box) 
    29792902                        fun_box.SetSelection(0) 
    2980                         #self.fun_box.SetToolTipString("A function 
     2903                        # self.fun_box.SetToolTipString("A function 
    29812904                        #    describing the interface") 
    29822905                        wx.EVT_COMBOBOX(fun_box, wx.ID_ANY, self._on_fun_box) 
     
    29852908                                                size=(_BOX_WIDTH, 20), 
    29862909                                style=wx.TE_PROCESS_ENTER, name='%s' % item) 
    2987                         fun_box.SetToolTipString(\ 
     2910                        fun_box.SetToolTipString( 
    29882911                                "Hit 'Enter' after typing to update the plot.") 
    29892912                        fun_box.SetValue(format_number(value, True)) 
     
    29932916                                                None, None]) 
    29942917                else: 
    2995                     ## add parameters name with checkbox for selecting to fit 
     2918                    # add parameters name with checkbox for selecting to fit 
    29962919                    cb = wx.CheckBox(self, wx.ID_ANY, item) 
    29972920                    cb.SetValue(CHECK_STATE) 
    29982921                    cb.SetToolTipString(" Check mark to fit.") 
    2999                     #cb.SetValue(True) 
     2922                    # cb.SetValue(True) 
    30002923                    wx.EVT_CHECKBOX(self, cb.GetId(), self.select_param) 
    30012924 
     
    30032926                              wx.LEFT | wx.EXPAND | wx.ADJUST_MINSIZE, 5) 
    30042927 
    3005                     ## add parameter value 
     2928                    # add parameter value 
    30062929                    ix += 1 
    30072930                    value = self.model.getParam(item) 
    30082931                    ctl1 = ModelTextCtrl(self, wx.ID_ANY, size=(_BOX_WIDTH, 20), 
    30092932                                         style=wx.TE_PROCESS_ENTER) 
    3010                     ctl1.SetToolTipString(\ 
     2933                    ctl1.SetToolTipString( 
    30112934                                "Hit 'Enter' after typing to update the plot.") 
    30122935                    ctl1.SetValue(format_number(value, True)) 
    30132936                    sizer.Add(ctl1, (iy, ix), (1, 1), wx.EXPAND) 
    3014                     ## text to show error sign 
     2937                    # text to show error sign 
    30152938                    ix += 1 
    30162939                    text2 = wx.StaticText(self, wx.ID_ANY, '+/-') 
    3017                     sizer.Add(text2, (iy, ix), (1, 1), \ 
     2940                    sizer.Add(text2, (iy, ix), (1, 1), 
    30182941                              wx.EXPAND | wx.ADJUST_MINSIZE, 0) 
    30192942                    if not self.is_mac: 
     
    30762999        iy += 1 
    30773000        ix = 0 
    3078         #Add tile for orientational angle 
     3001        # Add tile for orientational angle 
    30793002        for item in keys: 
    30803003            if item in self.model.orientation_params: 
     
    30833006                mag_on_button.SetToolTipString("Turn Pol Beam/Mag scatt on/off") 
    30843007                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?") 
    30863010                mag_angle_help_button.SetToolTipString("see angle definitions") 
    30873011                mag_help_button = wx.Button(self, wx.ID_ANY, "Mag HELP") 
    30883012                mag_help_button.SetToolTipString("Help on pol beam/mag fitting") 
    30893013                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, 
    30913015                                            self._on_mag_angle_help) 
    30923016                sizer.Add(orient_angle, (iy, ix), (1, 1), 
     
    31013025                          wx.LEFT | wx.EXPAND | wx.ADJUST_MINSIZE, 15) 
    31023026 
    3103                 #handle the magnetic buttons 
    3104                 #clean this up so that assume mag is off then turn  
    3105                 #all buttons on IF mag has mag and has 2D 
     3027                # 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 
    31063030                if not self._has_magnetic: 
    31073031                    mag_on_button.Show(False) 
     
    31293053                break 
    31303054 
    3131         #For Gaussian only 
     3055        # For Gaussian only 
    31323056        if type.lower() != "array": 
    31333057            for item in self.model.orientation_params: 
     
    31353059                    if item in self.model.magnetic_params: 
    31363060                        continue 
    3137                 if not item in self.disp_list: 
    3138                     ##prepare a spot to store min max 
    3139                     if not item in 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: 
    31403064                        self.model.details[item] = ["", None, None] 
    31413065 
    31423066                    iy += 1 
    31433067                    ix = 0 
    3144                     ## add parameters name with checkbox for selecting to fit 
     3068                    # add parameters name with checkbox for selecting to fit 
    31453069                    cb = wx.CheckBox(self, wx.ID_ANY, item) 
    31463070                    cb.SetValue(CHECK_STATE) 
     
    31553079                              wx.LEFT | wx.EXPAND | wx.ADJUST_MINSIZE, 5) 
    31563080 
    3157                     ## add parameter value 
     3081                    # add parameter value 
    31583082                    ix += 1 
    31593083                    value = self.model.getParam(item) 
    31603084                    ctl1 = ModelTextCtrl(self, -1, size=(_BOX_WIDTH, 20), 
    31613085                                         style=wx.TE_PROCESS_ENTER) 
    3162                     ctl1.SetToolTipString(\ 
     3086                    ctl1.SetToolTipString( 
    31633087                                "Hit 'Enter' after typing to update the plot.") 
    31643088                    ctl1.SetValue(format_number(value, True)) 
     
    31693093                        ctl1.Hide() 
    31703094                    sizer.Add(ctl1, (iy, ix), (1, 1), wx.EXPAND) 
    3171                     ## text to show error sign 
     3095                    # text to show error sign 
    31723096                    ix += 1 
    31733097                    text2 = wx.StaticText(self, -1, '+/-') 
    3174                     sizer.Add(text2, (iy, ix), (1, 1), \ 
     3098                    sizer.Add(text2, (iy, ix), (1, 1), 
    31753099                              wx.EXPAND | wx.ADJUST_MINSIZE, 0) 
    31763100 
     
    32373161        iy += 1 
    32383162        box_description.SetForegroundColour(wx.BLUE) 
    3239         #Display units text on panel 
     3163        # Display units text on panel 
    32403164        for item in keys: 
    32413165            if item in self.model.details: 
    32423166                self.text2_4.Show() 
    3243         #Fill the list of fittable parameters 
     3167        # Fill the list of fittable parameters 
    32443168        self.get_all_checked_params() 
    32453169        self.save_current_state_fit() 
     
    32533177        Get key stroke event 
    32543178        """ 
    3255         if self.data == None: 
     3179        if self.data is None: 
    32563180            return 
    32573181        # Figuring out key combo: Cmd for copy, Alt for paste 
Note: See TracChangeset for help on using the changeset viewer.