source: trunk/imports/G2pwd_csv.py @ 2835

Last change on this file since 2835 was 2835, checked in by vondreele, 5 years ago

add self.scriptable=False to ImportBaseClass?
set it True in various PWDR readers
when selecting points for image calibration, shift key forces selection at cursor
Status bar text changes to reflect this

  • Property svn:eol-style set to native
  • Property svn:keywords set to Date Author Revision URL Id
File size: 3.7 KB
Line 
1# -*- coding: utf-8 -*-
2########### SVN repository information ###################
3# $Date: 2017-05-16 21:02:31 +0000 (Tue, 16 May 2017) $
4# $Author: vondreele $
5# $Revision: 2835 $
6# $URL: trunk/imports/G2pwd_csv.py $
7# $Id: G2pwd_csv.py 2835 2017-05-16 21:02:31Z vondreele $
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 os.path as ospath
19import numpy as np
20import GSASIIobj as G2obj
21import GSASIIpath
22GSASIIpath.SetVersionNumber("$Revision: 2835 $")
23class csv_ReaderClass(G2obj.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=('.csv','.xy','.XY',),
28            strictExtension=True,
29            formatName = 'comma/tab/semicolon separated',
30            longFormatName = 'Worksheet-type .csv powder data file'
31            )
32        self.scriptable = True
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        for i,S in enumerate(filepointer):
60            vals = S.replace(',',' ').replace(';',' ').split()
61            if len(vals) < 2 and i > 0:
62                print 'Line '+str(i+1)+' cannot be read:\n\t'+S
63                continue
64            try:
65                x.append(float(vals[0]))
66                f = float(vals[1])
67                if f <= 0.0:
68                    y.append(0.0)
69                    w.append(0.0)
70                elif len(vals) == 3:
71                    y.append(float(vals[1]))
72                    w.append(1.0/float(vals[2])**2)
73                else:
74                    y.append(float(vals[1]))
75                    w.append(1.0/float(vals[1]))
76                err = False
77            except ValueError:
78                err = True
79                msg = 'Error parsing number in line '+str(i+1)
80            except:
81                err = True
82                msg = 'Error in line '+str(i+1)
83            if err and i > 0:
84                print msg
85                print S
86                break
87        N = len(x)
88        self.powderdata = [
89            np.array(x), # x-axis values
90            np.array(y), # powder pattern intensities
91            np.array(w), # 1/sig(intensity)^2 values (weights)
92            np.zeros(N), # calc. intensities (zero)
93            np.zeros(N), # calc. background (zero)
94            np.zeros(N), # obs-calc profiles
95            ]
96        self.powderentry[0] = filename
97        #self.powderentry[1] = pos # bank offset (N/A here)
98        #self.powderentry[2] = 1 # xye file only has one bank
99        self.idstring = ospath.basename(filename)
100        # scan comments for temperature
101        Temperature = 300
102        for S in self.comments:
103            if 'Temp' in S.split('=')[0]:
104                try:
105                    Temperature = float(S.split('=')[1])
106                except:
107                    pass
108        self.Sample['Temperature'] = Temperature
109
110        return True
Note: See TracBrowser for help on using the repository browser.