source: sasview/src/sas/sascalc/dataloader/readers/sesans_reader.py @ b2c28a5

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.2.2ticket-1009ticket-1094-headlessticket-1242-2d-resolutionticket-1243ticket-1249ticket885unittest-saveload
Last change on this file since b2c28a5 was b2c28a5, checked in by lewis, 7 years ago

Refactor sesans_reader to use FileReader? class

  • Property mode set to 100644
File size: 5.3 KB
Line 
1"""
2    SESANS reader (based on ASCII reader)
3
4    Reader for .ses or .sesans file format
5
6    Jurrian Bakker
7"""
8import numpy as np
9import os
10from sas.sascalc.dataloader.file_reader_base_class import FileReader
11from sas.sascalc.dataloader.data_info import plottable_1D, DataInfo
12from sas.sascalc.dataloader.loader_exceptions import FileContentsException, DataReaderException
13
14# Check whether we have a converter available
15has_converter = True
16try:
17    from sas.sascalc.data_util.nxsunit import Converter
18except:
19    has_converter = False
20_ZERO = 1e-16
21
22class Reader(FileReader):
23    """
24    Class to load sesans files (6 columns).
25    """
26    ## File type
27    type_name = "SESANS"
28
29    ## Wildcards
30    type = ["SESANS files (*.ses)|*.ses",
31            "SESANS files (*..sesans)|*.sesans"]
32    ## List of allowed extensions
33    ext = ['.ses', '.SES', '.sesans', '.SESANS']
34
35    ## Flag to bypass extension check
36    allow_all = False
37
38    def get_file_contents(self):
39        self.current_datainfo = DataInfo()
40        self.current_dataset = plottable_1D(np.array([]), np.array([]))
41        self.current_datainfo.isSesans = True
42        self.output = []
43
44        error_message = ""
45        loaded_correctly = True
46
47        import pdb; pdb.set_trace()
48
49        buff = self.f_open.read()
50        lines = buff.splitlines()
51
52        self.current_datainfo.filename = os.path.basename(self.f_open.name)
53
54        paramnames=[]
55        paramvals=[]
56        zvals=[]
57        dzvals=[]
58        lamvals=[]
59        dlamvals=[]
60        Pvals=[]
61        dPvals=[]
62
63        for line in lines:
64            # Initial try for CSV (split on ,)
65            line=line.strip()
66            toks = line.split('\t')
67            if len(toks)==2:
68                paramnames.append(toks[0])
69                paramvals.append(toks[1])
70            elif len(toks)>5:
71                zvals.append(toks[0])
72                dzvals.append(toks[3])
73                lamvals.append(toks[4])
74                dlamvals.append(toks[5])
75                Pvals.append(toks[1])
76                dPvals.append(toks[2])
77            else:
78                continue
79
80        x=[]
81        y=[]
82        lam=[]
83        dx=[]
84        dy=[]
85        dlam=[]
86        lam_header = lamvals[0].split()
87        data_conv_z = None
88        default_z_unit = "A"
89        data_conv_P = None
90        default_p_unit = " " # Adjust unit for axis (L^-3)
91        lam_unit = lam_header[1].replace("[","").replace("]","")
92        if lam_unit == 'AA':
93            lam_unit = 'A'
94        varheader=[zvals[0],dzvals[0],lamvals[0],dlamvals[0],Pvals[0],dPvals[0]]
95        valrange=range(1, len(zvals))
96        try:
97            for i in valrange:
98                x.append(float(zvals[i]))
99                y.append(float(Pvals[i]))
100                lam.append(float(lamvals[i]))
101                dy.append(float(dPvals[i]))
102                dx.append(float(dzvals[i]))
103                dlam.append(float(dlamvals[i]))
104        except ValueError as val_err:
105            err_msg = "Invalid float"
106            err_msg += ":".join(val_err.message.split(":")[1:])
107            raise FileContentsException(err_msg)
108
109        x, y, lam, dy, dx, dlam = [
110            np.asarray(v, 'double')
111           for v in (x, y, lam, dy, dx, dlam)
112        ]
113
114        self.f_open.close()
115
116        self.current_dataset.x, self.current_dataset._xunit = self._unit_conversion(x, lam_unit, default_z_unit)
117        self.current_dataset.y = y
118        self.current_dataset._yunit = r'\AA^{-2} cm^{-1}'  # output y_unit added
119        self.current_dataset.dx, _ = self._unit_conversion(dx, lam_unit, default_z_unit)
120        self.current_dataset.dy = dy
121        self.current_dataset.lam, _ = self._unit_conversion(lam, lam_unit, default_z_unit)
122        self.current_dataset.dlam, _ = self._unit_conversion(dlam, lam_unit, default_z_unit)
123
124        self.current_dataset.xaxis(r"\rm{z}", self.current_dataset._xunit)
125        self.current_dataset.yaxis(r"\rm{ln(P)/(t \lambda^2)}", self.current_dataset._yunit)  # Adjust label to ln P/(lam^2 t), remove lam column refs
126
127        # Store loading process information
128        self.current_datainfo.meta_data['loader'] = self.type_name
129        try:
130            self.current_datainfo.sample.thickness = float(paramvals[6])
131        except ValueError as val_err:
132            loaded_correctly = False
133            error_message += "\nInvalid sample thickness '{}'".format(paramvals[6])
134
135        self.current_datainfo.sample.name = paramvals[1]
136        self.current_datainfo.sample.ID = paramvals[0]
137        zaccept_unit_split = paramnames[7].split("[")
138        zaccept_unit = zaccept_unit_split[1].replace("]","")
139        if zaccept_unit.strip() == r'\AA^-1' or zaccept_unit.strip() == r'\A^-1':
140            zaccept_unit = "1/A"
141        self.current_datainfo.sample.zacceptance=(float(paramvals[7]),zaccept_unit)
142
143        self.current_datainfo.vars = varheader
144
145        if len(self.current_dataset.x) < 1:
146            raise FileContentsException("No data points in file.")
147
148        self.send_to_output()
149
150        if not loaded_correctly:
151            raise DataReaderException(error_message)
152
153    def _unit_conversion(self, value, value_unit, default_unit):
154        if has_converter == True and value_unit != default_unit:
155            data_conv_q = Converter(value_unit)
156            value = data_conv_q(value, units=default_unit)
157            new_unit = default_unit
158        else:
159            new_unit = value_unit
160        return value, new_unit
Note: See TracBrowser for help on using the repository browser.