source: trunk/imports/G2pwd_BrukerRAW.py @ 3098

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

fix powder data import errors with G2scriptable

File size: 9.6 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
17#import sys
18import os.path as ospath
19import struct as st
20import numpy as np
21import GSASIIobj as G2obj
22import GSASIIpath
23GSASIIpath.SetVersionNumber("$Revision: 1620 $")
24class raw_ReaderClass(G2obj.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        self.scriptable = True
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            self.errors += "Sorry, this is a Version 4 Bruker file. "
48            self.errors += "We need documentation for it so that it can be implemented in GSAS-II. "
49            self.errors += "Use PowDLL (http://users.uoi.gr/nkourkou/powdll/) to convert it to ASCII xy."
50            print(self.errors)
51            return False
52        else:
53            self.errors = 'Unexpected information in header: '
54            if all([ord(c) < 128 and ord(c) != 0 for c in str(head)]): # show only if ASCII
55                self.errors += '  '+str(head)
56            else: 
57                self.errors += '  (binary)'
58            return False
59        return True
60           
61    def Reader(self,filename,filepointer, ParentFrame=None, **kwarg):
62        'Read a Bruker RAW file'
63        self.comments = []
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            File.seek(4)
70            nBlock = int(st.unpack('<i',File.read(4))[0])
71            File.seek(168)
72            self.comments.append('Date/Time='+File.read(20))
73            self.comments.append('Anode='+File.read(2))
74            self.comments.append('Ka1=%.5f'%(st.unpack('<f',File.read(4))[0]))
75            self.comments.append('Ka2=%.5f'%(st.unpack('<f',File.read(4))[0]))
76            self.comments.append('Ka2/Ka1=%.5f'%(st.unpack('<f',File.read(4))[0]))
77            File.seek(206)
78            self.comments.append('Kb=%.5f'%(st.unpack('<f',File.read(4))[0]))
79            pos = 256
80            File.seek(pos)
81            blockNum = kwarg.get('blocknum',0)
82            self.idstring = ospath.basename(filename) + ' Scan '+str(blockNum)
83            if blockNum <= nBlock:
84                for iBlock in range(blockNum):
85                    headLen = int(st.unpack('<H',File.read(2))[0])
86                    nSteps = int(st.unpack('<H',File.read(2))[0])
87                    if iBlock+1 == blockNum:
88                        File.seek(pos+12)
89                        step = st.unpack('<f',File.read(4))[0]
90                        start2Th = st.unpack('<f',File.read(4))[0]
91                        pos += headLen      #position at start of data block
92                        File.seek(pos)                                   
93                        x = np.array([start2Th+i*step for i in range(nSteps)])
94                        y = np.array([max(1.,st.unpack('<f',File.read(4))[0]) for i in range(nSteps)])
95                        y = np.where(y<0.,y,1.)
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                else:
104                    self.repeat = True
105            File.close()
106        elif 'ver. 3' in self.formatName:
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 not nSteps: break
134                    if nBlock > 1:
135                        File.seek(pos+256)
136                        headLen += st.unpack('<i',File.read(4))[0]
137                    if iBlock+1 == blockNum:
138                        File.seek(pos+8)
139                        st.unpack('<d',File.read(8))[0]
140                        start2Th = st.unpack('<d',File.read(8))[0]
141                        File.seek(pos+212)
142                        temp = st.unpack('<f',File.read(4))[0]
143                        if temp > 0.:
144                            self.Sample['Temperature'] = temp                                                       
145                        File.seek(pos+176)
146                        step = st.unpack('<d',File.read(8))[0]
147                        pos += headLen      #position at start of data block
148                        File.seek(pos)                                   
149                        x = np.array([start2Th+i*step for i in range(nSteps)])
150                        y = np.array([max(1.,st.unpack('<f',File.read(4))[0]) for i in range(nSteps)])
151                        w = 1./y
152                        self.powderdata = [x,y,w,np.zeros(nSteps),np.zeros(nSteps),np.zeros(nSteps)]
153                        break
154                    pos += headLen+4*nSteps
155                    File.seek(pos)
156                if blockNum == nBlock:
157                    self.repeat = False
158                else:
159                    self.repeat = True
160            File.close()
161           
162        elif 'ver. 4' in self.formatName:   #does not work - format still elusive
163            File.seek(12)   #ok
164            self.comments.append('Date='+File.read(10))
165            self.comments.append('Time='+File.read(10))
166            File.seek(144)
167            self.comments.append('Sample='+File.read(60))
168            File.seek(564)  # where is it?
169            radius = st.unpack('<f',File.read(4))[0]
170            self.comments.append('Gonio. radius=%.2f'%(radius))
171            self.Sample['Gonio. radius'] = radius
172            File.seek(516)  #ok
173            self.comments.append('Anode='+File.read(4))
174            File.seek(472)  #ok
175            self.comments.append('Ka mean=%.5f'%(st.unpack('<d',File.read(8))[0]))
176            self.comments.append('Ka1=%.5f'%(st.unpack('<d',File.read(8))[0]))
177            self.comments.append('Ka2=%.5f'%(st.unpack('<d',File.read(8))[0]))
178            self.comments.append('Kb=%.5f'%(st.unpack('<d',File.read(8))[0]))
179            self.comments.append('Ka2/Ka1=%.5f'%(st.unpack('<d',File.read(8))[0]))
180            File.seek(pos)  #deliberate fail here - pos not known from file contents
181            self.idstring = ospath.basename(filename) + ' Scan '+str(1)
182            nSteps = int(st.unpack('<i',File.read(4))[0])
183            st.unpack('<d',File.read(8))[0]
184            start2Th = st.unpack('<d',File.read(8))[0]
185            File.seek(pos+176)
186            step = st.unpack('<d',File.read(8))[0]
187            pos += headLen      #position at start of data block
188            File.seek(pos)                                   
189            x = np.array([start2Th+i*step for i in range(nSteps)])
190            y = np.array([max(1.,st.unpack('<f',File.read(4))[0]) for i in range(nSteps)])
191            w = 1./y
192            self.powderdata = [x,y,w,np.zeros(nSteps),np.zeros(nSteps),np.zeros(nSteps)]
193            File.close()
194        else:
195            return False
196           
197        return True
Note: See TracBrowser for help on using the repository browser.