Changeset 12f7f24 in sasview for src/sas/sasgui


Ignore:
Timestamp:
Aug 17, 2017 10:14:37 AM (7 years ago)
Author:
Paul Kienzle <pkienzle@…>
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, magnetic_scatt, release-4.2.2, ticket-1009, ticket-1094-headless, ticket-1242-2d-resolution, ticket-1243, ticket-1249, ticket885, unittest-saveload
Children:
e61f668
Parents:
6b7d3c2 (diff), a06ee7e (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 ticket-887-reorg

Location:
src/sas/sasgui
Files:
20 edited

Legend:

Unmodified
Added
Removed
  • src/sas/sasgui/perspectives/calculator/model_editor.py

    ra1b8fee r07ec714  
    643643        self.name_hsizer = None 
    644644        self.name_tcl = None 
     645        self.overwrite_cb = None 
    645646        self.desc_sizer = None 
    646647        self.desc_tcl = None 
     
    657658        self.warning = "" 
    658659        #This does not seem to be used anywhere so commenting out for now 
    659         #    -- PDB 2/26/17  
     660        #    -- PDB 2/26/17 
    660661        #self._description = "New Plugin Model" 
    661662        self.function_tcl = None 
     
    689690        #title name [string] 
    690691        name_txt = wx.StaticText(self, -1, 'Function Name : ') 
    691         overwrite_cb = wx.CheckBox(self, -1, "Overwrite existing plugin model of this name?", (10, 10)) 
    692         overwrite_cb.SetValue(False) 
    693         overwrite_cb.SetToolTipString("Overwrite it if already exists?") 
    694         wx.EVT_CHECKBOX(self, overwrite_cb.GetId(), self.on_over_cb) 
     692        self.overwrite_cb = wx.CheckBox(self, -1, "Overwrite existing plugin model of this name?", (10, 10)) 
     693        self.overwrite_cb.SetValue(False) 
     694        self.overwrite_cb.SetToolTipString("Overwrite it if already exists?") 
     695        wx.EVT_CHECKBOX(self, self.overwrite_cb.GetId(), self.on_over_cb) 
    695696        self.name_tcl = wx.TextCtrl(self, -1, size=(PANEL_WIDTH * 3 / 5, -1)) 
    696697        self.name_tcl.Bind(wx.EVT_TEXT_ENTER, self.on_change_name) 
     
    700701        self.name_tcl.SetToolTipString(hint_name) 
    701702        self.name_hsizer.AddMany([(self.name_tcl, 0, wx.LEFT | wx.TOP, 0), 
    702                                   (overwrite_cb, 0, wx.LEFT, 20)]) 
     703                                  (self.overwrite_cb, 0, wx.LEFT, 20)]) 
    703704        self.name_sizer.AddMany([(name_txt, 0, wx.LEFT | wx.TOP, 10), 
    704705                                 (self.name_hsizer, 0, 
     
    740741        self.param_sizer.AddMany([(param_txt, 0, wx.LEFT, 10), 
    741742                                  (self.param_tcl, 1, wx.EXPAND | wx.ALL, 10)]) 
    742          
     743 
    743744        # Parameters with polydispersity 
    744745        pd_param_txt = wx.StaticText(self, -1, 'Fit Parameters requiring ' + \ 
     
    755756        self.pd_param_tcl.setDisplayLineNumbers(True) 
    756757        self.pd_param_tcl.SetToolTipString(pd_param_tip) 
    757          
     758 
    758759        self.param_sizer.AddMany([(pd_param_txt, 0, wx.LEFT, 10), 
    759760                                  (self.pd_param_tcl, 1, wx.EXPAND | wx.ALL, 10)]) 
     
    995996            info = 'Error' 
    996997            color = 'red' 
     998            self.overwrite_cb.SetValue(True) 
     999            self.overwrite_name = True 
    9971000        else: 
    9981001            self._notes = result 
     
    10301033        if has_scipy: 
    10311034            lines.insert(0, 'import scipy') 
    1032          
    1033         # Think about 2D later         
     1035 
     1036        # Think about 2D later 
    10341037        #self.is_2d = func_str.count("#self.ndim = 2") 
    10351038        #line_2d = '' 
    10361039        #if self.is_2d: 
    10371040        #    line_2d = CUSTOM_2D_TEMP.split('\n') 
    1038          
    1039         # Also think about test later         
     1041 
     1042        # Also think about test later 
    10401043        #line_test = TEST_TEMPLATE.split('\n') 
    10411044        #local_params = '' 
     
    10431046        spaces4  = ' '*4 
    10441047        spaces13 = ' '*13 
    1045         spaces16 = ' '*16      
     1048        spaces16 = ' '*16 
    10461049        param_names = []    # to store parameter names 
    10471050        has_scipy = func_str.count("scipy.") 
     
    10551058            out_f.write(line + '\n') 
    10561059            if line.count('#name'): 
    1057                 out_f.write('name = "%s" \n' % name)                
     1060                out_f.write('name = "%s" \n' % name) 
    10581061            elif line.count('#title'): 
    1059                 out_f.write('title = "User model for %s"\n' % name)                
     1062                out_f.write('title = "User model for %s"\n' % name) 
    10601063            elif line.count('#description'): 
    1061                 out_f.write('description = "%s"\n' % desc_str)                
     1064                out_f.write('description = "%s"\n' % desc_str) 
    10621065            elif line.count('#parameters'): 
    10631066                out_f.write('parameters = [ \n') 
     
    10651068                    p_line = param_line.lstrip().rstrip() 
    10661069                    if p_line: 
    1067                         pname, pvalue = self.get_param_helper(p_line) 
     1070                        pname, pvalue, desc = self.get_param_helper(p_line) 
    10681071                        param_names.append(pname) 
    1069                         out_f.write("%s['%s', '', %s, [-numpy.inf, numpy.inf], '', ''],\n" % (spaces16, pname, pvalue)) 
     1072                        out_f.write("%s['%s', '', %s, [-numpy.inf, numpy.inf], '', '%s'],\n" % (spaces16, pname, pvalue, desc)) 
    10701073                for param_line in pd_param_str.split('\n'): 
    10711074                    p_line = param_line.lstrip().rstrip() 
    10721075                    if p_line: 
    1073                         pname, pvalue = self.get_param_helper(p_line) 
     1076                        pname, pvalue, desc = self.get_param_helper(p_line) 
    10741077                        param_names.append(pname) 
    1075                         out_f.write("%s['%s', '', %s, [-numpy.inf, numpy.inf], 'volume', ''],\n" % (spaces16, pname, pvalue)) 
     1078                        out_f.write("%s['%s', '', %s, [-numpy.inf, numpy.inf], 'volume', '%s'],\n" % (spaces16, pname, pvalue, desc)) 
    10761079                out_f.write('%s]\n' % spaces13) 
    1077              
     1080 
    10781081        # No form_volume or ER available in simple model editor 
    10791082        out_f.write('def form_volume(*arg): \n') 
     
    10821085        out_f.write('def ER(*arg): \n') 
    10831086        out_f.write('    return 1.0 \n') 
    1084          
     1087 
    10851088        # function to compute 
    10861089        out_f.write('\n') 
     
    10911094        for func_line in func_str.split('\n'): 
    10921095            out_f.write('%s%s\n' % (spaces4, func_line)) 
    1093          
     1096 
    10941097        Iqxy_string = 'return Iq(numpy.sqrt(x**2+y**2) ' 
    1095              
     1098 
    10961099        out_f.write('\n') 
    10971100        out_f.write('def Iqxy(x, y ') 
     
    11131116        items = line.split(";") 
    11141117        for item in items: 
    1115             name = item.split("=")[0].lstrip().rstrip() 
     1118            name = item.split("=")[0].strip() 
     1119            description = "" 
    11161120            try: 
    1117                 value = item.split("=")[1].lstrip().rstrip() 
     1121                value = item.split("=")[1].strip() 
     1122                if value.count("#"): 
     1123                    # If line ends in a comment, remove it before parsing float 
     1124                    index = value.index("#") 
     1125                    description = value[(index + 1):].strip() 
     1126                    value = value[:value.index("#")].strip() 
    11181127                float(value) 
    1119             except: 
     1128            except ValueError: 
    11201129                value = 1.0 # default 
    11211130 
    1122         return name, value 
     1131        return name, value, description 
    11231132 
    11241133    def set_function_helper(self, line): 
     
    12041213import numpy 
    12051214 
    1206 #name  
     1215#name 
    12071216 
    12081217#title 
     
    12101219#description 
    12111220 
    1212 #parameters  
     1221#parameters 
    12131222 
    12141223""" 
  • src/sas/sasgui/perspectives/calculator/pyconsole.py

    r7432acb r4627657  
    3737    Iqxy = model.evalDistribution([qx, qy]) 
    3838 
    39     result = """ 
    40     Iq(%s) = %s 
    41     Iqxy(%s, %s) = %s 
    42     """%(q, Iq, qx, qy, Iqxy) 
     39    # check the model's unit tests run 
     40    from sasmodels.model_test import run_one 
     41    result = run_one(path) 
    4342 
    4443    return result 
     
    8988        ok = wx.Button(self, wx.ID_OK, "OK") 
    9089 
    91         # Mysterious constraint layouts from  
     90        # Mysterious constraint layouts from 
    9291        # https://www.wxpython.org/docs/api/wx.lib.layoutf.Layoutf-class.html 
    9392        lc = layoutf.Layoutf('t=t5#1;b=t5#2;l=l5#1;r=r5#1', (self,ok)) 
  • src/sas/sasgui/perspectives/fitting/fitting.py

    ra534432 r489f53a  
    257257        toks = os.path.splitext(label) 
    258258        path = os.path.join(models.find_plugins_dir(), toks[0]) 
     259        message = "Are you sure you want to delete the file {}?".format(path) 
     260        dlg = wx.MessageDialog(self.frame, message, '', wx.YES_NO | wx.ICON_QUESTION) 
     261        if not dlg.ShowModal() == wx.ID_YES: 
     262            return 
    259263        try: 
    260264            for ext in ['.py', '.pyc']: 
    261265                p_path = path + ext 
     266                if ext == '.pyc' and not os.path.isfile(path + ext): 
     267                    # If model is invalid, .pyc file may not exist as model has 
     268                    # never been compiled. Don't try and delete it 
     269                    continue 
    262270                os.remove(p_path) 
    263271            self.update_custom_combo() 
     
    361369                                   'Add a new model function') 
    362370        wx.EVT_MENU(owner, wx_id, self.make_new_model) 
    363          
     371 
    364372        wx_id = wx.NewId() 
    365373        self.edit_model_menu.Append(wx_id, 'Sum|Multi(p1, p2)', 
     
    383391          '(Re)Load all models present in user plugin_models folder') 
    384392        wx.EVT_MENU(owner, wx_id, self.load_plugin_models) 
    385                  
     393 
    386394    def set_edit_menu_helper(self, owner=None, menu=None): 
    387395        """ 
     
    17341742            @param unsmeared_error: data error, rescaled to unsmeared model 
    17351743        """ 
    1736              
    1737         number_finite = np.count_nonzero(np.isfinite(y))  
     1744 
     1745        number_finite = np.count_nonzero(np.isfinite(y)) 
    17381746        np.nan_to_num(y) 
    17391747        new_plot = self.create_theory_1D(x, y, page_id, model, data, state, 
     
    17941802            msg = "Computing Error: Model did not return any finite value." 
    17951803            wx.PostEvent(self.parent, StatusEvent(status = msg, info="error")) 
    1796         else:                  
     1804        else: 
    17971805            msg = "Computation  completed!" 
    17981806            if number_finite != y.size: 
     
    18241832        that can be plot. 
    18251833        """ 
    1826         number_finite = np.count_nonzero(np.isfinite(image))  
     1834        number_finite = np.count_nonzero(np.isfinite(image)) 
    18271835        np.nan_to_num(image) 
    18281836        new_plot = Data2D(image=image, err_image=data.err_data) 
     
    19271935                ## and may be the cause of other noted instabilities 
    19281936                ## 
    1929                 ##    -PDB August 12, 2014  
     1937                ##    -PDB August 12, 2014 
    19301938                while self.calc_2D.isrunning(): 
    19311939                    time.sleep(0.1) 
     
    19691977            if (self.calc_1D is not None) and self.calc_1D.isrunning(): 
    19701978                self.calc_1D.stop() 
    1971                 ## stop just raises the flag -- the thread is supposed to  
     1979                ## stop just raises the flag -- the thread is supposed to 
    19721980                ## then kill itself but cannot.  Paul Kienzle came up with 
    19731981                ## this fix to prevent threads from stepping on each other 
     
    19811989                ## a request to stop the computation. 
    19821990                ## It seems thus that the whole thread approach used here 
    1983                 ## May need rethinking   
     1991                ## May need rethinking 
    19841992                ## 
    19851993                ##    -PDB August 12, 2014 
     
    21462154            residuals.dxw = None 
    21472155            residuals.ytransform = 'y' 
    2148             # For latter scale changes  
     2156            # For latter scale changes 
    21492157            residuals.xaxis('\\rm{Q} ', 'A^{-1}') 
    21502158            residuals.yaxis('\\rm{Residuals} ', 'normalized') 
  • src/sas/sasgui/perspectives/fitting/models.py

    r7df0ccd r12f7f24  
    186186            try: 
    187187                model = load_custom_model(path) 
    188                 model.name = PLUGIN_NAME_BASE + model.name 
     188                if not model.name.count(PLUGIN_NAME_BASE): 
     189                    model.name = PLUGIN_NAME_BASE + model.name 
    189190                plugins[model.name] = model 
    190191            except Exception: 
  • src/sas/sasgui/perspectives/pr/inversion_panel.py

    r7432acb rcb62bd5  
    7070        self.rg_ctl = None 
    7171        self.iq0_ctl = None 
    72         self.bck_chk = None 
     72        self.bck_value = None 
     73        self.bck_est_ctl = None 
     74        self.bck_man_ctl = None 
     75        self.est_bck = True 
     76        self.bck_input = None 
    7377        self.bck_ctl = None 
    7478 
     
    312316        # Read the panel's parameters 
    313317        flag, alpha, dmax, nfunc, qmin, \ 
    314         qmax, height, width = self._read_pars() 
     318        qmax, height, width, bck = self._read_pars() 
    315319 
    316320        state.nfunc = nfunc 
     
    326330 
    327331        # Background evaluation checkbox 
    328         state.estimate_bck = self.bck_chk.IsChecked() 
     332        state.estimate_bck = self.est_bck 
     333        state.bck_value = bck 
    329334 
    330335        # Estimates 
     
    371376        self.plot_data.SetValue(str(state.file)) 
    372377 
    373         # Background evaluation checkbox 
    374         self.bck_chk.SetValue(state.estimate_bck) 
     378        # Background value 
     379        self.bck_est_ctl.SetValue(state.estimate_bck) 
     380        self.bck_man_ctl.SetValue(not state.estimate_bck) 
     381        if not state.estimate_bck: 
     382            self.bck_input.Enable() 
     383            self.bck_input.SetValue(str(state.bck_value)) 
     384        self.est_bck = state.estimate_bck 
     385        self.bck_value = state.bck_value 
    375386 
    376387        # Estimates 
     
    431442                       wx.EXPAND | wx.LEFT | wx.RIGHT | wx.ADJUST_MINSIZE, 15) 
    432443 
    433         self.bck_chk = wx.CheckBox(self, -1, "Estimate background level") 
    434         hint_msg = "Check box to let the fit estimate " 
    435         hint_msg += "the constant background level." 
    436         self.bck_chk.SetToolTipString(hint_msg) 
    437         self.bck_chk.Bind(wx.EVT_CHECKBOX, self._on_pars_changed) 
     444        radio_sizer = wx.GridBagSizer(5, 5) 
     445 
     446        self.bck_est_ctl = wx.RadioButton(self, -1, "Estimate background level", 
     447            name="estimate_bck", style=wx.RB_GROUP) 
     448        self.bck_man_ctl = wx.RadioButton(self, -1, "Input manual background level", 
     449            name="manual_bck") 
     450 
     451        self.bck_est_ctl.Bind(wx.EVT_RADIOBUTTON, self._on_bck_changed) 
     452        self.bck_man_ctl.Bind(wx.EVT_RADIOBUTTON, self._on_bck_changed) 
     453 
     454        radio_sizer.Add(self.bck_est_ctl, (0,0), (1,1), wx.LEFT | wx.EXPAND) 
     455        radio_sizer.Add(self.bck_man_ctl, (0,1), (1,1), wx.RIGHT | wx.EXPAND) 
     456 
    438457        iy += 1 
    439         pars_sizer.Add(self.bck_chk, (iy, 0), (1, 2), 
     458        pars_sizer.Add(radio_sizer, (iy, 0), (1, 2), 
    440459                       wx.LEFT | wx.EXPAND | wx.ADJUST_MINSIZE, 15) 
     460 
     461        background_label = wx.StaticText(self, -1, "Background: ") 
     462        self.bck_input = PrTextCtrl(self, -1, style=wx.TE_PROCESS_ENTER, 
     463            size=(60, 20), value="0.0") 
     464        self.bck_input.Disable() 
     465        self.bck_input.Bind(wx.EVT_TEXT, self._read_pars) 
     466        background_units = wx.StaticText(self, -1, "[A^(-1)]", size=(55, 20)) 
     467        iy += 1 
     468 
     469        background_sizer = wx.GridBagSizer(5, 5) 
     470 
     471        background_sizer.Add(background_label, (0, 0), (1,1), 
     472            wx.LEFT | wx.EXPAND | wx.ADJUST_MINSIZE, 23) 
     473        background_sizer.Add(self.bck_input, (0, 1), (1,1), 
     474            wx.LEFT | wx.ADJUST_MINSIZE, 5) 
     475        background_sizer.Add(background_units, (0, 2), (1,1), 
     476            wx.LEFT | wx.ADJUST_MINSIZE, 5) 
     477        pars_sizer.Add(background_sizer, (iy, 0), (1, 2), 
     478            wx.LEFT | wx.EXPAND | wx.ADJUST_MINSIZE, 15) 
     479 
    441480        boxsizer1.Add(pars_sizer, 0, wx.EXPAND) 
    442481        vbox.Add(boxsizer1, (iy_vb, 0), (1, 1), 
     
    764803        self._on_pars_changed() 
    765804 
     805    def _on_bck_changed(self, evt=None): 
     806        self.est_bck = self.bck_est_ctl.GetValue() 
     807        if self.est_bck: 
     808            self.bck_input.Disable() 
     809        else: 
     810            self.bck_input.Enable() 
     811 
    766812    def _on_pars_changed(self, evt=None): 
    767813        """ 
     
    770816        scenes. 
    771817        """ 
    772         flag, alpha, dmax, nfunc, qmin, qmax, height, width = self._read_pars() 
    773         has_bck = self.bck_chk.IsChecked() 
     818        flag, alpha, dmax, nfunc, qmin, qmax, height, width, bck = self._read_pars() 
    774819 
    775820        # If the pars are valid, estimate alpha 
     
    783828                                                      d_max=dmax, 
    784829                                                      q_min=qmin, q_max=qmax, 
    785                                                       bck=has_bck, 
     830                                                      est_bck=self.est_bck, 
     831                                                      bck_val=bck, 
    786832                                                      height=height, 
    787833                                                      width=width) 
     
    797843        height = 0 
    798844        width = 0 
     845        background = 0 
    799846        flag = True 
    800847        # Read slit height 
     
    890937            self.qmax_ctl.Refresh() 
    891938 
    892         return flag, alpha, dmax, nfunc, qmin, qmax, height, width 
     939        # Read background 
     940        if not self.est_bck: 
     941            try: 
     942                bck_str = self.bck_input.GetValue() 
     943                if len(bck_str.strip()) == 0: 
     944                    background = 0.0 
     945                else: 
     946                    background = float(bck_str) 
     947                    self.bck_input.SetBackgroundColour(wx.WHITE) 
     948            except ValueError: 
     949                background = 0.0 
     950                self.bck_input.SetBackgroundColour("pink") 
     951            self.bck_input.Refresh() 
     952 
     953        return flag, alpha, dmax, nfunc, qmin, qmax, height, width, background 
    893954 
    894955    def _on_explore(self, evt): 
     
    915976        # Push it to the manager 
    916977 
    917         flag, alpha, dmax, nfunc, qmin, qmax, height, width = self._read_pars() 
    918         has_bck = self.bck_chk.IsChecked() 
     978        flag, alpha, dmax, nfunc, qmin, qmax, height, width, bck = self._read_pars() 
    919979 
    920980        if flag: 
     
    928988                                                   d_max=dmax, 
    929989                                                   q_min=qmin, q_max=qmax, 
    930                                                    bck=has_bck, 
     990                                                   est_bck=self.est_bck, 
     991                                                   bck_val = bck, 
    931992                                                   height=height, 
    932993                                                   width=width) 
  • src/sas/sasgui/perspectives/pr/inversion_state.py

    r7432acb ra0e6b1b  
    3636           ["qmin", "qmin"], 
    3737           ["qmax", "qmax"], 
    38            ["estimate_bck", "estimate_bck"]] 
     38           ["estimate_bck", "estimate_bck"], 
     39           ["bck_value", "bck_value"]] 
    3940 
    4041## List of P(r) inversion outputs 
     
    6263        self.estimate_bck = False 
    6364        self.timestamp = time.time() 
     65        self.bck_value = 0.0 
    6466 
    6567        # Inversion parameters 
     
    109111        state += "Timestamp:    %s\n" % self.timestamp 
    110112        state += "Estimate bck: %s\n" % str(self.estimate_bck) 
     113        state += "Bck Value:    %s\n" % str(self.bck_value) 
    111114        state += "No. terms:    %s\n" % str(self.nfunc) 
    112115        state += "D_max:        %s\n" % str(self.d_max) 
     
    296299                            self.coefficients.append(float(c)) 
    297300                        except: 
    298                             # Bad data, skip. We will count the number of  
    299                             # coefficients at the very end and deal with  
     301                            # Bad data, skip. We will count the number of 
     302                            # coefficients at the very end and deal with 
    300303                            # inconsistencies then. 
    301304                            pass 
     
    329332                                cov_row.append(float(c)) 
    330333                            except: 
    331                                 # Bad data, skip. We will count the number of  
    332                                 # coefficients at the very end and deal with  
     334                                # Bad data, skip. We will count the number of 
     335                                # coefficients at the very end and deal with 
    333336                                # inconsistencies then. 
    334337                                pass 
     
    461464                tree = etree.parse(path, parser=etree.ETCompatXMLParser()) 
    462465                # Check the format version number 
    463                 # Specifying the namespace will take care of the file  
    464                 #format version  
     466                # Specifying the namespace will take care of the file 
     467                #format version 
    465468                root = tree.getroot() 
    466469 
  • src/sas/sasgui/perspectives/pr/media/pr_help.rst

    r1221196 r1abd19c  
    4949P(r) inversion requires that the background be perfectly subtracted.  This is 
    5050often difficult to do well and thus many data sets will include a background. 
    51 For those cases, the user should check the "estimate background" box and the 
    52 module will do its best to estimate it. 
     51For those cases, the user should check the "Estimate background level" option 
     52and the module will do its best to estimate it. If you know the background value 
     53for your data, select the "Input manual background level" option. Note that 
     54this value will be treated as having 0 error. 
    5355 
    5456The P(r) module is constantly computing in the background what the optimum 
  • src/sas/sasgui/perspectives/pr/pr.py

    ra1b8fee rcb62bd5  
    6868        self.q_min = None 
    6969        self.q_max = None 
    70         self.has_bck = False 
     70        self.est_bck = False 
     71        self.bck_val = 0 
    7172        self.slit_height = 0 
    7273        self.slit_width = 0 
     
    828829        self.control_panel.iq0 = pr.iq0(out) 
    829830        self.control_panel.bck = pr.background 
     831        self.control_panel.bck_input.SetValue("{:.2g}".format(pr.background)) 
    830832 
    831833        # Show I(q) fit 
     
    907909 
    908910    def setup_plot_inversion(self, alpha, nfunc, d_max, q_min=None, q_max=None, 
    909                              bck=False, height=0, width=0): 
     911                             est_bck=False, bck_val=0, height=0, width=0): 
    910912        """ 
    911913            Set up inversion from plotted data 
     
    916918        self.q_min = q_min 
    917919        self.q_max = q_max 
    918         self.has_bck = bck 
     920        self.est_bck = est_bck 
     921        self.bck_val = bck_val 
    919922        self.slit_height = height 
    920923        self.slit_width = width 
     
    930933    def estimate_plot_inversion(self, alpha, nfunc, d_max, 
    931934                                q_min=None, q_max=None, 
    932                                 bck=False, height=0, width=0): 
     935                                est_bck=False, bck_val=0, height=0, width=0): 
    933936        """ 
    934937            Estimate parameters from plotted data 
     
    939942        self.q_min = q_min 
    940943        self.q_max = q_max 
    941         self.has_bck = bck 
     944        self.est_bck = est_bck 
     945        self.bck_val = bck_val 
    942946        self.slit_height = height 
    943947        self.slit_width = width 
     
    973977        pr.x = self.current_plottable.x 
    974978        pr.y = self.current_plottable.y 
    975         pr.has_bck = self.has_bck 
     979        pr.est_bck = self.est_bck 
    976980        pr.slit_height = self.slit_height 
    977981        pr.slit_width = self.slit_width 
     982        pr.background = self.bck_val 
    978983 
    979984        # Keep track of the plot window title to ensure that 
     
    10191024        self.q_min = q_min 
    10201025        self.q_max = q_max 
    1021         self.has_bck = bck 
     1026        self.est_bck = bck 
    10221027        self.slit_height = height 
    10231028        self.slit_width = width 
     
    10421047        self.q_min = q_min 
    10431048        self.q_max = q_max 
    1044         self.has_bck = bck 
     1049        self.est_bck = bck 
    10451050        self.slit_height = height 
    10461051        self.slit_width = width 
     
    11151120            pr.y = y 
    11161121            pr.err = err 
    1117             pr.has_bck = self.has_bck 
     1122            pr.est_bck = self.est_bck 
    11181123            pr.slit_height = self.slit_height 
    11191124            pr.slit_width = self.slit_width 
  • src/sas/sasgui/__init__.py

    rd7bb526 rc6bdb3b  
     1import sys 
     2import os 
     3from os.path import exists, expanduser, dirname, realpath, join as joinpath 
     4 
     5 
     6def dirn(path, n): 
     7    path = realpath(path) 
     8    for _ in range(n): 
     9        path = dirname(path) 
     10    return path 
     11 
     12# Set up config directories 
     13def make_user_folder(): 
     14    path = joinpath(expanduser("~"),'.sasview') 
     15    if not exists(path): 
     16        os.mkdir(path) 
     17    return path 
     18 
     19 
     20def find_app_folder(): 
     21    # We are starting out with the following info: 
     22    #     __file__ = .../sas/sasgui/__init__.pyc 
     23    # Check if the sister path .../sas/sasview exists, and use it as the 
     24    # app directory.  This will only be the case if the app is not frozen. 
     25    path = joinpath(dirn(__file__, 2), 'sasview') 
     26    if exists(path): 
     27        return path 
     28 
     29    # If we are running frozen, then root is a parent directory 
     30    if sys.platform == 'darwin': 
     31        # Here is the path to the file on the mac: 
     32        #     .../Sasview.app/Contents/Resources/lib/python2.7/site-packages.zip/sas/sasgui/__init__.pyc 
     33        # We want the path to the Resources directory. 
     34        path = dirn(__file__, 6) 
     35    elif os.name == 'nt': 
     36        # Here is the path to the file on windows: 
     37        #     ../Sasview/library.zip/sas/sasgui/__init__.pyc 
     38        # We want the path to the Sasview directory. 
     39        path = dirn(__file__, 4) 
     40    else: 
     41        raise RuntimeError("Couldn't find the app directory") 
     42    return path 
     43 
     44USER_FOLDER = make_user_folder() 
     45APP_FOLDER = find_app_folder() 
     46 
     47 
     48def get_app_dir(): 
     49    return APP_FOLDER 
     50 
     51def get_user_dir(): 
     52    return USER_FOLDER 
     53 
     54def get_custom_config_path(): 
     55    dirname = os.path.join(get_user_dir(), 'config') 
     56    # If the directory doesn't exist, create it 
     57    if not os.path.exists(dirname): 
     58        os.makedirs(dirname) 
     59    path = os.path.join(dirname, "custom_config.py") 
     60    return path 
     61 
     62_config_cache = None 
     63def get_local_config(): 
     64    global _config_cache 
     65    if not _config_cache: 
     66        _config_cache = _load_config() 
     67    return _config_cache 
     68 
     69def _load_config(): 
     70    import os 
     71    import sys 
     72    import logging 
     73    from sasmodels.custom import load_module_from_path 
     74 
     75    logger = logging.getLogger(__name__) 
     76    dirname = get_app_dir() 
     77    filename = 'local_config.py' 
     78    path = os.path.join(dirname, filename) 
     79    try: 
     80        module = load_module_from_path('sas.sasgui.local_config', path) 
     81        logger.info("GuiManager loaded %s", path) 
     82        return module 
     83    except Exception as exc: 
     84        logger.critical("Error loading %s: %s", path, exc) 
     85        sys.exit() 
  • src/sas/sasgui/guiframe/CategoryInstaller.py

    r235f514 r914ba0a  
    1414import logging 
    1515from collections import defaultdict, OrderedDict 
     16 
     17from sas.sasgui import get_user_dir 
    1618 
    1719USER_FILE = 'categories.json' 
     
    6971 
    7072    @staticmethod 
    71     def _get_home_dir(): 
    72         """ 
    73         returns the users sasview config dir 
    74         """ 
    75         return os.path.join(os.path.expanduser("~"), ".sasview") 
    76  
    77     @staticmethod 
    7873    def _regenerate_model_dict(master_category_dict): 
    7974        """ 
     
    8580        by_model_dict = defaultdict(list) 
    8681        model_enabled_dict = defaultdict(bool) 
    87          
     82 
    8883        for category in master_category_dict: 
    8984            for (model, enabled) in master_category_dict[category]: 
     
    9691    def _regenerate_master_dict(by_model_dict, model_enabled_dict): 
    9792        """ 
    98         regenerates master_category_dict from by_model_dict  
     93        regenerates master_category_dict from by_model_dict 
    9994        and model_enabled_dict 
    10095        returns the master category dictionary 
     
    112107        returns the user data file, eg .sasview/categories.json.json 
    113108        """ 
    114         return os.path.join(CategoryInstaller._get_home_dir(), USER_FILE) 
     109        return os.path.join(get_user_dir(), USER_FILE) 
    115110 
    116111    @staticmethod 
     
    150145                model_name, enabled = master_category_dict[cat][ind] 
    151146                if model_name not in _model_list: 
    152                     del_name = True  
     147                    del_name = True 
    153148                    try: 
    154149                        by_model_dict.pop(model_name) 
  • src/sas/sasgui/guiframe/aboutbox.py

    r959eb01 r914ba0a  
    2424import os.path 
    2525import os 
    26 try: 
    27     # Try to find a local config 
    28     import imp 
    29     path = os.getcwd() 
    30     if(os.path.isfile("%s/%s.py" % (path, 'local_config'))) or \ 
    31       (os.path.isfile("%s/%s.pyc" % (path, 'local_config'))): 
    32         fObj, path, descr = imp.find_module('local_config', [path]) 
    33         config = imp.load_module('local_config', fObj, path, descr)   
    34     else: 
    35         # Try simply importing local_config 
    36         import local_config as config 
    37 except: 
    38     # Didn't find local config, load the default  
    39     import config 
     26 
     27from sas.sasgui import get_local_config 
     28config = get_local_config() 
    4029 
    4130def launchBrowser(url): 
    4231    """ 
    4332    Launches browser and opens specified url 
    44      
     33 
    4534    In some cases may require BROWSER environment variable to be set up. 
    46      
     35 
    4736    :param url: URL to open 
    48      
     37 
    4938    """ 
    5039    import webbrowser 
     
    5544    """ 
    5645    "About" Dialog 
    57      
     46 
    5847    Shows product name, current version, authors, and link to the product page. 
    5948    Current version is taken from version.py 
    60      
    61     """ 
    62      
     49 
     50    """ 
     51 
    6352    def __init__(self, *args, **kwds): 
    6453 
     
    6655        kwds["style"] = wx.DEFAULT_DIALOG_STYLE 
    6756        wx.Dialog.__init__(self, *args, **kwds) 
    68          
     57 
    6958        file_dir = os.path.dirname(__file__) 
    70          
     59 
    7160        # Mac doesn't display images with transparent background so well, 
    7261        # keep it for Windows 
    7362        image = file_dir + "/images/angles_flat.png" 
    74          
     63 
    7564        if os.path.isfile(config._corner_image): 
    7665            image = config._corner_image 
     
    8069        else: 
    8170            self.bitmap_logo = wx.StaticBitmap(self, -1, wx.Bitmap(image)) 
    82          
     71 
    8372        self.label_title = wx.StaticText(self, -1, config.__appname__) 
    8473        self.label_version = wx.StaticText(self, -1, "") 
     
    112101        #self.bitmap_button_danse = wx.BitmapButton(self, -1, wx.NullBitmap) 
    113102        self.bitmap_button_msu = wx.BitmapButton(self, -1, wx.NullBitmap) 
    114          
     103 
    115104        self.bitmap_button_isis = wx.BitmapButton(self, -1, wx.NullBitmap) 
    116105        self.bitmap_button_ess = wx.BitmapButton(self, -1, wx.NullBitmap) 
     
    119108        self.bitmap_button_tudelft = wx.BitmapButton(self, -1, wx.NullBitmap) 
    120109        self.bitmap_button_dls = wx.BitmapButton(self, -1, wx.NullBitmap) 
    121          
     110 
    122111        self.static_line_3 = wx.StaticLine(self, -1) 
    123112        self.button_OK = wx.Button(self, wx.ID_OK, "OK") 
     
    125114        self.__set_properties() 
    126115        self.__do_layout() 
    127          
     116 
    128117        self.Bind(wx.EVT_BUTTON, self.onNistLogo, self.bitmap_button_nist) 
    129118        self.Bind(wx.EVT_BUTTON, self.onUmdLogo, self.bitmap_button_umd) 
     
    145134        random.shuffle(config._authors) 
    146135        strLabel = ", ".join(config._authors) 
    147          
     136 
    148137        # display version and svn revison numbers 
    149138        verwords = config.__version__.split('.') 
     
    157146        self.label_version.SetLabel(config.__version__)#(version) 
    158147        self.label_svnrevision.SetLabel(build_num) 
    159          
     148 
    160149        # set bitmaps for logo buttons 
    161150        image = file_dir + "/images/nist_logo.png" 
    162151        if os.path.isfile(config._nist_logo): 
    163152            image = config._nist_logo 
    164         logo = wx.Bitmap(image)         
     153        logo = wx.Bitmap(image) 
    165154        self.bitmap_button_nist.SetBitmapLabel(logo) 
    166          
     155 
    167156        image = file_dir + "/images/umd_logo.png" 
    168157        if os.path.isfile(config._umd_logo): 
    169158            image = config._umd_logo 
    170         logo = wx.Bitmap(image)         
     159        logo = wx.Bitmap(image) 
    171160        self.bitmap_button_umd.SetBitmapLabel(logo) 
    172161 
     
    174163        if os.path.isfile(config._ornl_logo): 
    175164            image = config._ornl_logo 
    176         logo = wx.Bitmap(image)         
     165        logo = wx.Bitmap(image) 
    177166        self.bitmap_button_ornl.SetBitmapLabel(logo) 
    178167 
     
    181170        if os.path.isfile(config._sns_logo): 
    182171            image = config._sns_logo 
    183         logo = wx.Bitmap(image)         
     172        logo = wx.Bitmap(image) 
    184173        self.bitmap_button_sns.SetBitmapLabel(logo) 
    185          
     174 
    186175        image = file_dir + "/images/nsf_logo.png" 
    187176        if os.path.isfile(config._nsf_logo): 
    188177            image = config._nsf_logo 
    189         logo = wx.Bitmap(image)         
     178        logo = wx.Bitmap(image) 
    190179        self.bitmap_button_nsf.SetBitmapLabel(logo) 
    191180 
     
    201190        logo = wx.Bitmap(image) 
    202191        self.bitmap_button_msu.SetBitmapLabel(logo) 
    203          
     192 
    204193        image = file_dir + "/images/isis_logo.png" 
    205194        if os.path.isfile(config._isis_logo): 
    206195            image = config._isis_logo 
    207         logo = wx.Bitmap(image)         
     196        logo = wx.Bitmap(image) 
    208197        self.bitmap_button_isis.SetBitmapLabel(logo) 
    209198 
     
    213202        logo = wx.Bitmap(image) 
    214203        self.bitmap_button_ess.SetBitmapLabel(logo) 
    215          
     204 
    216205        image = file_dir + "/images/ill_logo.png" 
    217206        if os.path.isfile(config._ill_logo): 
     
    219208        logo = wx.Bitmap(image) 
    220209        self.bitmap_button_ill.SetBitmapLabel(logo) 
    221          
     210 
    222211        image = file_dir + "/images/ansto_logo.png" 
    223212        if os.path.isfile(config._ansto_logo): 
     
    225214        logo = wx.Bitmap(image) 
    226215        self.bitmap_button_ansto.SetBitmapLabel(logo) 
    227          
     216 
    228217        image = file_dir + "/images/tudelft_logo.png" 
    229218        if os.path.isfile(config._tudelft_logo): 
     
    231220        logo = wx.Bitmap(image) 
    232221        self.bitmap_button_tudelft.SetBitmapLabel(logo) 
    233          
     222 
    234223        image = file_dir + "/images/dls_logo.png" 
    235224        if os.path.isfile(config._dls_logo): 
     
    237226        logo = wx.Bitmap(image) 
    238227        self.bitmap_button_dls.SetBitmapLabel(logo) 
    239                  
     228 
    240229        # resize dialog window to fit version number nicely 
    241230        if wx.VERSION >= (2, 7, 2, 0): 
     
    244233            size = [self.GetBestFittingSize()[0], self.GetSize()[1]] 
    245234        self.Fit() 
    246          
     235 
    247236    def __set_properties(self): 
    248237        """ 
     
    310299        sizer_main.Add(self.static_line_2, 0, wx.EXPAND, 0) 
    311300 
    312         sizer_logos.Add(self.bitmap_button_msu, 0,  
     301        sizer_logos.Add(self.bitmap_button_msu, 0, 
    313302                        wx.LEFT|wx.ADJUST_MINSIZE, 2) 
    314303        #sizer_logos.Add(self.bitmap_button_danse, 0, 
    315304        #                wx.LEFT|wx.ADJUST_MINSIZE, 2) 
    316         #sizer_logos.Add(self.bitmap_button_nsf, 0,  
     305        #sizer_logos.Add(self.bitmap_button_nsf, 0, 
    317306        #                wx.LEFT|wx.ADJUST_MINSIZE, 2) 
    318         sizer_logos.Add(self.bitmap_button_umd, 0,  
    319                         wx.LEFT|wx.ADJUST_MINSIZE, 2) 
    320         sizer_logos.Add(self.bitmap_button_nist, 0,  
    321                         wx.LEFT|wx.ADJUST_MINSIZE, 2) 
    322         #sizer_logos.Add(self.bitmap_button_sns, 0,  
     307        sizer_logos.Add(self.bitmap_button_umd, 0, 
     308                        wx.LEFT|wx.ADJUST_MINSIZE, 2) 
     309        sizer_logos.Add(self.bitmap_button_nist, 0, 
     310                        wx.LEFT|wx.ADJUST_MINSIZE, 2) 
     311        #sizer_logos.Add(self.bitmap_button_sns, 0, 
    323312        #                wx.LEFT|wx.ADJUST_MINSIZE, 2) 
    324         sizer_logos.Add(self.bitmap_button_ornl, 0,  
    325                         wx.LEFT|wx.ADJUST_MINSIZE, 2) 
    326         sizer_logos.Add(self.bitmap_button_isis, 0,  
    327                         wx.LEFT|wx.ADJUST_MINSIZE, 2) 
    328         sizer_logos.Add(self.bitmap_button_ess, 0,  
    329                         wx.LEFT|wx.ADJUST_MINSIZE, 2) 
    330         sizer_logos.Add(self.bitmap_button_ill, 0,  
    331                         wx.LEFT|wx.ADJUST_MINSIZE, 2) 
    332         sizer_logos.Add(self.bitmap_button_ansto, 0,  
    333                         wx.LEFT|wx.ADJUST_MINSIZE, 2) 
    334         sizer_logos.Add(self.bitmap_button_tudelft, 0,  
    335                         wx.LEFT|wx.ADJUST_MINSIZE, 2) 
    336         sizer_logos.Add(self.bitmap_button_dls, 0,  
    337                         wx.LEFT|wx.ADJUST_MINSIZE, 2) 
    338                  
     313        sizer_logos.Add(self.bitmap_button_ornl, 0, 
     314                        wx.LEFT|wx.ADJUST_MINSIZE, 2) 
     315        sizer_logos.Add(self.bitmap_button_isis, 0, 
     316                        wx.LEFT|wx.ADJUST_MINSIZE, 2) 
     317        sizer_logos.Add(self.bitmap_button_ess, 0, 
     318                        wx.LEFT|wx.ADJUST_MINSIZE, 2) 
     319        sizer_logos.Add(self.bitmap_button_ill, 0, 
     320                        wx.LEFT|wx.ADJUST_MINSIZE, 2) 
     321        sizer_logos.Add(self.bitmap_button_ansto, 0, 
     322                        wx.LEFT|wx.ADJUST_MINSIZE, 2) 
     323        sizer_logos.Add(self.bitmap_button_tudelft, 0, 
     324                        wx.LEFT|wx.ADJUST_MINSIZE, 2) 
     325        sizer_logos.Add(self.bitmap_button_dls, 0, 
     326                        wx.LEFT|wx.ADJUST_MINSIZE, 2) 
     327 
    339328        sizer_logos.Add((10, 50), 0, wx.ADJUST_MINSIZE, 0) 
    340329        sizer_main.Add(sizer_logos, 0, wx.EXPAND, 0) 
    341330        sizer_main.Add(self.static_line_3, 0, wx.EXPAND, 0) 
    342331        sizer_button.Add((20, 40), 1, wx.EXPAND|wx.ADJUST_MINSIZE, 0) 
    343         sizer_button.Add(self.button_OK, 0,  
     332        sizer_button.Add(self.button_OK, 0, 
    344333                         wx.RIGHT|wx.ADJUST_MINSIZE|wx.CENTER, 10) 
    345334        sizer_main.Add(sizer_button, 0, wx.EXPAND, 0) 
     
    350339        # end wxGlade 
    351340 
    352     def onNistLogo(self, event):  
     341    def onNistLogo(self, event): 
    353342        """ 
    354343        """ 
     
    356345        launchBrowser(config._nist_url) 
    357346        event.Skip() 
    358          
    359     def onUmdLogo(self, event):  
     347 
     348    def onUmdLogo(self, event): 
    360349        """ 
    361350        """ 
     
    363352        launchBrowser(config._umd_url) 
    364353        event.Skip() 
    365          
    366     def onOrnlLogo(self, event):  
     354 
     355    def onOrnlLogo(self, event): 
    367356        """ 
    368357        """ 
     
    370359        launchBrowser(config._ornl_url) 
    371360        event.Skip() 
    372          
    373     def onSnsLogo(self, event):  
     361 
     362    def onSnsLogo(self, event): 
    374363        """ 
    375364        """ 
     
    377366        launchBrowser(config._sns_url) 
    378367        event.Skip() 
    379                  
    380     def onNsfLogo(self, event):  
     368 
     369    def onNsfLogo(self, event): 
    381370        """ 
    382371        """ 
     
    394383    def onUTLogo(self, event): 
    395384        """ 
    396         """  
     385        """ 
    397386        # wxGlade: DialogAbout.<event_handler> 
    398387        launchBrowser(config._inst_url) 
    399388        event.Skip() 
    400389 
    401     def onIsisLogo(self, event):  
     390    def onIsisLogo(self, event): 
    402391        """ 
    403392        """ 
     
    415404    def onIllLogo(self, event): 
    416405        """ 
    417         """  
     406        """ 
    418407        # wxGlade: DialogAbout.<event_handler> 
    419408        launchBrowser(config._ill_url) 
     
    422411    def onAnstoLogo(self, event): 
    423412        """ 
    424         """  
     413        """ 
    425414        # wxGlade: DialogAbout.<event_handler> 
    426415        launchBrowser(config._ansto_url) 
     
    429418    def onTudelftLogo(self, event): 
    430419        """ 
    431         """  
     420        """ 
    432421        # wxGlade: DialogAbout.<event_handler> 
    433422        launchBrowser(config._tudelft_url) 
     
    436425    def onDlsLogo(self, event): 
    437426        """ 
    438         """  
     427        """ 
    439428        # wxGlade: DialogAbout.<event_handler> 
    440429        launchBrowser(config._dls_url) 
     
    462451    app = MyApp(0) 
    463452    app.MainLoop() 
    464      
    465 ##### end of testing code #####################################################     
     453 
     454##### end of testing code ##################################################### 
  • src/sas/sasgui/guiframe/acknowledgebox.py

    r74c8cd0 r914ba0a  
    1212import wx.lib.hyperlink 
    1313from wx.lib.expando import ExpandoTextCtrl 
    14 import random 
    15 import os.path 
    16 import os 
    17 try: 
    18     # Try to find a local config 
    19     import imp 
    20     path = os.getcwd() 
    21     if(os.path.isfile("%s/%s.py" % (path, 'local_config'))) or \ 
    22       (os.path.isfile("%s/%s.pyc" % (path, 'local_config'))): 
    23         fObj, path, descr = imp.find_module('local_config', [path]) 
    24         config = imp.load_module('local_config', fObj, path, descr) 
    25     else: 
    26         # Try simply importing local_config 
    27         import local_config as config 
    28 except: 
    29     # Didn't find local config, load the default 
    30     import config 
    3114 
     15from sas.sasgui import get_local_config 
     16config = get_local_config() 
    3217 
    3318class DialogAcknowledge(wx.Dialog): 
  • src/sas/sasgui/guiframe/config.py

    ra1b8fee rc6bdb3b  
    11""" 
    2     Application settings 
     2Application settings 
    33""" 
    44from __future__ import print_function 
     
    66import time 
    77import os 
     8import logging 
     9 
    810from sas.sasgui.guiframe.gui_style import GUIFRAME 
    911import sas.sasview 
    10 import logging 
    11  
    1212 
    1313logger = logging.getLogger(__name__) 
     
    7575_ansto_logo = os.path.join(icon_path, "ansto_logo.png") 
    7676_tudelft_logo = os.path.join(icon_path, "tudelft_logo.png") 
     77_dls_logo = os.path.join(icon_path, "dls_logo.png") 
    7778_nsf_logo = os.path.join(icon_path, "nsf_logo.png") 
    7879_danse_logo = os.path.join(icon_path, "danse_logo.png") 
     
    147148SAS_OPENCL = None 
    148149 
     150# Time out for updating sasview 
     151UPDATE_TIMEOUT = 2 
     152 
    149153def printEVT(message): 
    150154    if __EVT_DEBUG__: 
  • src/sas/sasgui/guiframe/customdir.py

    r959eb01 rc6bdb3b  
    11# Setup and find Custom config dir 
     2from __future__ import print_function 
     3 
    24import os.path 
     5import logging 
    36import shutil 
    47 
    5 CONF_DIR = 'config'  
    6 APPLICATION_NAME = 'sasview' 
     8from sasmodels.custom import load_module_from_path 
    79 
    8 def _find_usersasview_dir(): 
    9     """ 
    10     Find and return user/.sasview dir 
    11     """ 
    12     return os.path.join(os.path.expanduser("~"), ("." + APPLICATION_NAME)) 
     10from sas.sasgui import get_custom_config_path, get_app_dir 
    1311 
    14 def _find_customconf_dir(): 
    15     """ 
    16     Find path of the config directory. 
    17     The plugin directory is located in the user's home directory. 
    18     """ 
    19     u_dir = _find_usersasview_dir() 
    20     return os.path.join(u_dir, CONF_DIR) 
     12logger = logging.getLogger(__name__) 
    2113 
    22 def _setup_conf_dir(path): 
     14_config_cache = None 
     15def setup_custom_config(): 
    2316    """ 
    2417    Setup the custom config dir and cat file 
    2518    """ 
    26     conf_dir = _find_customconf_dir() 
    27     # If the plugin directory doesn't exist, create it 
    28     if not os.path.isdir(conf_dir): 
    29         os.makedirs(conf_dir) 
    30     config_file = os.path.join(conf_dir, "custom_config.py") 
    31  
    32     # Place example user models as needed 
    33     try: 
    34         if not os.path.isfile(config_file): 
    35             shutil.copyfile(os.path.join(path, "custom_config.py"), config_file) 
    36  
    37         #Adding SAS_OPENCL if it doesn't exist in the config file 
    38         # - to support backcompability 
    39         if not "SAS_OPENCL" in open(config_file).read(): 
    40             open(config_file,"a+").write("SAS_OPENCL = \"None\"\n") 
    41     except: 
    42         # Check for data path next to exe/zip file. 
    43         #Look for maximum n_dir up of the current dir to find plugins dir 
    44         n_dir = 12 
    45         is_dir = False 
    46         f_dir = path 
    47         for i in range(n_dir): 
    48             if i > 1: 
    49                 f_dir, _ = os.path.split(f_dir) 
    50             temp_path = os.path.join(f_dir, "custom_config.py") 
    51             if os.path.isfile(temp_path): 
    52                 shutil.copyfile(temp_path, config_file) 
    53                 is_dir = True 
    54                 break 
    55         if not is_dir: 
    56             raise 
    57     return conf_dir 
     19    global _config_cache 
     20    if not _config_cache: 
     21        _config_cache = _setup_custom_config() 
     22    return _config_cache 
    5823 
    5924 
    60 class SetupCustom(object): 
    61     """ 
    62     implement custom config dir 
    63     """ 
    64     def find_dir(self): 
    65         return _find_customconf_dir() 
    66      
    67     def setup_dir(self, path): 
    68         return _setup_conf_dir(path) 
     25def _setup_custom_config(): 
     26    path = get_custom_config_path() 
     27    if not os.path.isfile(path): 
     28        try: 
     29            # if the custom config file does not exist, copy the default from 
     30            # the app dir 
     31            shutil.copyfile(os.path.join(get_app_dir(), "custom_config.py"), 
     32                            path) 
     33        except Exception: 
     34            logger.error("Could not copy default custom config.") 
     35 
     36    #Adding SAS_OPENCL if it doesn't exist in the config file 
     37    # - to support backcompability 
     38    if not "SAS_OPENCL" in open(path).read(): 
     39        try: 
     40            open(config_file, "a+").write("SAS_OPENCL = \"None\"\n") 
     41        except Exception: 
     42            logger.error("Could not update custom config with SAS_OPENCL.") 
     43 
     44    custom_config = _load_config(path) 
     45    return custom_config 
     46 
     47 
     48def _load_config(path): 
     49    if os.path.exists(path): 
     50        try: 
     51            module = load_module_from_path('sas.sasview.custom_config', path) 
     52            logger.info("GuiManager loaded %s", path) 
     53            return module 
     54        except Exception as exc: 
     55            logger.error("Error loading %s: %s", path, exc) 
     56 
     57    from sas.sasview import custom_config 
     58    logger.info("GuiManager custom_config defaults to sas.sasview.custom_config") 
     59    return custom_config 
  • src/sas/sasgui/guiframe/data_panel.py

    ra1b8fee rc6bdb3b  
    3333from sas.sasgui.guiframe.local_perspectives.plotting.SimplePlot \ 
    3434    import PlotFrame as QucikPlotDialog 
    35 import sas.sasgui.guiframe.config as config 
     35from sas.sasgui import get_local_config 
     36 
     37config = get_local_config() 
    3638 
    3739# Check version 
  • src/sas/sasgui/guiframe/documentation_window.py

    r959eb01 rd66dbcc  
    1616import os 
    1717import logging 
    18 import wx 
    1918import webbrowser 
    2019import urllib 
    2120import sys 
    2221 
     22import wx 
     23try: 
     24    import wx.html2 as html 
     25    WX_SUPPORTS_HTML2 = True 
     26except: 
     27    WX_SUPPORTS_HTML2 = False 
     28 
     29from sas.sasgui import get_app_dir 
     30 
    2331logger = logging.getLogger(__name__) 
    2432 
    2533SPHINX_DOC_ENV = "SASVIEW_DOC_PATH" 
    26 WX_SUPPORTS_HTML2 = True 
    27 try: 
    28     import wx.html2 as html 
    29 except: 
    30     WX_SUPPORTS_HTML2 = False 
    31  
    32  
    33 from gui_manager import get_app_dir 
    34  
    3534 
    3635class DocumentationWindow(wx.Frame): 
  • src/sas/sasgui/guiframe/gui_manager.py

    r2f22db9 r914ba0a  
    2222import re 
    2323import logging 
    24 import httplib 
    2524import traceback 
    2625import urllib 
    27 import urllib2 
    2826import json 
    2927 
     28from matplotlib import _pylab_helpers 
     29 
     30from sas.sasgui import get_local_config, get_app_dir, get_user_dir 
    3031from sas.sasgui.guiframe.events import EVT_CATEGORY 
    3132from sas.sasgui.guiframe.events import EVT_STATUS 
     
    4647from sas.sascalc.dataloader.loader import Loader 
    4748from sas.sasgui.guiframe.proxy import Connection 
    48 from matplotlib import _pylab_helpers 
     49from sas.sasgui.guiframe.customdir import setup_custom_config 
    4950 
    5051logger = logging.getLogger(__name__) 
    51  
    5252warnings.simplefilter("ignore") 
    5353 
    54 def get_app_dir(): 
    55     """ 
    56         The application directory is the one where the default custom_config.py 
    57         file resides. 
    58  
    59         :returns: app_path - the path to the applicatin directory 
    60     """ 
    61     # First, try the directory of the executable we are running 
    62     app_path = sys.path[0] 
    63     if os.path.isfile(app_path): 
    64         app_path = os.path.dirname(app_path) 
    65     if os.path.isfile(os.path.join(app_path, "custom_config.py")): 
    66         app_path = os.path.abspath(app_path) 
    67         logger.info("Using application path: %s", app_path) 
    68         return app_path 
    69  
    70     # Next, try the current working directory 
    71     if os.path.isfile(os.path.join(os.getcwd(), "custom_config.py")): 
    72         logger.info("Using application path: %s", os.getcwd()) 
    73         return os.path.abspath(os.getcwd()) 
    74  
    75     # Finally, try the directory of the sasview module 
    76     # TODO: gui_manager will have to know about sasview until we 
    77     # clean all these module variables and put them into a config class 
    78     # that can be passed by sasview.py. 
    79     logger.debug(sys.executable) 
    80     logger.debug(str(sys.argv)) 
    81     from sas import sasview as sasview 
    82     app_path = os.path.dirname(sasview.__file__) 
    83     logger.debug("Using application path: %s", app_path) 
    84     return app_path 
    85  
    86  
    87 def get_user_directory(): 
    88     """ 
    89         Returns the user's home directory 
    90     """ 
    91     userdir = os.path.join(os.path.expanduser("~"), ".sasview") 
    92     if not os.path.isdir(userdir): 
    93         os.makedirs(userdir) 
    94     return userdir 
    95  
    96  
    97 def _find_local_config(file, path): 
    98     """ 
    99         Find configuration file for the current application 
    100     """ 
    101     config_module = None 
    102     fObj = None 
    103     try: 
    104         fObj, path_config, descr = imp.find_module(file, [path]) 
    105         config_module = imp.load_module(file, fObj, path_config, descr) 
    106     except: 
    107         logger.error("Error loading %s/%s: %s" % (path, file, sys.exc_value)) 
    108     finally: 
    109         if fObj is not None: 
    110             fObj.close() 
    111     logger.debug("GuiManager loaded %s/%s" % (path, file)) 
    112     return config_module 
    113  
    114 # Get APP folder 
    115 PATH_APP = get_app_dir() 
    116 DATAPATH = PATH_APP 
    117  
    118 # GUI always starts from the App folder 
    119 # os.chdir(PATH_APP) 
    120 # Read in the local config, which can either be with the main 
    121 # application or in the installation directory 
    122 config = _find_local_config('local_config', PATH_APP) 
    123 if config is None: 
    124     config = _find_local_config('local_config', os.getcwd()) 
    125     if config is None: 
    126         # Didn't find local config, load the default 
    127         import sas.sasgui.guiframe.config as config 
    128         logger.debug("using default local_config") 
    129     else: 
    130         logger.debug("found local_config in %s" % os.getcwd()) 
    131 else: 
    132     logger.debug("found local_config in %s" % PATH_APP) 
    133  
    134 from sas.sasgui.guiframe.customdir import SetupCustom 
    135 c_conf_dir = SetupCustom().setup_dir(PATH_APP) 
    136 custom_config = _find_local_config('custom_config', c_conf_dir) 
    137 if custom_config is None: 
    138     custom_config = _find_local_config('custom_config', os.getcwd()) 
    139     if custom_config is None: 
    140         msgConfig = "Custom_config file was not imported" 
    141         logger.debug(msgConfig) 
    142     else: 
    143         logger.debug("using custom_config in %s" % os.getcwd()) 
    144 else: 
    145     logger.debug("using custom_config from %s" % c_conf_dir) 
     54config = get_local_config() 
     55custom_config = setup_custom_config() 
    14656 
    14757# read some constants from config 
     
    17787        DEFAULT_OPEN_FOLDER = os.path.abspath(open_folder) 
    17888    else: 
    179         DEFAULT_OPEN_FOLDER = PATH_APP 
     89        DEFAULT_OPEN_FOLDER = get_app_dir() 
    18090    SAS_OPENCL = custom_config.SAS_OPENCL 
    18191except: 
     
    192102    DEFAULT_PERSPECTIVE = None 
    193103    CLEANUP_PLOT = False 
     104    DEFAULT_OPEN_FOLDER = get_app_dir() 
    194105    DEFAULT_OPEN_FOLDER = PATH_APP 
    195106    SAS_OPENCL = None 
     
    265176                if os.path.isfile(ico_file): 
    266177                    self.SetIcon(wx.Icon(ico_file, wx.BITMAP_TYPE_ICO)) 
    267         self.path = PATH_APP 
     178        self.path = get_app_dir() 
    268179        self.application_name = APPLICATION_NAME 
    269180        # Application manager 
     
    540451        try: 
    541452            fd = open(file_name, 'w') 
    542         except: 
     453        except Exception: 
    543454            # On Permission denied: IOError 
    544             temp_dir = get_user_directory() 
     455            temp_dir = get_user_dir() 
    545456            temp_file_name = os.path.join(temp_dir, name) 
    546457            fd = open(temp_file_name, 'w') 
     
    15321443            # want Analysis.  This is NOT an issue on the Mac which does not 
    15331444            # have the extra Window menu item. 
    1534             #      March 2016 Code Camp  -- PDB  
     1445            #      March 2016 Code Camp  -- PDB 
    15351446            Tools_pos = self._menubar.FindMenu("Tools") 
    15361447            self._menubar.Insert(Tools_pos+1, self._applications_menu, 
     
    21632074                logger.info("Failed to connect to www.sasview.org") 
    21642075        self._process_version(version_info, standalone=event is None) 
     2076 
    21652077 
    21662078    def _process_version(self, version_info, standalone=True): 
     
    33513263                if basename.lower() in [app_py, app_exe, app_app, app_base]: 
    33523264                    data_base = sys.argv[1] 
    3353                     input_file = os.path.normpath(os.path.join(DATAPATH, 
     3265                    input_file = os.path.normpath(os.path.join(get_app_dir(), 
    33543266                                                               data_base)) 
    33553267        if input_file is None: 
     
    33663278        # do it only the first time app loaded 
    33673279        # delete unused model folder 
    3368         model_folder = os.path.join(PATH_APP, path) 
     3280        model_folder = os.path.join(get_app_dir(), path) 
    33693281        if os.path.exists(model_folder) and os.path.isdir(model_folder): 
    33703282            if len(os.listdir(model_folder)) > 0: 
  • src/sas/sasgui/guiframe/local_perspectives/data_loader/data_loader.py

    r235f514 r914ba0a  
    1111 
    1212from sas.sascalc.dataloader.loader import Loader 
     13 
     14from sas.sasgui import get_local_config 
    1315from sas.sasgui.guiframe.plugin_base import PluginBase 
    1416from sas.sasgui.guiframe.events import StatusEvent 
    1517from sas.sasgui.guiframe.gui_style import GUIFRAME 
    1618from sas.sasgui.guiframe.gui_manager import DEFAULT_OPEN_FOLDER 
    17 try: 
    18     # Try to find a local config 
    19     import imp 
    20     path = os.getcwd() 
    21     if(os.path.isfile("%s/%s.py" % (path, 'local_config'))) or \ 
    22         (os.path.isfile("%s/%s.pyc" % (path, 'local_config'))): 
    23         fObj, path, descr = imp.find_module('local_config', [path]) 
    24         config = imp.load_module('local_config', fObj, path, descr) 
    25     else: 
    26         # Try simply importing local_config 
    27         import local_config as config 
    28 except: 
    29     # Didn't find local config, load the default 
    30     import sas.sasgui.guiframe.config as config 
    31  
    32 if config is None: 
    33     import sas.sasgui.guiframe.config as config 
    34  
    35  
     19 
     20config = get_local_config() 
    3621extension_list = [] 
    3722if config.APPLICATION_STATE_EXTENSION is not None: 
  • src/sas/sasgui/guiframe/startup_configuration.py

    r7432acb r914ba0a  
    1  
    21################################################################################ 
    32#This software was developed by the University of Tennessee as part of the 
    43#Distributed Data Analysis of Neutron Scattering Experiments (DANSE) 
    5 #project funded by the US National Science Foundation.  
     4#project funded by the US National Science Foundation. 
    65# 
    76#See the license text in license.txt 
     
    98#copyright 2009, University of Tennessee 
    109################################################################################ 
     10import os 
     11import copy 
     12 
    1113import wx 
    12 import os 
    13 import sys 
    14 import copy 
    15 #import sas.sasgui.guiframe.gui_manager as gui 
    16 from sas.sasgui.guiframe.events import StatusEvent   
     14 
     15from sas.sasgui import get_custom_config_path 
     16from sas.sasgui.guiframe.events import StatusEvent 
    1717from sas.sasgui.guiframe.gui_style import GUIFRAME 
    1818from sas.sasgui.guiframe import gui_manager as CURRENT 
    19 from sas.sasgui.guiframe.customdir  import SetupCustom 
     19 
     20 
    2021# default configuration 
    2122DEFAULT_STRINGS = {'GUIFRAME_WIDTH':-1, 
     
    6263    """ 
    6364    def __init__(self, parent, gui, id=-1, title="Startup Setting"): 
    64         wx.Dialog.__init__(self, parent, id, title,  
     65        wx.Dialog.__init__(self, parent, id, title, 
    6566                           size=(PANEL_WIDTH, PANEL_HEIGHT)) 
    6667        # parent 
    6768        self.parent = parent 
    68         self.path = SetupCustom().find_dir() 
    6969        self._gui = gui 
    70         # font size  
     70        # font size 
    7171        self.SetWindowVariant(variant=FONT_VARIANT) 
    7272        self.current_string = copy.deepcopy(CURRENT_STRINGS) 
     
    7676        title_text = wx.StaticText(self, id=wx.NewId(), label='Set interface configuration') 
    7777 
    78         default_bt = wx.RadioButton(self, -1, 'Default View', (15, 30),  
     78        default_bt = wx.RadioButton(self, -1, 'Default View', (15, 30), 
    7979                                    style=wx.RB_GROUP) 
    8080        default_bt.Bind(wx.EVT_RADIOBUTTON, self.OnDefault) 
     
    8787        note_txt = wx.StaticText(self, -1, msg, (15, 75)) 
    8888        note_txt.SetForegroundColour("black") 
    89          
     89 
    9090        hbox = wx.BoxSizer(wx.HORIZONTAL) 
    9191        okButton = wx.Button(self, wx.ID_OK, 'Set', size=(70, 25)) 
    92         closeButton = wx.Button(self,wx.ID_CANCEL, 'Cancel', size=(70, 25)) 
     92        closeButton = wx.Button(self, wx.ID_CANCEL, 'Cancel', size=(70, 25)) 
    9393        hbox.Add(closeButton, 1, wx.RIGHT, 5) 
    9494        hbox.Add(okButton, 1, wx.RIGHT, 5) 
     
    102102        self.SetSizer(vbox) 
    103103 
    104          
     104 
    105105    def OnDefault(self, event=None): 
    106106        """ 
     
    111111        self.return_string = copy.deepcopy(DEFAULT_STRINGS) 
    112112        return self.return_string 
    113          
     113 
    114114    def OnCurrent(self, event=None): 
    115115        """ 
     
    134134                p_size = CURRENT_STRINGS['PLOPANEL_WIDTH'] 
    135135            self.current_string['PLOPANEL_WIDTH'] = p_size 
    136              
     136 
    137137            try: 
    138138                control_frame = self.parent.get_current_perspective().frame 
     
    143143                self.current_string['CONTROL_WIDTH'] = -1 
    144144                self.current_string['CONTROL_HEIGHT'] = -1 
    145                  
     145 
    146146            data_pw, _ = self.parent.panels["data_panel"].frame.GetSizeTuple() 
    147147            if data_pw is None: 
    148148                data_pw = CURRENT_STRINGS['DATAPANEL_WIDTH'] 
    149149            self.current_string['DATAPANEL_WIDTH'] = data_pw 
    150              
     150 
    151151            #label = self.parent._data_panel_menu.GetText() 
    152152            label = self.parent.panels['data_panel'].frame.IsShown() 
     
    155155            else: 
    156156                self.current_string['DATALOADER_SHOW'] = False 
    157                  
     157 
    158158            if self.parent._toolbar.IsShown(): 
    159159                self.current_string['TOOLBAR_SHOW'] = True 
    160160            else: 
    161161                self.current_string['TOOLBAR_SHOW'] = False 
    162                  
     162 
    163163            style = self._gui & GUIFRAME.FLOATING_PANEL 
    164             if style == GUIFRAME.FLOATING_PANEL:  
     164            if style == GUIFRAME.FLOATING_PANEL: 
    165165                self.current_string['FIXED_PANEL'] = False 
    166166            else: 
    167167                self.current_string['FIXED_PANEL'] = True 
    168                  
     168 
    169169            if self.parent.panels['default'].frame.IsShown(): 
    170170                self.current_string['WELCOME_PANEL_SHOW'] = True 
     
    182182            self.current_string['DEFAULT_OPEN_FOLDER'] = location 
    183183                        #self.parent._default_save_location.ascii_letters 
    184              
     184 
    185185        except: 
    186186            raise 
     
    188188        self.return_string = self.current_string 
    189189        return self.return_string 
    190      
     190 
     191 
    191192    def write_custom_config(self): 
    192193        """ 
    193             Write custom configuration 
    194         """ 
    195         fname = os.path.join(self.path, 'custom_config.py') 
    196         self.write_string(fname, self.return_string) 
    197  
    198     def write_string(self, fname, strings): 
    199         """ 
    200         Write and Save file 
    201         """ 
    202          
    203         try: 
    204             out_f =  open(fname,'w') 
    205         except : 
    206             raise  #RuntimeError, "Error: Can not change the configuration..." 
    207         out_f.write("#Application appearance custom configuration\n" ) 
    208         for key, item in strings.iteritems(): 
    209             if (key == 'DEFAULT_PERSPECTIVE') or \ 
    210                 (key == 'DEFAULT_OPEN_FOLDER' and item is not None): 
    211                 out_f.write("%s = \"%s\"\n" % (key,str(item))) 
    212             else: 
    213                 out_f.write("%s = %s\n" % (key,str(item))) 
    214      
    215         out_f.close()  
    216          
     194        Write custom configuration 
     195        """ 
     196        path = get_custom_config_path() 
     197        with open(path, 'w') as out_f: 
     198            out_f.write("#Application appearance custom configuration\n") 
     199            for key, item in self.return_string.iteritems(): 
     200                if (key == 'DEFAULT_PERSPECTIVE') or \ 
     201                    (key == 'DEFAULT_OPEN_FOLDER' and item != None): 
     202                    out_f.write("%s = \"%s\"\n" % (key, str(item))) 
     203                else: 
     204                    out_f.write("%s = %s\n" % (key, str(item))) 
  • src/sas/sasgui/plottools/__init__.py

    rd7bb526 refe730d  
    1 import config 
    21from PlotPanel import PlotPanel 
    32from plottables import Data1D, Theory1D 
Note: See TracChangeset for help on using the changeset viewer.