use crate::xafsft::{Window, xftf};
use crate::xasproc::{AutobkParams, PreEdgeParams, autobk, autobk_delta_chi, pre_edge};
use crate::xasdata::group::XasGroup;
pub fn normalize(group: &mut XasGroup, params: &PreEdgeParams) {
let out = pre_edge(&group.energy, &group.mu, params);
group.e0 = Some(out.e0);
group.edge_step = Some(out.edge_step);
group.pre_edge = Some(out.pre_edge);
group.post_edge = Some(out.post_edge);
group.norm = Some(out.norm);
group.flat = Some(out.flat);
group.dmude = Some(out.dmude);
}
pub fn autobk_group(group: &mut XasGroup, params: &AutobkParams, err_sigma: f64) {
let mut p = params.clone();
if p.ek0.is_none() {
p.ek0 = group.e0;
}
if p.edge_step.is_none() {
p.edge_step = group.edge_step;
}
let out = autobk(&group.energy, &group.mu, &p);
if err_sigma > 0.0 {
if let Some(delta) = autobk_delta_chi(&out, err_sigma) {
group.delta_bkg = Some(delta.delta_bkg);
group.delta_chi = Some(delta.delta_chi);
}
} else {
group.delta_bkg = None;
group.delta_chi = None;
}
group.e0 = Some(out.ek0);
group.edge_step = Some(out.edge_step);
group.bkg = Some(out.bkg);
group.k = Some(out.k);
group.chi = Some(out.chi);
}
#[derive(Clone, Debug)]
pub struct FtParams {
pub kmin: f64,
pub kmax: f64,
pub kweight: i32,
pub dk: f64,
pub window: Window,
pub rmax_out: f64,
pub nfft: usize,
pub kstep: f64,
}
impl Default for FtParams {
fn default() -> Self {
Self {
kmin: 2.0,
kmax: 12.0,
kweight: 2,
dk: 1.0,
window: Window::Hanning,
rmax_out: 10.0,
nfft: 2048,
kstep: 0.05,
}
}
}
pub fn xftf_group(group: &mut XasGroup, params: &FtParams) -> bool {
let (Some(k), Some(chi)) = (group.k.as_ref(), group.chi.as_ref()) else {
return false;
};
let out = xftf(
k,
chi,
params.kmin,
params.kmax,
params.kweight,
params.dk,
None,
params.window,
params.rmax_out,
params.nfft,
Some(params.kstep),
);
group.r = Some(out.r);
group.chir_mag = Some(out.chir_mag);
group.chir_re = Some(out.chir_re);
group.chir_im = Some(out.chir_im);
true
}