Source code for est.io.utils.readers.ascii_reader
import logging
import functools
from typing import Tuple, List, Optional
import numpy
from est.units import ur
from .parse import parse_energy_mu
_logger = logging.getLogger(__name__)
[docs]
def get_first_scan_title(file_path: str) -> Optional[str]:
return None
[docs]
def get_all_scan_titles(file_path: str) -> List[str]:
return list()
[docs]
def get_scan_column_names(file_path: str, scan_title: str) -> List[str]:
columns, _, _ = _ascii_header(file_path)
return columns
def _ascii_header(ascii_file: str) -> Tuple[List[str], str, int]:
firstline = ""
skiprows = 0
with open(ascii_file, "r") as csvfile:
while not firstline or firstline.startswith("#"):
firstline = csvfile.readline().strip()
skiprows += 1
for delimiter in [",", ";", " "]:
columns = firstline.split(delimiter)
if len(columns) > 1:
break
try:
float(columns[0])
except ValueError:
columns = [s.strip() for s in columns]
return columns, delimiter, skiprows
skiprows -= 1
columns = [f"Column {i+1}" for i in range(len(columns))]
return columns, delimiter, skiprows
[docs]
@functools.lru_cache(maxsize=2) # called twice for energy and absorption
def read_spectrum(
ascii_file,
energy_col_name=None,
absorption_col_name=None,
monitor_col_name=None,
energy_unit=ur.eV,
scan_title=None,
) -> Tuple[Optional[numpy.ndarray], Optional[numpy.ndarray]]:
columns, delimiter, skiprows = _ascii_header(ascii_file)
if not columns:
return None, None
if energy_col_name is None:
_logger.warning(
"Spec energy column name not provided. Select the first column."
)
energy_col_name = columns[0]
if absorption_col_name is None:
_logger.warning(
"Spec absorption column name not provided. Select the second column."
)
if len(columns) > 1:
absorption_col_name = columns[1]
has_energy = energy_col_name in columns
has_absorption = absorption_col_name in columns
if not has_energy and not has_absorption:
return None, None
has_monitor = monitor_col_name in columns
usecols = list()
names = list()
if has_energy:
usecols.append(columns.index(energy_col_name))
names.append("energy")
if has_absorption:
usecols.append(columns.index(absorption_col_name))
names.append("mu")
if has_monitor:
usecols.append(columns.index(monitor_col_name))
names.append("monitor")
data = numpy.loadtxt(
ascii_file, delimiter=delimiter, skiprows=skiprows, usecols=usecols
)
data = dict(zip(names, data.T))
energy = data.get("energy")
mu = data.get("mu")
monitor = data.get("monitor")
return parse_energy_mu(energy, mu, monitor, energy_unit)