Extract data from .brml heatscans and save as .xy

This commit is contained in:
rasmusvt 2022-06-13 13:50:24 +02:00
parent a7f6abe0b9
commit ebc77c1b9e

View file

@ -4,6 +4,7 @@ import pandas as pd
import numpy as np import numpy as np
import os import os
import shutil import shutil
import sys
import zipfile import zipfile
import xml.etree.ElementTree as ET import xml.etree.ElementTree as ET
@ -317,6 +318,117 @@ def read_brml(data, options={}, index=0):
return diffractogram, wavelength return diffractogram, wavelength
def read_htxrd(data, options={}, index=0):
required_options = ['extract_folder', 'save_folder', 'save_filename']
default_options = {
'extract_folder': 'tmp',
'save_folder': None,
'save_filename': None
}
options = aux.update_options(options=options, required_options=required_options, default_options=default_options)
# Extract the RawData0.xml file from the brml-file
with zipfile.ZipFile(data['path'][index], 'r') as brml:
for info in brml.infolist():
if "RawData" in info.filename:
brml.extract(info.filename, options['extract_folder'])
# Get all filenames
files = os.listdir(os.path.join(options['extract_folder'], 'Experiment0'))
# initalise empty list to store all DataFrames
diffractograms = []
wavelengths = []
# Loop through all RawData-files and extract all data and temperatures
for i, file in enumerate(files):
# Create all filenames as strings
filename = os.path.join('tmp/Experiment0/', f'RawData{i}.xml')
# Parse the .xml-files
tree = ET.parse(filename)
root = tree.getroot()
# initalise empty list to store data from this particular scan
diffractogram = []
for chain in root.findall('./DataRoutes/DataRoute'):
scantypes = chain.findall('ScanInformation')
for scantype in scantypes:
if scantype.get('VisibleName') == 'Still (TCU1000N)':
continue
else:
if chain.get('RouteFlag') == 'Final':
for scandata in chain.findall('Datum'):
scandata = scandata.text.split(',')
twotheta, intensity, temperature = float(scandata[2]), float(scandata[3]), float(scandata[5])
diffractogram.append({'2th': twotheta, 'I': intensity, 'T': temperature})
diffractogram = pd.DataFrame(diffractogram)
diffractograms.append(diffractogram)
if not data['wavelength'][index]:
for chain in root.findall('./FixedInformation/Instrument/PrimaryTracks/TrackInfoData/MountedOptics/InfoData/Tube/WaveLengthAlpha1'):
wavelength = float(chain.attrib['Value'])
else:
wavelength = data['wavelength'][index]
wavelengths.append(wavelength)
if options['save_folder']:
for i, (diffractogram, wavelength) in enumerate(zip(diffractograms, wavelengths)):
if not options['save_filename']:
filename = os.path.basename(data['path'][index]).split('.')[0] + '_' + str(i).zfill(4) +'.xy'
else:
filename = options['save_filename'] + '_' + str(i).zfill(4) +'.xy'
if not os.path.isdir(options['save_folder']):
os.makedirs(options['save_folder'])
save_htxrd_as_xy(diffractogram, wavelength, filename, options['save_folder'])
shutil.rmtree(options['extract_folder'])
return diffractograms, wavelengths
def save_htxrd_as_xy(diffractogram, wavelength, filename, save_path):
headers = '\n'.join(
[line for line in
[f'# Temperature {np.round(diffractogram["T"].mean())}',
f'# Wavelength {wavelength}',
]
]
)
diffractogram = diffractogram.drop('T', axis=1)
with open(os.path.join(save_path, filename), 'w') as f:
for line in headers:
f.write(line)
f.write('\n')
diffractogram.to_csv(f, index=False, sep='\t')
def read_xy(data, options={}, index=0): def read_xy(data, options={}, index=0):
#if 'wavelength' not in data.keys(): #if 'wavelength' not in data.keys():