source: trunk/imports/G2pwd_BrukerRAW.py @ 2547

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

remove str() from some text handling - failed on non ascii characters in file name & user entered titles.
Some code cleanups

File size: 10.2 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 v.1-v.3 .raw data*
11---------------------------------------------------
12
13Routine to read in powder data from a Bruker versions 1-3 .raw file
14
15'''
16
17import sys
18import os.path as ospath
19import struct as st
20import numpy as np
21import GSASIIIO as G2IO
22import GSASIIpath
23GSASIIpath.SetVersionNumber("$Revision: 1620 $")
24class raw_ReaderClass(G2IO.ImportPowderData):
25    'Routines to import powder data from a binary Bruker .RAW file'
26    def __init__(self):
27        super(self.__class__,self).__init__( # fancy way to self-reference
28            extensionlist=('.RAW',),
29            strictExtension=False,
30            formatName = 'Bruker RAW',
31            longFormatName = 'Bruker .RAW powder data file'
32            )
33
34    # Validate the contents -- make sure we only have valid lines
35    def ContentsValidator(self, filepointer):
36        'Look through the file for expected types of lines in a valid Bruker RAW file'
37        head = filepointer.read(7)
38        if head[:4] == 'RAW ':
39            self.formatName = 'Bruker RAW ver. 1'
40        elif head[:4] == 'RAW2':
41            self.formatName = 'Bruker RAW ver. 2'
42        elif head == 'RAW1.01':
43            self.formatName = 'Bruker RAW ver. 3'
44        elif head == 'RAW4.00':
45            self.formatName = 'Bruker RAW ver. 4'
46            self.errors += "Sorry, this is a Version 4 Bruker file. "
47            self.errors += "We need documentation for it so that it can be implemented in GSAS-II. "
48            self.errors += "Use PowDLL (http://users.uoi.gr/nkourkou/powdll/) to convert it to ASCII xy."
49            print(self.errors)
50            return False
51        else:
52            self.errors = 'Unexpected information in header: '
53            if all([ord(c) < 128 and ord(c) != 0 for c in str(head)]): # show only if ASCII
54                self.errors += '  '+str(head)
55            else: 
56                self.errors += '  (binary)'
57            return False
58        return True
59           
60    def Reader(self,filename,filepointer, ParentFrame=None, **kwarg):
61        'Read a Bruker RAW file'
62        self.comments = []
63        self.repeat = True
64        self.powderentry[0] = filename
65        File = open(filename,'rb')
66        if 'ver. 1' in self.formatName:
67            raise Exception    #for now
68        elif 'ver. 2' in self.formatName:
69            try:
70                File.seek(4)
71                nBlock = int(st.unpack('<i',File.read(4))[0])
72                File.seek(168)
73                self.comments.append('Date/Time='+File.read(20))
74                self.comments.append('Anode='+File.read(2))
75                self.comments.append('Ka1=%.5f'%(st.unpack('<f',File.read(4))[0]))
76                self.comments.append('Ka2=%.5f'%(st.unpack('<f',File.read(4))[0]))
77                self.comments.append('Ka2/Ka1=%.5f'%(st.unpack('<f',File.read(4))[0]))
78                File.seek(206)
79                self.comments.append('Kb=%.5f'%(st.unpack('<f',File.read(4))[0]))
80                pos = 256
81                File.seek(pos)
82                blockNum = kwarg.get('blocknum',0)
83                self.idstring = ospath.basename(filename) + ' Scan '+str(blockNum)
84                if blockNum <= nBlock:
85                    for iBlock in range(blockNum):
86                        headLen = int(st.unpack('<H',File.read(2))[0])
87                        nSteps = int(st.unpack('<H',File.read(2))[0])
88                        if iBlock+1 == blockNum:
89                            File.seek(pos+12)
90                            step = st.unpack('<f',File.read(4))[0]
91                            start2Th = st.unpack('<f',File.read(4))[0]
92                            pos += headLen      #position at start of data block
93                            File.seek(pos)                                   
94                            x = np.array([start2Th+i*step for i in range(nSteps)])
95                            y = np.array([max(1.,st.unpack('<f',File.read(4))[0]) for i in range(nSteps)])
96                            w = 1./y
97                            self.powderdata = [x,y,w,np.zeros(nSteps),np.zeros(nSteps),np.zeros(nSteps)]
98                            break
99                        pos += headLen+4*nSteps
100                        File.seek(pos)
101                    if blockNum == nBlock:
102                        self.repeat = False                                   
103                File.close()
104            except Exception as detail:
105                self.errors += '\n  '+str(detail)
106                print self.formatName+' read error:'+str(detail) # for testing
107                import traceback
108                traceback.print_exc(file=sys.stdout)
109                return False
110        elif 'ver. 3' in self.formatName:
111            try:
112                File.seek(12)
113                nBlock = int(st.unpack('<i',File.read(4))[0])
114                self.comments.append('Date='+File.read(10))
115                self.comments.append('Time='+File.read(10))
116                File.seek(326)
117                self.comments.append('Sample='+File.read(60))
118                File.seek(564)
119                radius = st.unpack('<f',File.read(4))[0]
120                self.comments.append('Gonio. radius=%.2f'%(radius))
121                self.Sample['Gonio. radius'] = radius
122                File.seek(608)
123                self.comments.append('Anode='+File.read(4))
124                File.seek(616)
125                self.comments.append('Ka mean=%.5f'%(st.unpack('<d',File.read(8))[0]))
126                self.comments.append('Ka1=%.5f'%(st.unpack('<d',File.read(8))[0]))
127                self.comments.append('Ka2=%.5f'%(st.unpack('<d',File.read(8))[0]))
128                self.comments.append('Kb=%.5f'%(st.unpack('<d',File.read(8))[0]))
129                self.comments.append('Ka2/Ka1=%.5f'%(st.unpack('<d',File.read(8))[0]))
130                pos = 712
131                File.seek(pos)      #position at 1st block header
132                blockNum = kwarg.get('blocknum',0)
133                self.idstring = ospath.basename(filename) + ' Scan '+str(blockNum)
134                if blockNum <= nBlock:
135                    for iBlock in range(blockNum):
136                        headLen = int(st.unpack('<i',File.read(4))[0])
137                        nSteps = int(st.unpack('<i',File.read(4))[0])
138                        if iBlock+1 == blockNum:
139                            st.unpack('<d',File.read(8))[0]
140                            start2Th = st.unpack('<d',File.read(8))[0]
141                            File.seek(pos+176)
142                            step = st.unpack('<d',File.read(8))[0]
143                            pos += headLen      #position at start of data block
144                            File.seek(pos)                                   
145                            x = np.array([start2Th+i*step for i in range(nSteps)])
146                            y = np.array([max(1.,st.unpack('<f',File.read(4))[0]) for i in range(nSteps)])
147                            w = 1./y
148                            self.powderdata = [x,y,w,np.zeros(nSteps),np.zeros(nSteps),np.zeros(nSteps)]
149                            break
150                        pos += headLen+4*nSteps
151                        File.seek(pos)
152                    if blockNum == nBlock:
153                        self.repeat = False                                   
154                File.close()
155            except Exception as detail:
156                self.errors += '\n  '+str(detail)
157                print self.formatName+' read error:'+str(detail) # for testing
158                import traceback
159                traceback.print_exc(file=sys.stdout)
160                return False
161           
162        elif 'ver. 4' in self.formatName:   #does not work - format still elusive
163            try:
164                File.seek(12)   #ok
165                self.comments.append('Date='+File.read(10))
166                self.comments.append('Time='+File.read(10))
167                File.seek(144)
168                self.comments.append('Sample='+File.read(60))
169                File.seek(564)  # where is it?
170                radius = st.unpack('<f',File.read(4))[0]
171                self.comments.append('Gonio. radius=%.2f'%(radius))
172                self.Sample['Gonio. radius'] = radius
173                File.seek(516)  #ok
174                self.comments.append('Anode='+File.read(4))
175                File.seek(472)  #ok
176                self.comments.append('Ka mean=%.5f'%(st.unpack('<d',File.read(8))[0]))
177                self.comments.append('Ka1=%.5f'%(st.unpack('<d',File.read(8))[0]))
178                self.comments.append('Ka2=%.5f'%(st.unpack('<d',File.read(8))[0]))
179                self.comments.append('Kb=%.5f'%(st.unpack('<d',File.read(8))[0]))
180                self.comments.append('Ka2/Ka1=%.5f'%(st.unpack('<d',File.read(8))[0]))
181                File.seek(pos)  #deliberate fail here - pos not known from file contents
182                self.idstring = ospath.basename(filename) + ' Scan '+str(1)
183                nSteps = int(st.unpack('<i',File.read(4))[0])
184                st.unpack('<d',File.read(8))[0]
185                start2Th = st.unpack('<d',File.read(8))[0]
186                File.seek(pos+176)
187                step = st.unpack('<d',File.read(8))[0]
188                pos += headLen      #position at start of data block
189                File.seek(pos)                                   
190                x = np.array([start2Th+i*step for i in range(nSteps)])
191                y = np.array([max(1.,st.unpack('<f',File.read(4))[0]) for i in range(nSteps)])
192                w = 1./y
193                self.powderdata = [x,y,w,np.zeros(nSteps),np.zeros(nSteps),np.zeros(nSteps)]
194                File.close()
195            except Exception as detail:
196                self.errors += '\n  '+str(detail)
197                print self.formatName+' read error:'+str(detail) # for testing
198                import traceback
199                traceback.print_exc(file=sys.stdout)
200                return False
201           
202        return True
Note: See TracBrowser for help on using the repository browser.