Changeset 571bf4b in sasview


Ignore:
Timestamp:
Apr 4, 2017 9:42:02 AM (7 years ago)
Author:
GitHub <noreply@…>
Branches:
master, ESS_GUI, ESS_GUI_Docs, ESS_GUI_batch_fitting, ESS_GUI_bumps_abstraction, ESS_GUI_iss1116, ESS_GUI_iss879, ESS_GUI_iss959, ESS_GUI_opencl, ESS_GUI_ordering, ESS_GUI_sync_sascalc, costrafo411, magnetic_scatt, release-4.2.2, ticket-1009, ticket-1094-headless, ticket-1242-2d-resolution, ticket-1243, ticket-1249, ticket885, unittest-saveload
Children:
b2b3009d, 7b15990
Parents:
a8d79fd (diff), 05d167e (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.
git-author:
Andrew Jackson <andrew.jackson@…> (04/04/17 09:42:02)
git-committer:
GitHub <noreply@…> (04/04/17 09:42:02)
Message:

Merge pull request #41 from SasView?/update-mac-build-instructions

Add OSX Build Instructions

Files:
1 added
20 edited
1 moved

Legend:

Unmodified
Added
Removed
  • INSTALL.txt

    rd09f0ae1 r26c9b85  
    22================================ 
    33 
     4Note - at the current time sasview will only run in gui form under Python 2. 
    45 
    5 The build works in the usualy pythonic way: 
     6Before trying to install and run sasview you'll need to check what 
     7dependencies are required: 
     8 
     9$ python check_packages.py 
     10 
     11Many of these are available from PyPi, but some (e.g. h5py) may require more 
     12involvement to build and install. If you use the conda package manager then 
     13many of the pre-built dependencies are available there. This may be the easiest 
     14route if you are on windows. 
     15 
     16The build works in the pythonic way: 
    617 
    718$ python setup.py build      # will build the package underneath 'build/' 
    8 $ python setup.py install    # will install the package 
    9  
     19$ python setup.py install    # will install the package into site-packages 
    1020 
    1121 
     
    1424$ python run.py              # will run the code in place (building the C code once, if required) 
    1525 
     26On OSX or windows you may need to use: 
    1627 
    17  
    18 To check all dependencies are met: 
    19  
    20 $ python deps.py 
    21 $ python check_packages.py  
    22  
    23 Both tell you different parts of the story, unfortunately. 
    24  
     28$ pythonw run.py 
    2529 
    2630 
  • LICENSE.TXT

    r7c05b63 ra3e3ef5  
    1 Copyright (c) 2009-2016, SasView Developers 
     1Copyright (c) 2009-2017, SasView Developers 
    22All rights reserved. 
    33 
  • check_packages.py

    r131d94b rf433e6a  
    22Checking and reinstalling the external packages 
    33""" 
    4 import os 
     4from __future__ import print_function 
     5 
    56import sys 
    67 
     
    1415    sys.modules['Image'] = PIL.Image 
    1516 
     17if sys.version_info[0] > 2: 
     18    print("To use the sasview GUI you must use Python 2\n") 
    1619 
    1720common_required_package_list = { 
    18     'setuptools':{'version':'0.6c11','import_name':'setuptools','test':'__version__'}, 
    19     'pyparsing':{'version':'1.5.5','import_name':'pyparsing','test':'__version__'}, 
    20     'html5lib':{'version':'0.95','import_name':'html5lib','test':'__version__'}, 
    21     'reportlab':{'version':'2.5','import_name':'reportlab','test':'Version'}, 
    22     'h5py':{'version':'2.5','import_name':'h5py','test':'__version__'}, 
    23     'lxml':{'version':'2.3','import_name':'lxml.etree','test':'LXML_VERSION'}, 
    24     'PIL':{'version':'1.1.7','import_name':'Image','test':'VERSION'}, 
    25     'pylint':{'version':None,'import_name':'pylint','test':None}, 
    26     'periodictable':{'version':'1.3.0','import_name':'periodictable','test':'__version__'}, 
    27     'bumps':{'version':'0.7.5.9','import_name':'bumps','test':'__version__'}, 
    28     'numpy':{'version':'1.7.1','import_name':'numpy','test':'__version__'}, 
    29     'scipy':{'version':'0.18.0','import_name':'scipy','test':'__version__'}, 
    30     'wx':{'version':'2.8.12.1','import_name':'wx','test':'__version__'}, 
    31     'matplotlib':{'version':'1.1.0','import_name':'matplotlib','test':'__version__'}, 
    32     'xhtml2pdf':{'version':'3.0.33','import_name':'xhtml2pdf','test':'__version__'}, 
    33     'sphinx':{'version':'1.2.1','import_name':'sphinx','test':'__version__'}, 
    34     'unittest-xml-reporting':{'version':'1.10.0','import_name':'xmlrunner','test':'__version__'}, 
    35     'pyopencl':{'version':'2015.1','import_name':'pyopencl','test':'VERSION_TEXT'}, 
     21    'setuptools': {'version': '0.6c11', 'import_name': 'setuptools', 'test': '__version__'}, 
     22    'pyparsing': {'version': '1.5.5', 'import_name': 'pyparsing', 'test': '__version__'}, 
     23    'html5lib': {'version': '0.95', 'import_name': 'html5lib', 'test': '__version__'}, 
     24    'reportlab': {'version': '2.5', 'import_name': 'reportlab', 'test': 'Version'}, 
     25    'h5py': {'version': '2.5', 'import_name': 'h5py', 'test': '__version__'}, 
     26    'lxml': {'version': '2.3', 'import_name': 'lxml.etree', 'test': 'LXML_VERSION'}, 
     27    'PIL': {'version': '1.1.7', 'import_name': 'Image', 'test': 'VERSION'}, 
     28    'pylint': {'version': None, 'import_name': 'pylint', 'test': None}, 
     29    'periodictable': {'version': '1.3.0', 'import_name': 'periodictable', 'test': '__version__'}, 
     30    'bumps': {'version': '0.7.5.9', 'import_name': 'bumps', 'test': '__version__'}, 
     31    'numpy': {'version': '1.7.1', 'import_name': 'numpy', 'test': '__version__'}, 
     32    'scipy': {'version': '0.18.0', 'import_name': 'scipy', 'test': '__version__'}, 
     33    'wx': {'version': '2.8.12.1', 'import_name': 'wx', 'test': '__version__'}, 
     34    'matplotlib': {'version': '1.1.0', 'import_name': 'matplotlib', 'test': '__version__'}, 
     35    'xhtml2pdf': {'version': '3.0.33', 'import_name': 'xhtml2pdf', 'test': '__version__'}, 
     36    'sphinx': {'version': '1.2.1', 'import_name': 'sphinx', 'test': '__version__'}, 
     37    'unittest-xml-reporting': {'version': '1.10.0', 'import_name': 'xmlrunner', 'test': '__version__'}, 
     38    'pyopencl': {'version': '2015.1', 'import_name': 'pyopencl', 'test': 'VERSION_TEXT'}, 
    3639} 
    3740win_required_package_list = { 
    38     'comtypes':{'version':'0.6.2','import_name':'comtypes','test':'__version__'}, 
    39     'pywin':{'version':'217','import_name':'pywin','test':'__version__'}, 
    40     'py2exe':{'version':'0.6.9','import_name':'py2exe','test':'__version__'}, 
     41    'comtypes': {'version': '0.6.2', 'import_name': 'comtypes', 'test': '__version__'}, 
     42    'pywin': {'version': '217', 'import_name': 'pywin', 'test': '__version__'}, 
     43    'py2exe': {'version': '0.6.9', 'import_name': 'py2exe', 'test': '__version__'}, 
    4144} 
    4245mac_required_package_list = { 
    43     'py2app':{'version':None,'import_name':'py2app','test':'__version__'}, 
     46    'py2app': {'version': None, 'import_name': 'py2app', 'test': '__version__'}, 
    4447} 
    4548 
    4649deprecated_package_list = { 
    47     'pyPdf':{'version':'1.13','import_name':'pyPdf','test':'__version__'}, 
     50    'pyPdf': {'version': '1.13', 'import_name': 'pyPdf', 'test': '__version__'}, 
    4851} 
    4952 
    50 print "Checking Required Package Versions...." 
    51 print 
    52 print "Common Packages" 
    53 for package_name,test_vals in common_required_package_list.iteritems(): 
     53print("Checking Required Package Versions....\n") 
     54print("Common Packages") 
     55 
     56for package_name, test_vals in common_required_package_list.items(): 
    5457    try: 
    55         i = __import__(test_vals['import_name'],fromlist=['']) 
     58        i = __import__(test_vals['import_name'], fromlist=['']) 
    5659        if test_vals['test'] == None: 
    57             print "%s Installed (Unknown version)" % package_name 
     60            print("%s Installed (Unknown version)" % package_name) 
    5861        elif package_name == 'lxml': 
    59             verstring = str(getattr(i,'LXML_VERSION')) 
    60             print "%s Version Installed: %s"% (package_name,verstring.replace(', ','.').lstrip('(').rstrip(')')) 
     62            verstring = str(getattr(i, 'LXML_VERSION')) 
     63            print("%s Version Installed: %s"% (package_name, verstring.replace(', ', '.').lstrip('(').rstrip(')'))) 
    6164        else: 
    62             print "%s Version Installed: %s"% (package_name,getattr(i,test_vals['test'])) 
    63     except: 
    64         print '%s NOT INSTALLED'% package_name 
     65            print("%s Version Installed: %s"% (package_name, getattr(i, test_vals['test']))) 
     66    except ImportError: 
     67        print('%s NOT INSTALLED'% package_name) 
    6568 
    6669if sys.platform == 'win32': 
    67     print 
    68     print "Windows Specific Packages:" 
    69     for package_name,test_vals in win_required_package_list.iteritems(): 
     70    print("") 
     71    print("Windows Specific Packages:") 
     72    for package_name, test_vals in win_required_package_list.items(): 
    7073        try: 
    7174            if package_name == "pywin": 
    7275                import win32api 
    73                 fixed_file_info = win32api.GetFileVersionInfo(win32api.__file__,'\\') 
    74                 print "%s Version Installed: %s"% (package_name,fixed_file_info['FileVersionLS'] >> 16) 
     76                fixed_file_info = win32api.GetFileVersionInfo(win32api.__file__, '\\') 
     77                print("%s Version Installed: %s"% (package_name, fixed_file_info['FileVersionLS'] >> 16)) 
    7578            else: 
    76                 i = __import__(test_vals['import_name'],fromlist=['']) 
    77                 print "%s Version Installed: %s"% (package_name,getattr(i,test_vals['test'])) 
    78         except: 
    79             print '%s NOT INSTALLED'% package_name 
     79                i = __import__(test_vals['import_name'], fromlist=['']) 
     80                print("%s Version Installed: %s"% (package_name, getattr(i, test_vals['test']))) 
     81        except ImportError: 
     82            print('%s NOT INSTALLED'% package_name) 
    8083 
    8184if sys.platform == 'darwin': 
    82     print 
    83     print "MacOS Specific Packages:" 
    84     for package_name,test_vals in mac_required_package_list.iteritems(): 
     85    print("") 
     86    print("MacOS Specific Packages:") 
     87    for package_name, test_vals in mac_required_package_list.items(): 
    8588        try: 
    86             i = __import__(test_vals['import_name'],fromlist=['']) 
    87             print "%s Version Installed: %s"% (package_name,getattr(i,test_vals['test'])) 
    88         except: 
    89             print '%s NOT INSTALLED'% package_name 
     89            i = __import__(test_vals['import_name'], fromlist=['']) 
     90            print("%s Version Installed: %s"% (package_name, getattr(i, test_vals['test']))) 
     91        except ImportError: 
     92            print('%s NOT INSTALLED'% package_name) 
    9093 
    9194 
    92 print 
    93 print "Deprecated Packages" 
    94 print "You can remove these unless you need them for other reasons!" 
    95 for package_name,test_vals in deprecated_package_list.iteritems(): 
     95print("") 
     96print("Deprecated Packages") 
     97print("You can remove these unless you need them for other reasons!") 
     98for package_name, test_vals in deprecated_package_list.items(): 
    9699    try: 
    97         i = __import__(test_vals['import_name'],fromlist=['']) 
     100        i = __import__(test_vals['import_name'], fromlist=['']) 
    98101        if package_name == 'pyPdf': 
    99             #pyPdf doesn't have the version number internally 
    100             print 'pyPDF Installed (Version unknown)' 
     102            # pyPdf doesn't have the version number internally 
     103            print('pyPDF Installed (Version unknown)') 
    101104        else: 
    102             print "%s Version Installed: %s"% (package_name,getattr(i,test_vals['test'])) 
    103     except: 
    104         print '%s NOT INSTALLED'% package_name 
     105            print("%s Version Installed: %s"% (package_name, getattr(i, test_vals['test']))) 
     106    except ImportError: 
     107        print('%s NOT INSTALLED'% package_name) 
  • sasview/README.txt

    r220b1e7 r9146ed9  
    441- Features 
    55=========== 
     6    - New in Version 4.1.0 
     7      ------------------ 
     8      This incremental release brings a series of new features and improvements, 
     9      and a host of bug fixes. Of particular note are: 
     10       
     11      - Correlation Function Analysis (Corfunc) 
     12        This performs a correlation function analysis of one-dimensional SAXS/SANS data,  
     13        or generates a model-independent volume fraction profile from the SANS from an  
     14        adsorbed polymer/surfactant layer. 
     15 
     16        A correlation function may be interpreted in terms of an imaginary rod moving  
     17        through the structure of the material. Γ1D(R) is the probability that a rod of  
     18        length R moving through the material has equal electron/neutron scattering  
     19        length density at either end. Hence a frequently occurring spacing within a  
     20        structure manifests itself as a peak. 
     21 
     22        A volume fraction profile \Phi(z) describes how the density of polymer  
     23        segments/surfactant molecules varies with distance from an (assumed locally flat) 
     24        interface. 
     25 
     26      - Fitting of SESANS Data 
     27        Data from Spin-Echo SANS measurements can now be loaded and fitted. The data will  
     28        be plotted against the correct axes and models will automatically perform a Hankel  
     29        transform in order to calculate SESANS from a SANS model. 
     30 
     31      - Documentation 
     32        The documentation has undergone significant checking and updating. 
     33 
     34      - Improvements 
     35        - Correlation function (corfunc) analysis of 1D SAS data added from CCP13 
     36        - File converter tool for multi-file single column data sets 
     37        - SESANS data loading and direct fitting using the Hankel transformation 
     38        - Saving and loading of simultaneous and constrained fits now supported 
     39        - Save states from SasView v3.x.y now loaded using sasmodel model names 
     40        - Saving and loading of projects with 2D fits now supported 
     41        - Loading a project removes all existing data, fits, and plots 
     42        - Structure factor and form factor can be plotted independently 
     43        - OpenCL is disabled by default and can be enabled through a fit menu 
     44        - Data and theory fields are now independently expandable 
     45      - Bug Fixes 
     46        - Fixes #667: Models computed multiple times on parameters changes 
     47        - Fixes #673: Custom models override built in models of same name 
     48        - Fixes #678: Hard crash when running complex models on GPU 
     49        - Fixes $774: Old style plugin models unloadable 
     50        - Fixes #789: stacked disk scale doesn't match cylinder model 
     51        - Fixes #792: core_shell_fractal uses wrong effective radius 
     52        - Fixes #800: Plot range reset on plot redraws 
     53        - Fixes #811 and #825: 2D smearing broken 
     54        - Fixes #815: Integer model parameter handling 
     55        - Fixes #824: Cannot apply sector averaging when no detector data present 
     56        - Fixes #830: Cansas HDF5 reader fully compliant with NXCanSAS v1.0 format 
     57        - Fixes #835: Fractal model breaks with negative Q values 
     58        - Fixes #843: Multilayer vesicle does not define effective radius 
     59        - Fixes #858: Hayter MSA S(Q) returns errors 
     60        - Numerous grammatical and contexual errors in documention 
     61 
     62 
    663    - New in Version 4.0.1 
    764      ------------------ 
     
    426483=============== 
    427484 
     485 
     486   4.1- All systems: 
     487      The conversion to sasmodels infrastructure is ongoing and should be 
     488      completed in the next release. In the meantime this leads to a few known 
     489      issues: 
     490        - The way that orientation is defined is being refactored to address 
     491        long standing issues and comments.  In release 4.1 however only models 
     492        with symmetry (e.g. a=b) have been converted to the new definitions. 
     493        The rest (a <> b <> c - e.g. parellelepiped) maintain the same 
     494        definition as before and will be converted in 4.2.  Note that 
     495        orientational distribution also makes much more sense in the new 
     496        framework.  The documentation should indicate which definition is being 
     497        used for a given model. 
     498        - The infrastructure currently handles internal conversion of old style 
     499        models so that user created models in previous versions should continue 
     500        to work for now. At some point in the future such support will go away. 
     501        Everyone is encouraged to convert to the new structure which should be 
     502        relatively straight forward and provides a number of benefits.  
     503        - In that vein, the distributed models and those generated by the new 
     504        plugin model editor are in the new format, however those generated by 
     505        sum|multiply models are the old style sum|multiply models. This should 
     506        also disappear in the near future  
     507        - The on the fly discovery of plugin models and changes thereto behave 
     508        inconsistently.  If a change to a plugin model does not seem to 
     509        register, the Load Plugin Models (under fitting -> Plugin Model 
     510        Operations) can be used.  However, after calling Load Plugin Models, the 
     511        active plugin will no longer be loaded (even though the GUI looks like 
     512        it is) unless it is a sum|multiply model which works properly.  All 
     513        others will need to be recalled from the model dropdown menu to reload 
     514        the model into the calculation engine.  While it might be annoying it 
     515        does not appear to prevent SasView from working.. 
     516        - The model code and documentation review is ongoing. At this time the 
     517        core shell parellelepiped is known to have the C shell effectively fixed 
     518        at 0 (noted in documentation) while the triaxial ellipsoid does not seem 
     519        to reproduce the limit of the oblate or prolate ellipsoid. If errors are 
     520        found and corrected, corrected versions will be uploaded to the 
     521        marketplace.  
     522    
    428523   3.1- All systems: 
    429524        - The documentation window may take a few seconds to load the first time 
  • sasview/local_config.py

    r73cbeec rf9d1f60  
    3333''' remember to:''' 
    3434_acknowledgement_preamble_bullet1 =\ 
    35 '''Acknowledge its use in your publications as suggested below;''' 
     35'''Acknowledge its use in your publications as :''' 
    3636_acknowledgement_preamble_bullet2 =\ 
    37 '''Reference SasView as : M. Doucet, et al. SasView Version 4.0, Zenodo''' +\ 
    38 ''', http://doi.org/10.5281/zenodo.159083;''' 
     37'''Reference SasView as:''' 
    3938_acknowledgement_preamble_bullet3 =\ 
    40 '''Reference the model you used if appropriate (see documentation for refs);''' 
     39'''Reference the model you used if appropriate (see documentation for refs)''' 
    4140_acknowledgement_preamble_bullet4 =\ 
    4241'''Send us your reference for our records: developers@sasview.org''' 
    4342_acknowledgement_publications = \ 
    44 '''This work benefited from the use of the SasView application, originally developed under NSF Award  
    45 DMR-0520547. SasView also contains code developed with funding from the EU Horizon 2020 programme  
    46 under the SINE2020 project Grant No 654000, and by Patrick O'Brien & Adam Washington.''' 
     43'''This work benefited from the use of the SasView application, originally developed under NSF Award DMR-0520547. SasView also contains code developed with funding from the EU Horizon 2020 programme under the SINE2020 project Grant No 654000.''' 
     44_acknowledgement_citation = \ 
     45'''M. Doucet et al. SasView Version 4.1, Zenodo, 10.5281/zenodo.438138''' 
    4746 
    4847_acknowledgement =  \ 
    49 '''This work was originally developed as part of the DANSE project funded by the US NSF under Award DMR-0520547, but is currently maintained  
    50 by a collaboration between UTK, UMD, NIST, ORNL, ISIS, ESS, ILL, ANSTO and TU Delft. SasView also contains code developed with funding from the  
    51 EU Horizon 2020 programme under the SINE2020 project (Grant No 654000), and by Patrick O'Brien (pycrust) and Adam Washington (corfunc-py).''' 
     48'''This work was originally developed as part of the DANSE project funded by the US NSF under Award DMR-0520547,\n but is currently maintained by a collaboration between UTK, UMD, NIST, ORNL, ISIS, ESS, ILL, ANSTO and TU Delft and the scattering community.\n\n SasView also contains code developed with funding from the EU Horizon 2020 programme under the SINE2020 project (Grant No 654000).\nA list of individual contributors can be found at: https://github.com/orgs/SasView/people 
     49''' 
    5250 
    5351_homepage = "http://www.sasview.org" 
     
    8987_corner_image = os.path.join(icon_path, "angles_flat.png") 
    9088_welcome_image = os.path.join(icon_path, "SVwelcome.png") 
    91 _copyright = "(c) 2009 - 2016, UTK, UMD, NIST, ORNL, ISIS, ESS, ILL, ANSTO and TU Delft" 
     89_copyright = "(c) 2009 - 2017, UTK, UMD, NIST, ORNL, ISIS, ESS, ILL, ANSTO and TU Delft" 
    9290marketplace_url = "http://marketplace.sasview.org/" 
    9391 
  • setup.py

    r1e13b53 r27109e5  
    315315                               'test/1d_data/*', 
    316316                               'test/2d_data/*', 
     317                               'test/convertible_files/*', 
     318                               'test/coordinate_data/*', 
     319                               'test/image_data/*', 
     320                               'test/media/*', 
     321                               'test/other_files/*', 
    317322                               'test/save_states/*', 
    318                                'test/upcoming_formats/*', 
    319                                  'default_categories.json'] 
     323                               'test/sesans_data/*' 
     324                               ] 
    320325packages.append("sas.sasview") 
    321326 
  • src/sas/sascalc/calculator/slit_length_calculator.py

    rb699768 rbfba720  
    1616        # y data 
    1717        self.y = None 
    18         #default slit length 
     18        # default slit length 
    1919        self.slit_length = 0.0 
    2020 
     
    4242        """ 
    4343        # None data do nothing 
    44         if self.y == None or self.x == None: 
     44        if self.y is None or self.x is None: 
    4545            return 
    4646        # set local variable 
     
    5454        y_sum = 0.0 
    5555        y_max = 0.0 
    56         ind = 0.0 
     56        ind = 0 
    5757 
    5858        # sum 10 or more y values until getting max_y, 
     
    7070        # defaults 
    7171        y_half_d = 0.0 
    72         ind = 0.0 
     72        ind = 0 
    7373        # find indices where it crosses y = y_half. 
    7474        while True: 
     
    8181 
    8282        # y value and ind just before passed the spot of the half height 
    83         y_half_u = y[ind-1] 
     83        y_half_u = y[ind - 1] 
    8484 
    8585        # get corresponding x values 
    8686        x_half_d = x[ind] 
    87         x_half_u = x[ind-1] 
     87        x_half_u = x[ind - 1] 
    8888 
    8989        # calculate x at y = y_half using linear interpolation 
     
    9191            x_half = (x_half_d + x_half_u)/2.0 
    9292        else: 
    93             x_half = (x_half_u * (y_half - y_half_d)  \ 
    94                        + x_half_d * (y_half_u - y_half)) \ 
    95                         / (y_half_u - y_half_d) 
     93            x_half = ((x_half_u * (y_half - y_half_d) 
     94                       + x_half_d * (y_half_u - y_half)) 
     95                       / (y_half_u - y_half_d)) 
    9696 
    9797        # Our slit length is half width, so just give half beam value 
  • src/sas/sascalc/dataloader/manipulations.py

    rb2b36932 r36d69e1  
    8080 
    8181    """ 
    82     if data2d.data == None or data2d.x_bins == None or data2d.y_bins == None: 
     82    if data2d.data is None or data2d.x_bins is None or data2d.y_bins is None: 
    8383        raise ValueError, "Can't convert this data: data=None..." 
    8484    new_x = numpy.tile(data2d.x_bins, (len(data2d.y_bins), 1)) 
     
    9090    qy_data = new_y.flatten() 
    9191    q_data = numpy.sqrt(qx_data * qx_data + qy_data * qy_data) 
    92     if data2d.err_data == None or numpy.any(data2d.err_data <= 0): 
     92    if data2d.err_data is None or numpy.any(data2d.err_data <= 0): 
    9393        new_err_data = numpy.sqrt(numpy.abs(new_data)) 
    9494    else: 
  • src/sas/sascalc/dataloader/readers/IgorReader.py

    rb699768 r36d69e1  
    1313############################################################################# 
    1414import os 
    15 import numpy 
    16 import math 
    17 #import logging 
     15 
    1816from sas.sascalc.dataloader.data_info import Data2D 
    1917from sas.sascalc.dataloader.data_info import Detector 
    2018from sas.sascalc.dataloader.manipulations import reader2D_converter 
     19import numpy as np 
    2120 
    2221# Look for unit converter 
     
    4039        """ Read file """ 
    4140        if not os.path.isfile(filename): 
    42             raise ValueError, \ 
    43             "Specified file %s is not a regular file" % filename 
    44          
    45         # Read file 
    46         f = open(filename, 'r') 
    47         buf = f.read() 
    48          
    49         # Instantiate data object 
     41            raise ValueError("Specified file %s is not a regular " 
     42                             "file" % filename) 
     43         
    5044        output = Data2D() 
     45 
    5146        output.filename = os.path.basename(filename) 
    5247        detector = Detector() 
    53         if len(output.detector) > 0: 
    54             print str(output.detector[0]) 
     48        if len(output.detector): 
     49            print(str(output.detector[0])) 
    5550        output.detector.append(detector) 
    56                  
    57         # Get content 
    58         dataStarted = False 
    59          
    60         lines = buf.split('\n') 
    61         itot = 0 
    62         x = [] 
    63         y = [] 
    64          
    65         ncounts = 0 
    66          
    67         xmin = None 
    68         xmax = None 
    69         ymin = None 
    70         ymax = None 
    71          
    72         i_x = 0 
    73         i_y = -1 
    74         i_tot_row = 0 
    75          
    76         isInfo = False 
    77         isCenter = False 
    78         
    79         data_conv_q = None 
    80         data_conv_i = None 
    81          
    82         if has_converter == True and output.Q_unit != '1/A': 
     51 
     52        data_conv_q = data_conv_i = None 
     53         
     54        if has_converter and output.Q_unit != '1/A': 
    8355            data_conv_q = Converter('1/A') 
    8456            # Test it 
    8557            data_conv_q(1.0, output.Q_unit) 
    8658             
    87         if has_converter == True and output.I_unit != '1/cm': 
     59        if has_converter and output.I_unit != '1/cm': 
    8860            data_conv_i = Converter('1/cm') 
    8961            # Test it 
    9062            data_conv_i(1.0, output.I_unit) 
    91           
    92         for line in lines: 
    93              
    94             # Find setup info line 
    95             if isInfo: 
    96                 isInfo = False 
    97                 line_toks = line.split() 
    98                 # Wavelength in Angstrom 
    99                 try: 
    100                     wavelength = float(line_toks[1]) 
    101                 except: 
    102                     msg = "IgorReader: can't read this file, missing wavelength" 
    103                     raise ValueError, msg 
    104                  
    105             #Find # of bins in a row assuming the detector is square. 
    106             if dataStarted == True: 
    107                 try: 
    108                     value = float(line) 
    109                 except: 
    110                     # Found a non-float entry, skip it 
    111                     continue 
    112                  
    113                 # Get total bin number 
    114                  
    115             i_tot_row += 1 
    116         i_tot_row = math.ceil(math.sqrt(i_tot_row)) - 1 
    117         #print "i_tot", i_tot_row 
    118         size_x = i_tot_row  # 192#128 
    119         size_y = i_tot_row  # 192#128 
    120         output.data = numpy.zeros([size_x, size_y]) 
    121         output.err_data = numpy.zeros([size_x, size_y]) 
    122       
    123         #Read Header and 2D data 
    124         for line in lines: 
    125             # Find setup info line 
    126             if isInfo: 
    127                 isInfo = False 
    128                 line_toks = line.split() 
    129                 # Wavelength in Angstrom 
    130                 try: 
    131                     wavelength = float(line_toks[1]) 
    132                 except: 
    133                     msg = "IgorReader: can't read this file, missing wavelength" 
    134                     raise ValueError, msg 
    135                 # Distance in meters 
    136                 try: 
    137                     distance = float(line_toks[3]) 
    138                 except: 
    139                     msg = "IgorReader: can't read this file, missing distance" 
    140                     raise ValueError, msg 
    141                  
    142                 # Distance in meters 
    143                 try: 
    144                     transmission = float(line_toks[4]) 
    145                 except: 
    146                     msg = "IgorReader: can't read this file, " 
    147                     msg += "missing transmission" 
    148                     raise ValueError, msg 
    149                                              
    150             if line.count("LAMBDA") > 0: 
    151                 isInfo = True 
    152                  
    153             # Find center info line 
    154             if isCenter: 
    155                 isCenter = False 
    156                 line_toks = line.split() 
    157                  
    158                 # Center in bin number: Must substrate 1 because 
    159                 #the index starts from 1 
    160                 center_x = float(line_toks[0]) - 1 
    161                 center_y = float(line_toks[1]) - 1 
    162  
    163             if line.count("BCENT") > 0: 
    164                 isCenter = True 
    165                  
    166             # Find data start 
    167             if line.count("***")>0: 
    168                 dataStarted = True 
    169                  
    170                 # Check that we have all the info 
    171                 if wavelength == None \ 
    172                     or distance == None \ 
    173                     or center_x == None \ 
    174                     or center_y == None: 
    175                     msg = "IgorReader:Missing information in data file" 
    176                     raise ValueError, msg 
    177                  
    178             if dataStarted == True: 
    179                 try: 
    180                     value = float(line) 
    181                 except: 
    182                     # Found a non-float entry, skip it 
    183                     continue 
    184                  
    185                 # Get bin number 
    186                 if math.fmod(itot, i_tot_row) == 0: 
    187                     i_x = 0 
    188                     i_y += 1 
    189                 else: 
    190                     i_x += 1 
    191                      
    192                 output.data[i_y][i_x] = value 
    193                 ncounts += 1 
    194                  
    195                 # Det 640 x 640 mm 
    196                 # Q = 4pi/lambda sin(theta/2) 
    197                 # Bin size is 0.5 cm  
    198                 #REmoved +1 from theta = (i_x-center_x+1)*0.5 / distance 
    199                 # / 100.0 and  
    200                 #REmoved +1 from theta = (i_y-center_y+1)*0.5 / 
    201                 # distance / 100.0 
    202                 #ToDo: Need  complete check if the following 
    203                 # covert process is consistent with fitting.py. 
    204                 theta = (i_x - center_x) * 0.5 / distance / 100.0 
    205                 qx = 4.0 * math.pi / wavelength * math.sin(theta/2.0) 
    206  
    207                 if has_converter == True and output.Q_unit != '1/A': 
    208                     qx = data_conv_q(qx, units=output.Q_unit) 
    209  
    210                 if xmin == None or qx < xmin: 
    211                     xmin = qx 
    212                 if xmax == None or qx > xmax: 
    213                     xmax = qx 
    214                  
    215                 theta = (i_y - center_y) * 0.5 / distance / 100.0 
    216                 qy = 4.0 * math.pi / wavelength * math.sin(theta / 2.0) 
    217  
    218                 if has_converter == True and output.Q_unit != '1/A': 
    219                     qy = data_conv_q(qy, units=output.Q_unit) 
    220                  
    221                 if ymin == None or qy < ymin: 
    222                     ymin = qy 
    223                 if ymax == None or qy > ymax: 
    224                     ymax = qy 
    225                  
    226                 if not qx in x: 
    227                     x.append(qx) 
    228                 if not qy in y: 
    229                     y.append(qy) 
    230                  
    231                 itot += 1 
    232                    
    233                    
     63 
     64        data_row = 0 
     65        wavelength = distance = center_x = center_y = None 
     66        dataStarted = isInfo = isCenter = False 
     67 
     68        with open(filename, 'r') as f: 
     69            for line in f: 
     70                data_row += 1 
     71                # Find setup info line 
     72                if isInfo: 
     73                    isInfo = False 
     74                    line_toks = line.split() 
     75                    # Wavelength in Angstrom 
     76                    try: 
     77                        wavelength = float(line_toks[1]) 
     78                    except ValueError: 
     79                        msg = "IgorReader: can't read this file, missing wavelength" 
     80                        raise ValueError(msg) 
     81                    # Distance in meters 
     82                    try: 
     83                        distance = float(line_toks[3]) 
     84                    except ValueError: 
     85                        msg = "IgorReader: can't read this file, missing distance" 
     86                        raise ValueError(msg) 
     87 
     88                    # Distance in meters 
     89                    try: 
     90                        transmission = float(line_toks[4]) 
     91                    except: 
     92                        msg = "IgorReader: can't read this file, " 
     93                        msg += "missing transmission" 
     94                        raise ValueError(msg) 
     95 
     96                if line.count("LAMBDA"): 
     97                    isInfo = True 
     98 
     99                # Find center info line 
     100                if isCenter: 
     101                    isCenter = False 
     102                    line_toks = line.split() 
     103 
     104                    # Center in bin number: Must subtract 1 because 
     105                    # the index starts from 1 
     106                    center_x = float(line_toks[0]) - 1 
     107                    center_y = float(line_toks[1]) - 1 
     108 
     109                if line.count("BCENT"): 
     110                    isCenter = True 
     111 
     112                # Find data start 
     113                if line.count("***"): 
     114                    # now have to continue to blank line 
     115                    dataStarted = True 
     116 
     117                    # Check that we have all the info 
     118                    if (wavelength is None 
     119                            or distance is None 
     120                            or center_x is None 
     121                            or center_y is None): 
     122                        msg = "IgorReader:Missing information in data file" 
     123                        raise ValueError(msg) 
     124 
     125                if dataStarted: 
     126                    if len(line.rstrip()): 
     127                        continue 
     128                    else: 
     129                        break 
     130 
     131        # The data is loaded in row major order (last index changing most 
     132        # rapidly). However, the original data is in column major order (first 
     133        # index changing most rapidly). The swap to column major order is done 
     134        # in reader2D_converter at the end of this method. 
     135        data = np.loadtxt(filename, skiprows=data_row) 
     136        size_x = size_y = int(np.rint(np.sqrt(data.size))) 
     137        output.data = np.reshape(data, (size_x, size_y)) 
     138        output.err_data = np.zeros_like(output.data) 
     139 
     140        # Det 640 x 640 mm 
     141        # Q = 4 * pi/lambda * sin(theta/2) 
     142        # Bin size is 0.5 cm 
     143        # Removed +1 from theta = (i_x - center_x + 1)*0.5 / distance 
     144        # / 100.0 and 
     145        # Removed +1 from theta = (i_y - center_y + 1)*0.5 / 
     146        # distance / 100.0 
     147        # ToDo: Need  complete check if the following 
     148        # convert process is consistent with fitting.py. 
     149 
     150        # calculate qx, qy bin centers of each pixel in the image 
     151        theta = (np.arange(size_x) - center_x) * 0.5 / distance / 100. 
     152        qx = 4 * np.pi / wavelength * np.sin(theta/2) 
     153 
     154        theta = (np.arange(size_y) - center_y) * 0.5 / distance / 100. 
     155        qy = 4 * np.pi / wavelength * np.sin(theta/2) 
     156 
     157        if has_converter and output.Q_unit != '1/A': 
     158            qx = data_conv_q(qx, units=output.Q_unit) 
     159            qy = data_conv_q(qx, units=output.Q_unit) 
     160 
     161        xmax = np.max(qx) 
     162        xmin = np.min(qx) 
     163        ymax = np.max(qy) 
     164        ymin = np.min(qy) 
     165 
     166        # calculate edge offset in q. 
    234167        theta = 0.25 / distance / 100.0 
    235         xstep = 4.0 * math.pi / wavelength * math.sin(theta / 2.0) 
     168        xstep = 4.0 * np.pi / wavelength * np.sin(theta / 2.0) 
    236169         
    237170        theta = 0.25 / distance / 100.0 
    238         ystep = 4.0 * math.pi/ wavelength * math.sin(theta / 2.0) 
     171        ystep = 4.0 * np.pi/ wavelength * np.sin(theta / 2.0) 
    239172         
    240173        # Store all data ###################################### 
    241174        # Store wavelength 
    242         if has_converter == True and output.source.wavelength_unit != 'A': 
     175        if has_converter and output.source.wavelength_unit != 'A': 
    243176            conv = Converter('A') 
    244177            wavelength = conv(wavelength, units=output.source.wavelength_unit) 
     
    246179 
    247180        # Store distance 
    248         if has_converter == True and detector.distance_unit != 'm': 
     181        if has_converter and detector.distance_unit != 'm': 
    249182            conv = Converter('m') 
    250183            distance = conv(distance, units=detector.distance_unit) 
     
    254187        output.sample.transmission = transmission 
    255188         
    256         # Store pixel size 
     189        # Store pixel size (mm) 
    257190        pixel = 5.0 
    258         if has_converter == True and detector.pixel_size_unit != 'mm': 
     191        if has_converter and detector.pixel_size_unit != 'mm': 
    259192            conv = Converter('mm') 
    260193            pixel = conv(pixel, units=detector.pixel_size_unit) 
     
    267200         
    268201        # Store limits of the image (2D array) 
    269         xmin = xmin - xstep / 2.0 
    270         xmax = xmax + xstep / 2.0 
    271         ymin = ymin - ystep / 2.0 
    272         ymax = ymax + ystep / 2.0 
    273         if has_converter == True and output.Q_unit != '1/A': 
     202        xmin -= xstep / 2.0 
     203        xmax += xstep / 2.0 
     204        ymin -= ystep / 2.0 
     205        ymax += ystep / 2.0 
     206        if has_converter and output.Q_unit != '1/A': 
    274207            xmin = data_conv_q(xmin, units=output.Q_unit) 
    275208            xmax = data_conv_q(xmax, units=output.Q_unit) 
     
    282215         
    283216        # Store x and y axis bin centers 
    284         output.x_bins = x 
    285         output.y_bins = y 
     217        output.x_bins = qx.tolist() 
     218        output.y_bins = qy.tolist() 
    286219         
    287220        # Units 
  • src/sas/sascalc/dataloader/readers/cansas_reader.py

    rc221349 r8434365  
    930930            self._write_data(datainfo, entry_node) 
    931931        # Transmission Spectrum Info 
    932         self._write_trans_spectrum(datainfo, entry_node) 
     932        # TODO: fix the writer to linearize all data, including T_spectrum 
     933        # self._write_trans_spectrum(datainfo, entry_node) 
    933934        # Sample info 
    934935        self._write_sample_info(datainfo, entry_node) 
  • src/sas/sascalc/dataloader/readers/cansas_reader_HDF5.py

    rbbd0f37 rc94280c  
    99import sys 
    1010 
    11 from sas.sascalc.dataloader.data_info import plottable_1D, plottable_2D, Data1D, Data2D, DataInfo, Process, Aperture 
    12 from sas.sascalc.dataloader.data_info import Collimation, TransmissionSpectrum, Detector 
     11from sas.sascalc.dataloader.data_info import plottable_1D, plottable_2D,\ 
     12    Data1D, Data2D, DataInfo, Process, Aperture, Collimation, \ 
     13    TransmissionSpectrum, Detector 
    1314from sas.sascalc.dataloader.data_info import combine_data_info_with_plottable 
    14  
    1515 
    1616 
    1717class Reader(): 
    1818    """ 
    19     A class for reading in CanSAS v2.0 data files. The existing iteration opens Mantid generated HDF5 formatted files 
    20     with file extension .h5/.H5. Any number of data sets may be present within the file and any dimensionality of data 
    21     may be used. Currently 1D and 2D SAS data sets are supported, but future implementations will include 1D and 2D 
    22     SESANS data. 
    23  
    24     Any number of SASdata sets may be present in a SASentry and the data within can be either 1D I(Q) or 2D I(Qx, Qy). 
     19    A class for reading in CanSAS v2.0 data files. The existing iteration opens 
     20    Mantid generated HDF5 formatted files with file extension .h5/.H5. Any 
     21    number of data sets may be present within the file and any dimensionality 
     22    of data may be used. Currently 1D and 2D SAS data sets are supported, but 
     23    future implementations will include 1D and 2D SESANS data. 
     24 
     25    Any number of SASdata sets may be present in a SASentry and the data within 
     26    can be either 1D I(Q) or 2D I(Qx, Qy). 
    2527 
    2628    Also supports reading NXcanSAS formatted HDF5 files 
     
    3032    """ 
    3133 
    32     ## CanSAS version 
     34    # CanSAS version 
    3335    cansas_version = 2.0 
    34     ## Logged warnings or messages 
     36    # Logged warnings or messages 
    3537    logging = None 
    36     ## List of errors for the current data set 
     38    # List of errors for the current data set 
    3739    errors = None 
    38     ## Raw file contents to be processed 
     40    # Raw file contents to be processed 
    3941    raw_data = None 
    40     ## Data info currently being read in 
     42    # Data info currently being read in 
    4143    current_datainfo = None 
    42     ## SASdata set currently being read in 
     44    # SASdata set currently being read in 
    4345    current_dataset = None 
    44     ## List of plottable1D objects that should be linked to the current_datainfo 
     46    # List of plottable1D objects that should be linked to the current_datainfo 
    4547    data1d = None 
    46     ## List of plottable2D objects that should be linked to the current_datainfo 
     48    # List of plottable2D objects that should be linked to the current_datainfo 
    4749    data2d = None 
    48     ## Data type name 
     50    # Data type name 
    4951    type_name = "CanSAS 2.0" 
    50     ## Wildcards 
     52    # Wildcards 
    5153    type = ["CanSAS 2.0 HDF5 Files (*.h5)|*.h5"] 
    52     ## List of allowed extensions 
     54    # List of allowed extensions 
    5355    ext = ['.h5', '.H5'] 
    54     ## Flag to bypass extension check 
    55     allow_all = False 
    56     ## List of files to return 
     56    # Flag to bypass extension check 
     57    allow_all = True 
     58    # List of files to return 
    5759    output = None 
    5860 
     
    6466        :return: List of Data1D/2D objects and/or a list of errors. 
    6567        """ 
    66         ## Reinitialize the class when loading a new data file to reset all class variables 
     68        # Reinitialize when loading a new data file to reset all class variables 
    6769        self.reset_class_variables() 
    68         ## Check that the file exists 
     70        # Check that the file exists 
    6971        if os.path.isfile(filename): 
    7072            basename = os.path.basename(filename) 
     
    7274            # If the file type is not allowed, return empty list 
    7375            if extension in self.ext or self.allow_all: 
    74                 ## Load the data file 
     76                # Load the data file 
    7577                self.raw_data = h5py.File(filename, 'r') 
    76                 ## Read in all child elements of top level SASroot 
     78                # Read in all child elements of top level SASroot 
    7779                self.read_children(self.raw_data, []) 
    78                 ## Add the last data set to the list of outputs 
     80                # Add the last data set to the list of outputs 
    7981                self.add_data_set() 
    80                 ## Close the data file 
     82                # Close the data file 
    8183                self.raw_data.close() 
    82         ## Return data set(s) 
     84        # Return data set(s) 
    8385        return self.output 
    8486 
     
    110112        """ 
    111113 
    112         ## Loop through each element of the parent and process accordingly 
     114        # Loop through each element of the parent and process accordingly 
    113115        for key in data.keys(): 
    114             ## Get all information for the current key 
     116            # Get all information for the current key 
    115117            value = data.get(key) 
    116118            if value.attrs.get(u'canSAS_class') is not None: 
     
    126128                self.parent_class = class_name 
    127129                parent_list.append(key) 
    128                 ## If this is a new sasentry, store the current data sets and create a fresh Data1D/2D object 
     130                # If a new sasentry, store the current data sets and create 
     131                # a fresh Data1D/2D object 
    129132                if class_prog.match(u'SASentry'): 
    130133                    self.add_data_set(key) 
    131134                elif class_prog.match(u'SASdata'): 
    132135                    self._initialize_new_data_set(parent_list) 
    133                 ## Recursion step to access data within the group 
     136                # Recursion step to access data within the group 
    134137                self.read_children(value, parent_list) 
    135138                self.add_intermediate() 
     
    137140 
    138141            elif isinstance(value, h5py.Dataset): 
    139                 ## If this is a dataset, store the data appropriately 
     142                # If this is a dataset, store the data appropriately 
    140143                data_set = data[key][:] 
    141144                unit = self._get_unit(value) 
    142145 
    143                 ## I and Q Data 
     146                # I and Q Data 
    144147                if key == u'I': 
    145                     if type(self.current_dataset) is plottable_2D: 
     148                    if isinstance(self.current_dataset, plottable_2D): 
    146149                        self.current_dataset.data = data_set 
    147150                        self.current_dataset.zaxis("Intensity", unit) 
     
    151154                    continue 
    152155                elif key == u'Idev': 
    153                     if type(self.current_dataset) is plottable_2D: 
     156                    if isinstance(self.current_dataset, plottable_2D): 
    154157                        self.current_dataset.err_data = data_set.flatten() 
    155158                    else: 
     
    158161                elif key == u'Q': 
    159162                    self.current_dataset.xaxis("Q", unit) 
    160                     if type(self.current_dataset) is plottable_2D: 
     163                    if isinstance(self.current_dataset, plottable_2D): 
    161164                        self.current_dataset.q = data_set.flatten() 
    162165                    else: 
     
    166169                    self.current_dataset.dx = data_set.flatten() 
    167170                    continue 
     171                elif key == u'dQw': 
     172                    self.current_dataset.dxw = data_set.flatten() 
     173                    continue 
     174                elif key == u'dQl': 
     175                    self.current_dataset.dxl = data_set.flatten() 
     176                    continue 
    168177                elif key == u'Qy': 
    169178                    self.current_dataset.yaxis("Q_y", unit) 
     
    183192                    self.current_dataset.mask = data_set.flatten() 
    184193                    continue 
     194                # Transmission Spectrum 
     195                elif (key == u'T' 
     196                      and self.parent_class == u'SAStransmission_spectrum'): 
     197                    self.trans_spectrum.transmission = data_set.flatten() 
     198                    continue 
     199                elif (key == u'Tdev' 
     200                      and self.parent_class == u'SAStransmission_spectrum'): 
     201                    self.trans_spectrum.transmission_deviation = \ 
     202                        data_set.flatten() 
     203                    continue 
     204                elif (key == u'lambda' 
     205                      and self.parent_class == u'SAStransmission_spectrum'): 
     206                    self.trans_spectrum.wavelength = data_set.flatten() 
     207                    continue 
    185208 
    186209                for data_point in data_set: 
    187                     ## Top Level Meta Data 
     210                    # Top Level Meta Data 
    188211                    if key == u'definition': 
    189212                        self.current_datainfo.meta_data['reader'] = data_point 
     
    201224                        self.current_datainfo.notes.append(data_point) 
    202225 
    203                     ## Sample Information 
    204                     elif key == u'Title' and self.parent_class == u'SASsample': # CanSAS 2.0 format 
     226                    # Sample Information 
     227                    # CanSAS 2.0 format 
     228                    elif key == u'Title' and self.parent_class == u'SASsample': 
    205229                        self.current_datainfo.sample.name = data_point 
    206                     elif key == u'ID' and self.parent_class == u'SASsample': # NXcanSAS format 
     230                    # NXcanSAS format 
     231                    elif key == u'name' and self.parent_class == u'SASsample': 
    207232                        self.current_datainfo.sample.name = data_point 
    208                     elif key == u'thickness' and self.parent_class == u'SASsample': 
     233                    # NXcanSAS format 
     234                    elif key == u'ID' and self.parent_class == u'SASsample': 
     235                        self.current_datainfo.sample.name = data_point 
     236                    elif (key == u'thickness' 
     237                          and self.parent_class == u'SASsample'): 
    209238                        self.current_datainfo.sample.thickness = data_point 
    210                     elif key == u'temperature' and self.parent_class == u'SASsample': 
     239                    elif (key == u'temperature' 
     240                          and self.parent_class == u'SASsample'): 
    211241                        self.current_datainfo.sample.temperature = data_point 
    212                     elif key == u'transmission' and self.parent_class == u'SASsample': 
     242                    elif (key == u'transmission' 
     243                          and self.parent_class == u'SASsample'): 
    213244                        self.current_datainfo.sample.transmission = data_point 
    214                     elif key == u'x_position' and self.parent_class == u'SASsample': 
     245                    elif (key == u'x_position' 
     246                          and self.parent_class == u'SASsample'): 
    215247                        self.current_datainfo.sample.position.x = data_point 
    216                     elif key == u'y_position' and self.parent_class == u'SASsample': 
     248                    elif (key == u'y_position' 
     249                          and self.parent_class == u'SASsample'): 
    217250                        self.current_datainfo.sample.position.y = data_point 
    218                     elif key == u'polar_angle' and self.parent_class == u'SASsample': 
     251                    elif key == u'pitch' and self.parent_class == u'SASsample': 
    219252                        self.current_datainfo.sample.orientation.x = data_point 
    220                     elif key == u'azimuthal_angle' and self.parent_class == u'SASsample': 
     253                    elif key == u'yaw' and self.parent_class == u'SASsample': 
     254                        self.current_datainfo.sample.orientation.y = data_point 
     255                    elif key == u'roll' and self.parent_class == u'SASsample': 
    221256                        self.current_datainfo.sample.orientation.z = data_point 
    222                     elif key == u'details' and self.parent_class == u'SASsample': 
     257                    elif (key == u'details' 
     258                          and self.parent_class == u'SASsample'): 
    223259                        self.current_datainfo.sample.details.append(data_point) 
    224260 
    225                     ## Instrumental Information 
    226                     elif key == u'name' and self.parent_class == u'SASinstrument': 
     261                    # Instrumental Information 
     262                    elif (key == u'name' 
     263                          and self.parent_class == u'SASinstrument'): 
    227264                        self.current_datainfo.instrument = data_point 
    228265                    elif key == u'name' and self.parent_class == u'SASdetector': 
     
    231268                        self.detector.distance = float(data_point) 
    232269                        self.detector.distance_unit = unit 
    233                     elif key == u'slit_length' and self.parent_class == u'SASdetector': 
     270                    elif (key == u'slit_length' 
     271                          and self.parent_class == u'SASdetector'): 
    234272                        self.detector.slit_length = float(data_point) 
    235273                        self.detector.slit_length_unit = unit 
    236                     elif key == u'x_position' and self.parent_class == u'SASdetector': 
     274                    elif (key == u'x_position' 
     275                          and self.parent_class == u'SASdetector'): 
    237276                        self.detector.offset.x = float(data_point) 
    238277                        self.detector.offset_unit = unit 
    239                     elif key == u'y_position' and self.parent_class == u'SASdetector': 
     278                    elif (key == u'y_position' 
     279                          and self.parent_class == u'SASdetector'): 
    240280                        self.detector.offset.y = float(data_point) 
    241281                        self.detector.offset_unit = unit 
    242                     elif key == u'polar_angle' and self.parent_class == u'SASdetector': 
     282                    elif (key == u'pitch' 
     283                          and self.parent_class == u'SASdetector'): 
    243284                        self.detector.orientation.x = float(data_point) 
    244285                        self.detector.orientation_unit = unit 
    245                     elif key == u'azimuthal_angle' and self.parent_class == u'SASdetector': 
     286                    elif key == u'roll' and self.parent_class == u'SASdetector': 
    246287                        self.detector.orientation.z = float(data_point) 
    247288                        self.detector.orientation_unit = unit 
    248                     elif key == u'beam_center_x' and self.parent_class == u'SASdetector': 
     289                    elif key == u'yaw' and self.parent_class == u'SASdetector': 
     290                        self.detector.orientation.y = float(data_point) 
     291                        self.detector.orientation_unit = unit 
     292                    elif (key == u'beam_center_x' 
     293                          and self.parent_class == u'SASdetector'): 
    249294                        self.detector.beam_center.x = float(data_point) 
    250295                        self.detector.beam_center_unit = unit 
    251                     elif key == u'beam_center_y' and self.parent_class == u'SASdetector': 
     296                    elif (key == u'beam_center_y' 
     297                          and self.parent_class == u'SASdetector'): 
    252298                        self.detector.beam_center.y = float(data_point) 
    253299                        self.detector.beam_center_unit = unit 
    254                     elif key == u'x_pixel_size' and self.parent_class == u'SASdetector': 
     300                    elif (key == u'x_pixel_size' 
     301                          and self.parent_class == u'SASdetector'): 
    255302                        self.detector.pixel_size.x = float(data_point) 
    256303                        self.detector.pixel_size_unit = unit 
    257                     elif key == u'y_pixel_size' and self.parent_class == u'SASdetector': 
     304                    elif (key == u'y_pixel_size' 
     305                          and self.parent_class == u'SASdetector'): 
    258306                        self.detector.pixel_size.y = float(data_point) 
    259307                        self.detector.pixel_size_unit = unit 
    260                     elif key == u'SSD' and self.parent_class == u'SAScollimation': 
     308                    elif (key == u'distance' 
     309                          and self.parent_class == u'SAScollimation'): 
    261310                        self.collimation.length = data_point 
    262311                        self.collimation.length_unit = unit 
    263                     elif key == u'name' and self.parent_class == u'SAScollimation': 
     312                    elif (key == u'name' 
     313                          and self.parent_class == u'SAScollimation'): 
    264314                        self.collimation.name = data_point 
    265  
    266                     ## Process Information 
    267                     elif key == u'name' and self.parent_class == u'SASprocess': 
     315                    elif (key == u'shape' 
     316                          and self.parent_class == u'SASaperture'): 
     317                        self.aperture.shape = data_point 
     318                    elif (key == u'x_gap' 
     319                          and self.parent_class == u'SASaperture'): 
     320                        self.aperture.size.x = data_point 
     321                    elif (key == u'y_gap' 
     322                          and self.parent_class == u'SASaperture'): 
     323                        self.aperture.size.y = data_point 
     324 
     325                    # Process Information 
     326                    elif (key == u'Title' 
     327                          and self.parent_class == u'SASprocess'): # CanSAS 2.0 
    268328                        self.process.name = data_point 
    269                     elif key == u'Title' and self.parent_class == u'SASprocess': # CanSAS 2.0 format 
     329                    elif (key == u'name' 
     330                          and self.parent_class == u'SASprocess'): # NXcanSAS 
    270331                        self.process.name = data_point 
    271                     elif key == u'name' and self.parent_class == u'SASprocess': # NXcanSAS format 
    272                         self.process.name = data_point 
    273                     elif key == u'description' and self.parent_class == u'SASprocess': 
     332                    elif (key == u'description' 
     333                          and self.parent_class == u'SASprocess'): 
    274334                        self.process.description = data_point 
    275335                    elif key == u'date' and self.parent_class == u'SASprocess': 
    276336                        self.process.date = data_point 
     337                    elif key == u'term' and self.parent_class == u'SASprocess': 
     338                        self.process.term = data_point 
    277339                    elif self.parent_class == u'SASprocess': 
    278340                        self.process.notes.append(data_point) 
    279341 
    280                     ## Transmission Spectrum 
    281                     elif key == u'T' and self.parent_class == u'SAStransmission_spectrum': 
    282                         self.trans_spectrum.transmission.append(data_point) 
    283                     elif key == u'Tdev' and self.parent_class == u'SAStransmission_spectrum': 
    284                         self.trans_spectrum.transmission_deviation.append(data_point) 
    285                     elif key == u'lambda' and self.parent_class == u'SAStransmission_spectrum': 
    286                         self.trans_spectrum.wavelength.append(data_point) 
    287  
    288                     ## Source 
    289                     elif key == u'wavelength' and self.parent_class == u'SASdata': 
     342                    # Source 
     343                    elif (key == u'wavelength' 
     344                          and self.parent_class == u'SASdata'): 
    290345                        self.current_datainfo.source.wavelength = data_point 
    291346                        self.current_datainfo.source.wavelength_unit = unit 
    292                     elif key == u'incident_wavelength' and self.parent_class == u'SASsource': 
     347                    elif (key == u'incident_wavelength' 
     348                          and self.parent_class == 'SASsource'): 
    293349                        self.current_datainfo.source.wavelength = data_point 
    294350                        self.current_datainfo.source.wavelength_unit = unit 
    295                     elif key == u'wavelength_max' and self.parent_class == u'SASsource': 
     351                    elif (key == u'wavelength_max' 
     352                          and self.parent_class == u'SASsource'): 
    296353                        self.current_datainfo.source.wavelength_max = data_point 
    297354                        self.current_datainfo.source.wavelength_max_unit = unit 
    298                     elif key == u'wavelength_min' and self.parent_class == u'SASsource': 
     355                    elif (key == u'wavelength_min' 
     356                          and self.parent_class == u'SASsource'): 
    299357                        self.current_datainfo.source.wavelength_min = data_point 
    300358                        self.current_datainfo.source.wavelength_min_unit = unit 
    301                     elif key == u'wavelength_spread' and self.parent_class == u'SASsource': 
    302                         self.current_datainfo.source.wavelength_spread = data_point 
    303                         self.current_datainfo.source.wavelength_spread_unit = unit 
    304                     elif key == u'beam_size_x' and self.parent_class == u'SASsource': 
     359                    elif (key == u'incident_wavelength_spread' 
     360                          and self.parent_class == u'SASsource'): 
     361                        self.current_datainfo.source.wavelength_spread = \ 
     362                            data_point 
     363                        self.current_datainfo.source.wavelength_spread_unit = \ 
     364                            unit 
     365                    elif (key == u'beam_size_x' 
     366                          and self.parent_class == u'SASsource'): 
    305367                        self.current_datainfo.source.beam_size.x = data_point 
    306368                        self.current_datainfo.source.beam_size_unit = unit 
    307                     elif key == u'beam_size_y' and self.parent_class == u'SASsource': 
     369                    elif (key == u'beam_size_y' 
     370                          and self.parent_class == u'SASsource'): 
    308371                        self.current_datainfo.source.beam_size.y = data_point 
    309372                        self.current_datainfo.source.beam_size_unit = unit 
    310                     elif key == u'beam_shape' and self.parent_class == u'SASsource': 
     373                    elif (key == u'beam_shape' 
     374                          and self.parent_class == u'SASsource'): 
    311375                        self.current_datainfo.source.beam_shape = data_point 
    312                     elif key == u'radiation' and self.parent_class == u'SASsource': 
     376                    elif (key == u'radiation' 
     377                          and self.parent_class == u'SASsource'): 
    313378                        self.current_datainfo.source.radiation = data_point 
    314                     elif key == u'transmission' and self.parent_class == u'SASdata': 
     379                    elif (key == u'transmission' 
     380                          and self.parent_class == u'SASdata'): 
    315381                        self.current_datainfo.sample.transmission = data_point 
    316382 
    317                     ## Everything else goes in meta_data 
     383                    # Everything else goes in meta_data 
    318384                    else: 
    319                         new_key = self._create_unique_key(self.current_datainfo.meta_data, key) 
     385                        new_key = self._create_unique_key( 
     386                            self.current_datainfo.meta_data, key) 
    320387                        self.current_datainfo.meta_data[new_key] = data_point 
    321388 
    322389            else: 
    323                 ## I don't know if this reachable code 
     390                # I don't know if this reachable code 
    324391                self.errors.add("ShouldNeverHappenException") 
    325392 
    326393    def add_intermediate(self): 
    327394        """ 
    328         This method stores any intermediate objects within the final data set after fully reading the set. 
    329  
    330         :param parent: The NXclass name for the h5py Group object that just finished being processed 
     395        This method stores any intermediate objects within the final data set 
     396        after fully reading the set. 
     397 
     398        :param parent: The NXclass name for the h5py Group object that just 
     399                       finished being processed 
    331400        """ 
    332401 
     
    347416            self.aperture = Aperture() 
    348417        elif self.parent_class == u'SASdata': 
    349             if type(self.current_dataset) is plottable_2D: 
     418            if isinstance(self.current_dataset, plottable_2D): 
    350419                self.data2d.append(self.current_dataset) 
    351             elif type(self.current_dataset) is plottable_1D: 
     420            elif isinstance(self.current_dataset, plottable_1D): 
    352421                self.data1d.append(self.current_dataset) 
    353422 
    354423    def final_data_cleanup(self): 
    355424        """ 
    356         Does some final cleanup and formatting on self.current_datainfo and all data1D and data2D objects and then 
    357         combines the data and info into Data1D and Data2D objects 
    358         """ 
    359  
    360         ## Type cast data arrays to float64 
     425        Does some final cleanup and formatting on self.current_datainfo and 
     426        all data1D and data2D objects and then combines the data and info into 
     427        Data1D and Data2D objects 
     428        """ 
     429 
     430        # Type cast data arrays to float64 
    361431        if len(self.current_datainfo.trans_spectrum) > 0: 
    362432            spectrum_list = [] 
     
    364434                spectrum.transmission = np.delete(spectrum.transmission, [0]) 
    365435                spectrum.transmission = spectrum.transmission.astype(np.float64) 
    366                 spectrum.transmission_deviation = np.delete(spectrum.transmission_deviation, [0]) 
    367                 spectrum.transmission_deviation = spectrum.transmission_deviation.astype(np.float64) 
     436                spectrum.transmission_deviation = np.delete( 
     437                    spectrum.transmission_deviation, [0]) 
     438                spectrum.transmission_deviation = \ 
     439                    spectrum.transmission_deviation.astype(np.float64) 
    368440                spectrum.wavelength = np.delete(spectrum.wavelength, [0]) 
    369441                spectrum.wavelength = spectrum.wavelength.astype(np.float64) 
     
    372444            self.current_datainfo.trans_spectrum = spectrum_list 
    373445 
    374         ## Append errors to dataset and reset class errors 
     446        # Append errors to dataset and reset class errors 
    375447        self.current_datainfo.errors = self.errors 
    376448        self.errors.clear() 
    377449 
    378         ## Combine all plottables with datainfo and append each to output 
    379         ## Type cast data arrays to float64 and find min/max as appropriate 
     450        # Combine all plottables with datainfo and append each to output 
     451        # Type cast data arrays to float64 and find min/max as appropriate 
    380452        for dataset in self.data2d: 
    381453            dataset.data = dataset.data.astype(np.float64) 
     
    397469            zeros = np.ones(dataset.data.size, dtype=bool) 
    398470            try: 
    399                 for i in range (0, dataset.mask.size - 1): 
     471                for i in range(0, dataset.mask.size - 1): 
    400472                    zeros[i] = dataset.mask[i] 
    401473            except: 
    402474                self.errors.add(sys.exc_value) 
    403475            dataset.mask = zeros 
    404             ## Calculate the actual Q matrix 
     476            # Calculate the actual Q matrix 
    405477            try: 
    406478                if dataset.q_data.size <= 1: 
    407                     dataset.q_data = np.sqrt(dataset.qx_data * dataset.qx_data + dataset.qy_data * dataset.qy_data) 
     479                    dataset.q_data = np.sqrt(dataset.qx_data 
     480                                             * dataset.qx_data 
     481                                             + dataset.qy_data 
     482                                             * dataset.qy_data) 
    408483            except: 
    409484                dataset.q_data = None 
     
    415490                dataset.data = dataset.data.flatten() 
    416491 
    417             final_dataset = combine_data_info_with_plottable(dataset, self.current_datainfo) 
     492            final_dataset = combine_data_info_with_plottable( 
     493                dataset, self.current_datainfo) 
    418494            self.output.append(final_dataset) 
    419495 
     
    435511            if dataset.dy is not None: 
    436512                dataset.dy = dataset.dy.astype(np.float64) 
    437             final_dataset = combine_data_info_with_plottable(dataset, self.current_datainfo) 
     513            final_dataset = combine_data_info_with_plottable( 
     514                dataset, self.current_datainfo) 
    438515            self.output.append(final_dataset) 
    439516 
    440517    def add_data_set(self, key=""): 
    441518        """ 
    442         Adds the current_dataset to the list of outputs after preforming final processing on the data and then calls a 
    443         private method to generate a new data set. 
     519        Adds the current_dataset to the list of outputs after preforming final 
     520        processing on the data and then calls a private method to generate a 
     521        new data set. 
    444522 
    445523        :param key: NeXus group name for current tree level 
     
    453531 
    454532 
    455     def _initialize_new_data_set(self, parent_list = None): 
    456         """ 
    457         A private class method to generate a new 1D or 2D data object based on the type of data within the set. 
    458         Outside methods should call add_data_set() to be sure any existing data is stored properly. 
     533    def _initialize_new_data_set(self, parent_list=None): 
     534        """ 
     535        A private class method to generate a new 1D or 2D data object based on 
     536        the type of data within the set. Outside methods should call 
     537        add_data_set() to be sure any existing data is stored properly. 
    459538 
    460539        :param parent_list: List of names of parent elements 
     
    473552    def _find_intermediate(self, parent_list, basename=""): 
    474553        """ 
    475         A private class used to find an entry by either using a direct key or knowing the approximate basename. 
    476  
    477         :param parent_list: List of parents to the current level in the HDF5 file 
     554        A private class used to find an entry by either using a direct key or 
     555        knowing the approximate basename. 
     556 
     557        :param parent_list: List of parents nodes in the HDF5 file 
    478558        :param basename: Approximate name of an entry to search for 
    479559        :return: 
     
    486566            top = top.get(parent) 
    487567        for key in top.keys(): 
    488             if (key_prog.match(key)): 
     568            if key_prog.match(key): 
    489569                entry = True 
    490570                break 
     
    516596        """ 
    517597        unit = value.attrs.get(u'units') 
    518         if unit == None: 
     598        if unit is None: 
    519599            unit = value.attrs.get(u'unit') 
    520         ## Convert the unit formats 
     600        # Convert the unit formats 
    521601        if unit == "1/A": 
    522602            unit = "A^{-1}" 
  • src/sas/sascalc/fit/BumpsFitting.py

    r345e7e4 r1a30720  
    352352    except Exception as exc: 
    353353        best, fbest = None, numpy.NaN 
    354         errors = [str(exc), traceback.traceback.format_exc()] 
     354        errors = [str(exc), traceback.format_exc()] 
    355355    finally: 
    356356        mapper.stop_mapper(fitdriver.mapper) 
  • src/sas/sasgui/guiframe/acknowledgebox.py

    rc1fdf84 r74c8cd0  
    1111import wx.richtext 
    1212import wx.lib.hyperlink 
     13from wx.lib.expando import ExpandoTextCtrl 
    1314import random 
    1415import os.path 
     
    3637    Shows the current method for acknowledging SasView in 
    3738    scholarly publications. 
    38  
    3939    """ 
    4040 
     
    4444        wx.Dialog.__init__(self, *args, **kwds) 
    4545 
    46         self.ack = wx.TextCtrl(self, style=wx.TE_LEFT|wx.TE_MULTILINE|wx.TE_BESTWRAP|wx.TE_READONLY|wx.TE_NO_VSCROLL) 
     46        self.ack = ExpandoTextCtrl(self, style=wx.TE_LEFT|wx.TE_MULTILINE|wx.TE_BESTWRAP|wx.TE_READONLY|wx.TE_NO_VSCROLL) 
    4747        self.ack.SetValue(config._acknowledgement_publications) 
    48         self.ack.SetMinSize((-1, 55)) 
     48        #self.ack.SetMinSize((-1, 55)) 
     49        self.citation = ExpandoTextCtrl(self, style=wx.TE_LEFT|wx.TE_MULTILINE|wx.TE_BESTWRAP|wx.TE_READONLY|wx.TE_NO_VSCROLL) 
     50        self.citation.SetValue(config._acknowledgement_citation) 
    4951        self.preamble = wx.StaticText(self, -1, config._acknowledgement_preamble) 
    5052        items = [config._acknowledgement_preamble_bullet1, 
     
    5254                 config._acknowledgement_preamble_bullet3, 
    5355                 config._acknowledgement_preamble_bullet4] 
    54         self.list1 = wx.StaticText(self, -1, "\t(1) " + items[0]) 
    55         self.list2 = wx.StaticText(self, -1, "\t(2) " + items[1]) 
    56         self.list3 = wx.StaticText(self, -1, "\t(3) " + items[2]) 
    57         self.list4 = wx.StaticText(self, -1, "\t(4) " + items[3]) 
     56        self.list1 = wx.StaticText(self, -1, "(1) " + items[0]) 
     57        self.list2 = wx.StaticText(self, -1, "(2) " + items[1]) 
     58        self.list3 = wx.StaticText(self, -1, "(3) " + items[2]) 
     59        self.list4 = wx.StaticText(self, -1, "(4) " + items[3]) 
    5860        self.static_line = wx.StaticLine(self, 0) 
    5961        self.__set_properties() 
     
    6971        self.SetTitle("Acknowledging SasView") 
    7072        #Increased size of box from (525, 225), SMK, 04/10/16 
    71         self.SetSize((600, 300)) 
     73        self.SetClientSize((600, 320)) 
    7274        # end wxGlade 
    7375 
     
    8183        sizer_titles.Add(self.preamble, 0, wx.ALL|wx.EXPAND, 5) 
    8284        sizer_titles.Add(self.list1, 0, wx.ALL|wx.EXPAND, 5) 
     85        sizer_titles.Add(self.ack, 0, wx.ALL|wx.EXPAND, 5) 
    8386        sizer_titles.Add(self.list2, 0, wx.ALL|wx.EXPAND, 5) 
     87        sizer_titles.Add(self.citation, 0, wx.ALL|wx.EXPAND, 5) 
    8488        sizer_titles.Add(self.list3, 0, wx.ALL|wx.EXPAND, 5) 
     89        #sizer_titles.Add(self.static_line, 0, wx.ALL|wx.EXPAND, 0) 
    8590        sizer_titles.Add(self.list4, 0, wx.ALL|wx.EXPAND, 5) 
    86         sizer_titles.Add(self.static_line, 0, wx.ALL|wx.EXPAND, 0) 
    87         sizer_titles.Add(self.ack, 0, wx.ALL|wx.EXPAND, 5) 
    8891        sizer_main.Add(sizer_titles, -1, wx.ALL|wx.EXPAND, 5) 
    8992        self.SetAutoLayout(True) 
     
    9194        self.Layout() 
    9295        self.Centre() 
     96        #self.SetClientSize(sizer_main.GetSize()) 
    9397        # end wxGlade 
    9498 
  • src/sas/sasgui/guiframe/config.py

    rd85c194 rf9d1f60  
    11""" 
    2 Application settings 
     2    Application settings 
    33""" 
     4import time 
    45import os 
    5 import time 
    66from sas.sasgui.guiframe.gui_style import GUIFRAME 
     7import sas.sasview 
     8import logging 
     9 
    710# Version of the application 
    8 __appname__ = "DummyView" 
    9 __version__ = '0.0.0' 
    10 __build__ = '1' 
     11__appname__ = "SasView" 
     12__version__ = sas.sasview.__version__ 
     13__build__ = sas.sasview.__build__ 
    1114__download_page__ = 'https://github.com/SasView/sasview/releases' 
    1215__update_URL__ = 'http://www.sasview.org/latestversion.json' 
    1316 
    14  
    1517# Debug message flag 
    16 __EVT_DEBUG__ = True 
     18__EVT_DEBUG__ = False 
    1719 
    1820# Flag for automated testing 
     
    2931_acknowledgement_preamble =\ 
    3032'''To ensure the long term support and development of this software please''' +\ 
    31 ''' remember to do the following.''' 
     33''' remember to:''' 
    3234_acknowledgement_preamble_bullet1 =\ 
    33 '''Acknowledge its use in your publications as suggested below''' 
     35'''Acknowledge its use in your publications as :''' 
    3436_acknowledgement_preamble_bullet2 =\ 
    35 '''Reference the following website: http://www.sasview.org''' 
     37'''Reference SasView as:''' 
    3638_acknowledgement_preamble_bullet3 =\ 
    3739'''Reference the model you used if appropriate (see documentation for refs)''' 
     
    3941'''Send us your reference for our records: developers@sasview.org''' 
    4042_acknowledgement_publications = \ 
    41 '''This work benefited from the use of the SasView application, originally 
    42 developed under NSF award DMR-0520547. 
     43'''This work benefited from the use of the SasView application, originally developed under NSF Award DMR-0520547. SasView also contains code developed with funding from the EU Horizon 2020 programme under the SINE2020 project Grant No 654000.''' 
     44_acknowledgement_citation = \ 
     45'''M. Doucet et al. SasView Version 4.1, Zenodo, 10.5281/zenodo.438138''' 
     46 
     47_acknowledgement =  \ 
     48'''This work was originally developed as part of the DANSE project funded by the US NSF under Award DMR-0520547,\n but is currently maintained by a collaboration between UTK, UMD, NIST, ORNL, ISIS, ESS, ILL, ANSTO and TU Delft and the scattering community.\n\n SasView also contains code developed with funding from the EU Horizon 2020 programme under the SINE2020 project (Grant No 654000).\nA list of individual contributors can be found at: https://github.com/orgs/SasView/people 
    4349''' 
    44 _acknowledgement =  \ 
    45 '''This work originally developed as part of the DANSE project funded by the NSF 
    46 under grant DMR-0520547, and currently maintained by NIST, UMD, ORNL, ISIS, ESS 
    47 and ILL. 
    4850 
    49 ''' 
    5051_homepage = "http://www.sasview.org" 
    51 _download = "http://sourceforge.net/projects/sasview/files/" 
     52_download = __download_page__ 
    5253_authors = [] 
    5354_paper = "http://sourceforge.net/p/sasview/tickets/" 
    5455_license = "mailto:help@sasview.org" 
    55 _nsf_logo = "images/nsf_logo.png" 
    56 _danse_logo = "images/danse_logo.png" 
    57 _inst_logo = "images/utlogo.gif" 
    58 _nist_logo = "images/nist_logo.png" 
    59 _umd_logo = "images/umd_logo.png" 
    60 _sns_logo = "images/sns_logo.png" 
    61 _isis_logo = "images/isis_logo.png" 
    62 _ess_logo = "images/ess_logo.png" 
    63 _ill_logo = "images/ill_logo.png" 
     56 
     57 
     58icon_path = os.path.abspath(os.path.join(os.path.dirname(__file__), "images")) 
     59logging.info("icon path: %s" % icon_path) 
     60media_path = os.path.abspath(os.path.join(os.path.dirname(__file__), "media")) 
     61test_path = os.path.abspath(os.path.join(os.path.dirname(__file__), "test")) 
     62 
     63_nist_logo = os.path.join(icon_path, "nist_logo.png") 
     64_umd_logo = os.path.join(icon_path, "umd_logo.png") 
     65_sns_logo = os.path.join(icon_path, "sns_logo.png") 
     66_ornl_logo = os.path.join(icon_path, "ornl_logo.png") 
     67_isis_logo = os.path.join(icon_path, "isis_logo.png") 
     68_ess_logo = os.path.join(icon_path, "ess_logo.png") 
     69_ill_logo = os.path.join(icon_path, "ill_logo.png") 
     70_ansto_logo = os.path.join(icon_path, "ansto_logo.png") 
     71_tudelft_logo = os.path.join(icon_path, "tudelft_logo.png") 
     72_nsf_logo = os.path.join(icon_path, "nsf_logo.png") 
     73_danse_logo = os.path.join(icon_path, "danse_logo.png") 
     74_inst_logo = os.path.join(icon_path, "utlogo.gif") 
    6475_nist_url = "http://www.nist.gov/" 
    6576_umd_url = "http://www.umd.edu/" 
    6677_sns_url = "http://neutrons.ornl.gov/" 
     78_ornl_url = "http://neutrons.ornl.gov/" 
    6779_nsf_url = "http://www.nsf.gov" 
    68 _danse_url = "http://www.cacr.caltech.edu/projects/danse/release/index.html" 
    69 _inst_url = "http://www.utk.edu" 
    7080_isis_url = "http://www.isis.stfc.ac.uk/" 
    7181_ess_url = "http://ess-scandinavia.eu/" 
    7282_ill_url = "http://www.ill.eu/" 
    73 _corner_image = "images/angles_flat.png" 
    74 _welcome_image = "images/SVwelcome.png" 
    75 _copyright = "(c) 2008, University of Tennessee" 
    76 #edit the lists below of file state your plugin can read 
    77 #for sasview this how you can edit these lists 
    78 #PLUGIN_STATE_EXTENSIONS = ['.prv','.fitv', '.inv'] 
    79 #APPLICATION_STATE_EXTENSION = '.svs' 
    80 #PLUGINS_WLIST = ['P(r) files (*.prv)|*.prv', 
    81 #                  'Fitting files (*.fitv)|*.fitv', 
    82 #                  'Invariant files (*.inv)|*.inv'] 
    83 #APPLICATION_WLIST = 'SasView files (*.svs)|*.svs' 
    84 APPLICATION_WLIST = '' 
    85 APPLICATION_STATE_EXTENSION = None 
    86 PLUGINS_WLIST = [] 
    87 PLUGIN_STATE_EXTENSIONS = [] 
    88 SPLASH_SCREEN_PATH = "images/danse_logo.png" 
    89 DEFAULT_STYLE = GUIFRAME.SINGLE_APPLICATION 
    90 SPLASH_SCREEN_WIDTH = 500 
    91 SPLASH_SCREEN_HEIGHT = 300 
    92 WELCOME_PANEL_ON = False 
    93 TUTORIAL_PATH = None 
    94 SS_MAX_DISPLAY_TIME = 1500 
    95 PLOPANEL_WIDTH = 350 
    96 PLOPANEL_HEIGTH = 350 
    97 GUIFRAME_WIDTH = 1000 
    98 GUIFRAME_HEIGHT = 800 
    99 CONTROL_WIDTH = -1 
    100 CONTROL_HEIGHT = -1 
    101 SetupIconFile_win = os.path.join("images", "ball.ico") 
    102 SetupIconFile_mac = os.path.join("images", "ball.icns") 
    103 DefaultGroupName = "DANSE" 
    104 OutputBaseFilename = "setupGuiFrame" 
     83_ansto_url = "http://www.ansto.gov.au/" 
     84_tudelft_url = "http://www.tnw.tudelft.nl/en/cooperation/facilities/reactor-instituut-delft/" 
     85_danse_url = "http://www.cacr.caltech.edu/projects/danse/release/index.html" 
     86_inst_url = "http://www.utk.edu" 
     87_corner_image = os.path.join(icon_path, "angles_flat.png") 
     88_welcome_image = os.path.join(icon_path, "SVwelcome.png") 
     89_copyright = "(c) 2009 - 2017, UTK, UMD, NIST, ORNL, ISIS, ESS, ILL, ANSTO and TU Delft" 
     90marketplace_url = "http://marketplace.sasview.org/" 
     91 
     92#edit the list of file state your plugin can read 
     93APPLICATION_WLIST = 'SasView files (*.svs)|*.svs' 
     94APPLICATION_STATE_EXTENSION = '.svs' 
     95GUIFRAME_WIDTH = 1150 
     96GUIFRAME_HEIGHT = 840 
     97PLUGIN_STATE_EXTENSIONS = ['.fitv', '.inv', '.prv', '.crf'] 
     98PLUGINS_WLIST = ['Fitting files (*.fitv)|*.fitv', 
     99                 'Invariant files (*.inv)|*.inv', 
     100                 'P(r) files (*.prv)|*.prv', 
     101                 'Corfunc files (*.crf)|*.crf'] 
     102PLOPANEL_WIDTH = 415 
     103PLOPANEL_HEIGTH = 370 
    105104DATAPANEL_WIDTH = 235 
    106105DATAPANEL_HEIGHT = 700 
     106SPLASH_SCREEN_PATH = os.path.join(icon_path, "SVwelcome_mini.png") 
     107TUTORIAL_PATH = os.path.join(media_path, "Tutorial.pdf") 
     108DEFAULT_STYLE = GUIFRAME.MULTIPLE_APPLICATIONS|GUIFRAME.MANAGER_ON\ 
     109                    |GUIFRAME.CALCULATOR_ON|GUIFRAME.TOOLBAR_ON 
     110SPLASH_SCREEN_WIDTH = 512 
     111SPLASH_SCREEN_HEIGHT = 366 
     112SS_MAX_DISPLAY_TIME = 2000 
     113WELCOME_PANEL_ON = True 
     114WELCOME_PANEL_SHOW = False 
     115CLEANUP_PLOT = False 
     116# OPEN and SAVE project menu 
     117OPEN_SAVE_PROJECT_MENU = True 
     118#VIEW MENU 
     119VIEW_MENU = True 
     120#EDIT MENU 
     121EDIT_MENU = True 
     122 
     123SetupIconFile_win = os.path.join(icon_path, "ball.ico") 
     124SetupIconFile_mac = os.path.join(icon_path, "ball.icns") 
     125DefaultGroupName = "." 
     126OutputBaseFilename = "setupSasView" 
     127 
    107128FIXED_PANEL = True 
    108129DATALOADER_SHOW = True 
     
    113134# set a default perspective 
    114135DEFAULT_PERSPECTIVE = 'None' 
    115 # OPEN and SAVE project menu 
    116 OPEN_SAVE_PROJECT_MENU = True 
    117 CLEANUP_PLOT = False 
    118 # OPEN and SAVE project menu 
    119 OPEN_SAVE_PROJECT_MENU = False 
    120 #VIEW MENU 
    121 VIEW_MENU = False 
    122 #EDIT MENU 
    123 EDIT_MENU = False 
    124 import wx.lib.newevent 
    125 (StatusBarEvent, EVT_STATUS) = wx.lib.newevent.NewEvent() 
     136 
     137# Time out for updating sasview 
     138UPDATE_TIMEOUT = 2 
     139 
     140#OpenCL option 
     141SAS_OPENCL = None 
    126142 
    127143def printEVT(message): 
    128     """ 
    129     :TODO - need method documentation 
    130     """ 
    131144    if __EVT_DEBUG__: 
     145        """ 
     146        :TODO - Need method doc string 
     147        """ 
    132148        print "%g:  %s" % (time.clock(), message) 
    133      
     149 
    134150        if __EVT_DEBUG_2_FILE__: 
    135151            out = open(__EVT_DEBUG_FILENAME__, 'a') 
    136152            out.write("%10g:  %s\n" % (time.clock(), message)) 
    137153            out.close() 
    138              
  • src/sas/sasgui/perspectives/fitting/basepage.py

    r7a5aedd r5156918  
    120120        self.dxw = None 
    121121        # pinhole smear 
    122         self.dx_min = None 
    123         self.dx_max = None 
     122        self.dx_percent = None 
    124123        # smear attrbs 
    125124        self.enable_smearer = None 
     
    849848        self.state.pinhole_smearer = \ 
    850849                                copy.deepcopy(self.pinhole_smearer.GetValue()) 
    851         self.state.dx_max = copy.deepcopy(self.dx_max) 
    852         self.state.dx_min = copy.deepcopy(self.dx_min) 
     850        self.state.dx_percent = copy.deepcopy(self.dx_percent) 
    853851        self.state.dxl = copy.deepcopy(self.dxl) 
    854852        self.state.dxw = copy.deepcopy(self.dxw) 
     
    12471245        # we have two more options for smearing 
    12481246        if self.pinhole_smearer.GetValue(): 
    1249             self.dx_min = state.dx_min 
    1250             self.dx_max = state.dx_max 
    1251             if self.dx_min is not None: 
    1252                 self.smear_pinhole_min.SetValue(str(self.dx_min)) 
    1253             if self.dx_max is not None: 
    1254                 self.smear_pinhole_max.SetValue(str(self.dx_max)) 
     1247            self.dx_percent = state.dx_percent 
     1248            if self.dx_percent is not None: 
     1249                if state.dx_old: 
     1250                    self.dx_percent = 100 * (self.dx_percent / self.data.x[0]) 
     1251                self.smear_pinhole_percent.SetValue("%.2f" % self.dx_percent) 
    12551252            self.onPinholeSmear(event=None) 
    12561253        elif self.slit_smearer.GetValue(): 
     
    14521449                self.state_change = True 
    14531450                self._draw_model() 
    1454                 # Time delay has been introduced to prevent _handle error 
    1455                 # on Windows 
    1456                 # This part of code is executed when model is selected and 
    1457                 # it's parameters are changed (with respect to previously 
    1458                 # selected model). There are two Iq evaluations occuring one 
    1459                 # after another and therefore there may be compilation error 
    1460                 # if model is calculated for the first time. 
    1461                 # This seems to be Windows only issue - haven't tested on Linux 
    1462                 # though.The proper solution (other than time delay) requires 
    1463                 # more fundemental code refatoring 
    1464                 # Wojtek P. Nov 7, 2016 
    1465                 if not ON_MAC: 
    1466                     time.sleep(0.1) 
    14671451                self.Refresh() 
    14681452 
     
    26122596            Layout is called after fitting. 
    26132597        """ 
    2614         self._sleep4sec() 
    26152598        self.Layout() 
    26162599        return 
    2617  
    2618     def _sleep4sec(self): 
    2619         """ 
    2620             sleep for 1 sec only applied on Mac 
    2621             Note: This 1sec helps for Mac not to crash on self. 
    2622             Layout after self._draw_model 
    2623         """ 
    2624         if ON_MAC: 
    2625             time.sleep(1) 
    26262600 
    26272601    def _find_polyfunc_selection(self, disp_func=None): 
  • src/sas/sasgui/perspectives/fitting/fitpage.py

    r8c0d9eb r5156918  
    2929_BOX_WIDTH = 76 
    3030_DATA_BOX_WIDTH = 300 
    31 SMEAR_SIZE_L = 0.00 
    3231SMEAR_SIZE_H = 0.00 
    3332CUSTOM_MODEL = 'Plugin Models' 
     
    210209              "Please enter only the value of interest to customize smearing..." 
    211210        smear_message_new_psmear = \ 
    212               "Please enter both; the dQ will be generated by interpolation..." 
     211              "Please enter a fixed percentage to be applied to all Q values..." 
    213212        smear_message_2d_x_title = "<dQp>[1/A]:" 
    214213        smear_message_2d_y_title = "<dQs>[1/A]:" 
    215         smear_message_pinhole_min_title = "dQ_low[1/A]:" 
    216         smear_message_pinhole_max_title = "dQ_high[1/A]:" 
     214        smear_message_pinhole_percent_title = "dQ[%]:" 
    217215        smear_message_slit_height_title = "Slit height[1/A]:" 
    218216        smear_message_slit_width_title = "Slit width[1/A]:" 
     
    307305         
    308306        # textcntrl for custom resolution 
    309         self.smear_pinhole_max = ModelTextCtrl(self, wx.ID_ANY, 
    310                             size=(_BOX_WIDTH - 25, 20), 
    311                             style=wx.TE_PROCESS_ENTER, 
    312                             text_enter_callback=self.onPinholeSmear) 
    313         self.smear_pinhole_min = ModelTextCtrl(self, wx.ID_ANY, 
    314                             size=(_BOX_WIDTH - 25, 20), 
    315                             style=wx.TE_PROCESS_ENTER, 
    316                             text_enter_callback=self.onPinholeSmear) 
     307        self.smear_pinhole_percent = ModelTextCtrl(self, wx.ID_ANY, 
     308                                                   size=(_BOX_WIDTH - 25, 20), 
     309                                                   style=wx.TE_PROCESS_ENTER, 
     310                                                   text_enter_callback= 
     311                                                   self.onPinholeSmear) 
    317312        self.smear_slit_height = ModelTextCtrl(self, wx.ID_ANY, 
    318313                            size=(_BOX_WIDTH - 25, 20), 
     
    333328 
    334329        # set default values for smear 
    335         self.smear_pinhole_max.SetValue(str(self.dx_max)) 
    336         self.smear_pinhole_min.SetValue(str(self.dx_min)) 
     330        self.smear_pinhole_percent.SetValue(str(self.dx_percent)) 
    337331        self.smear_slit_height.SetValue(str(self.dxl)) 
    338332        self.smear_slit_width.SetValue(str(self.dxw)) 
     
    426420        self.smear_description_2d_y.SetToolTipString( 
    427421                                    " dQs(perpendicular) in q_phi direction.") 
    428         self.smear_description_pin_min = wx.StaticText(self, wx.ID_ANY, 
    429                         smear_message_pinhole_min_title, style=wx.ALIGN_LEFT) 
    430         self.smear_description_pin_max = wx.StaticText(self, wx.ID_ANY, 
    431                         smear_message_pinhole_max_title, style=wx.ALIGN_LEFT) 
     422        self.smear_description_pin_percent = wx.StaticText(self, wx.ID_ANY, 
     423                                            smear_message_pinhole_percent_title, 
     424                                            style=wx.ALIGN_LEFT) 
    432425        self.smear_description_slit_height = wx.StaticText(self, wx.ID_ANY, 
    433426                        smear_message_slit_height_title, style=wx.ALIGN_LEFT) 
     
    453446        self.sizer_new_smear.Add((15, -1)) 
    454447        self.sizer_new_smear.Add(self.smear_description_2d_x, 0, wx.CENTER, 10) 
    455         self.sizer_new_smear.Add(self.smear_description_pin_min, 
    456                                  0, wx.CENTER, 10) 
    457448        self.sizer_new_smear.Add(self.smear_description_slit_height, 
    458449                                 0, wx.CENTER, 10) 
    459450 
    460         self.sizer_new_smear.Add(self.smear_pinhole_min, 0, wx.CENTER, 10) 
    461451        self.sizer_new_smear.Add(self.smear_slit_height, 0, wx.CENTER, 10) 
    462452        self.sizer_new_smear.Add(self.smear_data_left, 0, wx.CENTER, 10) 
     
    464454        self.sizer_new_smear.Add(self.smear_description_2d_y, 
    465455                                 0, wx.CENTER, 10) 
    466         self.sizer_new_smear.Add(self.smear_description_pin_max, 
     456        self.sizer_new_smear.Add(self.smear_description_pin_percent, 
    467457                                 0, wx.CENTER, 10) 
    468458        self.sizer_new_smear.Add(self.smear_description_slit_width, 
    469459                                 0, wx.CENTER, 10) 
    470460 
    471         self.sizer_new_smear.Add(self.smear_pinhole_max, 0, wx.CENTER, 10) 
     461        self.sizer_new_smear.Add(self.smear_pinhole_percent, 0, wx.CENTER, 10) 
    472462        self.sizer_new_smear.Add(self.smear_slit_width, 0, wx.CENTER, 10) 
    473463        self.sizer_new_smear.Add(self.smear_data_right, 0, wx.CENTER, 10) 
     
    15811571        if self.dxw is None: 
    15821572            self.dxw = "" 
    1583         if self.dx_min is None: 
    1584             self.dx_min = SMEAR_SIZE_L 
    1585         if self.dx_max is None: 
    1586             self.dx_max = SMEAR_SIZE_H 
     1573        if self.dx_percent is None: 
     1574            self.dx_percent = SMEAR_SIZE_H 
    15871575 
    15881576    def _get_smear_info(self): 
     
    16461634            self.smear_description_2d_y.Show(True) 
    16471635            if self.pinhole_smearer.GetValue(): 
    1648                 self.smear_pinhole_min.Show(True) 
    1649                 self.smear_pinhole_max.Show(True) 
     1636                self.smear_pinhole_percent.Show(True) 
    16501637        # smear from data 
    16511638        elif self.enable_smearer.GetValue(): 
     
    16581645                    self.smear_description_slit_width.Show(True) 
    16591646                elif self.smear_type == 'Pinhole': 
    1660                     self.smear_description_pin_min.Show(True) 
    1661                     self.smear_description_pin_max.Show(True) 
     1647                    self.smear_description_pin_percent.Show(True) 
    16621648                self.smear_description_smear_type.Show(True) 
    16631649                self.smear_description_type.Show(True) 
     
    16681654            if self.smear_type == 'Pinhole': 
    16691655                self.smear_message_new_p.Show(True) 
    1670                 self.smear_description_pin_min.Show(True) 
    1671                 self.smear_description_pin_max.Show(True) 
    1672  
    1673             self.smear_pinhole_min.Show(True) 
    1674             self.smear_pinhole_max.Show(True) 
     1656                self.smear_description_pin_percent.Show(True) 
     1657 
     1658            self.smear_pinhole_percent.Show(True) 
    16751659        # custom slit smear 
    16761660        elif self.slit_smearer.GetValue(): 
     
    16971681        self.smear_data_left.Hide() 
    16981682        self.smear_data_right.Hide() 
    1699         self.smear_description_pin_min.Hide() 
    1700         self.smear_pinhole_min.Hide() 
    1701         self.smear_description_pin_max.Hide() 
    1702         self.smear_pinhole_max.Hide() 
     1683        self.smear_description_pin_percent.Hide() 
     1684        self.smear_pinhole_percent.Hide() 
    17031685        self.smear_description_slit_height.Hide() 
    17041686        self.smear_slit_height.Hide() 
     
    18261808        if not flag: 
    18271809            self.onSmear(None) 
    1828  
    1829     def _mac_sleep(self, sec=0.2): 
    1830         """ 
    1831         Give sleep to MAC 
    1832         """ 
    1833         if self.is_mac: 
    1834             time.sleep(sec) 
    18351810 
    18361811    def get_view_mode(self): 
     
    22062181        self.save_current_state() 
    22072182 
    2208         if not self.is_mac: 
    2209             self.Layout() 
    2210             self.Refresh() 
    2211         self._mac_sleep(0.1) 
    22122183        # plot model ( when drawing, do not update chisqr value again) 
    22132184        self._draw_model(update_chisqr=False, source='fit') 
     
    22492220            # event case of radio button 
    22502221            if tcrtl.GetValue(): 
    2251                 self.dx_min = 0.0 
    2252                 self.dx_max = 0.0 
     2222                self.dx_percent = 0.0 
    22532223                is_new_pinhole = True 
    22542224            else: 
     
    22872257        """ 
    22882258        # get the values 
    2289         pin_min = self.smear_pinhole_min.GetValue() 
    2290         pin_max = self.smear_pinhole_max.GetValue() 
    2291  
    2292         # Check changes in slit width 
     2259        pin_percent = self.smear_pinhole_percent.GetValue() 
     2260 
     2261        # Check changes in slit heigth 
    22932262        try: 
    2294             dx_min = float(pin_min) 
     2263            dx_percent = float(pin_percent) 
    22952264        except: 
    22962265            return True 
    2297         if self.dx_min != dx_min: 
    2298             return True 
    2299  
    2300         # Check changes in slit heigth 
    2301         try: 
    2302             dx_max = float(pin_max) 
    2303         except: 
    2304             return True 
    2305         if self.dx_max != dx_max: 
     2266        if self.dx_percent != dx_percent: 
    23062267            return True 
    23072268        return False 
     
    23292290        msg = None 
    23302291 
    2331         get_pin_min = self.smear_pinhole_min 
    2332         get_pin_max = self.smear_pinhole_max 
    2333  
    2334         if not check_float(get_pin_min): 
    2335             get_pin_min.SetBackgroundColour("pink") 
    2336             msg = "Model Error:wrong value entered!!!" 
    2337         elif not check_float(get_pin_max): 
    2338             get_pin_max.SetBackgroundColour("pink") 
     2292        get_pin_percent = self.smear_pinhole_percent 
     2293 
     2294        if not check_float(get_pin_percent): 
     2295            get_pin_percent.SetBackgroundColour("pink") 
    23392296            msg = "Model Error:wrong value entered!!!" 
    23402297        else: 
    23412298            if len_data < 2: 
    23422299                len_data = 2 
    2343             self.dx_min = float(get_pin_min.GetValue()) 
    2344             self.dx_max = float(get_pin_max.GetValue()) 
    2345             if self.dx_min < 0: 
    2346                 get_pin_min.SetBackgroundColour("pink") 
     2300            self.dx_percent = float(get_pin_percent.GetValue()) 
     2301            if self.dx_percent < 0: 
     2302                get_pin_percent.SetBackgroundColour("pink") 
    23472303                msg = "Model Error:This value can not be negative!!!" 
    2348             elif self.dx_max < 0: 
    2349                 get_pin_max.SetBackgroundColour("pink") 
    2350                 msg = "Model Error:This value can not be negative!!!" 
    2351             elif self.dx_min is not None and self.dx_max is not None: 
     2304            elif self.dx_percent is not None: 
     2305                percent = self.dx_percent/100 
    23522306                if self._is_2D(): 
    2353                     data.dqx_data[data.dqx_data == 0] = self.dx_min 
    2354                     data.dqy_data[data.dqy_data == 0] = self.dx_max 
    2355                 elif self.dx_min == self.dx_max: 
    2356                     data.dx[data.dx == 0] = self.dx_min 
     2307                    data.dqx_data[data.dqx_data == 0] = percent * data.qx_data 
     2308                    data.dqy_data[data.dqy_data == 0] = percent * data.qy_data 
    23572309                else: 
    2358                     step = (self.dx_max - self.dx_min) / (len_data - 1) 
    2359                     data.dx = numpy.arange(self.dx_min, 
    2360                                            self.dx_max + step / 1.1, 
    2361                                            step) 
    2362             elif self.dx_min is not None: 
    2363                 if self._is_2D(): 
    2364                     data.dqx_data[data.dqx_data == 0] = self.dx_min 
    2365                 else: 
    2366                     data.dx[data.dx == 0] = self.dx_min 
    2367             elif self.dx_max is not None: 
    2368                 if self._is_2D(): 
    2369                     data.dqy_data[data.dqy_data == 0] = self.dx_max 
    2370                 else: 
    2371                     data.dx[data.dx == 0] = self.dx_max 
     2310                    data.dx = percent * data.x 
    23722311            self.current_smearer = smear_selection(data, self.model) 
    23732312            # 2D need to set accuracy 
     
    23792318            wx.PostEvent(self._manager.parent, StatusEvent(status=msg)) 
    23802319        else: 
    2381             get_pin_min.SetBackgroundColour("white") 
    2382             get_pin_max.SetBackgroundColour("white") 
     2320            get_pin_percent.SetBackgroundColour("white") 
    23832321        # set smearing value whether or not the data contain the smearing info 
    23842322 
  • src/sas/sasgui/perspectives/fitting/fitting.py

    rddbac66 r5156918  
    876876                qmin=qmin, qmax=qmax, weight=weight) 
    877877 
    878     def _mac_sleep(self, sec=0.2): 
    879         """ 
    880         Give sleep to MAC 
    881         """ 
    882         if ON_MAC: 
    883             time.sleep(sec) 
    884  
    885878    def draw_model(self, model, page_id, data=None, smearer=None, 
    886879                   enable1D=True, enable2D=False, 
     
    10301023                                manager=self, 
    10311024                                improvement_delta=0.1) 
    1032         self._mac_sleep(0.2) 
    10331025 
    10341026        # batch fit 
     
    12701262        :param elapsed: time spent at the fitting level 
    12711263        """ 
    1272         self._mac_sleep(0.2) 
    12731264        uid = page_id[0] 
    12741265        if uid in self.fit_thread_list.keys(): 
     
    15201511            page_id = [] 
    15211512        ## fit more than 1 model at the same time 
    1522         self._mac_sleep(0.2) 
    15231513        try: 
    15241514            index = 0 
     
    17551745                                          data_id="Data  " + data.name + " unsmeared", 
    17561746                                          dy=unsmeared_error) 
    1757                  
    1758             if sq_model is not None and pq_model is not None: 
    1759                 self.create_theory_1D(x, sq_model, page_id, model, data, state, 
    1760                                       data_description=model.name + " S(q)", 
    1761                                       data_id=str(page_id) + " " + data.name + " S(q)") 
    1762                 self.create_theory_1D(x, pq_model, page_id, model, data, state, 
    1763                                       data_description=model.name + " P(q)", 
    1764                                       data_id=str(page_id) + " " + data.name + " P(q)") 
    1765  
     1747            # Comment this out until we can get P*S models with correctly populated parameters 
     1748            #if sq_model is not None and pq_model is not None: 
     1749            #    self.create_theory_1D(x, sq_model, page_id, model, data, state, 
     1750            #                          data_description=model.name + " S(q)", 
     1751            #                          data_id=str(page_id) + " " + data.name + " S(q)") 
     1752            #    self.create_theory_1D(x, pq_model, page_id, model, data, state, 
     1753            #                          data_description=model.name + " P(q)", 
     1754            #                          data_id=str(page_id) + " " + data.name + " P(q)") 
    17661755 
    17671756            current_pg = self.fit_panel.get_page_by_id(page_id) 
  • src/sas/sasgui/perspectives/fitting/media/plugin.rst

    r5295cf5 r984f3fc  
    364364  - the limits will show up as the default limits for the fit making it easy, 
    365365    for example, to force the radius to always be greater than zero. 
     366 
     367  - these are hard limits defining the valid range of parameter values; 
     368    polydisperity distributions will be truncated at the limits. 
    366369 
    367370- **"type"** can be one of: "", "sld", "volume", or "orientation". 
  • src/sas/sasgui/perspectives/fitting/pagestate.py

    r71601312 r27109e5  
    7474                            ["dq_l", "dq_l", "float"], 
    7575                            ["dq_r", "dq_r", "float"], 
    76                             ["dx_max", "dx_max", "float"], 
    77                             ["dx_min", "dx_min", "float"], 
     76                            ["dx_percent", "dx_percent", "float"], 
    7877                            ["dxl", "dxl", "float"], 
    7978                            ["dxw", "dxw", "float"]] 
     
    215214        self.dq_l = None 
    216215        self.dq_r = None 
    217         self.dx_max = None 
    218         self.dx_min = None 
     216        self.dx_percent = None 
     217        self.dx_old = False 
    219218        self.dxl = None 
    220219        self.dxw = None 
     
    343342        obj.dq_l = copy.deepcopy(self.dq_l) 
    344343        obj.dq_r = copy.deepcopy(self.dq_r) 
    345         obj.dx_max = copy.deepcopy(self.dx_max) 
    346         obj.dx_min = copy.deepcopy(self.dx_min) 
     344        obj.dx_percent = copy.deepcopy(self.dx_percent) 
     345        obj.dx_old = copy.deepcopy(self.dx_old) 
    347346        obj.dxl = copy.deepcopy(self.dxl) 
    348347        obj.dxw = copy.deepcopy(self.dxw) 
     
    562561        rep += "dq_l  : %s\n" % self.dq_l 
    563562        rep += "dq_r  : %s\n" % self.dq_r 
    564         rep += "dx_max  : %s\n" % str(self.dx_max) 
    565         rep += "dx_min : %s\n" % str(self.dx_min) 
     563        rep += "dx_percent  : %s\n" % str(self.dx_percent) 
    566564        rep += "dxl  : %s\n" % str(self.dxl) 
    567565        rep += "dxw : %s\n" % str(self.dxw) 
     
    821819 
    822820        attr = newdoc.createAttribute("version") 
    823         import sasview 
     821        from sas import sasview 
    824822        attr.nodeValue = sasview.__version__ 
    825823        # attr.nodeValue = '1.0' 
     
    10481046                    setattr(self, item[0], parse_entry_helper(node, item)) 
    10491047 
     1048                dx_old_node = get_content('ns:%s' % 'dx_min', entry) 
    10501049                for item in LIST_OF_STATE_ATTRIBUTES: 
    1051                     node = get_content('ns:%s' % item[0], entry) 
    1052                     setattr(self, item[0], parse_entry_helper(node, item)) 
     1050                    if item[0] == "dx_percent" and dx_old_node is not None: 
     1051                        dxmin = ["dx_min", "dx_min", "float"] 
     1052                        setattr(self, item[0], parse_entry_helper(dx_old_node, 
     1053                                                                  dxmin)) 
     1054                        self.dx_old = True 
     1055                    else: 
     1056                        node = get_content('ns:%s' % item[0], entry) 
     1057                        setattr(self, item[0], parse_entry_helper(node, item)) 
    10531058 
    10541059                for item in LIST_OF_STATE_PARAMETERS: 
  • test/corfunc/test/utest_corfunc.py

    racefa2b r253eb6c6  
    88from sas.sascalc.corfunc.corfunc_calculator import CorfuncCalculator 
    99from sas.sascalc.dataloader.data_info import Data1D 
    10 import matplotlib.pyplot as plt 
     10 
    1111 
    1212class TestCalculator(unittest.TestCase): 
     
    6969        self.assertLess(abs(params['max']-75), 2.5) # L_p ~= 75 
    7070 
    71  
    7271    # Ensure tests are ran in correct order; 
    7372    # Each test depends on the one before it 
  • test/sasdataloader/test/utest_abs_reader.py

    r5f26aa4 r36d69e1  
    44 
    55import unittest 
    6 import numpy, math 
    7 from sas.sascalc.dataloader.loader import  Loader 
     6import math 
     7import numpy as np 
     8from sas.sascalc.dataloader.loader import Loader 
     9from sas.sascalc.dataloader.readers.IgorReader import Reader as IgorReader 
    810from sas.sascalc.dataloader.data_info import Data1D 
    911  
     
    8688     
    8789    def setUp(self): 
    88         self.data = Loader().load("MAR07232_rest.ASC") 
    89          
     90        # the IgorReader should be able to read this filetype 
     91        # if it can't, stop here. 
     92        reader = IgorReader() 
     93        self.data = reader.read("MAR07232_rest.ASC") 
     94 
    9095    def test_igor_checkdata(self): 
    9196        """ 
     
    108113         
    109114        self.assertEqual(self.data.detector[0].beam_center_unit, 'mm') 
    110         center_x = (68.76-1)*5.0 
    111         center_y = (62.47-1)*5.0 
     115        center_x = (68.76 - 1)*5.0 
     116        center_y = (62.47 - 1)*5.0 
    112117        self.assertEqual(self.data.detector[0].beam_center.x, center_x) 
    113118        self.assertEqual(self.data.detector[0].beam_center.y, center_y) 
    114119         
    115120        self.assertEqual(self.data.I_unit, '1/cm') 
    116         self.assertEqual(self.data.data[0], 0.279783) 
    117         self.assertEqual(self.data.data[1], 0.28951) 
    118         self.assertEqual(self.data.data[2], 0.167634) 
    119          
     121        # 3 points should be suffcient to check that the data is in column 
     122        # major order. 
     123        np.testing.assert_almost_equal(self.data.data[0:3], 
     124                                       [0.279783, 0.28951, 0.167634]) 
     125        np.testing.assert_almost_equal(self.data.qx_data[0:3], 
     126                                       [-0.01849072, -0.01821785, -0.01794498]) 
     127        np.testing.assert_almost_equal(self.data.qy_data[0:3], 
     128                                       [-0.01677435, -0.01677435, -0.01677435]) 
     129 
     130    def test_generic_loader(self): 
     131        # the generic loader should direct the file to IgorReader as well 
     132        data = Loader().load("MAR07232_rest.ASC") 
     133        self.assertEqual(data.meta_data['loader'], "IGOR 2D") 
     134 
     135 
    120136class danse_reader(unittest.TestCase): 
    121137     
     
    313329        from sas.sascalc.dataloader.readers.cansas_reader import Reader 
    314330        r = Reader() 
    315         x = numpy.ones(5) 
    316         y = numpy.ones(5) 
    317         dy = numpy.ones(5) 
     331        x = np.ones(5) 
     332        y = np.ones(5) 
     333        dy = np.ones(5) 
    318334         
    319335        filename = "write_test.xml" 
Note: See TracChangeset for help on using the changeset viewer.