Source code for sas.sascalc.file_converter.FileConverterUtilities

# pylint: disable=C0103, I1101
"""
Module with file loader specific static utilities.
"""
import os
import numpy as np

from sas.sascalc.dataloader.data_info import Data1D
from sas.sascalc.file_converter.nxcansas_writer import NXcanSASWriter
from sas.sascalc.file_converter.bsl_loader import BSLLoader
from sas.sascalc.file_converter.otoko_loader import OTOKOLoader
from sas.sascalc.file_converter.cansas_writer import CansasWriter

[docs]def extract_ascii_data(filename): """ Extracts data from a single-column ASCII file :param filename: The file to load data from :return: A numpy array containing the extracted data """ try: data = np.loadtxt(filename, dtype=str) except: # Check if file is a BSL or OTOKO header file f = open(filename, 'r') f.readline() f.readline() bsl_metadata = f.readline().strip().split() f.close() if len(bsl_metadata) == 10: msg = ("Error parsing ASII data. {} looks like a BSL or OTOKO " "header file.") raise IOError(msg.format(os.path.split(filename)[-1])) if len(data.shape) != 1: msg = "Error reading {}: Only one column of data is allowed" raise IOError(msg.format(filename.split('\\')[-1])) is_float = True try: float(data[0]) except: is_float = False if not is_float: end_char = data[0][-1] # If lines end with comma or semi-colon, trim the last character if end_char in (',', ';'): data = [s[0:-1] for s in data] else: msg = ("Error reading {}: Lines must end with a digit, comma " "or semi-colon").format(filename.split('\\')[-1]) raise IOError(msg) return np.array(data, dtype=np.float32)
[docs]def extract_otoko_data(qfile, ifile): """ Extracts data from a 1D OTOKO file :param filename: The OTOKO file to load the data from :return: A numpy array containing the extracted data """ loader = OTOKOLoader(qfile, ifile) otoko_data = loader.load_otoko_data() qdata = otoko_data.q_axis.data iqdata = otoko_data.data_axis.data if len(qdata) > 1: msg = ("Q-Axis file has multiple frames. Only 1 frame is " "allowed for the Q-Axis") raise IOError(msg) qdata = qdata[0] return qdata, iqdata
[docs]def convert_2d_data(dataset, output, metadata): """ Wrapper for the NX SAS writer call Sets external metadata on the dataset first. """ for key, value in metadata.items(): setattr(dataset[0], key, value) w = NXcanSASWriter() w.write(dataset, output)
[docs]def convert_to_cansas(frame_data, filepath, run_name, single_file): """ Saves an array of Data1D objects to a single CanSAS file with multiple <SasData> elements, or to multiple CanSAS files, each with one <SasData> element. :param frame_data: If single_file is true, an array of Data1D objects. If single_file is false, a dictionary of the form *{frame_number: Data1D}*. :param filepath: Where to save the CanSAS file :param single_file: If true, array is saved as a single file, if false, each item in the array is saved to it's own file """ writer = CansasWriter() entry_attrs = None if run_name != '': entry_attrs = {'name': run_name} if single_file: writer.write(filepath, frame_data, sasentry_attrs=entry_attrs) else: # Folder and base filename [group_path, group_name] = os.path.split(filepath) ext = "." + group_name.split('.')[-1] # File extension for frame_number, frame_d in frame_data.items(): # Append frame number to base filename filename = group_name.replace(ext, str(frame_number)+ext) destination = os.path.join(group_path, filename) writer.write(destination, [frame_d], sasentry_attrs=entry_attrs)
[docs]def toFloat(text): """ Dumb string->float converter """ value = None try: value = float(text) if text != "" else None except ValueError: pass return value