Changeset a40e913 in sasview


Ignore:
Timestamp:
Jan 11, 2018 8:29:18 AM (4 years ago)
Author:
GitHub <noreply@…>
Branches:
master, magnetic_scatt, release-4.2.2, ticket-1009, ticket-1094-headless, ticket-1242-2d-resolution, ticket-1243, ticket-1249, ticket885, unittest-saveload
Children:
8cc9048, 6eb02a5
Parents:
2bdf61a (diff), a58b5a0 (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@…> (01/11/18 08:29:18)
git-committer:
GitHub <noreply@…> (01/11/18 08:29:18)
Message:

Merge pull request #135 from SasView?/ticket-1037

Ticket 1037: Remove nan values from 1D and 2D data objects

closes #1037

Files:
7 added
1 deleted
12 edited

Legend:

Unmodified
Added
Removed
  • src/sas/sascalc/dataloader/file_reader_base_class.py

    r3053a4a ra58b5a0  
    77import os 
    88import sys 
    9 import re 
     9import math 
    1010import logging 
    1111from abc import abstractmethod 
     
    2525    def decode(s): 
    2626        return s.decode() if isinstance(s, bytes) else s 
     27 
     28# Data 1D fields for iterative purposes 
     29FIELDS_1D = ('x', 'y', 'dx', 'dy', 'dxl', 'dxw') 
     30# Data 2D fields for iterative purposes 
     31FIELDS_2D = ('data', 'qx_data', 'qy_data', 'q_data', 'err_data', 
     32                 'dqx_data', 'dqy_data', 'mask') 
     33 
    2734 
    2835class FileReader(object): 
     
    102109        self.current_dataset = None 
    103110        self.filepath = None 
     111        self.ind = None 
    104112        self.output = [] 
    105113 
     
    159167                # Sort data by increasing x and remove 1st point 
    160168                ind = np.lexsort((data.y, data.x)) 
    161                 data.x = np.asarray([data.x[i] for i in ind]).astype(np.float64) 
    162                 data.y = np.asarray([data.y[i] for i in ind]).astype(np.float64) 
     169                data.x = self._reorder_1d_array(data.x, ind) 
     170                data.y = self._reorder_1d_array(data.y, ind) 
    163171                if data.dx is not None: 
    164172                    if len(data.dx) == 0: 
    165173                        data.dx = None 
    166174                        continue 
    167                     data.dx = np.asarray([data.dx[i] for i in ind]).astype(np.float64) 
     175                    data.dx = self._reorder_1d_array(data.dx, ind) 
    168176                if data.dxl is not None: 
    169                     data.dxl = np.asarray([data.dxl[i] for i in ind]).astype(np.float64) 
     177                    data.dxl = self._reorder_1d_array(data.dxl, ind) 
    170178                if data.dxw is not None: 
    171                     data.dxw = np.asarray([data.dxw[i] for i in ind]).astype(np.float64) 
     179                    data.dxw = self._reorder_1d_array(data.dxw, ind) 
    172180                if data.dy is not None: 
    173181                    if len(data.dy) == 0: 
    174182                        data.dy = None 
    175183                        continue 
    176                     data.dy = np.asarray([data.dy[i] for i in ind]).astype(np.float64) 
     184                    data.dy = self._reorder_1d_array(data.dy, ind) 
    177185                if data.lam is not None: 
    178                     data.lam = np.asarray([data.lam[i] for i in ind]).astype(np.float64) 
     186                    data.lam = self._reorder_1d_array(data.lam, ind) 
    179187                if data.dlam is not None: 
    180                     data.dlam = np.asarray([data.dlam[i] for i in ind]).astype(np.float64) 
     188                    data.dlam = self._reorder_1d_array(data.dlam, ind) 
     189                data = self._remove_nans_in_data(data) 
    181190                if len(data.x) > 0: 
    182191                    data.xmin = np.min(data.x) 
     
    184193                    data.ymin = np.min(data.y) 
    185194                    data.ymax = np.max(data.y) 
     195 
     196    @staticmethod 
     197    def _reorder_1d_array(array, ind): 
     198        """ 
     199        Reorders a 1D array based on the indices passed as ind 
     200        :param array: Array to be reordered 
     201        :param ind: Indices used to reorder array 
     202        :return: reordered array 
     203        """ 
     204        array = np.asarray(array, dtype=np.float64) 
     205        return array[ind] 
     206 
     207    @staticmethod 
     208    def _remove_nans_in_data(data): 
     209        """ 
     210        Remove data points where nan is loaded 
     211        :param data: 1D or 2D data object 
     212        :return: data with nan points removed 
     213        """ 
     214        if isinstance(data, Data1D): 
     215            fields = FIELDS_1D 
     216        elif isinstance(data, Data2D): 
     217            fields = FIELDS_2D 
     218        else: 
     219            return data 
     220        # Make array of good points - all others will be removed 
     221        good = np.isfinite(getattr(data, fields[0])) 
     222        for name in fields[1:]: 
     223            array = getattr(data, name) 
     224            if array is not None: 
     225                # Update good points only if not already changed 
     226                good &= np.isfinite(array) 
     227        if not np.all(good): 
     228            for name in fields: 
     229                array = getattr(data, name) 
     230                if array is not None: 
     231                    setattr(data, name, array[good]) 
     232        return data 
    186233 
    187234    def sort_two_d_data(self): 
     
    214261                    dataset.x_bins = dataset.qx_data[:int(n_cols)] 
    215262                dataset.data = dataset.data.flatten() 
     263                dataset = self._remove_nans_in_data(dataset) 
    216264                if len(dataset.data) > 0: 
    217265                    dataset.xmin = np.min(dataset.qx_data) 
  • test/sasdataloader/test/utest_ascii.py

    rf53d684 rdb5196d  
    55import os.path 
    66import warnings 
     7import math 
    78warnings.simplefilter("ignore") 
    89 
     
    110111            self.assertEqual(f, None) 
    111112 
     113    def test_nan_values(self): 
     114        """ 
     115        Test loading an ascii data file with nan values saved in x, y, or dy. 
     116        """ 
     117        f_1d = self.loader.load(find("nans_in_1d_data.dat"))[0] 
     118        f_2d = self.loader.load(find("nans_in_2d_data.DAT"))[0] 
     119        for i in range(0, len(f_1d.x) - 1): 
     120            self.assertFalse(math.isnan(f_1d.x[i])) 
     121            self.assertFalse(math.isnan(f_1d.y[i])) 
     122            self.assertFalse(math.isnan(f_1d.dy[i])) 
     123        f_2d.data = f_2d.data.flatten() 
     124        f_2d.qx_data = f_2d.qx_data.flatten() 
     125        f_2d.qy_data = f_2d.qy_data.flatten() 
     126        for i in range(0, len(f_2d.data) - 1): 
     127            self.assertFalse(math.isnan(f_2d.data[i])) 
     128            self.assertFalse(math.isnan(f_2d.qx_data[i])) 
     129            self.assertFalse(math.isnan(f_2d.qy_data[i])) 
     130 
     131 
    112132if __name__ == '__main__': 
    113133    unittest.main() 
  • .gitignore

    r948484f r1b605fb  
    2929default_categories.json 
    3030/setup.cfg 
     31Thumbs.db 
    3132 
    3233# doc build 
  • installers/sasview.spec

    • Property mode changed from 100755 to 100644
  • installers/version.txt

    • Property mode changed from 100755 to 100644
  • src/sas/sascalc/dataloader/readers/abs_reader.py

    r1efbc190 re3775c6  
    2929    type_name = "IGOR 1D" 
    3030    # Wildcards 
    31     type = ["IGOR 1D files (*.abs)|*.abs"] 
     31    type = ["IGOR 1D files (*.abs)|*.abs", "IGOR 1D USANS files (*.cor)|*.cor"] 
    3232    # List of allowed extensions 
    33     ext = ['.abs'] 
     33    ext = ['.abs', '.cor'] 
    3434 
    3535    def get_file_contents(self): 
     
    4646        self.current_datainfo = DataInfo() 
    4747        self.current_datainfo.filename = filepath 
    48         self.reset_data_list(len(lines)) 
    4948        detector = Detector() 
    5049        data_line = 0 
     
    188187                    self.current_dataset.y[data_line] = _y 
    189188                    self.current_dataset.dy[data_line] = _dy 
    190                     self.current_dataset.dx[data_line] = _dx 
     189                    if _dx > 0: 
     190                        self.current_dataset.dx[data_line] = _dx 
     191                    else: 
     192                        if data_line == 0: 
     193                            self.current_dataset.dx = None 
     194                            self.current_dataset.dxl = np.zeros(len(lines)) 
     195                            self.current_dataset.dxw = np.zeros(len(lines)) 
     196                        self.current_dataset.dxl[data_line] = abs(_dx) 
     197                        self.current_dataset.dxw[data_line] = 0 
    191198                    data_line += 1 
    192199 
     
    197204                    pass 
    198205 
     206            # SANS Data: 
    199207            # The 6 columns are | Q (1/A) | I(Q) (1/cm) | std. dev. 
    200208            # I(Q) (1/cm) | sigmaQ | meanQ | ShadowFactor| 
    201             if line.count("The 6 columns") > 0: 
     209            # USANS Data: 
     210            # EMP LEVEL: <value> ; BKG LEVEL: <value> 
     211            if line.startswith("The 6 columns") or line.startswith("EMP LEVEL"): 
    202212                is_data_started = True 
    203213 
  • src/sas/sascalc/dataloader/readers/associations.py

    r574adc7 ra32c19c  
    2626    ".dat": "red2d_reader", 
    2727    ".abs": "abs_reader", 
     28    ".cor": "abs_reader", 
    2829    ".sans": "danse_reader", 
    2930    ".pdh": "anton_paar_saxs_reader" 
  • src/sas/sasgui/perspectives/fitting/fitting.py

    • Property mode changed from 100755 to 100644
  • src/sas/sasview/images/dls_logo.png

    • Property mode changed from 100755 to 100644
  • src/sas/sasview/images/tudelft_logo.png

    • Property mode changed from 100755 to 100644
  • src/sas/sasview/test/1d_data/saxess_example.pdh

    • Property mode changed from 100755 to 100644
  • test/sasdataloader/test/utest_abs_reader.py

    rf53d684 rfa749b7  
    7575        data = Loader().load(find("jan08002.ABS")) 
    7676        self.assertEqual(data[0].meta_data['loader'], "IGOR 1D") 
     77 
     78    def test_usans_negative_dxl(self): 
     79        data_abs = Loader().load(find("sam14_cor.ABS")) 
     80        data_cor = Loader().load(find("sam14_cor.cor")) 
     81        for i in range(0, len(data_abs) - 1): 
     82            self.assertEquals(data_abs.x[i], data_cor.x[i]) 
     83            self.assertEquals(data_abs.y[i], data_cor.y[i]) 
     84            self.assertEquals(data_abs.dxl[i], data_cor.dxl[i]) 
     85            self.assertEquals(data_abs.dxw[i], data_cor.dxw[i]) 
     86            self.assertTrue(data_abs.dxl > 0) 
     87 
    7788 
    7889class DanseReaderTests(unittest.TestCase): 
Note: See TracChangeset for help on using the changeset viewer.