source: trunk/imports/G2pwd_BrukerRAW.py @ 2341

Last change on this file since 2341 was 2341, checked in by toby, 6 years ago

improve powder imports: suppress printing of binary data; improve validation of old GSAS binary files

File size: 7.5 KB
Line 
1# -*- coding: utf-8 -*-
2########### SVN repository information ###################
3# $Date: 2014-12-27 11:14:59 -0600 (Sat, 27 Dec 2014) $
4# $Author: vondreele $
5# $Revision: 1620 $
6# $URL: https://subversion.xray.aps.anl.gov/pyGSAS/trunk/imports/G2pwd_xye.py $
7# $Id: G2pwd_xye.py 1620 2014-12-27 17:14:59Z vondreele $
8########### SVN repository information ###################
9'''
10*Module G2pwd_xye: Topas .xye data*
11------------------------------------
12
13Routine to read in powder data from a Topas-compatible .xye file
14
15'''
16
17import sys
18import os.path as ospath
19import struct as st
20import array as ar
21import numpy as np
22import GSASIIIO as G2IO
23import GSASIIpath
24GSASIIpath.SetVersionNumber("$Revision: 1620 $")
25class xye_ReaderClass(G2IO.ImportPowderData):
26    'Routines to import powder data from a binary Bruker .RAW file'
27    def __init__(self):
28        super(self.__class__,self).__init__( # fancy way to self-reference
29            extensionlist=('.RAW',),
30            strictExtension=False,
31            formatName = 'Bruker RAW',
32            longFormatName = 'Bruker .RAW powder data file'
33            )
34
35    # Validate the contents -- make sure we only have valid lines
36    def ContentsValidator(self, filepointer):
37        'Look through the file for expected types of lines in a valid Bruker RAW file'
38        head = filepointer.read(7)
39        if head[:4] == 'RAW ':
40            self.formatName = 'Bruker RAW ver. 1'
41        elif head[:4] == 'RAW2':
42            self.formatName = 'Bruker RAW ver. 2'
43        elif head == 'RAW1.01':
44            self.formatName = 'Bruker RAW ver. 3'
45        else:
46            self.errors = 'Unexpected information in header: '
47            if all([ord(c) < 128 and ord(c) != 0 for c in str(head)]): # show only if ASCII
48                self.errors += '  '+str(head)
49            else: 
50                self.errors += '  (binary)'
51            return False
52        return True
53           
54    def Reader(self,filename,filepointer, ParentFrame=None, **kwarg):
55        'Read a Bruker RAW file'
56        self.comments = []
57        self.repeat = True
58        File = open(filename,'rb')
59        if 'ver. 1' in self.formatName:
60            raise Exception    #for now
61        elif 'ver. 2' in self.formatName:
62            try:
63                File.seek(4)
64                nBlock = int(st.unpack('<i',File.read(4))[0])
65                File.seek(168)
66                self.comments.append('Date/Time='+File.read(20))
67                self.comments.append('Anode='+File.read(2))
68                self.comments.append('Ka1=%.5f'%(st.unpack('<f',File.read(4))[0]))
69                self.comments.append('Ka2=%.5f'%(st.unpack('<f',File.read(4))[0]))
70                self.comments.append('Ka2/Ka1=%.5f'%(st.unpack('<f',File.read(4))[0]))
71                File.seek(206)
72                self.comments.append('Kb=%.5f'%(st.unpack('<f',File.read(4))[0]))
73                pos = 256
74                File.seek(pos)
75                blockNum = kwarg.get('blocknum',0)
76                self.idstring = ospath.basename(filename) + ' Scan '+str(blockNum)
77                if blockNum <= nBlock:
78                    for iBlock in range(blockNum):
79                        headLen = int(st.unpack('<H',File.read(2))[0])
80                        nSteps = int(st.unpack('<H',File.read(2))[0])
81                        if iBlock+1 == blockNum:
82                            File.seek(pos+12)
83                            step = st.unpack('<f',File.read(4))[0]
84                            start2Th = st.unpack('<f',File.read(4))[0]
85                            pos += headLen      #position at start of data block
86                            File.seek(pos)                                   
87                            x = np.array([start2Th+i*step for i in range(nSteps)])
88                            y = np.array([max(1.,st.unpack('<f',File.read(4))[0]) for i in range(nSteps)])
89                            w = 1./y
90                            self.powderdata = [x,y,w,np.zeros(nSteps),np.zeros(nSteps),np.zeros(nSteps)]
91                            break
92                        pos += headLen+4*nSteps
93                        File.seek(pos)
94                    if blockNum == nBlock:
95                        self.repeat = False                                   
96                File.close()
97            except Exception as detail:
98                self.errors += '\n  '+str(detail)
99                print self.formatName+' read error:'+str(detail) # for testing
100                import traceback
101                traceback.print_exc(file=sys.stdout)
102                return False
103               
104               
105        elif 'ver. 3' in self.formatName:
106            try:
107                File.seek(12)
108                nBlock = int(st.unpack('<i',File.read(4))[0])
109                self.comments.append('Date='+File.read(10))
110                self.comments.append('Time='+File.read(10))
111                File.seek(326)
112                self.comments.append('Sample='+File.read(60))
113                File.seek(564)
114                radius = st.unpack('<f',File.read(4))[0]
115                self.comments.append('Gonio. radius=%.2f'%(radius))
116                self.Sample['Gonio. radius'] = radius
117                File.seek(608)
118                self.comments.append('Anode='+File.read(4))
119                File.seek(616)
120                self.comments.append('Ka mean=%.5f'%(st.unpack('<d',File.read(8))[0]))
121                self.comments.append('Ka1=%.5f'%(st.unpack('<d',File.read(8))[0]))
122                self.comments.append('Ka2=%.5f'%(st.unpack('<d',File.read(8))[0]))
123                self.comments.append('Kb=%.5f'%(st.unpack('<d',File.read(8))[0]))
124                self.comments.append('Ka2/Ka1=%.5f'%(st.unpack('<d',File.read(8))[0]))
125                pos = 712
126                File.seek(pos)      #position at 1st block header
127                blockNum = kwarg.get('blocknum',0)
128                self.idstring = ospath.basename(filename) + ' Scan '+str(blockNum)
129                if blockNum <= nBlock:
130                    for iBlock in range(blockNum):
131                        headLen = int(st.unpack('<i',File.read(4))[0])
132                        nSteps = int(st.unpack('<i',File.read(4))[0])
133                        if iBlock+1 == blockNum:
134                            t = st.unpack('<d',File.read(8))[0]
135                            start2Th = st.unpack('<d',File.read(8))[0]
136                            File.seek(pos+176)
137                            step = st.unpack('<d',File.read(8))[0]
138                            pos += headLen      #position at start of data block
139                            File.seek(pos)                                   
140                            x = np.array([start2Th+i*step for i in range(nSteps)])
141                            y = np.array([max(1.,st.unpack('<f',File.read(4))[0]) for i in range(nSteps)])
142                            w = 1./y
143                            self.powderdata = [x,y,w,np.zeros(nSteps),np.zeros(nSteps),np.zeros(nSteps)]
144                            break
145                        pos += headLen+4*nSteps
146                        File.seek(pos)
147                    if blockNum == nBlock:
148                        self.repeat = False                                   
149                File.close()
150            except Exception as detail:
151                self.errors += '\n  '+str(detail)
152                print self.formatName+' read error:'+str(detail) # for testing
153                import traceback
154                traceback.print_exc(file=sys.stdout)
155                return False
156           
157        return True
Note: See TracBrowser for help on using the repository browser.