source: trunk/imports/G2pwd_BrukerRAW.py @ 2835

Last change on this file since 2835 was 2835, checked in by vondreele, 6 years ago

add self.scriptable=False to ImportBaseClass?
set it True in various PWDR readers
when selecting points for image calibration, shift key forces selection at cursor
Status bar text changes to reflect this

File size: 9.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_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 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.repeat = True
65        self.powderentry[0] = filename
66        File = open(filename,'rb')
67        if 'ver. 1' in self.formatName:
68            raise Exception    #for now
69        elif 'ver. 2' in self.formatName:
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                        y = np.where(y<0.,y,1.)
97                        w = 1./y
98                        self.powderdata = [x,y,w,np.zeros(nSteps),np.zeros(nSteps),np.zeros(nSteps)]
99                        break
100                    pos += headLen+4*nSteps
101                    File.seek(pos)
102                if blockNum == nBlock:
103                    self.repeat = False                                   
104            File.close()
105        elif 'ver. 3' in self.formatName:
106            File.seek(12)
107            nBlock = int(st.unpack('<i',File.read(4))[0])
108            self.comments.append('Date='+File.read(10))
109            self.comments.append('Time='+File.read(10))
110            File.seek(326)
111            self.comments.append('Sample='+File.read(60))
112            File.seek(564)
113            radius = st.unpack('<f',File.read(4))[0]
114            self.comments.append('Gonio. radius=%.2f'%(radius))
115            self.Sample['Gonio. radius'] = radius
116            File.seek(608)
117            self.comments.append('Anode='+File.read(4))
118            File.seek(616)
119            self.comments.append('Ka mean=%.5f'%(st.unpack('<d',File.read(8))[0]))
120            self.comments.append('Ka1=%.5f'%(st.unpack('<d',File.read(8))[0]))
121            self.comments.append('Ka2=%.5f'%(st.unpack('<d',File.read(8))[0]))
122            self.comments.append('Kb=%.5f'%(st.unpack('<d',File.read(8))[0]))
123            self.comments.append('Ka2/Ka1=%.5f'%(st.unpack('<d',File.read(8))[0]))
124            pos = 712
125            File.seek(pos)      #position at 1st block header
126            blockNum = kwarg.get('blocknum',0)
127            self.idstring = ospath.basename(filename) + ' Scan '+str(blockNum)
128            if blockNum <= nBlock:
129                for iBlock in range(blockNum):
130                    headLen = int(st.unpack('<i',File.read(4))[0])
131                    nSteps = int(st.unpack('<i',File.read(4))[0])
132                    if not nSteps: break
133                    if nBlock > 1:
134                        File.seek(pos+256)
135                        headLen += st.unpack('<i',File.read(4))[0]
136                    if iBlock+1 == blockNum:
137                        File.seek(pos+8)
138                        st.unpack('<d',File.read(8))[0]
139                        start2Th = st.unpack('<d',File.read(8))[0]
140                        File.seek(pos+212)
141                        temp = st.unpack('<f',File.read(4))[0]
142                        if temp > 0.:
143                            self.Sample['Temperature'] = temp                                                       
144                        File.seek(pos+176)
145                        step = st.unpack('<d',File.read(8))[0]
146                        pos += headLen      #position at start of data block
147                        File.seek(pos)                                   
148                        x = np.array([start2Th+i*step for i in range(nSteps)])
149                        y = np.array([max(1.,st.unpack('<f',File.read(4))[0]) for i in range(nSteps)])
150                        w = 1./y
151                        self.powderdata = [x,y,w,np.zeros(nSteps),np.zeros(nSteps),np.zeros(nSteps)]
152                        break
153                    pos += headLen+4*nSteps
154                    File.seek(pos)
155                if blockNum == nBlock:
156                    self.repeat = False                                   
157            File.close()
158           
159        elif 'ver. 4' in self.formatName:   #does not work - format still elusive
160            File.seek(12)   #ok
161            self.comments.append('Date='+File.read(10))
162            self.comments.append('Time='+File.read(10))
163            File.seek(144)
164            self.comments.append('Sample='+File.read(60))
165            File.seek(564)  # where is it?
166            radius = st.unpack('<f',File.read(4))[0]
167            self.comments.append('Gonio. radius=%.2f'%(radius))
168            self.Sample['Gonio. radius'] = radius
169            File.seek(516)  #ok
170            self.comments.append('Anode='+File.read(4))
171            File.seek(472)  #ok
172            self.comments.append('Ka mean=%.5f'%(st.unpack('<d',File.read(8))[0]))
173            self.comments.append('Ka1=%.5f'%(st.unpack('<d',File.read(8))[0]))
174            self.comments.append('Ka2=%.5f'%(st.unpack('<d',File.read(8))[0]))
175            self.comments.append('Kb=%.5f'%(st.unpack('<d',File.read(8))[0]))
176            self.comments.append('Ka2/Ka1=%.5f'%(st.unpack('<d',File.read(8))[0]))
177            File.seek(pos)  #deliberate fail here - pos not known from file contents
178            self.idstring = ospath.basename(filename) + ' Scan '+str(1)
179            nSteps = int(st.unpack('<i',File.read(4))[0])
180            st.unpack('<d',File.read(8))[0]
181            start2Th = st.unpack('<d',File.read(8))[0]
182            File.seek(pos+176)
183            step = st.unpack('<d',File.read(8))[0]
184            pos += headLen      #position at start of data block
185            File.seek(pos)                                   
186            x = np.array([start2Th+i*step for i in range(nSteps)])
187            y = np.array([max(1.,st.unpack('<f',File.read(4))[0]) for i in range(nSteps)])
188            w = 1./y
189            self.powderdata = [x,y,w,np.zeros(nSteps),np.zeros(nSteps),np.zeros(nSteps)]
190            File.close()
191           
192        return True
Note: See TracBrowser for help on using the repository browser.