Changes in src/sas/sascalc/dataloader/readers/IgorReader.py [dd11014:9a5097c] in sasview
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/sas/sascalc/dataloader/readers/IgorReader.py
rdd11014 r9a5097c 13 13 ############################################################################# 14 14 import os 15 15 import numpy as np 16 import math 17 #import logging 16 18 from sas.sascalc.dataloader.data_info import Data2D 17 19 from sas.sascalc.dataloader.data_info import Detector 18 20 from sas.sascalc.dataloader.manipulations import reader2D_converter 19 import numpy as np20 21 21 22 # Look for unit converter … … 39 40 """ Read file """ 40 41 if not os.path.isfile(filename): 41 raise ValueError("Specified file %s is not a regular " 42 "file" % filename) 43 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 44 50 output = Data2D() 45 46 51 output.filename = os.path.basename(filename) 47 52 detector = Detector() 48 if len(output.detector) :49 print (str(output.detector[0]))53 if len(output.detector) > 0: 54 print str(output.detector[0]) 50 55 output.detector.append(detector) 51 52 data_conv_q = data_conv_i = None 53 54 if has_converter and output.Q_unit != '1/A': 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': 55 83 data_conv_q = Converter('1/A') 56 84 # Test it 57 85 data_conv_q(1.0, output.Q_unit) 58 86 59 if has_converter and output.I_unit != '1/cm':87 if has_converter == True and output.I_unit != '1/cm': 60 88 data_conv_i = Converter('1/cm') 61 89 # Test it 62 90 data_conv_i(1.0, output.I_unit) 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. 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 = np.zeros([size_x, size_y]) 121 output.err_data = np.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 167 234 theta = 0.25 / distance / 100.0 168 xstep = 4.0 * np.pi / wavelength * np.sin(theta / 2.0)235 xstep = 4.0 * math.pi / wavelength * math.sin(theta / 2.0) 169 236 170 237 theta = 0.25 / distance / 100.0 171 ystep = 4.0 * np.pi/ wavelength * np.sin(theta / 2.0)238 ystep = 4.0 * math.pi/ wavelength * math.sin(theta / 2.0) 172 239 173 240 # Store all data ###################################### 174 241 # Store wavelength 175 if has_converter and output.source.wavelength_unit != 'A':242 if has_converter == True and output.source.wavelength_unit != 'A': 176 243 conv = Converter('A') 177 244 wavelength = conv(wavelength, units=output.source.wavelength_unit) … … 179 246 180 247 # Store distance 181 if has_converter and detector.distance_unit != 'm':248 if has_converter == True and detector.distance_unit != 'm': 182 249 conv = Converter('m') 183 250 distance = conv(distance, units=detector.distance_unit) … … 187 254 output.sample.transmission = transmission 188 255 189 # Store pixel size (mm)256 # Store pixel size 190 257 pixel = 5.0 191 if has_converter and detector.pixel_size_unit != 'mm':258 if has_converter == True and detector.pixel_size_unit != 'mm': 192 259 conv = Converter('mm') 193 260 pixel = conv(pixel, units=detector.pixel_size_unit) … … 200 267 201 268 # Store limits of the image (2D array) 202 xmin -=xstep / 2.0203 xmax +=xstep / 2.0204 ymin -=ystep / 2.0205 ymax +=ystep / 2.0206 if has_converter and output.Q_unit != '1/A':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': 207 274 xmin = data_conv_q(xmin, units=output.Q_unit) 208 275 xmax = data_conv_q(xmax, units=output.Q_unit) … … 215 282 216 283 # Store x and y axis bin centers 217 output.x_bins = qx.tolist()218 output.y_bins = qy.tolist()284 output.x_bins = x 285 output.y_bins = y 219 286 220 287 # Units
Note: See TracChangeset
for help on using the changeset viewer.