source: trunk/imports/G2pwd_BrukerRAW.py @ 2406

Last change on this file since 2406 was 2406, checked in by vondreele, 5 years ago

change spin flip from red/black to -1/1

File size: 9.9 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_BrukerRAW: Bruker 3 & 4 .raw data*
11------------------------------------
12
13Routine to read in powder data from a Bruker 3 & 4 .raw 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        elif head == 'RAW4.00':
46            self.formatName = 'Bruker RAW ver. 4'
47        else:
48            self.errors = 'Unexpected information in header: '
49            if all([ord(c) < 128 and ord(c) != 0 for c in str(head)]): # show only if ASCII
50                self.errors += '  '+str(head)
51            else: 
52                self.errors += '  (binary)'
53            return False
54        return True
55           
56    def Reader(self,filename,filepointer, ParentFrame=None, **kwarg):
57        'Read a Bruker RAW file'
58        self.comments = []
59        self.repeat = True
60        File = open(filename,'rb')
61        if 'ver. 1' in self.formatName:
62            raise Exception    #for now
63        elif 'ver. 2' in self.formatName:
64            try:
65                File.seek(4)
66                nBlock = int(st.unpack('<i',File.read(4))[0])
67                File.seek(168)
68                self.comments.append('Date/Time='+File.read(20))
69                self.comments.append('Anode='+File.read(2))
70                self.comments.append('Ka1=%.5f'%(st.unpack('<f',File.read(4))[0]))
71                self.comments.append('Ka2=%.5f'%(st.unpack('<f',File.read(4))[0]))
72                self.comments.append('Ka2/Ka1=%.5f'%(st.unpack('<f',File.read(4))[0]))
73                File.seek(206)
74                self.comments.append('Kb=%.5f'%(st.unpack('<f',File.read(4))[0]))
75                pos = 256
76                File.seek(pos)
77                blockNum = kwarg.get('blocknum',0)
78                self.idstring = ospath.basename(filename) + ' Scan '+str(blockNum)
79                if blockNum <= nBlock:
80                    for iBlock in range(blockNum):
81                        headLen = int(st.unpack('<H',File.read(2))[0])
82                        nSteps = int(st.unpack('<H',File.read(2))[0])
83                        if iBlock+1 == blockNum:
84                            File.seek(pos+12)
85                            step = st.unpack('<f',File.read(4))[0]
86                            start2Th = st.unpack('<f',File.read(4))[0]
87                            pos += headLen      #position at start of data block
88                            File.seek(pos)                                   
89                            x = np.array([start2Th+i*step for i in range(nSteps)])
90                            y = np.array([max(1.,st.unpack('<f',File.read(4))[0]) for i in range(nSteps)])
91                            w = 1./y
92                            self.powderdata = [x,y,w,np.zeros(nSteps),np.zeros(nSteps),np.zeros(nSteps)]
93                            break
94                        pos += headLen+4*nSteps
95                        File.seek(pos)
96                    if blockNum == nBlock:
97                        self.repeat = False                                   
98                File.close()
99            except Exception as detail:
100                self.errors += '\n  '+str(detail)
101                print self.formatName+' read error:'+str(detail) # for testing
102                import traceback
103                traceback.print_exc(file=sys.stdout)
104                return False
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        elif 'ver. 4' in self.formatName:   #does not work - format still elusive
158            try:
159                File.seek(12)   #ok
160                self.comments.append('Date='+File.read(10))
161                self.comments.append('Time='+File.read(10))
162                File.seek(144)
163                self.comments.append('Sample='+File.read(60))
164                File.seek(564)  # where is it?
165                radius = st.unpack('<f',File.read(4))[0]
166                self.comments.append('Gonio. radius=%.2f'%(radius))
167                self.Sample['Gonio. radius'] = radius
168                File.seek(516)  #ok
169                self.comments.append('Anode='+File.read(4))
170                File.seek(472)  #ok
171                self.comments.append('Ka mean=%.5f'%(st.unpack('<d',File.read(8))[0]))
172                self.comments.append('Ka1=%.5f'%(st.unpack('<d',File.read(8))[0]))
173                self.comments.append('Ka2=%.5f'%(st.unpack('<d',File.read(8))[0]))
174                self.comments.append('Kb=%.5f'%(st.unpack('<d',File.read(8))[0]))
175                self.comments.append('Ka2/Ka1=%.5f'%(st.unpack('<d',File.read(8))[0]))
176                File.seek(pos)  #deliberate fail here - pos not known from file contents
177                self.idstring = ospath.basename(filename) + ' Scan '+str(1)
178                nSteps = int(st.unpack('<i',File.read(4))[0])
179                t = st.unpack('<d',File.read(8))[0]
180                start2Th = st.unpack('<d',File.read(8))[0]
181                File.seek(pos+176)
182                step = st.unpack('<d',File.read(8))[0]
183                pos += headLen      #position at start of data block
184                File.seek(pos)                                   
185                x = np.array([start2Th+i*step for i in range(nSteps)])
186                y = np.array([max(1.,st.unpack('<f',File.read(4))[0]) for i in range(nSteps)])
187                w = 1./y
188                self.powderdata = [x,y,w,np.zeros(nSteps),np.zeros(nSteps),np.zeros(nSteps)]
189                File.close()
190            except Exception as detail:
191                self.errors += '\n  '+str(detail)
192                print self.formatName+' read error:'+str(detail) # for testing
193                import traceback
194                traceback.print_exc(file=sys.stdout)
195                return False
196           
197        return True
Note: See TracBrowser for help on using the repository browser.