source: trunk/imports/G2sad_xye.py @ 1223

Last change on this file since 1223 was 1223, checked in by toby, 8 years ago

move small angle readers; improve reinitialization

  • Property svn:eol-style set to native
File size: 9.9 KB
Line 
1# -*- coding: utf-8 -*-
2########### SVN repository information ###################
3# $Date: 2014-01-16 15:55:36 -0600 (Thu, 16 Jan 2014) $
4# $Author: vondreele $
5# $Revision: 1199 $
6# $URL: https://subversion.xor.aps.anl.gov/pyGSAS/trunk/imports/G2pwd_xye.py $
7# $Id: G2pwd_xye.py 1199 2014-01-16 21:55:36Z vondreele $
8########### SVN repository information ###################
9'''
10*Module G2pwd_xye: Topas .xye data*
11------------------------------------
12
13Routine to read in powder data from a Topas-compatible .xye file
14
15'''
16
17import sys
18import os.path as ospath
19import numpy as np
20import GSASIIIO as G2IO
21import GSASIIpath
22GSASIIpath.SetVersionNumber("$Revision: 1199 $")
23npasind = lambda x: 180.*np.arcsin(x)/np.pi
24class xye_ReaderClass(G2IO.ImportSmallAngleData):
25    'Routines to import powder data from a .xye file'
26    def __init__(self):
27        super(self.__class__,self).__init__( # fancy way to self-reference
28            extensionlist=('.xye',),
29            strictExtension=False,
30            formatName = 'Topas xye',
31            longFormatName = 'Topas .xye powder data file'
32            )
33
34    # Validate the contents -- make sure we only have valid lines
35    def ContentsValidator(self, filepointer):
36        'Look through the file for expected types of lines in a valid Topas file'
37        gotCcomment = False
38        begin = True
39        for i,S in enumerate(filepointer):
40            if i > 1000: break
41            if begin:
42                if gotCcomment and S.find('*/') > -1:
43                    begin = False
44                    continue
45                if S.strip().startswith('/*'):
46                    gotCcomment = True
47                    continue   
48                if S[0] == '#':
49                    continue       #ignore comments, if any
50                else:
51                    begin = False
52                # valid line to read?
53            vals = S.split()
54            if len(vals) == 2 or len(vals) == 3:
55                continue
56            else:
57                self.errors = 'Unexpected information in line: '+str(i+1)
58                self.errors += '  '+str(S)
59                return False
60        return True # no errors encountered
61
62    def Reader(self,filename,filepointer, ParentFrame=None, **unused):
63        'Read a Topas file'
64        x = []
65        y = []
66        w = []
67        try:
68            gotCcomment = False
69            begin = True
70            for i,S in enumerate(filepointer):
71                self.errors = 'Error reading line: '+str(i+1)
72                # or a block of comments delimited by /* and */
73                # or (GSAS style) each line can begin with '#'
74                if begin:
75                    if gotCcomment and S.find('*/') > -1:
76                        self.comments.append(S[:-1])
77                        begin = False
78                        continue
79                    if S.strip().startswith('/*'):
80                        self.comments.append(S[:-1])
81                        gotCcomment = True
82                        continue   
83                    if S[0] == '#':
84                        self.comments.append(S[:-1])
85                        continue       #ignore comments, if any
86                    else:
87                        begin = False
88                # valid line to read
89                vals = S.split()
90                try:
91                    x.append(float(vals[0]))
92                    f = float(vals[1])
93                    if f <= 0.0:
94                        y.append(0.0)
95                        w.append(1.0)
96                    elif len(vals) == 3:
97                        y.append(float(vals[1]))
98                        w.append(1.0/float(vals[2])**2)
99                    else:
100                        y.append(float(vals[1]))
101                        w.append(1.0/float(vals[1]))
102                except ValueError:
103                    msg = 'Error in line '+str(i+1)
104                    print msg
105                    break
106            N = len(x)
107            self.powderdata = [
108                np.array(x), # x-axis values
109                np.array(y), # powder pattern intensities
110                np.array(w), # 1/sig(intensity)^2 values (weights)
111                np.zeros(N), # calc. intensities (zero)
112                np.zeros(N), # calc. background (zero)
113                np.zeros(N), # obs-calc profiles
114                ]
115            self.powderentry[0] = filename
116            #self.powderentry[1] = pos # bank offset (N/A here)
117            self.powderentry[2] = 1 # xye file only has one bank
118            self.idstring = ospath.basename(filename)
119            # scan comments for temperature
120            Temperature = 300
121            for S in self.comments:
122                if 'Temp' in S.split('=')[0]:
123                    try:
124                        Temperature = float(S.split('=')[1])
125                    except:
126                        pass
127            self.Sample['Temperature'] = Temperature
128
129            return True
130        except Exception as detail:
131            self.errors += '\n  '+str(detail)
132            print self.formatName+' read error:'+str(detail) # for testing
133            import traceback
134            traceback.print_exc(file=sys.stdout)
135            return False
136
137class qxye_ReaderClass(G2IO.ImportSmallAngleData):
138    'Routines to import q data from a .xye file'
139    def __init__(self):
140        super(self.__class__,self).__init__( # fancy way to self-reference
141            extensionlist=('.xye','.txt','.dat'),
142            strictExtension=False,
143            formatName = 'q step xye',
144            longFormatName = 'q stepped data file'
145            )
146
147    # Validate the contents -- make sure we only have valid lines
148    def ContentsValidator(self, filepointer):
149        'Look through the file for expected types of lines in a valid q-step file'
150        gotCcomment = False
151        begin = True
152        for i,S in enumerate(filepointer):
153            if i > 1000: break
154            if begin:
155                if gotCcomment and S.find('*/') > -1:
156                    begin = False
157                    continue
158                if S.strip().startswith('/*'):
159                    gotCcomment = True
160                    continue   
161                if S[0] == '#':
162                    continue       #ignore comments, if any
163                elif len(S) == 1:
164                    continue        #ignore blank lines
165                else:
166                    begin = False
167                # valid line to read?
168            vals = S.split()
169            if len(vals) == 2 or len(vals) == 3:
170                continue
171            else:
172                self.errors = 'Unexpected information in line: '+str(i+1)
173                self.errors += '  '+str(S)
174                return False
175        return True # no errors encountered
176
177    def Reader(self,filename,filepointer, ParentFrame=None, **unused):
178        'Read a q-step file'
179        x = []
180        y = []
181        w = []
182        try:
183            wave = 1.5428   #Cuka default
184            Temperature = 300
185            for S in self.comments:
186                if 'Wave' in S.split('=')[0]:
187                    try:
188                        wave = float(S.split('=')[1])
189                    except:
190                        pass
191                elif 'Temp' in S.split('=')[0]:
192                    try:
193                        Temperature = float(S.split('=')[1])
194                    except:
195                        pass
196            self.instdict['wave'] = wave
197            gotCcomment = False
198            begin = True
199            for i,S in enumerate(filepointer):
200                self.errors = 'Error reading line: '+str(i+1)
201                # or a block of comments delimited by /* and */
202                # or (GSAS style) each line can begin with '#'
203                if begin:
204                    if gotCcomment and S.find('*/') > -1:
205                        self.comments.append(S[:-1])
206                        begin = False
207                        continue
208                    if S.strip().startswith('/*'):
209                        self.comments.append(S[:-1])
210                        gotCcomment = True
211                        continue   
212                    if S[0] == '#':
213                        self.comments.append(S[:-1])
214                        continue       #ignore comments, if any
215                    elif len(S) == 1:      #blank line only CR/LF
216                        continue
217                    else:
218                        begin = False
219                # valid line to read
220                vals = S.split()
221                try:
222                    x.append(2.*npasind(wave*float(vals[0])/(4.*np.pi)))
223                    f = float(vals[1])
224                    if f <= 0.0:
225                        y.append(0.0)
226                        w.append(1.0)
227                    elif len(vals) == 3:
228                        y.append(float(vals[1]))
229                        w.append(1.0/float(vals[2])**2)
230                    else:
231                        y.append(float(vals[1]))
232                        w.append(1.0/float(vals[1]))
233                except ValueError:
234                    msg = 'Error in line '+str(i+1)
235                    print msg
236                    break
237            N = len(x)
238            self.powderdata = [
239                np.array(x), # x-axis values
240                np.array(y), # powder pattern intensities
241                np.array(w), # 1/sig(intensity)^2 values (weights)
242                np.zeros(N), # calc. intensities (zero)
243                np.zeros(N), # calc. background (zero)
244                np.zeros(N), # obs-calc profiles
245                ]
246            self.powderentry[0] = filename
247            #self.powderentry[1] = pos # bank offset (N/A here)
248            self.powderentry[2] = 1 # xye file only has one bank
249            self.idstring = ospath.basename(filename)
250            # scan comments for temperature
251            self.Sample['Temperature'] = Temperature
252
253            return True
254        except Exception as detail:
255            self.errors += '\n  '+str(detail)
256            print self.formatName+' read error:'+str(detail) # for testing
257            import traceback
258            traceback.print_exc(file=sys.stdout)
259            return False
Note: See TracBrowser for help on using the repository browser.