Changeset b2c28a5 in sasview for src/sas/sascalc/dataloader


Ignore:
Timestamp:
Aug 1, 2017 6:36:13 AM (7 years ago)
Author:
lewis
Branches:
master, ESS_GUI, ESS_GUI_Docs, ESS_GUI_batch_fitting, ESS_GUI_bumps_abstraction, ESS_GUI_iss1116, ESS_GUI_iss879, ESS_GUI_iss959, ESS_GUI_opencl, ESS_GUI_ordering, ESS_GUI_sync_sascalc, costrafo411, magnetic_scatt, release-4.2.2, ticket-1009, ticket-1094-headless, ticket-1242-2d-resolution, ticket-1243, ticket-1249, ticket885, unittest-saveload
Children:
248ff73
Parents:
713a047
Message:

Refactor sesans_reader to use FileReader? class

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/sas/sascalc/dataloader/readers/sesans_reader.py

    r9a5097c rb2c28a5  
    11""" 
    22    SESANS reader (based on ASCII reader) 
    3      
     3 
    44    Reader for .ses or .sesans file format 
    5      
    6     Jurrian Bakker  
     5 
     6    Jurrian Bakker 
    77""" 
    88import numpy as np 
    99import os 
    10 from sas.sascalc.dataloader.data_info import Data1D 
     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 
    1113 
    1214# Check whether we have a converter available 
     
    1820_ZERO = 1e-16 
    1921 
    20 class Reader: 
     22class Reader(FileReader): 
    2123    """ 
    2224    Class to load sesans files (6 columns). 
     
    2426    ## File type 
    2527    type_name = "SESANS" 
    26      
     28 
    2729    ## Wildcards 
    2830    type = ["SESANS files (*.ses)|*.ses", 
     
    3032    ## List of allowed extensions 
    3133    ext = ['.ses', '.SES', '.sesans', '.SESANS'] 
    32      
     34 
    3335    ## Flag to bypass extension check 
    34     allow_all = True 
    35      
    36     def read(self, path): 
    37          
    38 #        print "reader triggered" 
    39          
    40         """ 
    41         Load data file 
    42          
    43         :param path: file path 
    44          
    45         :return: SESANSData1D object, or None 
    46          
    47         :raise RuntimeError: when the file can't be opened 
    48         :raise ValueError: when the length of the data vectors are inconsistent 
    49         """ 
    50         if os.path.isfile(path): 
    51             basename = os.path.basename(path) 
    52             _, extension = os.path.splitext(basename) 
    53             if self.allow_all or extension.lower() in self.ext: 
    54                 try: 
    55                     # Read in binary mode since GRASP frequently has no-ascii 
    56                     # characters that brakes the open operation 
    57                     input_f = open(path,'rb') 
    58                 except: 
    59                     raise  RuntimeError, "sesans_reader: cannot open %s" % path 
    60                 buff = input_f.read() 
    61                 lines = buff.splitlines() 
    62                 x  = np.zeros(0) 
    63                 y  = np.zeros(0) 
    64                 dy = np.zeros(0) 
    65                 lam  = np.zeros(0) 
    66                 dlam = np.zeros(0) 
    67                 dx = np.zeros(0) 
    68                  
    69                #temp. space to sort data 
    70                 tx  = np.zeros(0) 
    71                 ty  = np.zeros(0) 
    72                 tdy = np.zeros(0) 
    73                 tlam  = np.zeros(0) 
    74                 tdlam = np.zeros(0) 
    75                 tdx = np.zeros(0) 
    76                 output = Data1D(x=x, y=y, lam=lam, dy=dy, dx=dx, dlam=dlam, isSesans=True) 
    77                 self.filename = output.filename = basename 
     36    allow_all = False 
    7837 
    79                 paramnames=[] 
    80                 paramvals=[] 
    81                 zvals=[] 
    82                 dzvals=[] 
    83                 lamvals=[] 
    84                 dlamvals=[] 
    85                 Pvals=[] 
    86                 dPvals=[] 
     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 = [] 
    8743 
    88                 for line in lines: 
    89                     # Initial try for CSV (split on ,) 
    90                     line=line.strip() 
    91                     toks = line.split('\t') 
    92                     if len(toks)==2: 
    93                         paramnames.append(toks[0]) 
    94                         paramvals.append(toks[1]) 
    95                     if len(toks)>5: 
    96                         zvals.append(toks[0]) 
    97                         dzvals.append(toks[3]) 
    98                         lamvals.append(toks[4]) 
    99                         dlamvals.append(toks[5]) 
    100                         Pvals.append(toks[1]) 
    101                         dPvals.append(toks[2]) 
    102                     else: 
    103                         continue 
     44        error_message = "" 
     45        loaded_correctly = True 
    10446 
    105                 x=[] 
    106                 y=[] 
    107                 lam=[] 
    108                 dx=[] 
    109                 dy=[] 
    110                 dlam=[] 
    111                 lam_header = lamvals[0].split() 
    112                 data_conv_z = None 
    113                 default_z_unit = "A" 
    114                 data_conv_P = None 
    115                 default_p_unit = " " # Adjust unit for axis (L^-3) 
    116                 lam_unit = lam_header[1].replace("[","").replace("]","") 
    117                 if lam_unit == 'AA': 
    118                     lam_unit = 'A' 
    119                 varheader=[zvals[0],dzvals[0],lamvals[0],dlamvals[0],Pvals[0],dPvals[0]] 
    120                 valrange=range(1, len(zvals)) 
    121                 for i in valrange: 
    122                     x.append(float(zvals[i])) 
    123                     y.append(float(Pvals[i])) 
    124                     lam.append(float(lamvals[i])) 
    125                     dy.append(float(dPvals[i])) 
    126                     dx.append(float(dzvals[i])) 
    127                     dlam.append(float(dlamvals[i])) 
     47        import pdb; pdb.set_trace() 
    12848 
    129                 x,y,lam,dy,dx,dlam = [ 
    130                     np.asarray(v, 'double') 
    131                    for v in (x,y,lam,dy,dx,dlam) 
    132                 ] 
     49        buff = self.f_open.read() 
     50        lines = buff.splitlines() 
    13351 
    134                 input_f.close() 
     52        self.current_datainfo.filename = os.path.basename(self.f_open.name) 
    13553 
    136                 output.x, output.x_unit = self._unit_conversion(x, lam_unit, default_z_unit) 
    137                 output.y = y 
    138                 output.y_unit = r'\AA^{-2} cm^{-1}'  # output y_unit added 
    139                 output.dx, output.dx_unit = self._unit_conversion(dx, lam_unit, default_z_unit) 
    140                 output.dy = dy 
    141                 output.lam, output.lam_unit = self._unit_conversion(lam, lam_unit, default_z_unit) 
    142                 output.dlam, output.dlam_unit = self._unit_conversion(dlam, lam_unit, default_z_unit) 
    143                  
    144                 output.xaxis(r"\rm{z}", output.x_unit) 
    145                 output.yaxis(r"\rm{ln(P)/(t \lambda^2)}", output.y_unit)  # Adjust label to ln P/(lam^2 t), remove lam column refs 
     54        paramnames=[] 
     55        paramvals=[] 
     56        zvals=[] 
     57        dzvals=[] 
     58        lamvals=[] 
     59        dlamvals=[] 
     60        Pvals=[] 
     61        dPvals=[] 
    14662 
    147                 # Store loading process information 
    148                 output.meta_data['loader'] = self.type_name 
    149                 #output.sample.thickness = float(paramvals[6]) 
    150                 output.sample.name = paramvals[1] 
    151                 output.sample.ID = paramvals[0] 
    152                 zaccept_unit_split = paramnames[7].split("[") 
    153                 zaccept_unit = zaccept_unit_split[1].replace("]","") 
    154                 if zaccept_unit.strip() == r'\AA^-1' or zaccept_unit.strip() == r'\A^-1': 
    155                     zaccept_unit = "1/A" 
    156                 output.sample.zacceptance=(float(paramvals[7]),zaccept_unit) 
    157                 output.vars = varheader 
     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 
    15879 
    159                 if len(output.x) < 1: 
    160                     raise RuntimeError, "%s is empty" % path 
    161                 return output 
     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) 
    162108 
    163         else: 
    164             raise RuntimeError, "%s is not a file" % path 
    165         return None 
     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) 
    166152 
    167153    def _unit_conversion(self, value, value_unit, default_unit): 
Note: See TracChangeset for help on using the changeset viewer.