Source code for elli.spectraray

"""A helper class to load data from SpectraRay ASCII Files
"""
import pandas as pd
import scipy.constants as sc
from .dispersions.dispersions import TableEpsilon
from .utils import calc_rho


[docs]class SpectraRay: def __init__(self, path: str) -> None: self.spectraray_path = path
[docs] def loadDispersionTable(self, fname: str) -> TableEpsilon: start = 0 stop = 0 with open(self.spectraray_path + fname, "r", encoding="utf8") as file: line = file.readline() cnt = 0 while line: if line.strip() == "Begin of array": start = cnt + 1 if line.strip() == "End of array": stop = cnt line = file.readline() cnt += 1 if line.startswith("Units="): x_unit = line.split("=")[1].split(",")[0] df = pd.read_csv( self.spectraray_path + fname, delim_whitespace=True, skiprows=start, nrows=stop - start, index_col=0, usecols=[0, 1, 2], names=[x_unit, "ϵ1", "ϵ2"], ) if x_unit == "Wavelength": return TableEpsilon( lbda=df.index, epsilon=df.loc[:, "ϵ1"] + 1j * df.iloc[:, "ϵ2"] ) return TableEpsilon( lbda=SpectraRay.eV2nm(df.index), epsilon=df.loc[:, "ϵ1"] + 1j * df.loc[:, "ϵ2"], )
[docs] @staticmethod def read_psi_delta_file(fname: str, decimal: str = ".") -> pd.DataFrame: psi_delta = pd.read_csv( fname, index_col=0, sep=r"\s+", decimal=decimal, usecols=[0, 1, 2], names=["Wavelength", "Ψ", "Δ"], skiprows=1, ) psi_delta.loc[:, "Δ"] = psi_delta.loc[:, "Δ"].where( psi_delta.loc[:, "Δ"] <= 180, psi_delta.loc[:, "Δ"] - 360 ) return psi_delta
[docs] @staticmethod def read_mmatrix(fname: str, decimal: str = ".") -> pd.DataFrame: """Read a Mueller matrix from a Sentech ASCII file. Save the file in SpectraRay under Save As -> Ascii (.txt)""" mueller_matrix = pd.read_csv( fname, sep=r"\s+", decimal=decimal, index_col=0 ).iloc[:, -17:-1] mueller_matrix.index.name = "Wavelength" mueller_matrix.columns = [ "M11", "M12", "M13", "M14", "M21", "M22", "M23", "M24", "M31", "M32", "M33", "M34", "M41", "M42", "M43", "M44", ] return mueller_matrix
[docs] @staticmethod def read_rho(fname: str, decimal: str = ".") -> pd.DataFrame: psi_delta = SpectraRay.read_psi_delta_file(fname, decimal) return calc_rho(psi_delta)
[docs] @staticmethod def eV2nm(wlen): return sc.value("Planck constant in eV s") * sc.c * 1e9 / wlen