source: sasview/DataLoader/readers/ascii_reader.py @ dcf29d7

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 dcf29d7 was 0e2aa40, checked in by Jae Cho <jhjcho@…>, 16 years ago

Made the letter of units in plots consistent for all

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