source: trunk/imports/G2pwd_xye.py @ 1559

Last change on this file since 1559 was 1559, checked in by vondreele, 8 years ago

use deepcopy for various copy operations in G2ddataGUI
use complementary colors to background for cell edges
trap superlattice in cubics
more fixes to cell indexing routines from possible use of superlattice
add HStrainVals to G2spc
use it (maybe) in G2strIO, Math
make arguments for GetReflPos? & GetReflPosDeriv? the same (use A not G)
add GetDij? to G2strMath
topas xye file comments start with "'" sometimes

  • Property svn:eol-style set to native
  • Property svn:keywords set to Date Author Revision URL Id
File size: 5.2 KB
Line 
1# -*- coding: utf-8 -*-
2########### SVN repository information ###################
3# $Date: 2014-11-03 20:48:51 +0000 (Mon, 03 Nov 2014) $
4# $Author: vondreele $
5# $Revision: 1559 $
6# $URL: trunk/imports/G2pwd_xye.py $
7# $Id: G2pwd_xye.py 1559 2014-11-03 20:48:51Z 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: 1559 $")
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 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] in ["'",'#']:
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] in ["'"'#']:
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                if len(vals) < 2:
91                    print 'Line '+str(i+1)+' cannot be read:\n\t'+S
92                    continue
93                try:
94                    x.append(float(vals[0]))
95                    f = float(vals[1])
96                    if f <= 0.0:
97                        y.append(0.0)
98                        w.append(0.0)
99                    elif len(vals) == 3:
100                        y.append(float(vals[1]))
101                        w.append(1.0/float(vals[2])**2)
102                    else:
103                        y.append(float(vals[1]))
104                        w.append(1.0/float(vals[1]))
105                except ValueError:
106                    msg = 'Error parsing number in line '+str(i+1)
107                    print msg
108                    print S
109                    break
110                except:
111                    msg = 'Error in line '+str(i+1)
112                    print msg
113                    print S
114                    break
115            N = len(x)
116            self.powderdata = [
117                np.array(x), # x-axis values
118                np.array(y), # powder pattern intensities
119                np.array(w), # 1/sig(intensity)^2 values (weights)
120                np.zeros(N), # calc. intensities (zero)
121                np.zeros(N), # calc. background (zero)
122                np.zeros(N), # obs-calc profiles
123                ]
124            self.powderentry[0] = filename
125            #self.powderentry[1] = pos # bank offset (N/A here)
126            self.powderentry[2] = 1 # xye file only has one bank
127            self.idstring = ospath.basename(filename)
128            # scan comments for temperature
129            Temperature = 300
130            for S in self.comments:
131                if 'Temp' in S.split('=')[0]:
132                    try:
133                        Temperature = float(S.split('=')[1])
134                    except:
135                        pass
136            self.Sample['Temperature'] = Temperature
137
138            return True
139        except Exception as detail:
140            self.errors += '\n  '+str(detail)
141            print self.formatName+' read error:'+str(detail) # for testing
142            import traceback
143            traceback.print_exc(file=sys.stdout)
144            return False
145
Note: See TracBrowser for help on using the repository browser.