use crate::{
schema::axes::{Base, ChannelAxis, LabelledAxis},
strided_array_file::{ArrayProxy, Statistics},
};
use ndarray::SliceInfoElem;
pub type Error = String;
pub fn slice_coordinate_system<AxisType: Base>(
axes: &[AxisType],
slice_info: &[SliceInfoElem],
) -> Result<Vec<ChannelAxis>, Error> {
if axes.len() != slice_info.len() {
return Err("Inconsistent amount of axes and slicing dimensions".into());
}
let mut sliced = Vec::<ChannelAxis>::with_capacity(axes.len());
for (axis, slice_info) in axes.iter().zip(slice_info) {
sliced.push(axis.slice(slice_info)?);
}
Ok(sliced)
}
pub(crate) fn calculate_bounds(data: &ArrayProxy<'_>) -> Result<[f64; 2], Error> {
Ok([
data.calc_stats(Statistics::Min)?,
data.calc_stats(Statistics::Max)?,
])
}
pub(crate) fn update_labelled_axis(
axis: &mut LabelledAxis,
axis_index: usize,
data: &ArrayProxy<'_>,
) -> Result<(), Error> {
if axis_index >= data.dimensions() {
return Err("Axis index is out of bounds".into());
}
let mut slice_info = vec![
SliceInfoElem::Slice {
start: 0,
end: None,
step: 1,
};
data.dimensions()
];
for (label_index, label) in axis.labels.iter_mut().enumerate() {
slice_info[axis_index] = SliceInfoElem::Index(label_index as isize);
label.bounds = calculate_bounds(&data.slice(slice_info.clone())?)?;
}
Ok(())
}