Skip to main content

fpm_rs/tabular/tables/
evaluation.rs

1use polars::prelude::*;
2
3use crate::{Result, evaluation::FrameIntensityEvaluation};
4
5/// Builds one predicted-versus-measured intensity comparison row per acquisition frame.
6pub fn frame_evaluation_dataframe(
7    run_id: &str,
8    evaluation: &FrameIntensityEvaluation,
9) -> Result<DataFrame> {
10    let length = evaluation.per_frame.len();
11    let mut run_ids = Vec::with_capacity(length);
12    let mut frame_indices = Vec::with_capacity(length);
13    let mut reference_sums = Vec::with_capacity(length);
14    let mut estimate_sums = Vec::with_capacity(length);
15    let mut residual_l1 = Vec::with_capacity(length);
16    let mut residual_l2 = Vec::with_capacity(length);
17    let mut residual_mean = Vec::with_capacity(length);
18    let mut residual_std = Vec::with_capacity(length);
19    let mut residual_max_abs = Vec::with_capacity(length);
20    let mut normalized_l2 = Vec::with_capacity(length);
21    let mut saturated_pixels = Vec::with_capacity(length);
22    for (frame, metrics) in evaluation.per_frame.iter().enumerate() {
23        run_ids.push(run_id);
24        frame_indices.push(frame as u64);
25        reference_sums.push(metrics.reference_sum);
26        estimate_sums.push(metrics.estimate_sum);
27        residual_l1.push(metrics.residual_l1);
28        residual_l2.push(metrics.residual_l2);
29        residual_mean.push(metrics.residual_mean);
30        residual_std.push(metrics.residual_std);
31        residual_max_abs.push(metrics.residual_max_abs);
32        normalized_l2.push(metrics.normalized_l2);
33        saturated_pixels.push(metrics.saturated_pixels.map(|value| value as u64));
34    }
35    Ok(df!(
36        "run_id" => run_ids,
37        "frame_index" => frame_indices,
38        "reference_sum" => reference_sums,
39        "estimate_sum" => estimate_sums,
40        "residual_l1" => residual_l1,
41        "residual_l2" => residual_l2,
42        "residual_mean" => residual_mean,
43        "residual_std" => residual_std,
44        "residual_max_abs" => residual_max_abs,
45        "normalized_l2" => normalized_l2,
46        "saturated_pixels" => saturated_pixels,
47    )?)
48}