1
2
3 import numpy
4 from copy import deepcopy
5 from random import normalvariate
6 from calcRefl import fixedres, varyingres
7 from auxs import readdata, takelist, ravel
8
9
17
18
26
27
28
31 if filename != None:
32 self.read(filename)
33 self.A = None
34 self.Rform = 'magnitude'
35 self.background = 0.0
36 self.wavelength = 1.54
37 self.resolution = FixedResolution(0.0, 0.0)
38 self.columns = None
39 self.Q = numpy.arange(0.0, 1.0, 0.001)
40 self.R = None
41 self.dQ = None
42 self.dR = None
43 self.selected_points = None
44 self.calcQset = None
45 self.name = None
46
47 self.Qlo = 0.0
48 self.Qhi = 1.0
49 self.Qskip = 0.001
50 self.calcres()
51
54
58
62
66
70
72 if(self.isempty()): return self.Q.copy()
73 elif(self.calcQset == None): return self.get_fitQ()
74 else: return self.calcQset.copy()
75
77 if(self.selected_points == None): return numpy.arange(len(self.Q))
78 else: return self.selected_points
79
82
85
86
88 lines = inlines.split('\n')
89 data = []
90 for text in lines:
91 if text[0] == '#': continue
92 data.append([float(value) for value in text.split()])
93 return numpy.array(data)
94
95
97 """Load data from inline data"""
98 self.A = None
99 self.file = ""
100 A = self.read_data( inlines)
101 columns = A.shape[1]
102 if columns == 2:
103 self.columns = ['Q','R']
104 self.Q = A[:,0]
105 self.R = A[:,1]
106 self.dQ = None
107 self.dR = None
108 elif columns == 3:
109 self.columns = ['Q','R','dR']
110 self.Q = A[:,0]
111 self.dQ = None
112 self.R = A[:,1]
113 self.dR = A[:,2]
114 elif columns == 4:
115 self.columns = ['Q','dQ','R','dR']
116 self.Q = A[:,0]
117 self.dQ = A[:,1]
118 self.R = A[:,2]
119 self.dR = A[:,3]
120 elif columns == 5:
121 self.columns = ['Q','dQ','R','dR','L']
122 self.Q = A[:,0]
123 self.dQ = A[:,1]
124 self.R = A[:,2]
125 self.dR = A[:,3]
126 self.L = A[:,4]
127
128 self.A = A
129 self.file = ''
130 self.name = ''
131 self.points_selected = numpy.arange(len(self.Q))
132 self.dRdata = self.dR
133 self.calcres()
134
135
136 - def load(self,filename):
137 """Load data from filename"""
138 self.A = None
139 self.file = ""
140 A = readdata(filename)
141 columns = A.shape[1]
142 if columns == 2:
143 self.columns = ['Q','R']
144 self.Q = A[:,0]
145 self.R = A[:,1]
146 self.dQ = None
147 self.dR = None
148 elif columns == 3:
149 self.columns = ['Q','R','dR']
150 self.Q = A[:,0]
151 self.dQ = None
152 self.R = A[:,1]
153 self.dR = A[:,2]
154 elif columns == 4:
155 self.columns = ['Q','dQ','R','dR']
156 self.Q = A[:,0]
157 self.dQ = A[:,1]
158 self.R = A[:,2]
159 self.dR = A[:,3]
160 elif columns == 5:
161 self.columns = ['Q','dQ','R','dR','L']
162 self.Q = A[:,0]
163 self.dQ = A[:,1]
164 self.R = A[:,2]
165 self.dR = A[:,3]
166 self.L = A[:,4]
167
168 self.A = A
169 self.file = filename
170 self.name = filename
171 self.points_selected = numpy.arange(len(self.Q))
172 self.dRdata = self.dR
173 self.calcres()
174
175
178
181
183 self.dR = 0.01*self.R
184
186 self.dR = self.dRdata
187
191
195
201
203 self.resolution = resobj
204 self.calcres()
205
209
211 newData = deepcopy(self)
212 for x in numpy.arange(len(newData.fitR)):
213 newData.fitR[x] = normalvariate(self.fitR[x], self.fitdR[x])
214 return newData
215
217 return (self.Qlo, self.Qhi, self.Qskip)
218
219
222
223
225 _Q1 = self.Q.take( numpy.where( self.Q <= Q1 ) )[0]
226 _Q2 = self.Q.take( numpy.where( self.Q > Q2 ) )[0]
227 _Q3 = self.Q.take( numpy.where( (self.Q <= Q2)&(self.Q>Q1) ) )[0]
228 _dQ1 = self.resolution1.calc_dQ(self.wavelength, _Q1 )
229 _dQ2 = self.resolution2.calc_dQ(self.wavelength, _Q2 )
230 _dQ3 = self.resolution3.calc_dQ(self.wavelength, _Q3 )
231 self.dQ = numpy.concatenate( (_dQ1, _dQ3, _dQ2) )
232 assert( len(self.dQ) == len(self.Q) )
233
234
237
238
239
240
241
242
244 """Support for polarized data"""
245 - def __init__(self,
246 filenames=None,
247 num_datasets = 4,
248 dataset_names = ["A (--)", "B (-+)", "C (+-)", "D (++)"]
249 ):
250 """Multidata(basenameA, num_sets, setnames, window=None)
251 Load A,B,C,D cross sections of polarized data from files named
252 basenameA, basenameB, basenameC and basenameD."""
253 self.datasets = [ Data() for x in range(num_datasets)]
254 self.dataset_names = dataset_names
255 self.wfresnel = False
256 self.wq4 = False
257 self.wlog = False
258 self.wdata = False
259 if(filenames != None):
260 self.load_all(filenames)
261 self.num_datasets = num_datasets
262
263
265 """Return true if there is no data [only checks in A]"""
266 return self.datasets[0].isempty()
267
268
270 return self.num_datasets
271
277
280
283
287
290
294
296 retVal = []
297 for x in self.datasets:
298 retVal += [x.get_fitQ()]
299 return retVal
300
302 retVal = []
303 for x in self.datasets:
304 retVal += [x.get_fitR()]
305 return retVal
306
309
311 retVal = []
312 for x in self.datasets:
313 retVal += [x.get_fitdR()]
314 return retVal
315
317 retVal = []
318 for x in self.datasets:
319 retVal += [x.get_calcQ()]
320 return retVal
321
323 retVal = []
324 for x in self.datasets:
325 retVal += [x.Q]
326 return retVal
327
329 retVal = []
330 for x in self.datasets:
331 retVal += [x.R]
332 return retVal
333
335 retVal = []
336 for x in self.datasets:
337 retVal += [x.dQ]
338 return retVal
339
341 retVal = []
342 for x in self.datasets:
343 retVal += [x.dR]
344 return retVal
345
352
356
357
359 return self.datasets[0].isempty()
360
361
363 if(self.num_datasets == 4):
364 x = file[:-1]
365 if(file[-1] == 'A'):
366 self.load_all([x+'A', x+'B', x+'C', x+'D'])
367 if(file[-1] == 'a'):
368 self.load_all([x+'a', x+'b', x+'c', x+'d'])
369 elif(self.num_datasets == 1):
370 self.load_all([file])
371 else:
372 raise NotImplementedError
373
374
376 RawData = inlineRawData.strip().split('#')
377 if len(RawData) == 1:
378
379 self.load_all_inline([ RawData[0].strip() ])
380
381 elif len(RawData) == 4:
382 self.load_all_inline([ RawData[0].strip(),
383 RawData[1].strip(),
384 RawData[2].strip(),
385 RawData[3].strip() ])
386 else:
387 import sys
388 print "Error format in inline"
389 sys.exit()
390
391
392 - def load(self, filename, index):
393 self.datasets[index].load(filename)
394
395
397 for x in range(len(filenames)):
398 self.datasets[x].load(filenames[x])
399
400
401
403 for x in range(len(strlists)):
404 self.datasets[x].load_inline(strlists[x])
405
406
407
409 for x in self.datasets:
410 x.fresnelweight()
411 self.wfresnel = True
412 self.wq4 = False
413 self.wlog = False
414 self.wdata = False
415
416
418 for x in self.datasets:
419 x.Q4weight()
420 self.wfresnel = False
421 self.wq4 = True
422 self.wlog = False
423 self.wdata = False
424
425
427 for x in self.datasets:
428 x.logweight()
429 self.wfresnel = False
430 self.wq4 = False
431 self.wlog = True
432 self.wdata = False
433
434
436 for x in self.datasets:
437 x.dataweight()
438 self.wfresnel = False
439 self.wq4 = False
440 self.wlog = False
441 self.wdata = True
442
443
447
448
452
453
457
458
462
463
465 return self.datasets[0].resolution()
466
467
469
470 temp = self.window
471 self.window = None
472 newData = deepcopy(self)
473 self.window = temp
474 for dataset in newData.datasets:
475 for x in range(len(dataset.R)):
476 dataset.R[x] = normalvariate(dataset.R[x], dataset.dR[x])
477 return newData
478