source: sasview/DataLoader/readers/ascii_reader.py @ 31f3f661

ESS_GUIESS_GUI_DocsESS_GUI_batch_fittingESS_GUI_bumps_abstractionESS_GUI_iss1116ESS_GUI_iss879ESS_GUI_iss959ESS_GUI_openclESS_GUI_orderingESS_GUI_sync_sascalccostrafo411magnetic_scattrelease-4.1.1release-4.1.2release-4.2.2release_4.0.1ticket-1009ticket-1094-headlessticket-1242-2d-resolutionticket-1243ticket-1249ticket885unittest-saveload
Last change on this file since 31f3f661 was de1da34, checked in by Jae Cho <jhjcho@…>, 16 years ago

Added load-ability to get dQ (for smear) if exists, and capability to sort the data by Q as a key

  • Property mode set to 100644
File size: 7.8 KB
Line 
1"""
2This software was developed by the University of Tennessee as part of the
3Distributed Data Analysis of Neutron Scattering Experiments (DANSE)
4project funded by the US National Science Foundation.
5
6See the license text in license.txt
7
8copyright 2008, University of Tennessee
9"""
10
11import numpy
12import os
13from DataLoader.data_info import Data1D
14
15# Check whether we have a converter available
16has_converter = True
17try:
18    from data_util.nxsunit import Converter
19except:
20    has_converter = False
21
22class Reader:
23    """
24        Class to load ascii files (2 or 3 columns)
25    """
26    ## File type
27    type = ["ASCII files (*.txt)|*.txt",
28            "ASCII files (*.dat)|*.dat"]
29    ## List of allowed extensions
30    ext=['.txt', '.TXT', '.dat', '.DAT'] 
31   
32    def read(self, path):
33        """
34            Load data file
35           
36            @param path: file path
37            @return: Data1D object, or None
38            @raise RuntimeError: when the file can't be opened
39            @raise ValueError: when the length of the data vectors are inconsistent
40        """
41        if os.path.isfile(path):
42            basename  = os.path.basename(path)
43            root, extension = os.path.splitext(basename)
44            if extension.lower() in self.ext:
45                try:
46                    input_f =  open(path,'r')
47                except :
48                    raise  RuntimeError, "ascii_reader: cannot open %s" % path
49                buff = input_f.read()
50                lines = buff.split('\n')
51                x  = numpy.zeros(0)
52                y  = numpy.zeros(0)
53                dy = numpy.zeros(0)
54                dx = numpy.zeros(0)
55               
56               #temp. space to sort data
57                tx  = numpy.zeros(0)
58                ty  = numpy.zeros(0)
59                tdy = numpy.zeros(0)
60                tdx = numpy.zeros(0)
61               
62                output = Data1D(x, y, dy=dy, dx=dx)
63                self.filename = output.filename = basename
64           
65                data_conv_q = None
66                data_conv_i = None
67               
68                if has_converter == True and output.x_unit != '1/A':
69                    data_conv_q = Converter('1/A')
70                    # Test it
71                    data_conv_q(1.0, output.x_unit)
72                   
73                if has_converter == True and output.y_unit != '1/cm':
74                    data_conv_i = Converter('1/cm')
75                    # Test it
76                    data_conv_i(1.0, output.y_unit)
77           
78               
79                # The first good line of data will define whether
80                # we have 2-column or 3-column ascii
81                has_error_dx = None
82                has_error_dy = None
83               
84                for line in lines:
85                    toks = line.split()
86                    try:
87                        _x = float(toks[0])
88                        _y = float(toks[1])
89                       
90                        if data_conv_q is not None:
91                            _x = data_conv_q(_x, units=output.x_unit)
92                           
93                        if data_conv_i is not None:
94                            _y = data_conv_i(_y, units=output.y_unit)                       
95                       
96                        # If we have an extra token, check
97                        # whether it can be interpreted as a
98                        # third column.
99                        _dy = None
100                        if len(toks)>2:
101                            try:
102                                _dy = float(toks[2])
103                               
104                                if data_conv_i is not None:
105                                    _dy = data_conv_i(_dy, units=output.y_unit)
106                               
107                            except:
108                                # The third column is not a float, skip it.
109                                pass
110                           
111                        # If we haven't set the 3rd column
112                        # flag, set it now.
113                        if has_error_dy == None:
114                            has_error_dy = False if _dy == None else True
115                           
116                        #Check for dx
117                        _dx = None
118                        if len(toks)>3:
119                            try:
120                                _dx = float(toks[3])
121                               
122                                if data_conv_i is not None:
123                                    _dx = data_conv_i(_dx, units=output.x_unit)
124                               
125                            except:
126                                # The 4th column is not a float, skip it.
127                                pass
128                           
129                        # If we haven't set the 3rd column
130                        # flag, set it now.
131                        if has_error_dx == None:
132                            has_error_dx = False if _dx == None else True
133
134                        x  = numpy.append(x,   _x) 
135                        y  = numpy.append(y,   _y)
136                        if has_error_dy == True:
137                            dy = numpy.append(dy, _dy)
138                        if has_error_dx == True:
139                            dx = numpy.append(dx, _dx)
140                           
141                        #Same for temp.
142                        tx  = numpy.append(tx,   _x) 
143                        ty  = numpy.append(ty,   _y)
144                        if has_error_dy == True:
145                            tdy = numpy.append(tdy, _dy)
146                        if has_error_dx == True:
147                            tdx = numpy.append(tdx, _dx)
148                       
149                    except:
150                        # Couldn't parse this line, skip it
151                        pass
152                         
153                     
154                # Sanity check
155                if has_error_dy == True and not len(y) == len(dy):
156                    raise RuntimeError, "ascii_reader: y and dy have different length"
157                if has_error_dx == True and not len(x) == len(dx):
158                    raise RuntimeError, "ascii_reader: y and dy have different length"
159
160                # If the data length is zero, consider this as
161                # though we were not able to read the file.
162                if len(x)==0:
163                    raise RuntimeError, "ascii_reader: could not load file"
164               
165                #Let's reoder the data
166                ind = numpy.lexsort((ty,tx))
167                for i in ind:
168                    x[i] = tx[ind[i]]
169                    y[i] = ty[ind[i]]
170                    if has_error_dy == True:
171                        dy[i] = tdy[ind[i]]
172                    if has_error_dx == True:
173                        dx[i] = tdx[ind[i]]
174                   
175                output.x = x
176                output.y = y
177                output.dy = dy if has_error_dy == True else None
178                output.dx = dx if has_error_dx == True else None
179               
180                if data_conv_q is not None:
181                    output.xaxis("\\rm{Q}", output.x_unit)
182                else:
183                    output.xaxis("\\rm{Q}", 'A^{-1}')
184                if data_conv_i is not None:
185                    output.yaxis("\\{I(Q)}", output.y_unit)
186                else:
187                    output.yaxis("\\rm{I(Q)}","cm^{-1}")
188               
189                return output
190        else:
191            raise RuntimeError, "%s is not a file" % path
192        return None
193   
194if __name__ == "__main__": 
195    reader = Reader()
196    #print reader.read("../test/test_3_columns.txt")
197    print reader.read("../test/empty.txt")
198   
199   
200                       
Note: See TracBrowser for help on using the repository browser.