source: trunk/imports/G2rfd_Panalytical.py @ 4142

Last change on this file since 4142 was 4142, checked in by vondreele, 3 years ago

fix panalytical reflectometry mporter - now converts 2theta to q
some fixes to reflectometry stuff

File size: 5.3 KB
Line 
1# -*- coding: utf-8 -*-
2########### SVN repository information ###################
3# $Date: $
4# $Author: von dreele $
5# $Revision: $
6# $URL: $
7# $Id: $
8########### SVN repository information ###################
9
10from __future__ import division, print_function
11import os.path as ospath
12import xml.etree.ElementTree as ET
13import numpy as np
14import GSASIIobj as G2obj
15import GSASIIpath
16sind = lambda x: np.sin(x*np.pi/180.)
17GSASIIpath.SetVersionNumber("$Revision: $")
18class Panalytical_ReaderClass(G2obj.ImportReflectometryData):
19    '''Routines to import reflectivity data from a Pananalytical.xrdm (xml) file.
20   
21    '''
22    def __init__(self):
23        super(self.__class__,self).__init__( # fancy way to self-reference
24            extensionlist=('.xrdml','.xml'),
25            strictExtension=True,
26            formatName = 'Panalytical xrdml (xml)',
27            longFormatName = 'Panalytical reflectivity data as *.xrdml'
28            )
29        self.scriptable = True
30        self.vals = None
31        self.stepsize = None
32        self.skip = 0
33        self.root = None
34
35    # Validate the contents -- make sure we only have valid lines and set
36    # values we will need for later read.
37    def ContentsValidator(self, filename):
38        fp = open(filename,'r')
39        self.vals = None
40        self.stepsize = None
41        fp.seek(0)
42        try:
43            self.root = ET.parse(fp).getroot()
44            tag = self.root.tag
45            tag = tag.split('}')[0]+'}'
46            self.root.find(tag+'comment')
47        except:
48            self.errors = 'Bad xml file'
49            fp.close()
50            return False
51        fp.close()
52        return True
53           
54    def Reader(self,filename, ParentFrame=None, **kwarg):
55        'Read a Panalytical .xrdml (.xml) file; already in self.root'
56        blockNum = kwarg.get('blocknum',0)
57        self.idstring = ospath.basename(filename) + ' Scan '+str(blockNum)
58        x = []
59        y = []
60        w = []
61        tag = self.root.tag
62        tag = tag.split('}')[0]+'}'
63        sample = self.root.find(tag+'sample')
64        self.idstring = ospath.basename(filename) + ' Scan '+str(blockNum)
65        blks = self.root.findall(tag+'xrdMeasurement')
66        scans = []
67        for data in blks:
68            scans += data.findall(tag+'scan')
69        data = self.root.find(tag+'xrdMeasurement')       
70        wave = data.find(tag+'usedWavelength')
71        incident = data.find(tag+'incidentBeamPath')
72        radius = float(incident.find(tag+'radius').text)
73        tube = incident.find(tag+'xRayTube')
74        if len(scans) > 1:
75            self.repeat = True
76        if blockNum-1 == len(scans):
77            self.repeat = False
78            return False
79        scan = scans[blockNum-1]
80        header = scan.find(tag+'header')
81        dataPoints = scan.find(tag+'dataPoints')
82        self.comments.append('Gonio. radius=%.2f'%(radius))
83        self.Sample['Gonio. radius'] = radius
84        if sample.find(tag+'id').text:
85            self.comments.append('Sample name='+sample.find(tag+'id').text)
86        try:
87            self.comments.append('Date/TimeStart='+header.find(tag+'startTimeStamp').text)
88            self.comments.append('Date/TimeEnd='+header.find(tag+'endTimeStamp').text)
89            self.comments.append('xray tube='+tube.attrib['name'])
90        except AttributeError:
91            pass
92        self.comments.append('Ka1=%s'%(wave.find(tag+'kAlpha1').text))
93        self.comments.append('Ka2=%s'%(wave.find(tag+'kAlpha2').text))
94        self.comments.append('Ka2/Ka1=%s'%(wave.find(tag+'ratioKAlpha2KAlpha1').text))
95        self.comments.append('Kb=%s'%(wave.find(tag+'kBeta').text))
96        self.comments.append('Voltage='+tube.find(tag+'tension').text)
97        self.comments.append('Current='+tube.find(tag+'current').text)
98        limits = dataPoints.find(tag+'positions')
99        startPos = float(limits.find(tag+'startPosition').text)
100        endPos= float(limits.find(tag+'endPosition').text)
101        for seclbl in 'intensities','counts':
102            sec = dataPoints.find(tag+seclbl)
103            if sec is None: continue
104            y = np.fromstring(sec.text,sep=' ')
105            break
106        else:
107            print('Panalytical read error: Intensities could not be located')
108            return False           
109        self.instdict['wave'] = float(wave.find(tag+'kAlpha1').text)
110        self.instdict['type'] = 'RXC'
111        self.reflectometryentry[0] = filename
112        self.reflectometryentry[2] = blockNum
113        N = y.shape[0]
114        x = np.linspace(startPos,endPos,N)
115        x = 4.*np.pi*sind(x/2.)/self.instdict['wave']
116        w = np.where(y>0,1./y,1.)
117        self.reflectometrydata = [
118            np.array(x), # x-axis values
119            np.array(y), # powder pattern intensities
120            np.array(w), # 1/sig(intensity)^2 values (weights)
121            np.zeros(N), # calc. intensities (zero)
122            np.zeros(N), # calc. background (zero)
123            np.zeros(N), # obs-calc profiles
124            ]
125        conditions = scan.find(tag+'nonAmbientPoints')
126        if conditions is not None:
127            kind = conditions.attrib['type']
128            if kind == 'Temperature':
129                Temperature = float(conditions.find(tag+'nonAmbientValues').text.split()[-1])
130                self.Sample['Temperature'] = Temperature
131        return True
Note: See TracBrowser for help on using the repository browser.