source: trunk/imports/G2pwd_BrukerRAW.py @ 2238

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

remove commented block from GSASII.py
add Bruker RAW file importer for powder data

File size: 7.4 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_xye: Topas .xye data*
11------------------------------------
12
13Routine to read in powder data from a Topas-compatible .xye 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        else:
46            self.errors = 'Unexpected information in header: '+str(head)
47            self.errors += '  '+str(head)
48            return False
49        return True
50           
51    def Reader(self,filename,filepointer, ParentFrame=None, **kwarg):
52        'Read a Bruker RAW file'
53        self.comments = []
54        self.repeat = True
55        File = open(filename,'rb')
56        if 'ver. 1' in self.formatName:
57            raise Exception    #for now
58        elif 'ver. 2' in self.formatName:
59            try:
60                File.seek(4)
61                nBlock = int(st.unpack('<i',File.read(4))[0])
62                File.seek(168)
63                self.comments.append('Date/Time='+File.read(20))
64                self.comments.append('Anode='+File.read(2))
65                self.comments.append('Ka1=%.5f'%(st.unpack('<f',File.read(4))[0]))
66                self.comments.append('Ka2=%.5f'%(st.unpack('<f',File.read(4))[0]))
67                self.comments.append('Ka2/Ka1=%.5f'%(st.unpack('<f',File.read(4))[0]))
68                File.seek(206)
69                self.comments.append('Kb=%.5f'%(st.unpack('<f',File.read(4))[0]))
70                pos = 256
71                File.seek(pos)
72                blockNum = kwarg.get('blocknum',0)
73                self.idstring = ospath.basename(filename) + ' Scan '+str(blockNum)
74                if blockNum <= nBlock:
75                    for iBlock in range(blockNum):
76                        headLen = int(st.unpack('<H',File.read(2))[0])
77                        nSteps = int(st.unpack('<H',File.read(2))[0])
78                        if iBlock+1 == blockNum:
79                            File.seek(pos+12)
80                            step = st.unpack('<f',File.read(4))[0]
81                            start2Th = st.unpack('<f',File.read(4))[0]
82                            pos += headLen      #position at start of data block
83                            File.seek(pos)                                   
84                            x = np.array([start2Th+i*step for i in range(nSteps)])
85                            y = np.array([max(1.,st.unpack('<f',File.read(4))[0]) for i in range(nSteps)])
86                            w = 1./y
87                            self.powderdata = [x,y,w,np.zeros(nSteps),np.zeros(nSteps),np.zeros(nSteps)]
88                            break
89                        pos += headLen+4*nSteps
90                        File.seek(pos)
91                    if blockNum == nBlock:
92                        self.repeat = False                                   
93                File.close()
94            except Exception as detail:
95                self.errors += '\n  '+str(detail)
96                print self.formatName+' read error:'+str(detail) # for testing
97                import traceback
98                traceback.print_exc(file=sys.stdout)
99                return False
100               
101               
102        elif 'ver. 3' in self.formatName:
103            try:
104                File.seek(12)
105                nBlock = int(st.unpack('<i',File.read(4))[0])
106                self.comments.append('Date='+File.read(10))
107                self.comments.append('Time='+File.read(10))
108                File.seek(326)
109                self.comments.append('Sample='+File.read(60))
110                File.seek(564)
111                radius = st.unpack('<f',File.read(4))[0]
112                self.comments.append('Gonio. radius=%.2f'%(radius))
113                self.Sample['Gonio. radius'] = radius
114                File.seek(608)
115                self.comments.append('Anode='+File.read(4))
116                File.seek(616)
117                self.comments.append('Ka mean=%.5f'%(st.unpack('<d',File.read(8))[0]))
118                self.comments.append('Ka1=%.5f'%(st.unpack('<d',File.read(8))[0]))
119                self.comments.append('Ka2=%.5f'%(st.unpack('<d',File.read(8))[0]))
120                self.comments.append('Kb=%.5f'%(st.unpack('<d',File.read(8))[0]))
121                self.comments.append('Ka2/Ka1=%.5f'%(st.unpack('<d',File.read(8))[0]))
122                pos = 712
123                File.seek(pos)      #position at 1st block header
124                blockNum = kwarg.get('blocknum',0)
125                self.idstring = ospath.basename(filename) + ' Scan '+str(blockNum)
126                if blockNum <= nBlock:
127                    for iBlock in range(blockNum):
128                        headLen = int(st.unpack('<i',File.read(4))[0])
129                        nSteps = int(st.unpack('<i',File.read(4))[0])
130                        if iBlock+1 == blockNum:
131                            t = st.unpack('<d',File.read(8))[0]
132                            start2Th = st.unpack('<d',File.read(8))[0]
133                            File.seek(pos+176)
134                            step = st.unpack('<d',File.read(8))[0]
135                            pos += headLen      #position at start of data block
136                            File.seek(pos)                                   
137                            x = np.array([start2Th+i*step for i in range(nSteps)])
138                            y = np.array([max(1.,st.unpack('<f',File.read(4))[0]) for i in range(nSteps)])
139                            w = 1./y
140                            self.powderdata = [x,y,w,np.zeros(nSteps),np.zeros(nSteps),np.zeros(nSteps)]
141                            break
142                        pos += headLen+4*nSteps
143                        File.seek(pos)
144                    if blockNum == nBlock:
145                        self.repeat = False                                   
146                File.close()
147            except Exception as detail:
148                self.errors += '\n  '+str(detail)
149                print self.formatName+' read error:'+str(detail) # for testing
150                import traceback
151                traceback.print_exc(file=sys.stdout)
152                return False
153           
154        return True
Note: See TracBrowser for help on using the repository browser.