Changeset 1230


Ignore:
Timestamp:
Feb 25, 2014 3:06:18 PM (8 years ago)
Author:
vondreele
Message:

add substances & G2sasd (future sasd math routine)
remove sasd xye importer - didn't work & isn't needed

Location:
trunk
Files:
2 added
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/imports/G2sad_xye.py

    r1225 r1230  
    2323npasind = lambda x: 180.*np.arcsin(x)/np.pi
    2424
    25 class xye_ReaderClass(G2IO.ImportSmallAngleData):
    26     'Routines to import q SAXD data from a .xye file'
     25class txt_ReaderClass(G2IO.ImportSmallAngleData):
     26    'Routines to import q SAXD data from a .txt or .dat file'
    2727    def __init__(self):
    2828        super(self.__class__,self).__init__( # fancy way to self-reference
    29             extensionlist=('.xye','.txt','.dat'),
     29            extensionlist=('.txt','.dat'),
    3030            strictExtension=False,
    31             formatName = 'q step xye',
    32             longFormatName = 'q stepped data file'
     31            formatName = 'q step QIE data',
     32            longFormatName = 'q stepped text data file in Q,I,E order; E optional'
    3333            )
    3434
     
    3636    def ContentsValidator(self, filepointer):
    3737        'Look through the file for expected types of lines in a valid q-step file'
    38         gotCcomment = False
    39         begin = True
    40         for i,S in enumerate(filepointer):
    41             if i > 1000: break
    42             if begin:
    43                 if gotCcomment and S.find('*/') > -1:
    44                     begin = False
    45                     continue
    46                 if S.strip().startswith('/*'):
    47                     gotCcomment = True
    48                     continue   
    49                 if S[0] == '#':
    50                     continue       #ignore comments, if any
    51                 elif len(S) == 1:
    52                     continue        #ignore blank lines
    53                 elif not gotCcomment:
    54                     begin = False
    55                 # valid line to read?
    56             if begin:
    57                 continue   
    58             vals = S.split()
    59             if 2 <= len(vals) <= 3:
    60                 continue
    61             else:
    62                 self.errors = 'Unexpected information in line: '+str(i+1)
    63                 self.errors += '  '+str(S)
    64                 return False
    65         return True # no errors encountered
    66 
    67     def Reader(self,filename,filepointer, ParentFrame=None, **unused):
    68         'Read a q-step file'
    69         x = []
    70         y = []
    71         w = []
    72         try:
    73             wave = 1.5428   #Cuka default
    74             Temperature = 300
    75             gotCcomment = False
    76             begin = True
    77             for i,S in enumerate(filepointer):
    78                 self.errors = 'Error reading line: '+str(i+1)
    79                 # or a block of comments delimited by /* and */
    80                 # or (GSAS style) each line can begin with '#'
    81                 if begin:
    82                     if 'Wave' in S.split('=')[0]:
    83                         try:
    84                             wave = float(S.split('=')[1])
    85                         except:
    86                             pass
    87                     if gotCcomment:
    88                         if S.find('*/') == -1:
    89                             self.comments.append(S[:-1])
    90                         else:
    91                             self.comments.append(S[:-1])
    92                             begin = False
    93                         continue
    94                     if S.strip().startswith('/*'):
    95                         self.comments.append(S[:-1])
    96                         gotCcomment = True
    97                         continue   
    98                     if S[0] == '#':
    99                         self.comments.append(S[:-1])
    100                         continue       #ignore comments, if any
    101                     elif len(S) == 1:      #blank line only CR/LF
    102                         continue
    103                     elif  not gotCcomment:
    104                         begin = False
    105                 # valid line to read
    106                 if begin:
    107                     continue
    108                 vals = S.split()
    109                 try:
    110                     x.append(float(vals[0]))
    111 #                    x.append(2.*npasind(wave*float(vals[0])/(4.*np.pi)))
    112                     f = float(vals[1])
    113                     if f <= 0.0:
    114                         y.append(0.0)
    115                         w.append(1.0)
    116                     elif len(vals) == 3:
    117                         y.append(float(vals[1]))
    118                         w.append(1.0/float(vals[2])**2)
    119                     else:
    120                         y.append(float(vals[1]))
    121                         w.append(1.0/float(vals[1]))
    122                 except ValueError:
    123                     msg = 'Error in line '+str(i+1)
    124                     print msg
    125                     break
    126             N = len(x)
    127             for S in self.comments:
    128                 if 'Temp' in S.split('=')[0]:
    129                     try:
    130                         Temperature = float(S.split('=')[1])
    131                     except:
    132                         pass
    133             self.instdict['wave'] = wave
    134             self.instdict['type'] = 'LXC'
    135             x = np.array(x)
    136             if np.any(x > 2.):      #nanometers-1?
    137                 x /= 10.
    138             self.smallangledata = [
    139                 x, # x-axis values - q
    140                 np.array(y), # small angle pattern intensities
    141                 np.array(w), # 1/sig(intensity)^2 values (weights)
    142                 np.zeros(N), # calc. intensities (zero)
    143                 np.zeros(N), # obs-calc profiles
    144                 ]
    145             self.smallangleentry[0] = filename
    146             self.smallangleentry[2] = 1 # xye file only has one bank
    147             self.idstring = ospath.basename(filename)
    148             # scan comments for temperature
    149             self.Sample['Temperature'] = Temperature
    150 
    151             return True
    152         except Exception as detail:
    153             self.errors += '\n  '+str(detail)
    154             print self.formatName+' read error:'+str(detail) # for testing
    155             import traceback
    156             traceback.print_exc(file=sys.stdout)
    157             return False
    158 
    159 class txt_ReaderClass(G2IO.ImportSmallAngleData):
    160     'Routines to import q SAXD data from a .txt file'
    161     def __init__(self):
    162         super(self.__class__,self).__init__( # fancy way to self-reference
    163             extensionlist=('.txt','.dat'),
    164             strictExtension=False,
    165             formatName = 'q step txt',
    166             longFormatName = 'q stepped text data file'
    167             )
    168 
    169     # Validate the contents -- make sure we only have valid lines
    170     def ContentsValidator(self, filepointer):
    171         'Look through the file for expected types of lines in a valid txt q-step file'
    17238        Ndata = 0
    17339        for i,S in enumerate(filepointer):
    17440            vals = S.split()
    175             if 2 <= len(vals):
     41            if len(vals) >= 2:
    17642                try:
    17743                    data = [float(val) for val in vals]
     
    18551
    18652    def Reader(self,filename,filepointer, ParentFrame=None, **unused):
    187         'Read a q-step file'
     53        print 'Read a q-step text file'
    18854        x = []
    18955        y = []
     
    20571                    continue
    20672                vals = S.split()
    207                 if 2 <= len(vals):
     73                if len(vals) >= 2:
    20874                    try:
    20975                        data = [float(val) for val in vals]
     
    235101            if np.any(x > 2.):         #q must be nm-1
    236102                x /= 10.
    237 #            x = 2.*npasind(wave*x)/(4.*np.pi)   #convert to 2-theta
    238103            self.smallangledata = [
    239104                x, # x-axis values q
Note: See TracChangeset for help on using the changeset viewer.