Changeset dcb91cf in sasview for src/sas/sascalc/file_converter/ascii2d_loader.py
- Timestamp:
- Aug 21, 2017 10:16:13 AM (7 years ago)
- Branches:
- master, ESS_GUI, ESS_GUI_Docs, ESS_GUI_batch_fitting, ESS_GUI_bumps_abstraction, ESS_GUI_iss1116, ESS_GUI_iss879, ESS_GUI_iss959, ESS_GUI_opencl, ESS_GUI_ordering, ESS_GUI_sync_sascalc, 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
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/sas/sascalc/file_converter/ascii2d_loader.py
r0f010c9 rdcb91cf 13 13 # 2: q_y axis label and units 14 14 # 3: Intensity axis label and units 15 # 4: n UseRec - number of lines of user content following this line16 # 5 - 5+nUseRec: user content15 # 4: n_use_rec - number of lines of user content following this line 16 # 5 to (5+n_use_rec): user content 17 17 # Number of qx points 18 18 # List of qx points … … 34 34 35 35 :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 37 38 """ 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() 41 42 42 # Load num_points line-by-line from lines into a numpy array, starting43 #on line number start_line44 def _load_points(lines, start_line, num_points):45 qs = np.zeros(num_points)46 n = start_line47 filled = 048 while filled < num_points:49 row = np.fromstring(lines[n], dtype=np.float32, sep=' ')50 qs[filled:filled+len(row)] = row51 filled += len(row)52 n += 153 return n, qs43 # 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 54 55 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 62 108 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) 64 121 65 # Read qy data66 num_qs = int(all_lines[current_line].strip())67 122 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)80 123 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) 92 128 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) 99 143 100 # More qx and/or qy points can be provided than are actually used101 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() 103 147 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) 142 149 143 150 return data
Note: See TracChangeset
for help on using the changeset viewer.