Ignore:
File:
1 edited

Legend:

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

    r0ac6e11 r9a5097c  
    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""" 
    8 import logging 
    98import numpy as np 
    109import os 
     
    1918_ZERO = 1e-16 
    2019 
    21  
    2220class Reader: 
    2321    """ 
    2422    Class to load sesans files (6 columns). 
    2523    """ 
    26     # File type 
     24    ## File type 
    2725    type_name = "SESANS" 
    28  
    29     # Wildcards 
     26     
     27    ## Wildcards 
    3028    type = ["SESANS files (*.ses)|*.ses", 
    3129            "SESANS files (*..sesans)|*.sesans"] 
    32     # List of allowed extensions 
     30    ## List of allowed extensions 
    3331    ext = ['.ses', '.SES', '.sesans', '.SESANS'] 
    34  
    35     # Flag to bypass extension check 
     32     
     33    ## Flag to bypass extension check 
    3634    allow_all = True 
    37  
     35     
    3836    def read(self, path): 
     37         
     38#        print "reader triggered" 
     39         
    3940        """ 
    4041        Load data file 
    41  
     42         
    4243        :param path: file path 
    43  
     44         
    4445        :return: SESANSData1D object, or None 
    45  
     46         
    4647        :raise RuntimeError: when the file can't be opened 
    4748        :raise ValueError: when the length of the data vectors are inconsistent 
     
    5051            basename = os.path.basename(path) 
    5152            _, extension = os.path.splitext(basename) 
    52             if not (self.allow_all or extension.lower() in self.ext): 
    53                 raise RuntimeError("{} has an unrecognized file extension".format(path)) 
     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 
     78 
     79                paramnames=[] 
     80                paramvals=[] 
     81                zvals=[] 
     82                dzvals=[] 
     83                lamvals=[] 
     84                dlamvals=[] 
     85                Pvals=[] 
     86                dPvals=[] 
     87 
     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 
     104 
     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])) 
     128 
     129                x,y,lam,dy,dx,dlam = [ 
     130                    np.asarray(v, 'double') 
     131                   for v in (x,y,lam,dy,dx,dlam) 
     132                ] 
     133 
     134                input_f.close() 
     135 
     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 
     146 
     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 
     158 
     159                if len(output.x) < 1: 
     160                    raise RuntimeError, "%s is empty" % path 
     161                return output 
     162 
    54163        else: 
    55             raise RunetimeError("{} is not a file".format(path)) 
    56         with open(path, 'r') as input_f: 
    57             # Read in binary mode since GRASP frequently has no-ascii 
    58             # characters that brakes the open operation 
    59             line = input_f.readline() 
    60             params = {} 
    61             while not line.startswith("BEGIN_DATA"): 
    62                 terms = line.split() 
    63                 if len(terms) >= 2: 
    64                     params[terms[0]] = " ".join(terms[1:]) 
    65                 line = input_f.readline() 
    66             self.params = params 
    67             headers = input_f.readline().split() 
     164            raise RuntimeError, "%s is not a file" % path 
     165        return None 
    68166 
    69             data = np.loadtxt(input_f) 
    70             if data.size < 1: 
    71                 raise RuntimeError("{} is empty".format(path)) 
    72             x = data[:, headers.index("SpinEchoLength")] 
    73             dx = data[:, headers.index("SpinEchoLength_error")] 
    74             lam = data[:, headers.index("Wavelength")] 
    75             dlam = data[:, headers.index("Wavelength_error")] 
    76             y = data[:, headers.index("Depolarisation")] 
    77             dy = data[:, headers.index("Depolarisation_error")] 
    78  
    79             lam_unit = self._unit_fetch("Wavelength") 
    80             x, x_unit = self._unit_conversion(x, "A", self._unit_fetch("SpinEchoLength")) 
    81             dx, dx_unit = self._unit_conversion( 
    82                 dx, lam_unit, 
    83                 self._unit_fetch("SpinEchoLength")) 
    84             dlam, dlam_unit = self._unit_conversion( 
    85                 dlam, lam_unit, 
    86                 self._unit_fetch("Wavelength")) 
    87             y_unit = self._unit_fetch("Depolarisation") 
    88  
    89             output = Data1D(x=x, y=y, lam=lam, dy=dy, dx=dx, dlam=dlam, 
    90                             isSesans=True) 
    91  
    92             output.y_unit = y_unit 
    93             output.x_unit = x_unit 
    94             output.source.wavelength_unit = lam_unit 
    95             output.source.wavelength = lam 
    96             self.filename = output.filename = basename 
    97             output.xaxis(r"\rm{z}", x_unit) 
    98             # Adjust label to ln P/(lam^2 t), remove lam column refs 
    99             output.yaxis(r"\rm{ln(P)/(t \lambda^2)}", y_unit) 
    100             # Store loading process information 
    101             output.meta_data['loader'] = self.type_name 
    102             output.sample.name = params["Sample"] 
    103             output.sample.ID = params["DataFileTitle"] 
    104             output.sample.thickness = float( 
    105                 self._unit_conversion( 
    106                     params["Thickness"], "cm", self._unit_fetch("Thickness"))[0]) 
    107  
    108             output.sample.zacceptance = ( 
    109                 float(params["Theta_zmax"]), 
    110                 self._unit_fetch("Theta_zmax")) 
    111  
    112             output.sample.yacceptance = ( 
    113                 float(params["Theta_ymax"]), 
    114                 self._unit_fetch("Theta_ymax")) 
    115             return output 
    116  
    117     @staticmethod 
    118     def _unit_conversion(value, value_unit, default_unit): 
    119         """ 
    120         Performs unit conversion on a measurement. 
    121  
    122         :param value: The magnitude of the measurement 
    123         :param value_unit: a string containing the final desired unit 
    124         :param default_unit: a string containing the units of the original measurement 
    125         :return: The magnitude of the measurement in the new units 
    126         """ 
    127         # (float, string, string) -> float 
    128         if has_converter and value_unit != default_unit: 
     167    def _unit_conversion(self, value, value_unit, default_unit): 
     168        if has_converter == True and value_unit != default_unit: 
    129169            data_conv_q = Converter(value_unit) 
    130170            value = data_conv_q(value, units=default_unit) 
     
    133173            new_unit = value_unit 
    134174        return value, new_unit 
    135  
    136     def _unit_fetch(self, unit): 
    137         return self.params[unit+"_unit"] 
Note: See TracChangeset for help on using the changeset viewer.