Ignore:
Timestamp:
Aug 21, 2017 10:16:13 AM (7 years ago)
Author:
lewis
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:
7b15990
Parents:
44daa56
Message:

Make suggested changes

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/sas/sascalc/file_converter/ascii2d_loader.py

    r0f010c9 rdcb91cf  
    1313# 2: q_y axis label and units 
    1414# 3: Intensity axis label and units 
    15 # 4: nUseRec - number of lines of user content following this line 
    16 # 5 - 5+nUseRec: user content 
     15# 4: n_use_rec - number of lines of user content following this line 
     16# 5 to (5+n_use_rec): user content 
    1717# Number of qx points 
    1818# List of qx points 
     
    3434 
    3535        :return: A Data2D instance containing data from the file 
    36         :raises ValueError: Raises a ValueError if the file is incorrectly formatted 
     36        :raises ValueError: Raises a ValueError if the file is incorrectly 
     37            formatted 
    3738        """ 
    38         file_handle = open(self.data_path, 'r') 
    39         file_buffer = file_handle.read() 
    40         all_lines = file_buffer.splitlines() 
     39        with open(self.data_path, 'r') as file_handle: 
     40            file_buffer = file_handle.read() 
     41            all_lines = file_buffer.splitlines() 
    4142 
    42         # Load num_points line-by-line from lines into a numpy array, starting 
    43         # on line number start_line 
    44         def _load_points(lines, start_line, num_points): 
    45             qs = np.zeros(num_points) 
    46             n = start_line 
    47             filled = 0 
    48             while filled < num_points: 
    49                 row = np.fromstring(lines[n], dtype=np.float32, sep=' ') 
    50                 qs[filled:filled+len(row)] = row 
    51                 filled += len(row) 
    52                 n += 1 
    53             return n, qs 
     43            # Load num_points line-by-line from lines into a numpy array, 
     44            # starting on line number start_line 
     45            def _load_points(lines, start_line, num_points): 
     46                qs = np.zeros(num_points) 
     47                n = start_line 
     48                filled = 0 
     49                while filled < num_points: 
     50                    row = np.fromstring(lines[n], dtype=np.float32, sep=' ') 
     51                    qs[filled:filled+len(row)] = row 
     52                    filled += len(row) 
     53                    n += 1 
     54                return n, qs 
    5455 
    55         current_line = 4 
    56         try: 
    57             # Skip nUseRec lines 
    58             nUseRec = int(all_lines[current_line].strip()[0]) 
    59             current_line += nUseRec + 1 
    60             # Read qx data 
    61             num_qs = int(all_lines[current_line].strip()) 
     56            current_line = 4 
     57            try: 
     58                # Skip n_use_rec lines 
     59                n_use_rec = int(all_lines[current_line].strip()[0]) 
     60                current_line += n_use_rec + 1 
     61                # Read qx data 
     62                num_qs = int(all_lines[current_line].strip()) 
     63                current_line += 1 
     64                current_line, qx = _load_points(all_lines, current_line, num_qs) 
     65 
     66                # Read qy data 
     67                num_qs = int(all_lines[current_line].strip()) 
     68                current_line += 1 
     69                current_line, qy = _load_points(all_lines, current_line, num_qs) 
     70            except ValueError as e: 
     71                err_msg = "File incorrectly formatted.\n" 
     72                if str(e).find('broadcast') != -1: 
     73                    err_msg += "Incorrect number of q data points provided. " 
     74                    err_msg += "Expected {}.".format(num_qs) 
     75                elif str(e).find('invalid literal') != -1: 
     76                    err_msg += ("Expected integer on line {}. " 
     77                        "Instead got '{}'").format(current_line + 1, 
     78                            all_lines[current_line]) 
     79                else: 
     80                    err_msg += str(e) 
     81                raise ValueError(err_msg) 
     82 
     83            # dimensions: [width, height, scale] 
     84            try: 
     85                dimensions = np.fromstring(all_lines[current_line], 
     86                    dtype=np.float32, sep=' ') 
     87                if len(dimensions) != 3: raise ValueError() 
     88                width = int(dimensions[0]) 
     89                height = int(dimensions[1]) 
     90            except ValueError as e: 
     91                err_msg = "File incorrectly formatted.\n" 
     92                err_msg += ("Expected line {} to be of the form: <num_qx> " 
     93                    "<num_qy> <scale>.").format(current_line + 1) 
     94                err_msg += " Instead got '{}'.".format(all_lines[current_line]) 
     95                raise ValueError(err_msg) 
     96 
     97            if width > len(qx) or height > len(qy): 
     98                err_msg = "File incorrectly formatted.\n" 
     99                err_msg += ("Line {} says to use {}x{} points. " 
     100                    "Only {}x{} provided.").format(current_line + 1, width, 
     101                    height, len(qx), len(qy)) 
     102                raise ValueError(err_msg) 
     103 
     104            # More qx and/or qy points can be provided than are actually used 
     105            qx = qx[:width] 
     106            qy = qy[:height] 
     107 
    62108            current_line += 1 
    63             current_line, qx = _load_points(all_lines, current_line, num_qs) 
     109            # iflag = 1 => Only intensity data (not dealt with here) 
     110            # iflag = 2 => q axis and intensity data 
     111            # iflag = 3 => q axis, intensity and error data 
     112            try: 
     113                iflag = int(all_lines[current_line].strip()[0]) 
     114                if iflag <= 0 or iflag > 3: raise ValueError() 
     115            except: 
     116                err_msg = "File incorrectly formatted.\n" 
     117                iflag = all_lines[current_line].strip()[0] 
     118                err_msg += ("Expected iflag on line {} to be 1, 2 or 3. " 
     119                    "Instead got '{}'.").format(current_line+1, iflag) 
     120                raise ValueError(err_msg) 
    64121 
    65             # Read qy data 
    66             num_qs = int(all_lines[current_line].strip()) 
    67122            current_line += 1 
    68             current_line, qy = _load_points(all_lines, current_line, num_qs) 
    69         except ValueError as e: 
    70             err_msg = "File incorrectly formatted.\n" 
    71             if str(e).find('broadcast') != -1: 
    72                 err_msg += "Incorrect number of q data points provided. " 
    73                 err_msg += "Expected {}.".format(num_qs) 
    74             elif str(e).find('invalid literal') != -1: 
    75                 err_msg += "Expected integer on line {}. Instead got '{}'".format(current_line + 1, 
    76                     all_lines[current_line]) 
    77             else: 
    78                 err_msg += str(e) 
    79             raise ValueError(err_msg) 
    80123 
    81         # dimensions: [width, height, scale] 
    82         try: 
    83             dimensions = np.fromstring(all_lines[current_line], dtype=np.float32, sep=' ') 
    84             if len(dimensions) != 3: raise ValueError() 
    85             width = int(dimensions[0]) 
    86             height = int(dimensions[1]) 
    87         except ValueError as e: 
    88             err_msg = "File incorrectly formatted.\n" 
    89             err_msg += "Expected line {} to be of the form: <num_qx> <num_qy> <scale>.".format(current_line + 1) 
    90             err_msg += " Instead got '{}'.".format(all_lines[current_line]) 
    91             raise ValueError(err_msg) 
     124            try: 
     125                current_line, I = _load_points(all_lines, current_line, 
     126                    width * height) 
     127                dI = np.zeros(width*height) 
    92128 
    93         if width > len(qx) or height > len(qy): 
    94             err_msg = "File incorrectly formatted.\n" 
    95             err_msg += ("Line {} says to use {}x{} points. " 
    96                 "Only {}x{} provided.").format(current_line + 1, width, height, 
    97                 len(qx), len(qy)) 
    98             raise ValueError(err_msg) 
     129                # Load error data if it's provided 
     130                if iflag == 3: 
     131                    _, dI = _load_points(all_lines, current_line, width*height) 
     132            except Exception as e: 
     133                err_msg = "File incorrectly formatted.\n" 
     134                if str(e).find("list index") != -1: 
     135                    err_msg += ("Incorrect number of data points. Expected {}" 
     136                        " intensity").format(width * height) 
     137                    if iflag == 3: 
     138                        err_msg += " and error" 
     139                    err_msg += " points." 
     140                else: 
     141                    err_msg += str(e) 
     142                raise ValueError(err_msg) 
    99143 
    100         # More qx and/or qy points can be provided than are actually used 
    101         qx = qx[:width] 
    102         qy = qy[:height] 
     144            # Format data for use with Data2D 
     145            qx = list(qx) * height 
     146            qy = np.array([[y] * width for y in qy]).flatten() 
    103147 
    104         current_line += 1 
    105         # iflag = 1 => Only intensity data (not dealt with here) 
    106         # iflag = 2 => q axis and intensity data 
    107         # iflag = 3 => q axis, intensity and error data 
    108         try: 
    109             iflag = int(all_lines[current_line].strip()[0]) 
    110             if iflag <= 0 or iflag > 3: raise ValueError() 
    111         except: 
    112             err_msg = "File incorrectly formatted.\n" 
    113             iflag = all_lines[current_line].strip()[0] 
    114             err_msg += "Expected iflag on line {} to be 1, 2 or 3. Instead got '{}'.".format(current_line+1, iflag) 
    115             raise ValueError(err_msg) 
    116  
    117         current_line += 1 
    118  
    119         try: 
    120             current_line, I = _load_points(all_lines, current_line, width*height) 
    121             dI = np.zeros(width*height) 
    122  
    123             # Load error data if it's provided 
    124             if iflag == 3: 
    125                 _, dI = _load_points(all_lines, current_line, width*height) 
    126         except Exception as e: 
    127             err_msg = "File incorrectly formatted.\n" 
    128             if str(e).find("list index") != -1: 
    129                 err_msg += ("Incorrect number of data points. Expected {} intensity").format(width*height) 
    130                 if iflag == 3: 
    131                     err_msg += " and error" 
    132                 err_msg += " points." 
    133             else: 
    134                 err_msg += str(e) 
    135             raise ValueError(err_msg) 
    136  
    137         # Format data for use with Data2D 
    138         qx = list(qx) * height 
    139         qy = np.array([[y] * width for y in qy]).flatten() 
    140  
    141         data = Data2D(qx_data=qx, qy_data=qy, data=I, err_data=dI) 
     148            data = Data2D(qx_data=qx, qy_data=qy, data=I, err_data=dI) 
    142149 
    143150        return data 
Note: See TracChangeset for help on using the changeset viewer.