Source code for est.io.utils.readers.spec_reader
import logging
import functools
from typing import Tuple, Optional, List
import numpy
from silx.io.spech5 import SpecFile
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]:
spec_file = SpecFile(file_path)
try:
scan = spec_file[0]
except IndexError:
return None
return scan.scan_header_dict["S"]
[docs]
def get_all_scan_titles(file_path: str) -> List[str]:
return [scan.scan_header_dict["S"] for scan in SpecFile(file_path)]
[docs]
def get_scan_column_names(file_path: str, scan_title: str) -> List[str]:
for scan in SpecFile(file_path):
if not scan_title or scan_title == scan.scan_header_dict["S"]:
return scan.labels
return list()
[docs]
@functools.lru_cache(maxsize=2) # called twice for energy and absorption
def read_spectrum(
spec_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]]:
spec_file = SpecFile(spec_file)
for scan in spec_file:
is_scan = scan_title == scan.scan_header_dict["S"]
if not is_scan:
if scan_title is None:
continue
return None, None
columns = scan.labels
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."
)
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
energy = None
mu = None
monitor = None
if has_energy:
energy = scan.data_column_by_name(label=energy_col_name)
if has_absorption:
mu = scan.data_column_by_name(label=absorption_col_name)
if has_monitor:
monitor = scan.data_column_by_name(label=monitor_col_name)
return parse_energy_mu(energy, mu, monitor, energy_unit)
return None, None