Changeset 83db1cc in sasview for src/sas/sasgui
- Timestamp:
- Sep 27, 2017 10:49:33 AM (7 years ago)
- Branches:
- master, ESS_GUI, ESS_GUI_Docs, ESS_GUI_batch_fitting, ESS_GUI_bumps_abstraction, ESS_GUI_iss1116, ESS_GUI_iss879, ESS_GUI_iss959, ESS_GUI_opencl, ESS_GUI_ordering, ESS_GUI_sync_sascalc, magnetic_scatt, release-4.2.2, ticket-1009, ticket-1094-headless, ticket-1242-2d-resolution, ticket-1243, ticket-1249, ticket885, unittest-saveload
- Children:
- fca1f50, ae2f623
- Parents:
- 66000ae (diff), 38a1e63 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent. - Location:
- src/sas/sasgui
- Files:
-
- 1 added
- 22 edited
Legend:
- Unmodified
- Added
- Removed
-
src/sas/sasgui/perspectives/corfunc/media/corfunc_help.rst
rf80b416e rad476d1 9 9 ----------- 10 10 11 This performs a correlation function analysis of one-dimensional 12 SAXS/SANS data, or generates a model-independent volume fraction 13 profile from the SANS from an adsorbed polymer/surfactant layer. 11 This currently performs correlation function analysis on SAXS/SANS data, 12 but in the the future is also planned to generate model-independent volume 13 fraction profiles from the SANS from adsorbed polymer/surfactant layers. 14 The two types of analyses differ in the mathematical transform that is 15 applied to the data (Fourier vs Hilbert). However, both functions are 16 returned in *real space*. 14 17 15 18 A correlation function may be interpreted in terms of an imaginary rod moving 16 through the structure of the material. Î\ :sub:`1D`\ (R) is the probability that 17 a rod of length R moving through the material has equal electron/neutron scattering 18 length density at either end. Hence a frequently occurring spacing within a structure 19 manifests itself as a peak. 20 21 A volume fraction profile :math:`\Phi`\ (z) describes how the density of polymer segments/surfactant molecules varies with distance from an (assumed locally flat) interface. 22 23 Both functions are returned in *real space*. 24 25 The analysis is performed in 3 stages: 26 27 * Extrapolation of the scattering curve to :math:`Q = 0` and 19 through the structure of the material. Î(x) is the probability that a rod of 20 length x has equal electron/neutron scattering length density at either end. 21 Hence a frequently occurring spacing within a structure will manifest itself 22 as a peak in Î(x). *SasView* will return both the one-dimensional ( Î\ :sub:`1`\ (x) ) 23 and three-dimensional ( Î\ :sub:`3`\ (x) ) correlation functions, the difference 24 being that the former is only averaged in the plane of the scattering vector. 25 26 A volume fraction profile :math:`\Phi`\ (z) describes how the density of polymer 27 segments/surfactant molecules varies with distance, z, normal to an (assumed 28 locally flat) interface. The form of :math:`\Phi`\ (z) can provide information 29 about the arrangement of polymer/surfactant molecules at the interface. The width 30 of the profile provides measures of the layer thickness, and the area under 31 the profile is related to the amount of material that is adsorbed. 32 33 Both analyses are performed in 3 stages: 34 35 * Extrapolation of the scattering curve to :math:`Q = 0` and toward 28 36 :math:`Q = \infty` 29 37 * Smoothed merging of the two extrapolations into the original data 30 38 * Fourier / Hilbert Transform of the smoothed data to give the correlation 31 function /volume fraction profile, respectively32 * (Optional) Interpretation of the 1D correlation function based on an ideal33 lamellar morphology39 function or volume fraction profile, respectively 40 * (Optional) Interpretation of Î\ :sub:`1`\ (x) assuming the sample conforms 41 to an ideal lamellar morphology 34 42 35 43 .. ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ 44 36 45 37 46 Extrapolation … … 41 50 ................ 42 51 43 The data are extrapolated to Q = 0 by fitting a Guinier modelto the data44 points in the low- Qrange.52 The data are extrapolated to q = 0 by fitting a Guinier function to the data 53 points in the low-q range. 45 54 46 55 The equation used is: 47 56 48 57 .. math:: 49 I(Q) = Ae^{Bq^2} 50 51 The Guinier model assumes that the small angle scattering arises from particles 52 and that parameter :math:`B` is related to the radius of gyration of those 53 particles. This has dubious applicability to polymer systems. However, the 54 correlation function is affected by the Guinier back-extrapolation to the 55 greatest extent at large values of R and so only has a 56 small effect on the final analysis. 58 I(q) = A e^{Bq^2} 59 60 Where the parameter :math:`B` is related to the effective radius-of-gyration of 61 a spherical object having the same small-angle scattering in this region. 62 63 Note that as q tends to zero this function tends to a limiting value and is 64 therefore less appropriate for use in systems where the form factor does not 65 do likewise. However, because of the transform, the correlation functions are 66 most affected by the Guinier back-extrapolation at *large* values of x where 67 the impact on any extrapolated parameters will be least significant. 57 68 58 69 To :math:`Q = \infty` 59 70 ..................... 60 71 61 The data are extrapolated to Q = :math:`\infty` by fitting a Porod model to 62 the data points in the high-Q range. 72 The data are extrapolated towards q = :math:`\infty` by fitting a Porod model to 73 the data points in the high-q range and then computing the extrapolation to 100 74 times the maximum q value in the experimental dataset. This should be more than 75 sufficient to ensure that on transformation any truncation artefacts introduced 76 are at such small values of x that they can be safely ignored. 63 77 64 78 The equation used is: 65 79 66 80 .. math:: 67 I( Q) = K Q^{-4}e^{-Q^2\sigma^2} + Bg68 69 Where :math:`Bg` is the background, :math:`K` is the Porod 70 constant, and :math:`\sigma` (which must be > 0) describes the width of the electron or neutron scattering length density profile at the interface between the crystalline and amorphous 71 regions as shown below.81 I(q) = K q^{-4}e^{-q^2\sigma^2} + Bg 82 83 Where :math:`Bg` is the background, :math:`K` is the Porod constant, and :math:`\sigma` (which 84 must be > 0) describes the width of the electron/neutron scattering length density 85 profile at the interface between the crystalline and amorphous regions as shown below. 72 86 73 87 .. figure:: fig1.png … … 78 92 --------- 79 93 80 The extrapolated data set consists of the Guinier back-extrapolation from Q~0 81 up to the lowest Q value in the original data, then the original scattering data, and the Porod tail-fit beyond this. The joins between the original data and the Guinier/Porod fits are smoothed using the algorithm below to avoid the formation of ripples in the transformed data. 94 The extrapolated data set consists of the Guinier back-extrapolation from q ~ 0 95 up to the lowest q value in the original data, then the original scattering data, 96 and then the Porod tail-fit beyond this. The joins between the original data and 97 the Guinier/Porod extrapolations are smoothed using the algorithm below to try 98 and avoid the formation of truncation ripples in the transformed data: 82 99 83 100 Functions :math:`f(x_i)` and :math:`g(x_i)` where :math:`x_i \in \left\{ … … 94 111 95 112 96 Transform 97 --------- 113 Transformation 114 -------------- 98 115 99 116 Fourier 100 117 ....... 101 118 102 If "Fourier" is selected for the transform type, the analysiswill perform a119 If "Fourier" is selected for the transform type, *SasView* will perform a 103 120 discrete cosine transform on the extrapolated data in order to calculate the 104 1D correlation function :105 106 .. math:: 107 \Gamma _{1 D}(R) = \frac{1}{Q^{*}} \int_{0}^{\infty }I(q) q^{2} cos(qR) dq108 109 where Q\ :sup:`*` is the Scattering Invariant.121 1D correlation function as: 122 123 .. math:: 124 \Gamma _{1}(x) = \frac{1}{Q^{*}} \int_{0}^{\infty }I(q) q^{2} cos(qx) dq 125 126 where Q\ :sup:`*` is the Scattering (also called Porod) Invariant. 110 127 111 128 The following algorithm is applied: … … 116 133 N-1, N 117 134 118 The 3D correlation function is also calculated: 119 120 .. math:: 121 \Gamma _{3D}(R) = \frac{1}{Q^{*}} \int_{0}^{\infty}I(q) q^{2} 122 \frac{sin(qR)}{qR} dq 135 The 3D correlation function is calculated as: 136 137 .. math:: 138 \Gamma _{3}(x) = \frac{1}{Q^{*}} \int_{0}^{\infty}I(q) q^{2} 139 \frac{sin(qx)}{qx} dq 140 141 .. note:: It is always advisable to inspect Î\ :sub:`1`\ (x) and Î\ :sub:`3`\ (x) 142 for artefacts arising from the extrapolation and transformation processes: 143 144 - do they tend to zero as x tends to :math:`\infty`? 145 - do they smoothly curve onto the ordinate at x = 0? (if not check the value 146 of :math:`\sigma` is sensible) 147 - are there ripples at x values corresponding to (2 :math:`pi` over) the two 148 q values at which the extrapolated and experimental data are merged? 149 - are there any artefacts at x values corresponding to 2 :math:`pi` / q\ :sub:`max` in 150 the experimental data? 151 - and lastly, do the significant features/peaks in the correlation functions 152 actually correspond to anticpated spacings in the sample?!!! 153 154 Finally, the program calculates the interface distribution function (IDF) g\ :sub:`1`\ (x) as 155 the discrete cosine transform of: 156 157 .. math:: 158 -q^{4} I(q) 159 160 The IDF is proportional to the second derivative of Î\ :sub:`1`\ (x). 123 161 124 162 Hilbert 125 163 ....... 126 164 127 165 If "Hilbert" is selected for the transform type, the analysis will perform a 128 166 Hilbert transform on the extrapolated data in order to calculate the Volume 129 167 Fraction Profile. 130 168 131 .. note:: Th isfunctionality is not yet implemented in SasView.169 .. note:: The Hilbert transform functionality is not yet implemented in SasView. 132 170 133 171 … … 138 176 .................... 139 177 140 Once the correlation function has been calculated it may be interpreted by clicking the "Compute Parameters" button. 141 142 The correlation function is interpreted in terms of an ideal lamellar 143 morphology, and structural parameters are obtained from it as shown below. 144 It should be noted that a small beam size is assumed; ie, no de-smearing is 145 performed. 178 Once the correlation functions have been calculated *SasView* can be asked to 179 try and interpret Î\ :sub:`1`\ (x) in terms of an ideal lamellar morphology 180 as shown below. 146 181 147 182 .. figure:: fig2.png 148 183 :align: center 149 184 150 The structural parameters obtained are:185 The structural parameters extracted are: 151 186 152 187 * Long Period :math:`= L_p` … … 160 195 ....................... 161 196 162 SasView does not provide any automatic interpretation of volume fraction profiles in the same way that it does for correlation functions. However, a number of structural parameters are obtainable by other means: 197 SasView does not provide any automatic interpretation of volume fraction profiles 198 in the same way that it does for correlation functions. However, a number of 199 structural parameters are obtainable by other means: 163 200 164 201 * Surface Coverage :math:`=\theta` … … 175 212 :align: center 176 213 214 The reader is directed to the references for information on these parameters. 177 215 178 216 References 179 217 ---------- 180 218 219 Correlation Function 220 .................... 221 181 222 Strobl, G. R.; Schneider, M. *J. Polym. Sci.* (1980), 18, 1343-1359 182 223 … … 189 230 Baltá Calleja, F. J.; Vonk, C. G. *X-ray Scattering of Synthetic Poylmers*, Elsevier. Amsterdam (1989), 260-270 190 231 232 Göschel, U.; Urban, G. *Polymer* (1995), 36, 3633-3639 233 234 Stribeck, N. *X-Ray Scattering of Soft Matter*, Springer. Berlin (2007), 138-161 235 191 236 :ref:`FDR` (PDF format) 237 238 Volume Fraction Profile 239 ....................... 240 241 Washington, C.; King, S. M. *J. Phys. Chem.*, (1996), 100, 7603-7609 242 243 Cosgrove, T.; King, S. M.; Griffiths, P. C. *Colloid-Polymer Interactions: From Fundamentals to Practice*, Wiley. New York (1999), 193-204 244 245 King, S. M.; Griffiths, P. C.; Cosgrove, T. *Applications of Neutron Scattering to Soft Condensed Matter*, Gordon & Breach. Amsterdam (2000), 77-105 246 247 King, S.; Griffiths, P.; Hone, J.; Cosgrove, T. *Macromol. Symp.* (2002), 190, 33-42 192 248 193 249 .. ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ … … 198 254 Upon sending data for correlation function analysis, it will be plotted (minus 199 255 the background value), along with a *red* bar indicating the *upper end of the 200 low-Q range* (used for back-extrapolation), and 2 *purple* bars indicating the range to be used for forward-extrapolation. These bars may be moved my clicking and 201 dragging, or by entering appropriate values in the Q range input boxes. 256 low-Q range* (used for Guinier back-extrapolation), and 2 *purple* bars indicating 257 the range to be used for Porod forward-extrapolation. These bars may be moved by 258 grabbing and dragging, or by entering appropriate values in the Q range input boxes. 202 259 203 260 .. figure:: tutorial1.png 204 261 :align: center 205 262 206 Once the Q ranges have been set, click the "Calculate" button to determine the background level. Alternatively, enter your own value into the field. If the box turns yellow this indicates that background subtraction has resulted in some negative intensities. 207 208 Click the "Extrapolate" button to extrapolate the data and plot the extrapolation in the same figure. The values of the parameters used for the Guinier and Porod models will also be shown in the "Extrapolation Parameters" section of the window. 263 Once the Q ranges have been set, click the "Calculate Bg" button to determine the 264 background level. Alternatively, enter your own value into the box. If the box turns 265 yellow this indicates that background subtraction has created some negative intensities. 266 267 Now click the "Extrapolate" button to extrapolate the data. The graph window will update 268 to show the extrapolated data, and the values of the parameters used for the Guinier and 269 Porod extrapolations will appear in the "Extrapolation Parameters" section of the SasView 270 GUI. 209 271 210 272 .. figure:: tutorial2.png … … 214 276 buttons: 215 277 216 * **Fourier** Perform a Fourier Transform to calculate the correlation217 function 218 * **Hilbert** Perform a Hilbert Transform to calculate the volume fraction278 * **Fourier**: to perform a Fourier Transform to calculate the correlation 279 functions 280 * **Hilbert**: to perform a Hilbert Transform to calculate the volume fraction 219 281 profile 220 282 221 Click the "Transform" button to perform the selected transform and plot 222 the result in a new graph window. 223 224 If a Fourier Transform was performed, the "Compute Parameters" button can now be clicked to interpret the correlation function as described earlier. 283 and click the "Transform" button to perform the selected transform and plot 284 the results. 225 285 226 286 .. figure:: tutorial3.png 227 287 :align: center 228 288 289 If a Fourier Transform was performed, the "Compute Parameters" button can now be 290 clicked to interpret the correlation function as described earlier. The parameters 291 will appear in the "Output Parameters" section of the SasView GUI. 292 293 .. figure:: tutorial4.png 294 :align: center 295 229 296 230 297 .. note:: 231 This help document was last changed by Steve King, 08Oct2016298 This help document was last changed by Steve King, 26Sep2017 -
src/sas/sasgui/__init__.py
rd7bb526 rc6bdb3b 1 import sys 2 import os 3 from os.path import exists, expanduser, dirname, realpath, join as joinpath 4 5 6 def 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 13 def make_user_folder(): 14 path = joinpath(expanduser("~"),'.sasview') 15 if not exists(path): 16 os.mkdir(path) 17 return path 18 19 20 def 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 44 USER_FOLDER = make_user_folder() 45 APP_FOLDER = find_app_folder() 46 47 48 def get_app_dir(): 49 return APP_FOLDER 50 51 def get_user_dir(): 52 return USER_FOLDER 53 54 def 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 63 def get_local_config(): 64 global _config_cache 65 if not _config_cache: 66 _config_cache = _load_config() 67 return _config_cache 68 69 def _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 r6e50a8d 15 15 from collections import defaultdict, OrderedDict 16 16 17 from sas.sasgui import get_user_dir 18 17 19 USER_FILE = 'categories.json' 18 20 19 21 logger = logging.getLogger(__name__) 20 22 21 class CategoryInstaller :23 class CategoryInstaller(object): 22 24 """ 23 25 Class for making sure all category stuff is installed … … 25 27 Note - class is entirely static! 26 28 """ 27 28 def __init__(self):29 """ initialization """30 31 @staticmethod32 def _get_installed_model_dir():33 """34 returns the dir where installed_models.txt should be35 """36 import sas.sascalc.dataloader.readers37 return sas.sascalc.dataloader.readers.get_data_path()38 39 @staticmethod40 def _get_models_py_dir():41 """42 returns the dir where models.py should be43 """44 import sas.sasgui.perspectives.fitting.models45 return sas.sasgui.perspectives.fitting.models.get_model_python_path()46 47 @staticmethod48 def _get_default_cat_file_dir():49 """50 returns the dir where default_cat.j should be51 """52 # The default categories file is usually found with the code, except53 # when deploying using py2app (it will be in Contents/Resources), or54 # py2exe (it will be in the exec dir).55 import sas.sasview56 cat_file = "default_categories.json"57 58 possible_cat_file_paths = [59 os.path.join(os.path.split(sas.sasview.__file__)[0], cat_file), # Source60 os.path.join(os.path.dirname(sys.executable), '..', 'Resources', cat_file), # Mac61 os.path.join(os.path.dirname(sys.executable), cat_file) # Windows62 ]63 64 for path in possible_cat_file_paths:65 if os.path.isfile(path):66 return os.path.dirname(path)67 68 raise RuntimeError('CategoryInstaller: Could not find folder containing default categories')69 70 @staticmethod71 def _get_home_dir():72 """73 returns the users sasview config dir74 """75 return os.path.join(os.path.expanduser("~"), ".sasview")76 29 77 30 @staticmethod … … 85 38 by_model_dict = defaultdict(list) 86 39 model_enabled_dict = defaultdict(bool) 87 40 88 41 for category in master_category_dict: 89 42 for (model, enabled) in master_category_dict[category]: … … 96 49 def _regenerate_master_dict(by_model_dict, model_enabled_dict): 97 50 """ 98 regenerates master_category_dict from by_model_dict 51 regenerates master_category_dict from by_model_dict 99 52 and model_enabled_dict 100 53 returns the master category dictionary … … 112 65 returns the user data file, eg .sasview/categories.json.json 113 66 """ 114 return os.path.join( CategoryInstaller._get_home_dir(), USER_FILE)67 return os.path.join(get_user_dir(), USER_FILE) 115 68 116 69 @staticmethod … … 150 103 model_name, enabled = master_category_dict[cat][ind] 151 104 if model_name not in _model_list: 152 del_name = True 105 del_name = True 153 106 try: 154 107 by_model_dict.pop(model_name) -
src/sas/sasgui/guiframe/__init__.py
r959eb01 r5a405bd 14 14 # Check for data path next to exe/zip file. 15 15 # If we are inside a py2exe zip file, we need to go up 16 # to get to the directory containing 16 # to get to the directory containing 17 17 # the media for this module 18 18 path = os.path.dirname(__file__) … … 27 27 return module_media_path 28 28 return media_path 29 29 30 30 raise RuntimeError('Could not find guiframe images files') 31 31 … … 40 40 # Check for data path next to exe/zip file. 41 41 # If we are inside a py2exe zip file, we need to go up 42 # to get to the directory containing 42 # to get to the directory containing 43 43 # the media for this module 44 44 path = os.path.dirname(__file__) … … 58 58 """ 59 59 Return the data files associated with guiframe images . 60 60 61 61 The format is a list of (directory, [files...]) pairs which can be 62 62 used directly in setup(...,data_files=...) for setup.py. … … 64 64 """ 65 65 data_files = [] 66 path = get_data_path(media="images") 67 for f in findall(path): 68 data_files.append(('images/icons', [f])) 69 path = get_media_path(media="media") 70 for f in findall(path): 71 data_files.append(('media/guiframe_media', [f])) 66 data_files.append(('images/icons', findall(get_data_path("images")))) 67 data_files.append(('media/guiframe_media', findall(get_data_path("media")))) 72 68 73 69 return data_files -
src/sas/sasgui/guiframe/aboutbox.py
rf2ea95a r724af06 24 24 import os.path 25 25 import 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 27 from sas.sasgui import get_local_config 28 config = get_local_config() 40 29 41 30 def launchBrowser(url): -
src/sas/sasgui/guiframe/acknowledgebox.py
r74c8cd0 r914ba0a 12 12 import wx.lib.hyperlink 13 13 from wx.lib.expando import ExpandoTextCtrl 14 import random15 import os.path16 import os17 try:18 # Try to find a local config19 import imp20 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_config27 import local_config as config28 except:29 # Didn't find local config, load the default30 import config31 14 15 from sas.sasgui import get_local_config 16 config = get_local_config() 32 17 33 18 class DialogAcknowledge(wx.Dialog): -
src/sas/sasgui/guiframe/config.py
rf80b416e r724af06 1 1 """ 2 2 Application settings 3 3 """ 4 4 from __future__ import print_function … … 6 6 import time 7 7 import os 8 import logging 9 8 10 from sas.sasgui.guiframe.gui_style import GUIFRAME 9 11 import sas.sasview 10 import logging11 12 12 13 13 logger = logging.getLogger(__name__) … … 75 75 _ansto_logo = os.path.join(icon_path, "ansto_logo.png") 76 76 _tudelft_logo = os.path.join(icon_path, "tudelft_logo.png") 77 _dls_logo = os.path.join(icon_path, "dls_logo.png") 77 78 _nsf_logo = os.path.join(icon_path, "nsf_logo.png") 78 79 _danse_logo = os.path.join(icon_path, "danse_logo.png") … … 147 148 SAS_OPENCL = None 148 149 150 # Time out for updating sasview 151 UPDATE_TIMEOUT = 2 152 149 153 def printEVT(message): 150 154 if __EVT_DEBUG__: -
src/sas/sasgui/guiframe/customdir.py
r959eb01 rc6bdb3b 1 1 # Setup and find Custom config dir 2 from __future__ import print_function 3 2 4 import os.path 5 import logging 3 6 import shutil 4 7 5 CONF_DIR = 'config' 6 APPLICATION_NAME = 'sasview' 8 from sasmodels.custom import load_module_from_path 7 9 8 def _find_usersasview_dir(): 9 """ 10 Find and return user/.sasview dir 11 """ 12 return os.path.join(os.path.expanduser("~"), ("." + APPLICATION_NAME)) 10 from sas.sasgui import get_custom_config_path, get_app_dir 13 11 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) 12 logger = logging.getLogger(__name__) 21 13 22 def _setup_conf_dir(path): 14 _config_cache = None 15 def setup_custom_config(): 23 16 """ 24 17 Setup the custom config dir and cat file 25 18 """ 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 58 23 59 24 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) 25 def _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 48 def _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 33 33 from sas.sasgui.guiframe.local_perspectives.plotting.SimplePlot \ 34 34 import PlotFrame as QucikPlotDialog 35 import sas.sasgui.guiframe.config as config 35 from sas.sasgui import get_local_config 36 37 config = get_local_config() 36 38 37 39 # Check version -
src/sas/sasgui/guiframe/documentation_window.py
rf80b416e r724af06 27 27 WX_SUPPORTS_HTML2 = False 28 28 29 from .gui_managerimport get_app_dir29 from sas.sasgui import get_app_dir 30 30 31 31 # Don't use wx html renderer on windows. -
src/sas/sasgui/guiframe/gui_manager.py
r2f22db9 r914ba0a 22 22 import re 23 23 import logging 24 import httplib25 24 import traceback 26 25 import urllib 27 import urllib228 26 import json 29 27 28 from matplotlib import _pylab_helpers 29 30 from sas.sasgui import get_local_config, get_app_dir, get_user_dir 30 31 from sas.sasgui.guiframe.events import EVT_CATEGORY 31 32 from sas.sasgui.guiframe.events import EVT_STATUS … … 46 47 from sas.sascalc.dataloader.loader import Loader 47 48 from sas.sasgui.guiframe.proxy import Connection 48 from matplotlib import _pylab_helpers49 from sas.sasgui.guiframe.customdir import setup_custom_config 49 50 50 51 logger = logging.getLogger(__name__) 51 52 52 warnings.simplefilter("ignore") 53 53 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) 54 config = get_local_config() 55 custom_config = setup_custom_config() 146 56 147 57 # read some constants from config … … 177 87 DEFAULT_OPEN_FOLDER = os.path.abspath(open_folder) 178 88 else: 179 DEFAULT_OPEN_FOLDER = PATH_APP89 DEFAULT_OPEN_FOLDER = get_app_dir() 180 90 SAS_OPENCL = custom_config.SAS_OPENCL 181 91 except: … … 192 102 DEFAULT_PERSPECTIVE = None 193 103 CLEANUP_PLOT = False 104 DEFAULT_OPEN_FOLDER = get_app_dir() 194 105 DEFAULT_OPEN_FOLDER = PATH_APP 195 106 SAS_OPENCL = None … … 265 176 if os.path.isfile(ico_file): 266 177 self.SetIcon(wx.Icon(ico_file, wx.BITMAP_TYPE_ICO)) 267 self.path = PATH_APP178 self.path = get_app_dir() 268 179 self.application_name = APPLICATION_NAME 269 180 # Application manager … … 540 451 try: 541 452 fd = open(file_name, 'w') 542 except :453 except Exception: 543 454 # On Permission denied: IOError 544 temp_dir = get_user_dir ectory()455 temp_dir = get_user_dir() 545 456 temp_file_name = os.path.join(temp_dir, name) 546 457 fd = open(temp_file_name, 'w') … … 1532 1443 # want Analysis. This is NOT an issue on the Mac which does not 1533 1444 # have the extra Window menu item. 1534 # March 2016 Code Camp -- PDB 1445 # March 2016 Code Camp -- PDB 1535 1446 Tools_pos = self._menubar.FindMenu("Tools") 1536 1447 self._menubar.Insert(Tools_pos+1, self._applications_menu, … … 2163 2074 logger.info("Failed to connect to www.sasview.org") 2164 2075 self._process_version(version_info, standalone=event is None) 2076 2165 2077 2166 2078 def _process_version(self, version_info, standalone=True): … … 3351 3263 if basename.lower() in [app_py, app_exe, app_app, app_base]: 3352 3264 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(), 3354 3266 data_base)) 3355 3267 if input_file is None: … … 3366 3278 # do it only the first time app loaded 3367 3279 # delete unused model folder 3368 model_folder = os.path.join( PATH_APP, path)3280 model_folder = os.path.join(get_app_dir(), path) 3369 3281 if os.path.exists(model_folder) and os.path.isdir(model_folder): 3370 3282 if len(os.listdir(model_folder)) > 0: -
src/sas/sasgui/guiframe/local_perspectives/data_loader/data_loader.py
rdcb91cf r759a8ab 12 12 from sas.sascalc.dataloader.loader import Loader 13 13 from sas.sascalc.dataloader.loader_exceptions import NoKnownLoaderException 14 15 from sas.sasgui import get_local_config 14 16 from sas.sasgui.guiframe.plugin_base import PluginBase 15 17 from sas.sasgui.guiframe.events import StatusEvent 16 18 from sas.sasgui.guiframe.gui_style import GUIFRAME 17 19 from sas.sasgui.guiframe.gui_manager import DEFAULT_OPEN_FOLDER 18 try: 19 # Try to find a local config 20 import imp 21 path = os.getcwd() 22 if(os.path.isfile("%s/%s.py" % (path, 'local_config'))) or \ 23 (os.path.isfile("%s/%s.pyc" % (path, 'local_config'))): 24 fObj, path, descr = imp.find_module('local_config', [path]) 25 config = imp.load_module('local_config', fObj, path, descr) 26 else: 27 # Try simply importing local_config 28 import local_config as config 29 except: 30 # Didn't find local config, load the default 31 import sas.sasgui.guiframe.config as config 32 33 if config is None: 34 import sas.sasgui.guiframe.config as config 35 36 20 21 config = get_local_config() 37 22 extension_list = [] 38 23 if config.APPLICATION_STATE_EXTENSION is not None: -
src/sas/sasgui/guiframe/startup_configuration.py
r7432acb r914ba0a 1 2 1 ################################################################################ 3 2 #This software was developed by the University of Tennessee as part of the 4 3 #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. 6 5 # 7 6 #See the license text in license.txt … … 9 8 #copyright 2009, University of Tennessee 10 9 ################################################################################ 10 import os 11 import copy 12 11 13 import 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 15 from sas.sasgui import get_custom_config_path 16 from sas.sasgui.guiframe.events import StatusEvent 17 17 from sas.sasgui.guiframe.gui_style import GUIFRAME 18 18 from sas.sasgui.guiframe import gui_manager as CURRENT 19 from sas.sasgui.guiframe.customdir import SetupCustom 19 20 20 21 # default configuration 21 22 DEFAULT_STRINGS = {'GUIFRAME_WIDTH':-1, … … 62 63 """ 63 64 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, 65 66 size=(PANEL_WIDTH, PANEL_HEIGHT)) 66 67 # parent 67 68 self.parent = parent 68 self.path = SetupCustom().find_dir()69 69 self._gui = gui 70 # font size 70 # font size 71 71 self.SetWindowVariant(variant=FONT_VARIANT) 72 72 self.current_string = copy.deepcopy(CURRENT_STRINGS) … … 76 76 title_text = wx.StaticText(self, id=wx.NewId(), label='Set interface configuration') 77 77 78 default_bt = wx.RadioButton(self, -1, 'Default View', (15, 30), 78 default_bt = wx.RadioButton(self, -1, 'Default View', (15, 30), 79 79 style=wx.RB_GROUP) 80 80 default_bt.Bind(wx.EVT_RADIOBUTTON, self.OnDefault) … … 87 87 note_txt = wx.StaticText(self, -1, msg, (15, 75)) 88 88 note_txt.SetForegroundColour("black") 89 89 90 90 hbox = wx.BoxSizer(wx.HORIZONTAL) 91 91 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)) 93 93 hbox.Add(closeButton, 1, wx.RIGHT, 5) 94 94 hbox.Add(okButton, 1, wx.RIGHT, 5) … … 102 102 self.SetSizer(vbox) 103 103 104 104 105 105 def OnDefault(self, event=None): 106 106 """ … … 111 111 self.return_string = copy.deepcopy(DEFAULT_STRINGS) 112 112 return self.return_string 113 113 114 114 def OnCurrent(self, event=None): 115 115 """ … … 134 134 p_size = CURRENT_STRINGS['PLOPANEL_WIDTH'] 135 135 self.current_string['PLOPANEL_WIDTH'] = p_size 136 136 137 137 try: 138 138 control_frame = self.parent.get_current_perspective().frame … … 143 143 self.current_string['CONTROL_WIDTH'] = -1 144 144 self.current_string['CONTROL_HEIGHT'] = -1 145 145 146 146 data_pw, _ = self.parent.panels["data_panel"].frame.GetSizeTuple() 147 147 if data_pw is None: 148 148 data_pw = CURRENT_STRINGS['DATAPANEL_WIDTH'] 149 149 self.current_string['DATAPANEL_WIDTH'] = data_pw 150 150 151 151 #label = self.parent._data_panel_menu.GetText() 152 152 label = self.parent.panels['data_panel'].frame.IsShown() … … 155 155 else: 156 156 self.current_string['DATALOADER_SHOW'] = False 157 157 158 158 if self.parent._toolbar.IsShown(): 159 159 self.current_string['TOOLBAR_SHOW'] = True 160 160 else: 161 161 self.current_string['TOOLBAR_SHOW'] = False 162 162 163 163 style = self._gui & GUIFRAME.FLOATING_PANEL 164 if style == GUIFRAME.FLOATING_PANEL: 164 if style == GUIFRAME.FLOATING_PANEL: 165 165 self.current_string['FIXED_PANEL'] = False 166 166 else: 167 167 self.current_string['FIXED_PANEL'] = True 168 168 169 169 if self.parent.panels['default'].frame.IsShown(): 170 170 self.current_string['WELCOME_PANEL_SHOW'] = True … … 182 182 self.current_string['DEFAULT_OPEN_FOLDER'] = location 183 183 #self.parent._default_save_location.ascii_letters 184 184 185 185 except: 186 186 raise … … 188 188 self.return_string = self.current_string 189 189 return self.return_string 190 190 191 191 192 def write_custom_config(self): 192 193 """ 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/perspectives/calculator/__init__.py
r959eb01 r5a405bd 18 18 path = os.path.dirname(__file__) 19 19 #Look for maximum n_dir up of the current dir to find media 20 20 21 21 #for i in range(n_dir): 22 22 i = 0 … … 30 30 return media_path 31 31 i += 1 32 32 33 33 raise RuntimeError('Could not find calculator media files') 34 34 … … 36 36 """ 37 37 Return the data files associated with media calculator. 38 38 39 39 The format is a list of (directory, [files...]) pairs which can be 40 40 used directly in setup(...,data_files=...) for setup.py. … … 42 42 """ 43 43 data_files = [] 44 path = get_data_path(media="media") 45 for f in findall(path): 46 data_files.append(('media/calculator_media', [f])) 44 data_files.append(('media/calculator_media', findall(get_data_path("media")))) 47 45 return data_files -
src/sas/sasgui/perspectives/fitting/__init__.py
r959eb01 r12d3e0e 13 13 # Check for data path next to exe/zip file. 14 14 # If we are inside a py2exe zip file, we need to go up 15 # to get to the directory containing 15 # to get to the directory containing 16 16 # the media for this module 17 17 path = os.path.dirname(__file__) … … 26 26 return module_media_path 27 27 return media_path 28 28 29 29 raise RuntimeError('Could not find models media files') 30 30 … … 32 32 """ 33 33 Return the data files associated with media. 34 34 35 35 The format is a list of (directory, [files...]) pairs which can be 36 36 used directly in setup(...,data_files=...) for setup.py. … … 38 38 """ 39 39 data_files = [] 40 path = os.path.dirname(__file__) 41 p_path = os.path.join(path, 'plugin_models') 42 for f in findall(p_path): 43 data_files.append(('plugin_models', [f])) 44 # path = get_data_path(media="media") 45 for f in findall(path): 46 data_files.append(('media/fitting_media', [f])) 47 40 # Note: windows installer requires the plugin_models directory 41 plugin_models = os.path.join(os.path.dirname(__file__), "plugin_models") 42 data_files.append(('plugin_models', findall(plugin_models))) 43 data_files.append(('media/fitting_media', findall(get_data_path("media")))) 44 48 45 return data_files -
src/sas/sasgui/perspectives/fitting/models.py
r13374be r724af06 15 15 import shutil 16 16 from copy import copy 17 18 from sasmodels.sasview_model import load_custom_model, load_standard_models 19 17 20 # Explicitly import from the pluginmodel module so that py2exe 18 21 # places it in the distribution. The Model1DPlugin class is used 19 22 # as the base class of plug-in models. 23 from sas.sasgui import get_user_dir 20 24 from sas.sascalc.fit.pluginmodel import Model1DPlugin 21 25 from sas.sasgui.guiframe.CategoryInstaller import CategoryInstaller 22 from sasmodels.sasview_model import load_custom_model, load_standard_models23 26 from sas.sasgui.perspectives.fitting.fitpage import CUSTOM_MODEL 24 27 … … 27 30 28 31 PLUGIN_DIR = 'plugin_models' 29 PLUGIN_LOG = os.path.join(os.path.expanduser("~"), '.sasview', PLUGIN_DIR, 30 "plugins.log") 32 PLUGIN_LOG = os.path.join(get_user_dir(), PLUGIN_DIR, "plugins.log") 31 33 PLUGIN_NAME_BASE = '[plug-in] ' 32 34 -
src/sas/sasgui/perspectives/invariant/__init__.py
r959eb01 r5a405bd 15 15 # Check for data path next to exe/zip file. 16 16 # If we are inside a py2exe zip file, we need to go up 17 # to get to the directory containing 17 # to get to the directory containing 18 18 # the media for this module 19 19 path = os.path.dirname(__file__) … … 28 28 return module_media_path 29 29 return media_path 30 30 31 31 raise RuntimeError('Could not find invariant media files') 32 32 … … 34 34 """ 35 35 Return the data files associated with media invariant. 36 36 37 37 The format is a list of (directory, [files...]) pairs which can be 38 38 used directly in setup(...,data_files=...) for setup.py. … … 40 40 """ 41 41 data_files = [] 42 path = get_data_path(media="media") 43 for f in findall(path): 44 data_files.append(('media/invariant_media', [f])) 42 data_files.append(('media/invariant_media', findall(get_data_path("media")))) 45 43 return data_files -
src/sas/sasgui/plottools/__init__.py
rd7bb526 refe730d 1 import config2 1 from PlotPanel import PlotPanel 3 2 from plottables import Data1D, Theory1D -
src/sas/sasgui/plottools/config.py
rd7bb526 ra2a1c20 38 38 import pkg_resources 39 39 pkg_resources.require("matplotlib>=" + plot_version) 40 except :40 except ImportError: 41 41 from distutils.version import LooseVersion as Version 42 42 if Version(matplotlib.__version__) < Version(plot_version):
Note: See TracChangeset
for help on using the changeset viewer.