source: trunk/imports/G2pwd_BrukerRAW.py @ 2550

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

fix binary import for Bruker raw files
fix issues for new atoms in mag structures

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