Source code for G2pwd_FP

# -*- coding: utf-8 -*-
########### SVN repository information ###################
# $Date: 2023-05-11 18:08:12 -0500 (Thu, 11 May 2023) $
# $Author: toby $
# $Revision: 5577 $
# $URL: https://subversion.xray.aps.anl.gov/pyGSAS/trunk/imports/G2pwd_FP.py $
# $Id: G2pwd_FP.py 5577 2023-05-11 23:08:12Z toby $
########### SVN repository information ###################
'''
'''

from __future__ import division, print_function
import os.path as ospath
import numpy as np
import GSASIIobj as G2obj
import GSASIIpath
GSASIIpath.SetVersionNumber("$Revision: 5577 $")
[docs] class fp_ReaderClass(G2obj.ImportPowderData): 'Routines to import powder data from a FullProf 1-10 column .dat file' def __init__(self): super(self.__class__,self).__init__( # fancy way to self-reference extensionlist=('.dat',), strictExtension=False, formatName = 'FullProf .dat', longFormatName = 'FullProf 1-10 column .dat powder data file' ) self.scriptable = True # Validate the contents -- make sure we only have valid lines
[docs] def ContentsValidator(self, filename): 'Look through the file for expected types of lines in a valid FullProf file' gotCcomment = False begin = True self.GSAS = False fp = open(filename,'r') for i,S in enumerate(fp): if i > 50: break if begin: if gotCcomment and S.find('*/') > -1: begin = False continue elif S.strip().startswith('/*'): gotCcomment = True continue elif not S.strip(): # ignore blank lines continue elif S.lstrip()[0] in ["'",'#','!',]: continue #ignore comments, if any else: begin = False # valid line to read? vals = S.split() try: #look for start,step,stop card for j,val in enumerate(vals): float(val) if j == 2: break except ValueError: self.errors = 'Unexpected information in line: '+str(i+1) if all([ord(c) < 128 and ord(c) != 0 for c in str(S)]): # show only if ASCII self.errors += ' '+str(S) else: self.errors += ' (binary)' if i > 2: fp.close() return False fp.close() return True # no errors encountered
[docs] def Reader(self,filename, ParentFrame=None, **unused): 'Read a FullProf file' x = [] y = [] w = [] gotCcomment = False begin = True steps = False Stop = False N = 0 fp = open(filename,'r') for i,S in enumerate(fp): self.errors = 'Error reading line: '+str(i+1) # Allow a block of comments delimited by /* and */ # or (GSAS style) each comment line can begin with '#' or '!' if not S.strip(): # ignore blank lines continue elif S.lstrip()[0] in ["'",'#','!',]: self.comments.append(S[:-1]) continue # store comments, if any if begin: if gotCcomment and S.find('*/') > -1: self.comments.append(S[:-1]) begin = False continue if S.strip().startswith('/*'): self.comments.append(S[:-1]) gotCcomment = True continue # look for a line with start, steps etc. in 1st 4 lines if not steps: vals = S.replace(',',' ').split(None,4) if 'lambda' in S: self.instdict['wave'] = float(vals[1]) continue elif len(vals) >= 3: try: start = float(vals[0]) step = float(vals[1]) stop = float(vals[2]) steps = True begin = False if len(vals) > 3: self.comments.append(vals[3][:-1]) except: print('Skipping line ',S) continue elif i<3: print('Skipping header line ',S) continue # should be a valid line to read vals = S.split() #data strings try: for j in range(len(vals)): x.append(start+N*step) f = float(vals[j]) if f <= 0.0: y.append(0.0) w.append(0.0) else: y.append(float(vals[j])) w.append(1.0/float(vals[j])) if x[-1] >= stop: Stop = True break N += 1 if Stop: break except ValueError: msg = 'Error parsing number in line '+str(i+1) if GSASIIpath.GetConfigValue('debug'): print (msg) print (S.strip()) break except: msg = 'Error in line '+str(i+1) if GSASIIpath.GetConfigValue('debug'): print (msg) print (S.strip()) break fp.close() N = len(x) if N <= 1: return False 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 ] self.powderentry[0] = filename #self.powderentry[1] = pos # bank offset (N/A here) #self.powderentry[2] = 1 # xye file only has one bank self.idstring = ospath.basename(filename) # scan comments for temperature Temperature = 300 for S in self.comments: if 'Temp' in S.split('=')[0]: try: Temperature = float(S.split('=')[1]) except: pass self.Sample['Temperature'] = Temperature return True