Source code for G2pwd_Panalytical

# -*- coding: utf-8 -*-
########### SVN repository information ###################
# $Date: 2020-03-03 15:01:43 -0600 (Tue, 03 Mar 2020) $
# $Author: toby $
# $Revision: 4339 $
# $URL: https://subversion.xray.aps.anl.gov/pyGSAS/trunk/imports/G2pwd_Panalytical.py $
# $Id: G2pwd_Panalytical.py 4339 2020-03-03 21:01:43Z toby $
########### SVN repository information ###################

from __future__ import division, print_function
import os.path as ospath
import xml.etree.ElementTree as ET
import numpy as np
import GSASIIobj as G2obj
import GSASIIpath
GSASIIpath.SetVersionNumber("$Revision: 4339 $")
[docs] class Panalytical_ReaderClass(G2obj.ImportPowderData): '''Routines to import powder data from a Pananalytical.xrdm (xml) file. ''' def __init__(self): super(self.__class__,self).__init__( # fancy way to self-reference extensionlist=('.xrdml','.xml'), strictExtension=True, formatName = 'Panalytical xrdml (xml)', longFormatName = 'Panalytical powder data as *.xrdml' ) self.scriptable = True self.vals = None self.stepsize = None self.skip = 0 self.root = None # Validate the contents -- make sure we only have valid lines and set # values we will need for later read.
[docs] def ContentsValidator(self, filename): fp = open(filename,'r') self.vals = None self.stepsize = None fp.seek(0) try: self.root = ET.parse(fp).getroot() tag = self.root.tag tag = tag.split('}')[0]+'}' self.root.find(tag+'comment') except: self.errors = 'Bad xml file' fp.close() return False fp.close() return True
[docs] def Reader(self,filename, ParentFrame=None, **kwarg): 'Read a Panalytical .xrdml (.xml) file; already in self.root' blockNum = kwarg.get('blocknum',0) self.idstring = ospath.basename(filename) + ' Scan '+str(blockNum) x = [] y = [] w = [] tag = self.root.tag tag = tag.split('}')[0]+'}' sample = self.root.find(tag+'sample') self.idstring = ospath.basename(filename) + ' Scan '+str(blockNum) blks = self.root.findall(tag+'xrdMeasurement') scans = [] for data in blks: scans += data.findall(tag+'scan') data = self.root.find(tag+'xrdMeasurement') wave = data.find(tag+'usedWavelength') incident = data.find(tag+'incidentBeamPath') radius = float(incident.find(tag+'radius').text) tube = incident.find(tag+'xRayTube') if len(scans) > 1: self.repeat = True if blockNum-1 == len(scans): self.repeat = False return False scan = scans[blockNum-1] header = scan.find(tag+'header') dataPoints = scan.find(tag+'dataPoints') self.comments.append('Gonio. radius=%.2f'%(radius)) self.Sample['Gonio. radius'] = radius if sample.find(tag+'id').text: self.comments.append('Sample name='+sample.find(tag+'id').text) try: self.comments.append('Date/TimeStart='+header.find(tag+'startTimeStamp').text) self.comments.append('Date/TimeEnd='+header.find(tag+'endTimeStamp').text) self.comments.append('xray tube='+tube.attrib['name']) except AttributeError: pass self.comments.append('Ka1=%s'%(wave.find(tag+'kAlpha1').text)) self.comments.append('Ka2=%s'%(wave.find(tag+'kAlpha2').text)) self.comments.append('Ka2/Ka1=%s'%(wave.find(tag+'ratioKAlpha2KAlpha1').text)) self.comments.append('Kb=%s'%(wave.find(tag+'kBeta').text)) self.comments.append('Voltage='+tube.find(tag+'tension').text) self.comments.append('Current='+tube.find(tag+'current').text) limits = dataPoints.find(tag+'positions') startPos = float(limits.find(tag+'startPosition').text) endPos= float(limits.find(tag+'endPosition').text) for seclbl in 'intensities','counts': sec = dataPoints.find(tag+seclbl) if sec is None: continue y = np.fromstring(sec.text,sep=' ') break else: print('Panalytical read error: Intensities could not be located') return False N = y.shape[0] x = np.linspace(startPos,endPos,N) w = np.where(y>0,1./y,1.) self.powderdata = [ np.array(x), # x-axis values np.array(y), # powder pattern intensities np.array(w), # 1/sig(intensity)^2 values (weights) np.zeros(N), # calc. intensities (zero) np.zeros(N), # calc. background (zero) np.zeros(N), # obs-calc profiles ] conditions = scan.find(tag+'nonAmbientPoints') if conditions is not None: kind = conditions.attrib['type'] if kind == 'Temperature': Temperature = float(conditions.find(tag+'nonAmbientValues').text.split()[-1]) self.Sample['Temperature'] = Temperature return True