Files
fit/gen/fitlor.py
2022-08-19 15:22:33 +02:00

119 lines
3.2 KiB
Python
Executable File

#!/usr/bin/python
# above line tells us which program to handle this script
#
# M.Zolliker June 2081
#
usage='''
Usage:
> fitlor -fit <output-file> <input-file>
fit is called first, you should treat your peaks:
fit> data 5182 get data file 5182
fit> data [34] get peak number 34 from above datafile
fit> fun 0 as an example: select one gaussian
fit> fit you might play with parameters and reapeat
fit> k saving the data on the intermediate <input-file>
k means: keep data of this peak, might also be used
in the plot window
fit> exit exit and run the conversion program
when starting fit from fitlor, the commands 'open' and 'k' are used to
configure the outputfile for the needs of single crystal analysis
> fitlor <output-file> <input-file>
do the conversion of already existing input files
if file names are omitted, default values are used
'''
import sys
from math import sin, cos, radians
from subprocess import call
from collections import Mapping
from tempfile import NamedTemporaryFile
# each entry is contained witinh curly brackets {} and
# contains the variable name and the format separated by ':'
# <n>d n characters wide integer
# <n>.<m>d n characterws wide fixed point with m decimal digits
output_format = '{n:6d}{h:4d}{k:4d}{l:4d}'\
'{i1:10.2f}{sigi1:10.2f}'\
'{th1:8.2f}{p1:8.2f}{chi:8.2f}{phi:8.2f}'
# treating the arguments
if len(sys.argv) > 1 and sys.argv[1] == '-fit':
call_fit = True
sys.argv.pop(1)
else:
call_fit = False
if len(sys.argv) > 1:
outfile = sys.argv[1]
sys.argv.pop(0)
else:
outfile = 'fitlor_out.txt'
print('output-file: %s' % outfile)
if len(sys.argv) > 1:
datafile = sys.argv[1]
sys.argv.pop(1)
else:
datafile = 'fitlor_data.txt'
print('input-file: %s' % datafile)
if call_fit:
with NamedTemporaryFile('w') as cmdfil:
cmdfil.write('k h,k,l,i1,p1,intexp,two_theta,chi,phi\n')
cmdfil.write('open %s\n' % datafile)
cmdfil.flush()
call(('fit', '-F', cmdfil.name))
tilt_geometry = False
lorentz_correction = True
class Row(object):
def __init__(self, keys, values, fmt):
if keys is None:
raise ValueError('no keys')
for k,v in zip(keys, values):
v = float(v)
if v == int(v):
v = int(v)
setattr(self, k.lower(), v)
self.fmt = fmt
def write(self, fil):
fil.write(self.fmt.format(**self.__dict__) + '\n')
keys = None
rows = []
try:
with open(datafile) as inp:
for line in inp:
values = line.split()
try:
row = Row(keys, values, output_format)
except ValueError:
keys = values
continue
rows.append(row)
row.n = len(rows)
row.th1=row.two_theta * 0.2
if lorentz_correction:
lor_cor = sin(abs(radians(row.two_theta)))
if tilt_geometry:
lor_cor *= cos(radians(row.chi))
row.intcor = row.i1 * lor_cor
row.sigcor = row.sigi1 * lor_cor
except IOError:
print(usage)
with open(outfile, 'w') as out:
for row in rows:
row.write(out)