Changeset 1225


Ignore:
Timestamp:
Feb 20, 2014 12:22:18 AM (8 years ago)
Author:
vondreele
Message:

multiple revisions for sasd data

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/imports/G2sad_xye.py

    r1223 r1225  
    11# -*- coding: utf-8 -*-
    22########### SVN repository information ###################
    3 # $Date: 2014-01-16 15:55:36 -0600 (Thu, 16 Jan 2014) $
    4 # $Author: vondreele $
    5 # $Revision: 1199 $
    6 # $URL: https://subversion.xor.aps.anl.gov/pyGSAS/trunk/imports/G2pwd_xye.py $
    7 # $Id: G2pwd_xye.py 1199 2014-01-16 21:55:36Z vondreele $
     3# $Date: 2013-12-16 10:43:01 -0600 (Mon, 16 Dec 2013) $
     4# $Author: toby $
     5# $Revision: 1168 $
     6# $URL: https://subversion.xray.aps.anl.gov/pyGSAS/trunk/imports/G2sad_xye.py $
     7# $Id: G2sad_xye.py 1168 2013-12-16 16:43:01Z toby $
    88########### SVN repository information ###################
    99'''
    10 *Module G2pwd_xye: Topas .xye data*
     10*Module G2sad_xye: small angle q step .xye data*
    1111------------------------------------
    1212
    13 Routine to read in powder data from a Topas-compatible .xye file
     13Routine to read in small angle data from an .xye file
    1414
    1515'''
     
    2020import GSASIIIO as G2IO
    2121import GSASIIpath
    22 GSASIIpath.SetVersionNumber("$Revision: 1199 $")
     22GSASIIpath.SetVersionNumber("$Revision: 1168 $")
    2323npasind = lambda x: 180.*np.arcsin(x)/np.pi
     24
    2425class xye_ReaderClass(G2IO.ImportSmallAngleData):
    25     'Routines to import powder data from a .xye file'
     26    'Routines to import q SAXD data from a .xye file'
    2627    def __init__(self):
    2728        super(self.__class__,self).__init__( # fancy way to self-reference
    28             extensionlist=('.xye',),
     29            extensionlist=('.xye','.txt','.dat'),
    2930            strictExtension=False,
    30             formatName = 'Topas xye',
    31             longFormatName = 'Topas .xye powder data file'
     31            formatName = 'q step xye',
     32            longFormatName = 'q stepped data file'
    3233            )
    3334
    3435    # Validate the contents -- make sure we only have valid lines
    3536    def ContentsValidator(self, filepointer):
    36         'Look through the file for expected types of lines in a valid Topas file'
     37        'Look through the file for expected types of lines in a valid q-step file'
    3738        gotCcomment = False
    3839        begin = True
     
    4849                if S[0] == '#':
    4950                    continue       #ignore comments, if any
    50                 else:
     51                elif len(S) == 1:
     52                    continue        #ignore blank lines
     53                elif not gotCcomment:
    5154                    begin = False
    52                 # valid line to read?
     55                # valid line to read?
     56            if begin:
     57                continue   
    5358            vals = S.split()
    54             if len(vals) == 2 or len(vals) == 3:
     59            if 2 <= len(vals) <= 3:
    5560                continue
    5661            else:
     
    6166
    6267    def Reader(self,filename,filepointer, ParentFrame=None, **unused):
    63         'Read a Topas file'
     68        'Read a q-step file'
    6469        x = []
    6570        y = []
    6671        w = []
    6772        try:
     73            wave = 1.5428   #Cuka default
     74            Temperature = 300
    6875            gotCcomment = False
    6976            begin = True
     
    7380                # or (GSAS style) each line can begin with '#'
    7481                if begin:
    75                     if gotCcomment and S.find('*/') > -1:
    76                         self.comments.append(S[:-1])
    77                         begin = False
     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
    7893                        continue
    7994                    if S.strip().startswith('/*'):
     
    8499                        self.comments.append(S[:-1])
    85100                        continue       #ignore comments, if any
    86                     else:
     101                    elif len(S) == 1:      #blank line only CR/LF
     102                        continue
     103                    elif  not gotCcomment:
    87104                        begin = False
    88105                # valid line to read
     106                if begin:
     107                    continue
    89108                vals = S.split()
    90109                try:
    91110                    x.append(float(vals[0]))
     111#                    x.append(2.*npasind(wave*float(vals[0])/(4.*np.pi)))
    92112                    f = float(vals[1])
    93113                    if f <= 0.0:
     
    105125                    break
    106126            N = len(x)
    107             self.powderdata = [
    108                 np.array(x), # x-axis values
    109                 np.array(y), # powder pattern intensities
    110                 np.array(w), # 1/sig(intensity)^2 values (weights)
    111                 np.zeros(N), # calc. intensities (zero)
    112                 np.zeros(N), # calc. background (zero)
    113                 np.zeros(N), # obs-calc profiles
    114                 ]
    115             self.powderentry[0] = filename
    116             #self.powderentry[1] = pos # bank offset (N/A here)
    117             self.powderentry[2] = 1 # xye file only has one bank
    118             self.idstring = ospath.basename(filename)
    119             # scan comments for temperature
    120             Temperature = 300
    121127            for S in self.comments:
    122128                if 'Temp' in S.split('=')[0]:
     
    125131                    except:
    126132                        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
    127149            self.Sample['Temperature'] = Temperature
    128150
     
    135157            return False
    136158
    137 class qxye_ReaderClass(G2IO.ImportSmallAngleData):
    138     'Routines to import q data from a .xye file'
     159class txt_ReaderClass(G2IO.ImportSmallAngleData):
     160    'Routines to import q SAXD data from a .txt file'
    139161    def __init__(self):
    140162        super(self.__class__,self).__init__( # fancy way to self-reference
    141             extensionlist=('.xye','.txt','.dat'),
     163            extensionlist=('.txt','.dat'),
    142164            strictExtension=False,
    143             formatName = 'q step xye',
    144             longFormatName = 'q stepped data file'
     165            formatName = 'q step txt',
     166            longFormatName = 'q stepped text data file'
    145167            )
    146168
    147169    # Validate the contents -- make sure we only have valid lines
    148170    def ContentsValidator(self, filepointer):
    149         'Look through the file for expected types of lines in a valid q-step file'
    150         gotCcomment = False
    151         begin = True
     171        'Look through the file for expected types of lines in a valid txt q-step file'
     172        Ndata = 0
    152173        for i,S in enumerate(filepointer):
    153             if i > 1000: break
    154             if begin:
    155                 if gotCcomment and S.find('*/') > -1:
    156                     begin = False
    157                     continue
    158                 if S.strip().startswith('/*'):
    159                     gotCcomment = True
    160                     continue   
    161                 if S[0] == '#':
    162                     continue       #ignore comments, if any
    163                 elif len(S) == 1:
    164                     continue        #ignore blank lines
    165                 else:
    166                     begin = False
    167                 # valid line to read?
    168174            vals = S.split()
    169             if len(vals) == 2 or len(vals) == 3:
    170                 continue
    171             else:
    172                 self.errors = 'Unexpected information in line: '+str(i+1)
    173                 self.errors += '  '+str(S)
    174                 return False
     175            if 2 <= len(vals):
     176                try:
     177                    data = [float(val) for val in vals]
     178                    Ndata += 1
     179                except ValueError:
     180                    pass
     181        if not Ndata:     
     182            self.errors = 'No 2 or more column numeric data found'
     183            return False
    175184        return True # no errors encountered
    176185
     
    183192            wave = 1.5428   #Cuka default
    184193            Temperature = 300
     194            Ndata = 0
     195            for i,S in enumerate(filepointer):
     196                if len(S) == 1:     #skip blank line
     197                    continue
     198                if '=' in S:
     199                    self.comments.append(S[:-1])
     200                    if 'wave' in S.split('=')[0].lower():
     201                        try:
     202                            wave = float(S.split('=')[1])
     203                        except:
     204                            pass
     205                    continue
     206                vals = S.split()
     207                if 2 <= len(vals):
     208                    try:
     209                        data = [float(val) for val in vals]
     210                        x.append(float(data[0]))
     211                        f = float(data[1])
     212                        if f <= 0.0:
     213                            y.append(0.0)
     214                            w.append(1.0)
     215                        elif len(vals) > 2:
     216                            y.append(float(data[1]))
     217                            w.append(1.0/float(data[2])**2)
     218                        else:
     219                            y.append(float(data[1]))
     220                            w.append(1.0/float(data[1]))
     221                    except ValueError:
     222                        msg = 'Error in line '+str(i+1)
     223                        print msg
     224                        continue
     225            N = len(x)
    185226            for S in self.comments:
    186                 if 'Wave' in S.split('=')[0]:
    187                     try:
    188                         wave = float(S.split('=')[1])
    189                     except:
    190                         pass
    191                 elif 'Temp' in S.split('=')[0]:
     227                if 'Temp' in S.split('=')[0]:
    192228                    try:
    193229                        Temperature = float(S.split('=')[1])
     
    195231                        pass
    196232            self.instdict['wave'] = wave
    197             gotCcomment = False
    198             begin = True
    199             for i,S in enumerate(filepointer):
    200                 self.errors = 'Error reading line: '+str(i+1)
    201                 # or a block of comments delimited by /* and */
    202                 # or (GSAS style) each line can begin with '#'
    203                 if begin:
    204                     if gotCcomment and S.find('*/') > -1:
    205                         self.comments.append(S[:-1])
    206                         begin = False
    207                         continue
    208                     if S.strip().startswith('/*'):
    209                         self.comments.append(S[:-1])
    210                         gotCcomment = True
    211                         continue   
    212                     if S[0] == '#':
    213                         self.comments.append(S[:-1])
    214                         continue       #ignore comments, if any
    215                     elif len(S) == 1:      #blank line only CR/LF
    216                         continue
    217                     else:
    218                         begin = False
    219                 # valid line to read
    220                 vals = S.split()
    221                 try:
    222                     x.append(2.*npasind(wave*float(vals[0])/(4.*np.pi)))
    223                     f = float(vals[1])
    224                     if f <= 0.0:
    225                         y.append(0.0)
    226                         w.append(1.0)
    227                     elif len(vals) == 3:
    228                         y.append(float(vals[1]))
    229                         w.append(1.0/float(vals[2])**2)
    230                     else:
    231                         y.append(float(vals[1]))
    232                         w.append(1.0/float(vals[1]))
    233                 except ValueError:
    234                     msg = 'Error in line '+str(i+1)
    235                     print msg
    236                     break
    237             N = len(x)
    238             self.powderdata = [
    239                 np.array(x), # x-axis values
    240                 np.array(y), # powder pattern intensities
     233            self.instdict['type'] = 'LXC'
     234            x = np.array(x)
     235            if np.any(x > 2.):         #q must be nm-1
     236                x /= 10.
     237#            x = 2.*npasind(wave*x)/(4.*np.pi)   #convert to 2-theta
     238            self.smallangledata = [
     239                x, # x-axis values q
     240                np.array(y), # small angle pattern intensities
    241241                np.array(w), # 1/sig(intensity)^2 values (weights)
    242242                np.zeros(N), # calc. intensities (zero)
    243                 np.zeros(N), # calc. background (zero)
    244243                np.zeros(N), # obs-calc profiles
    245244                ]
    246             self.powderentry[0] = filename
    247             #self.powderentry[1] = pos # bank offset (N/A here)
    248             self.powderentry[2] = 1 # xye file only has one bank
     245            self.smallangleentry[0] = filename
     246            self.smallangleentry[2] = 1 # xye file only has one bank
    249247            self.idstring = ospath.basename(filename)
    250248            # scan comments for temperature
    251249            self.Sample['Temperature'] = Temperature
    252 
     250   
    253251            return True
    254252        except Exception as detail:
Note: See TracChangeset for help on using the changeset viewer.