source: trunk/imports/G2pwd_xye.py @ 2516

Last change on this file since 2516 was 2516, checked in by toby, 5 years ago

revise import to not assume Bank 1 with multibank instparm files; deal with unicode problem in CIF files; improve atoms use of selection from menu; add Pawley menu variable selection (plenty more to do)

  • Property svn:eol-style set to native
  • Property svn:keywords set to Date Author Revision URL Id
File size: 5.5 KB
Line 
1# -*- coding: utf-8 -*-
2########### SVN repository information ###################
3# $Date: 2016-11-07 04:18:52 +0000 (Mon, 07 Nov 2016) $
4# $Author: toby $
5# $Revision: 2516 $
6# $URL: trunk/imports/G2pwd_xye.py $
7# $Id: G2pwd_xye.py 2516 2016-11-07 04:18:52Z toby $
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: 2516 $")
23class xye_ReaderClass(G2IO.ImportPowderData):
24    'Routines to import powder data from a .xye file'
25    def __init__(self):
26        super(self.__class__,self).__init__( # fancy way to self-reference
27            extensionlist=('.xye',),
28            strictExtension=False,
29            formatName = 'Topas xye',
30            longFormatName = 'Topas .xye powder data file'
31            )
32
33    # Validate the contents -- make sure we only have valid lines
34    def ContentsValidator(self, filepointer):
35        'Look through the file for expected types of lines in a valid Topas file'
36        gotCcomment = False
37        begin = True
38        self.GSAS = False
39        for i,S in enumerate(filepointer):
40            if not S:
41                break
42            if i > 1000: break
43            if begin:
44                if gotCcomment and S.find('*/') > -1:
45                    begin = False
46                    continue
47                if S.strip().startswith('/*'):
48                    gotCcomment = True
49                    continue   
50                if S[0] in ["'",'#']:
51                    continue       #ignore comments, if any
52                else:
53                    begin = False
54                # valid line to read?
55            #vals = S.split()
56            vals = S.replace(',',' ').replace(';',' ').split()
57            if len(vals) == 2 or len(vals) == 3:
58                continue
59            else:
60                self.errors = 'Unexpected information in line: '+str(i+1)
61                if all([ord(c) < 128 and ord(c) != 0 for c in str(S)]): # show only if ASCII
62                    self.errors += '  '+str(S)
63                else: 
64                    self.errors += '  (binary)'
65                return False
66        return True # no errors encountered
67
68    def Reader(self,filename,filepointer, ParentFrame=None, **unused):
69        'Read a Topas file'
70        x = []
71        y = []
72        w = []
73        try:
74            gotCcomment = False
75            begin = True
76            for i,S in enumerate(filepointer):
77                self.errors = 'Error reading line: '+str(i+1)
78                # or a block of comments delimited by /* and */
79                # or (GSAS style) each line can begin with '#'
80                if begin:
81                    if gotCcomment and S.find('*/') > -1:
82                        self.comments.append(S[:-1])
83                        begin = False
84                        continue
85                    if S.strip().startswith('/*'):
86                        self.comments.append(S[:-1])
87                        gotCcomment = True
88                        continue   
89                    if S[0] in ["'",'#']:
90                        self.comments.append(S[:-1])
91                        continue       #ignore comments, if any
92                    else:
93                        begin = False
94                # valid line to read
95                #vals = S.split()
96                vals = S.replace(',',' ').replace(';',' ').split()
97                if len(vals) < 2:
98                    print 'Line '+str(i+1)+' cannot be read:\n\t'+S
99                    continue
100                try:
101                    x.append(float(vals[0]))
102                    f = float(vals[1])
103                    if f <= 0.0:
104                        y.append(0.0)
105                        w.append(0.0)
106                    elif len(vals) == 3:
107                        y.append(float(vals[1]))
108                        w.append(1.0/float(vals[2])**2)
109                    else:
110                        y.append(float(vals[1]))
111                        w.append(1.0/float(vals[1]))
112                except ValueError:
113                    msg = 'Error parsing number in line '+str(i+1)
114                    print msg
115                    print S
116                    break
117                except:
118                    msg = 'Error in line '+str(i+1)
119                    print msg
120                    print S
121                    break
122            N = len(x)
123            self.powderdata = [
124                np.array(x), # x-axis values
125                np.array(y), # powder pattern intensities
126                np.array(w), # 1/sig(intensity)^2 values (weights)
127                np.zeros(N), # calc. intensities (zero)
128                np.zeros(N), # calc. background (zero)
129                np.zeros(N), # obs-calc profiles
130                ]
131            self.powderentry[0] = filename
132            #self.powderentry[1] = pos # bank offset (N/A here)
133            #self.powderentry[2] = 1 # xye file only has one bank
134            self.idstring = ospath.basename(filename)
135            # scan comments for temperature
136            Temperature = 300
137            for S in self.comments:
138                if 'Temp' in S.split('=')[0]:
139                    try:
140                        Temperature = float(S.split('=')[1])
141                    except:
142                        pass
143            self.Sample['Temperature'] = Temperature
144
145            return True
146        except Exception as detail:
147            self.errors += '\n  '+str(detail)
148            print self.formatName+' read error:'+str(detail) # for testing
149            import traceback
150            traceback.print_exc(file=sys.stdout)
151            return False
152
Note: See TracBrowser for help on using the repository browser.