use crate::error::{NsbError, Result};
use crate::units::length::Nanometer;
use crate::units::SolarSpectralIrradianceUnit;
use siderust::optica::data::Provenance;
use siderust::optica::grid::OutOfRange;
use siderust::optica::spectrum::{loaders::ascii::two_column, Interpolation, SampledSpectrum};
const RAW: &str = include_str!("../../data/solar_spectrum.dat");
pub(crate) type SolarSpectrum = SampledSpectrum<Nanometer, SolarSpectralIrradianceUnit>;
pub(crate) fn load() -> Result<SolarSpectrum> {
two_column::<Nanometer, SolarSpectralIrradianceUnit>(
RAW,
1.0,
1.0,
Interpolation::Linear,
OutOfRange::ClampToEndpoints,
Some(Provenance::bundled_file("NSB/data/solar_spectrum.dat")),
)
.map_err(|e| NsbError::DataParse {
file: "solar_spectrum.dat",
message: e.to_string(),
})
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn solar_spectrum_loader_loads_nonempty() {
let s = load().expect("load solar reference spectrum");
assert!(!s.is_empty());
assert!(s.xs_raw()[0] > 0.0);
}
#[test]
fn solar_spectrum_checksum_matches() {
use siderust::checksum::{sha256, to_hex};
assert_eq!(
to_hex(&sha256(RAW.as_bytes())),
"1cc24671052b7623752eb41dd99a84520393b2845442b8bbde217610fe5ed949",
);
}
}