Changeset 868846b in sasview


Ignore:
Timestamp:
Sep 11, 2017 5:49:05 PM (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:
7b3f154
Parents:
e2b2473 (diff), 05b0bf6 (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:
Paul Butler <butlerpd@…> (09/11/17 17:49:05)
git-committer:
GitHub <noreply@…> (09/11/17 17:49:05)
Message:

Merge pull request #78 from SasView?/ticket-597

Ticket 597

Files:
3 added
7 deleted
12 edited

Legend:

Unmodified
Added
Removed
  • .pydevproject

    r26c8be3 r9d93c37  
    44<pydev_property name="org.python.pydev.PYTHON_PROJECT_VERSION">python 2.7</pydev_property> 
    55<pydev_pathproperty name="org.python.pydev.PROJECT_SOURCE_PATH"> 
    6 <path>/sasview4/src</path> 
     6<path>/sasview/src</path> 
    77</pydev_pathproperty> 
    88</pydev_project> 
  • src/sas/sasgui/perspectives/fitting/media/fitting_help.rst

    r5295cf5 r05b0bf6  
    484484.. ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ 
    485485 
     486.. _Batch_Fit_Mode: 
     487 
    486488Batch Fit Mode 
    487489-------------- 
     
    636638 
    637639     Example: radius [2 : 5] , radius [10 : 25] 
    638  
    639 .. ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ 
    640  
    641 .. note::  This help document was last changed by Steve King, 10Oct2016 
     640      
     641.. ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ 
     642 
     643Combined Batch Fit Mode 
     644----------------------- 
     645 
     646The purpose of the Combined Batch Fit is to allow running two or more batch 
     647fits in sequence without overwriting the output table of results.  This may be 
     648of interest for example if one is fitting a series of data sets where there is 
     649a shape change occurring in the series that requires changing the model part 
     650way through the series; for example a sphere to rod transition.  Indeed the 
     651regular batch mode does not allow for multiple models and requires all the 
     652files in the series to be fit with single model and set of parameters.  While 
     653it is of course possible to just run part of the series as a batch fit using 
     654model one followed by running another batch fit on the rest of the series with 
     655model two (and/or model three etc), doing so will overwrite the table of 
     656outputs from the previous batch fit(s).  This may not be desirable if one is 
     657interested in comparing the parameters: for example the sphere radius of set 
     658one and the cylinder radius of set two. 
     659 
     660Method 
     661^^^^^^ 
     662 
     663In order to use the *Combined Batch Fit*, first load all the data needed as 
     664described in :ref:`Loading_data`. Next start up two or more *BatchPage* fits 
     665following the instructions in :ref:`Batch_Fit_Mode` but **DO NOT PRESS FIT**. 
     666At this point the *Combine Batch Fit* menu item under the *Fitting menu* should 
     667be active (if there is one or no *BatchPage* the menu item will be greyed out 
     668and inactive).  Clicking on *Combine Batch Fit* will bring up a new panel, 
     669similar to the *Const & Simult Fit* panel. In this case there will be a 
     670checkbox for each *BatchPage* instead of each *FitPage* that should be included 
     671in the fit.  Once all are selected, click the Fit button on 
     672the *BatchPage* to run each batch fit in *sequence* 
     673 
     674.. image:: combine_batch_page.png 
     675 
     676The batch table will then pop up at the end as for the case of the simple Batch 
     677Fitting with the following caveats: 
     678 
     679.. note:: 
     680   The order matters.  The parameters in the table will be taken from the model 
     681   used in the first *BatchPage* of the list.  Any parameters from the 
     682   second and later *BatchPage* s that have the same name as a parameter in the 
     683   first will show up allowing for plotting of that parameter across the 
     684   models. The other parameters will not be available in the grid. 
     685.. note:: 
     686   a corralary of the above is that currently models created as a sum|multiply 
     687   model will not work as desired because the generated model parameters have a 
     688   p#_ appended to the beginning and thus radius and p1_radius will not be 
     689   recognized as the same parameter. 
     690    
     691.. image:: combine_batch_grid.png 
     692 
     693In the example shown above the data is a time series with a shifting peak. 
     694The first part of the series was fitted using the *broad_peak* model, while 
     695the rest of the data were fit using the *gaussian_peak* model. Unfortunately the 
     696time is not listed in the file but the file name contains the information. As 
     697described in :ref:`Grid_Window`, a column can be added manually, in this case 
     698called time, and the peak position plotted against time.  
     699 
     700.. image:: combine_batch_plot.png 
     701 
     702Note the discontinuity in the peak position.  This reflects the fact that the 
     703Gaussian fit is a rather poor model for the data and is not actually 
     704finding the peak. 
     705 
     706.. ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ 
     707 
     708.. note::  This help document was last changed by Paul Butler, 10 September 
     709   2017 
  • src/sas/sasgui/perspectives/fitting/simfitpage.py

    r959eb01 ra9f9ca4  
    11""" 
    2     Simultaneous fit page 
     2    Simultaneous or Batch fit page 
    33""" 
     4# Note that this is used for both Simultaneous/Constrained fit AND for  
     5# combined batch fit.  This is done through setting of the batch_on parameter. 
     6# There are the a half dozen or so places where an if statement is used as in  
     7# if not batch_on: 
     8#     xxxx 
     9# else: 
     10#     xxxx 
     11# This is just wrong but dont have time to fix this go. Proper approach would be 
     12# to strip all parts of the code that depend on batch_on and create the top 
     13# level class from which a contrained/simultaneous fit page and a combined  
     14# batch page inherit. 
     15# 
     16#            04/09/2017   --PDB 
     17 
    418import sys 
    519from collections import namedtuple 
     
    400414        # General Help button 
    401415        self.btHelp = wx.Button(self, wx.ID_HELP, 'HELP') 
    402         self.btHelp.SetToolTipString("Simultaneous/Constrained Fitting help.") 
     416        if self.batch_on: 
     417            self.btHelp.SetToolTipString("Combined Batch Fitting help.") 
     418        else: 
     419            self.btHelp.SetToolTipString("Simultaneous/Constrained Fitting help.") 
    403420        self.btHelp.Bind(wx.EVT_BUTTON, self._on_help) 
    404421 
     
    527544    """ 
    528545        _TreeLocation = "user/sasgui/perspectives/fitting/fitting_help.html" 
    529         _PageAnchor = "#simultaneous-fit-mode" 
    530         _doc_viewer = DocumentationWindow(self, self.ID_DOC, _TreeLocation, 
     546        if not self.batch_on: 
     547            _PageAnchor = "#simultaneous-fit-mode" 
     548            _doc_viewer = DocumentationWindow(self, self.ID_DOC, _TreeLocation, 
    531549                                          _PageAnchor, 
    532550                                          "Simultaneous/Constrained Fitting Help") 
     551        else: 
     552            _PageAnchor = "#combined-batch-fit-mode" 
     553            _doc_viewer = DocumentationWindow(self, self.ID_DOC, _TreeLocation, 
     554                                          _PageAnchor, 
     555                                          "Combined Batch Fit Help") 
    533556 
    534557    def set_manager(self, manager): 
  • src/sas/sascalc/dataloader/data_info.py

    r5a8cdbb r17e257b5  
    11611161    final_dataset = None 
    11621162    if isinstance(data, plottable_1D): 
    1163         final_dataset = Data1D(data.x, data.y) 
     1163        final_dataset = Data1D(data.x, data.y, isSesans=datainfo.isSesans) 
    11641164        final_dataset.dx = data.dx 
    11651165        final_dataset.dy = data.dy 
    11661166        final_dataset.dxl = data.dxl 
    11671167        final_dataset.dxw = data.dxw 
     1168        final_dataset.x_unit = data._xunit 
     1169        final_dataset.y_unit = data._yunit 
    11681170        final_dataset.xaxis(data._xaxis, data._xunit) 
    11691171        final_dataset.yaxis(data._yaxis, data._yunit) 
  • src/sas/sascalc/dataloader/file_reader_base_class.py

    rdcb91cf ra78a02f  
    66 
    77import os 
     8import re 
    89import logging 
    910import numpy as np 
     
    106107        for data in self.output: 
    107108            if isinstance(data, Data1D): 
     109                # Normalize the units for 
     110                data.x_unit = self.format_unit(data.x_unit) 
     111                data.y_unit = self.format_unit(data.y_unit) 
    108112                # Sort data by increasing x and remove 1st point 
    109113                ind = np.lexsort((data.y, data.x)) 
     
    131135        for dataset in self.output: 
    132136            if isinstance(dataset, Data2D): 
     137                # Normalize the units for 
     138                dataset.x_unit = self.format_unit(dataset.Q_unit) 
     139                dataset.y_unit = self.format_unit(dataset.I_unit) 
    133140                dataset.data = dataset.data.astype(np.float64) 
    134141                dataset.qx_data = dataset.qx_data.astype(np.float64) 
     
    155162                dataset.data = dataset.data.flatten() 
    156163 
     164    def format_unit(self, unit=None): 
     165        """ 
     166        Format units a common way 
     167        :param unit: 
     168        :return: 
     169        """ 
     170        if unit: 
     171            split = unit.split("/") 
     172            if len(split) == 1: 
     173                return unit 
     174            elif split[0] == '1': 
     175                return "{0}^".format(split[1]) + "{-1}" 
     176            else: 
     177                return "{0}*{1}^".format(split[0], split[1]) + "{-1}" 
     178 
    157179    def set_all_to_none(self): 
    158180        """ 
  • src/sas/sascalc/dataloader/readers/cansas_reader.py

    rdcb91cf ra78a02f  
    299299                    self.current_dataset.dx = np.append(self.current_dataset.dx, data_point) 
    300300                elif tagname == 'dQw': 
    301                     if self.current_dataset.dqw is None: self.current_dataset.dqw = np.empty(0) 
     301                    if self.current_dataset.dxw is None: 
     302                        self.current_dataset.dxw = np.empty(0) 
    302303                    self.current_dataset.dxw = np.append(self.current_dataset.dxw, data_point) 
    303304                elif tagname == 'dQl': 
    304                     if self.current_dataset.dxl is None: self.current_dataset.dxl = np.empty(0) 
     305                    if self.current_dataset.dxl is None: 
     306                        self.current_dataset.dxl = np.empty(0) 
    305307                    self.current_dataset.dxl = np.append(self.current_dataset.dxl, data_point) 
    306308                elif tagname == 'Qmean': 
  • src/sas/sascalc/dataloader/readers/danse_reader.py

    r713a047 ra78a02f  
    189189        x_vals = np.tile(x_vals, (size_y, 1)).flatten() 
    190190        y_vals = np.tile(y_vals, (size_x, 1)).T.flatten() 
    191         if self.current_dataset.err_data == np.all(np.array(None)) or np.any(self.current_dataset.err_data <= 0): 
     191        if (np.all(self.current_dataset.err_data == None) 
     192                or np.any(self.current_dataset.err_data <= 0)): 
    192193            new_err_data = np.sqrt(np.abs(self.current_dataset.data)) 
    193194        else: 
  • test/sasdataloader/test/utest_abs_reader.py

    rce8c7bd ra78a02f  
    2020    def setUp(self): 
    2121        reader = AbsReader() 
    22         self.data = reader.read("jan08002.ABS") 
     22        data = reader.read("jan08002.ABS") 
     23        self.data= data[0] 
    2324 
    2425    def test_abs_checkdata(self): 
     
    4748        self.assertEqual(self.data.detector[0].beam_center.y, center_y) 
    4849 
    49         self.assertEqual(self.data.y_unit, '1/cm') 
     50        self.assertEqual(self.data.y_unit, 'cm^{-1}') 
    5051        self.assertEqual(self.data.x[0], 0.002618) 
    5152        self.assertEqual(self.data.x[1], 0.007854) 
     
    6970        # the generic loader should work as well 
    7071        data = Loader().load("jan08002.ABS") 
    71         self.assertEqual(data.meta_data['loader'], "IGOR 1D") 
     72        self.assertEqual(data[0].meta_data['loader'], "IGOR 1D") 
    7273 
    7374class DanseReaderTests(unittest.TestCase): 
     
    7576    def setUp(self): 
    7677        reader = DANSEReader() 
    77         self.data = reader.read("MP_New.sans") 
     78        data = reader.read("MP_New.sans") 
     79        self.data = data[0] 
    7880 
    7981    def test_checkdata(self): 
     
    112114        # the generic loader should work as well 
    113115        data = Loader().load("MP_New.sans") 
    114         self.assertEqual(data.meta_data['loader'], "DANSE") 
     116        self.assertEqual(data[0].meta_data['loader'], "DANSE") 
    115117 
    116118 
     
    144146        # Data 
    145147        self.assertEqual(len(self.data.x), 2) 
    146         self.assertEqual(self.data.x_unit, '1/A') 
    147         self.assertEqual(self.data.y_unit, '1/cm') 
     148        self.assertEqual(self.data.x_unit, 'A^{-1}') 
     149        self.assertEqual(self.data.y_unit, 'cm^{-1}') 
    148150        self.assertAlmostEqual(self.data.x[0], 0.02, 6) 
    149151        self.assertAlmostEqual(self.data.y[0], 1000, 6) 
     
    257259            self.assertTrue(item.date in ['04-Sep-2007 18:35:02', 
    258260                                          '03-SEP-2006 11:42:47']) 
    259             print(item.term) 
    260261            for t in item.term: 
    261262                if (t['name'] == "ABS:DSTAND" 
     
    309310 
    310311        self.assertEqual(self.data.meta_data['loader'], "CanSAS XML 1D") 
    311         print(self.data.errors) 
    312         self.assertEqual(len(self.data.errors), 1) 
     312        self.assertEqual(len(self.data.errors), 0) 
    313313 
    314314    def test_slits(self): 
     
    324324        # Data 
    325325        self.assertEqual(len(self.data.x), 2) 
    326         self.assertEqual(self.data.x_unit, '1/A') 
    327         self.assertEqual(self.data.y_unit, '1/cm') 
     326        self.assertEqual(self.data.x_unit, 'A^{-1}') 
     327        self.assertEqual(self.data.y_unit, 'cm^{-1}') 
    328328        self.assertEqual(self.data.x[0], 0.02) 
    329329        self.assertEqual(self.data.y[0], 1000) 
     
    333333        self.assertEqual(self.data.x[1], 0.03) 
    334334        self.assertAlmostEquals(self.data.y[1], 1001.0) 
    335         self.assertEqual(self.data.dx, None) 
     335        self.assertEqual(self.data.dx[0], 0.0) 
    336336        self.assertEqual(self.data.dxl[1], 0.005) 
    337337        self.assertEqual(self.data.dxw[1], 0.001) 
  • test/sasdataloader/test/utest_ascii.py

    rad92c5a ra78a02f  
    3232        self.assertEqual(self.f1.x[0],0.002618) 
    3333        self.assertEqual(self.f1.x[9],0.0497) 
    34         self.assertEqual(self.f1.x_unit, '1/A') 
    35         self.assertEqual(self.f1.y_unit, '1/cm') 
     34        self.assertTrue(self.f1.x_unit == 'A^{-1}') 
     35        self.assertTrue(self.f1.y_unit == 'cm^{-1}') 
    3636         
    3737        self.assertEqual(self.f1.meta_data['loader'],"ASCII") 
  • test/sasdataloader/test/utest_cansas.py

    r1fc50fb2 r17e257b5  
    2020 
    2121from lxml import etree 
     22from lxml.etree import XMLSyntaxError 
    2223from xml.dom import minidom 
    2324 
     
    6263        """ 
    6364        invalid = StringIO.StringIO('<a><c></b></a>') 
    64         XMLreader(invalid) 
     65        self.assertRaises(XMLSyntaxError, lambda: XMLreader(invalid)) 
    6566 
    6667    def test_xml_validate(self): 
     
    302303        self.assertTrue(data._yunit == "cm^{-1}") 
    303304        self.assertTrue(data.y.size == 100) 
    304         self.assertAlmostEqual(data.y[9], 0.952749011516985) 
    305         self.assertAlmostEqual(data.x[9], 0.3834415188257777) 
     305        self.assertAlmostEqual(data.y[40], 0.952749011516985) 
     306        self.assertAlmostEqual(data.x[40], 0.3834415188257777) 
    306307        self.assertAlmostEqual(len(data.meta_data), 0) 
    307308 
  • test/sasdataloader/test/utest_sesans.py

    ra67c494 ra78a02f  
    44 
    55import unittest 
     6from sas.sascalc.dataloader.loader_exceptions import FileContentsException,\ 
     7    DefaultReaderException 
    68from sas.sascalc.dataloader.readers.sesans_reader import Reader 
    79from sas.sascalc.dataloader.loader import  Loader 
     
    1719            Test .SES in the full loader to make sure that the file type is correctly accepted 
    1820        """ 
    19         f = Loader().load("sesans_examples/sphere2micron.ses") 
     21        file = Loader().load("sesans_examples/sphere2micron.ses") 
     22        f = file[0] 
    2023        # self.assertEqual(f, 5) 
    2124        self.assertEqual(len(f.x), 40) 
     
    3437            Test .SES loading on a TOF dataset 
    3538        """ 
    36         f = self.loader("sesans_examples/sphere_isis.ses") 
     39        file = self.loader("sesans_examples/sphere_isis.ses") 
     40        f = file[0] 
    3741        self.assertEqual(len(f.x), 57) 
    3842        self.assertEqual(f.x[-1], 19303.4) 
     
    4852        """ 
    4953        self.assertRaises( 
    50             RuntimeError, 
     54            FileContentsException, 
    5155            self.loader, 
    5256            "sesans_examples/sesans_no_data.ses") 
     
    5761        """ 
    5862        self.assertRaises( 
    59             RuntimeError, 
     63            FileContentsException, 
    6064            self.loader, 
    6165            "sesans_examples/no_spin_echo_unit.ses") 
    62  
    63     def test_sesans_no_version(self): 
    64         """ 
    65             Confirm that sesans files with no file format version raise an appropriate error 
    66         """ 
    67         self.assertRaises( 
    68             RuntimeError, 
    69             self.loader, 
    70             "sesans_examples/no_version.ses") 
    7166 
    7267    def test_sesans_future_version(self): 
     
    7570        """ 
    7671        self.assertRaises( 
    77             RuntimeError, 
     72            FileContentsException, 
    7873            self.loader, 
    7974            "sesans_examples/next_gen.ses") 
     
    8479        """ 
    8580        self.assertRaises( 
    86             RuntimeError, 
     81            FileContentsException, 
    8782            self.loader, 
    8883            "sesans_examples/no_wavelength.ses") 
     
    9388        """ 
    9489        self.assertRaises( 
    95             RuntimeError, 
     90            FileContentsException, 
    9691            self.loader, 
    9792            "sesans_examples/too_many_headers.ses") 
  • test/utest_sasview.py

    raaf5e49 rb54440d  
    4444    n_errors = 0 
    4545    n_failures = 0 
    46      
     46 
    4747    for d in (dirs if dirs else os.listdir(test_root)): 
    48          
     48 
    4949        # Check for modules to be skipped 
    5050        if d in SKIPPED_DIRS: 
    5151            continue 
    52          
     52 
    5353 
    5454        # Go through modules looking for unit tests 
     
    6464                    #print std_out 
    6565                    #sys.exit() 
    66                     has_failed = True 
    6766                    m = re.search("Ran ([0-9]+) test", std_out) 
    6867                    if m is not None: 
    69                         has_failed = False 
    7068                        n_tests += int(m.group(1)) 
     69                        has_tests = True 
     70                    else: 
     71                        has_tests = False 
    7172 
    72                     m = re.search("FAILED \(errors=([0-9]+)\)", std_out) 
     73                    has_failed = "FAILED (" in std_out 
     74                    m = re.search("FAILED \(.*errors=([0-9]+)", std_out) 
    7375                    if m is not None: 
    74                         has_failed = True 
    7576                        n_errors += int(m.group(1)) 
    76                      
    77                     m = re.search("FAILED \(failures=([0-9]+)\)", std_out) 
     77                    m = re.search("FAILED \(.*failures=([0-9]+)", std_out) 
    7878                    if m is not None: 
    79                         has_failed = True 
    8079                        n_failures += int(m.group(1)) 
    81                      
    82                     if has_failed: 
     80 
     81                    if has_failed or not has_tests: 
    8382                        failed += 1 
    8483                        print("Result for %s (%s): FAILED" % (module_name, module_dir)) 
     
    102101        print("    Test errors:  %d" % n_errors) 
    103102    print("----------------------------------------------") 
    104      
     103 
    105104    return failed 
    106105 
     
    110109    if run_tests(dirs=dirs, all=all)>0: 
    111110        sys.exit(1) 
    112      
     111 
Note: See TracChangeset for help on using the changeset viewer.