source: trunk/imports/G2pwd_csv.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: 4.1 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_csv.py $
7# $Id: G2pwd_csv.py 2516 2016-11-07 04:18:52Z toby $
8########### SVN repository information ###################
9'''
10*Module G2pwd_csv: Read Excel .csv data*
11------------------------------------------
12
13Routine to read in powder data from Excel type comma separated variable
14column-oriented variable
15
16'''
17
18import sys
19import os.path as ospath
20import numpy as np
21import GSASIIIO as G2IO
22import GSASIIpath
23GSASIIpath.SetVersionNumber("$Revision: 2516 $")
24class csv_ReaderClass(G2IO.ImportPowderData):
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=('.csv','.xy','.XY',),
29            strictExtension=True,
30            formatName = 'comma/tab/semicolon separated',
31            longFormatName = 'Worksheet-type .csv powder data file'
32            )
33
34    # Validate the contents -- make sure we only have valid lines
35    def ContentsValidator(self, filepointer):
36        good = 0
37        for i,S in enumerate(filepointer):
38            if i > 1000: break
39            vals = S.replace(',',' ').replace(';',' ').split()
40            if len(vals) >= 2:
41                for j,v in enumerate(vals):
42                    if j == 3: break
43                    try:
44                        float(v)
45                    except ValueError:
46                        if good > 1: return False
47                        continue
48                good += 1
49                continue
50            elif good > 1:
51                return False
52        return True # no errors encountered
53
54    def Reader(self,filename,filepointer, ParentFrame=None, **unused):
55        'Read a csv file'
56        x = []
57        y = []
58        w = []
59        try:
60            begin = True
61            for i,S in enumerate(filepointer):
62                vals = S.replace(',',' ').replace(';',' ').split()
63                if len(vals) < 2 and i > 0:
64                    print 'Line '+str(i+1)+' cannot be read:\n\t'+S
65                    continue
66                try:
67                    x.append(float(vals[0]))
68                    f = float(vals[1])
69                    if f <= 0.0:
70                        y.append(0.0)
71                        w.append(0.0)
72                    elif len(vals) == 3:
73                        y.append(float(vals[1]))
74                        w.append(1.0/float(vals[2])**2)
75                    else:
76                        y.append(float(vals[1]))
77                        w.append(1.0/float(vals[1]))
78                    err = False
79                except ValueError:
80                    err = True
81                    msg = 'Error parsing number in line '+str(i+1)
82                except:
83                    err = True
84                    msg = 'Error in line '+str(i+1)
85                if err and i > 0:
86                    print msg
87                    print S
88                    break
89            N = len(x)
90            self.powderdata = [
91                np.array(x), # x-axis values
92                np.array(y), # powder pattern intensities
93                np.array(w), # 1/sig(intensity)^2 values (weights)
94                np.zeros(N), # calc. intensities (zero)
95                np.zeros(N), # calc. background (zero)
96                np.zeros(N), # obs-calc profiles
97                ]
98            self.powderentry[0] = filename
99            #self.powderentry[1] = pos # bank offset (N/A here)
100            #self.powderentry[2] = 1 # xye file only has one bank
101            self.idstring = ospath.basename(filename)
102            # scan comments for temperature
103            Temperature = 300
104            for S in self.comments:
105                if 'Temp' in S.split('=')[0]:
106                    try:
107                        Temperature = float(S.split('=')[1])
108                    except:
109                        pass
110            self.Sample['Temperature'] = Temperature
111
112            return True
113        except Exception as detail:
114            self.errors += '\n  '+str(detail)
115            print self.formatName+' read error:'+str(detail) # for testing
116            import traceback
117            traceback.print_exc(file=sys.stdout)
118            return False
Note: See TracBrowser for help on using the repository browser.