Source code for sasktran2.mie.refractive

from __future__ import annotations

from collections.abc import Callable
from pathlib import Path

import numpy as np
import pandas as pd
from scipy import interpolate

from sasktran2.database.web import StandardDatabase


[docs] class RefractiveIndex:
[docs] def __init__( self, refractive_index_fn: Callable[[float], complex], identifier: str ) -> None: """ A generic implementation of a refractive index function. This class is a light wrapper on top of a callable function that returns the complex refractive index for a given wavelength, as well as providing a unique identifier for the refractive index. Parameters ---------- refractive_index_fn : Callable[[float], complex] Function that takes in a wavelength in nm and returns the complex refractive index identifier : str A unique identifier for the refractive index """ self._fn = refractive_index_fn self._identifier = identifier
[docs] def refractive_index(self, wavelength_nm: np.ndarray) -> np.ndarray: """ Returns the complex refractive index for a given wavelength Parameters ---------- wavelength_nm : np.ndarray Returns ------- np.ndarray """ return self._fn(wavelength_nm)
@property def refractive_index_fn(self): """ Get the function that returns the complex refractive index """ return self._fn @property def identifier(self): """ Get the unique identifier for this refractive index """ return self._identifier
def _from_osiris_file(path: Path): """ Reads in data from the old OSIRIS refractive index files and returns a callable function """ data = pd.read_csv(path.as_posix(), header=None) return interpolate.interp1d( data.values[:, 0], data.values[:, 1] - 1j * data.values[:, 2] )
[docs] class H2SO4(RefractiveIndex):
[docs] def __init__(self, source: str = "osiris") -> None: """ A refractive index for H2SO4. The default source is the old OSIRIS data. """ if source.lower() == "osiris": super().__init__( _from_osiris_file( StandardDatabase().path("refractive_index/refrac_h2so4_osiris.txt") ), "H2SO4_osiris", ) else: msg = "Only osiris source is supported for H2SO4 refractive index data" raise ValueError(msg)
[docs] class Dust(RefractiveIndex):
[docs] def __init__(self, source: str = "osiris") -> None: """ A refractive index for Dust. The default source is the old OSIRIS data. """ if source.lower() == "osiris": super().__init__( _from_osiris_file( StandardDatabase().path("refractive_index/refrac_dust_osiris.txt") ), "dust_osiris", ) else: msg = "Only osiris source is supported for dust refractive index data" raise ValueError(msg)
[docs] class Ice(RefractiveIndex):
[docs] def __init__(self, source: str = "osiris") -> None: """ A refractive index for ice. The default source is the old OSIRIS data. """ if source.lower() == "osiris": super().__init__( _from_osiris_file( StandardDatabase().path("refractive_index/refrac_ice_osiris.txt") ), "ice_osiris", ) else: msg = "Only osiris source is supported for ice refractive index data" raise ValueError(msg)
[docs] class Water(RefractiveIndex):
[docs] def __init__(self, source: str = "osiris") -> None: """ A refractive index for Water. The default source is the old OSIRIS data. """ if source.lower() == "osiris": super().__init__( _from_osiris_file( StandardDatabase().path("refractive_index/refrac_water_osiris.txt") ), "water_osiris", ) else: msg = "Only osiris source is supported for water refractive index data" raise ValueError(msg)