From 4cc7fe83525396af3ea4a442e451b2dfffdfd346 Mon Sep 17 00:00:00 2001 From: Agah Date: Fri, 31 Jul 2026 11:08:48 -0400 Subject: [PATCH 01/10] feat(models): port vfa_t1 from qMRLab Claude-Session: https://claude.ai/code/session_01UPdViMfzMRjrtkSmwWbG5F --- crates/qmrust-core/src/models/mod.rs | 1 + .../qmrust-core/src/models/vfa_t1/config.rs | 127 ++++++ crates/qmrust-core/src/models/vfa_t1/fit.rs | 392 ++++++++++++++++++ crates/qmrust-core/src/models/vfa_t1/mod.rs | 7 + crates/qmrust-core/src/models/vfa_t1/model.rs | 383 +++++++++++++++++ crates/qmrust-core/src/registry.rs | 37 ++ crates/rust-bids/src/default_grouping.yaml | 3 + docs/references.bib | 13 + recipes/bids/vfa_t1_config.yaml | 14 + recipes/non-bids/vfa_t1_config.yaml | 14 + 10 files changed, 991 insertions(+) create mode 100644 crates/qmrust-core/src/models/vfa_t1/config.rs create mode 100644 crates/qmrust-core/src/models/vfa_t1/fit.rs create mode 100644 crates/qmrust-core/src/models/vfa_t1/mod.rs create mode 100644 crates/qmrust-core/src/models/vfa_t1/model.rs create mode 100644 recipes/bids/vfa_t1_config.yaml create mode 100644 recipes/non-bids/vfa_t1_config.yaml diff --git a/crates/qmrust-core/src/models/mod.rs b/crates/qmrust-core/src/models/mod.rs index 6aadec8..e52b6ca 100644 --- a/crates/qmrust-core/src/models/mod.rs +++ b/crates/qmrust-core/src/models/mod.rs @@ -3,3 +3,4 @@ pub mod mono_t2; pub mod mt_ratio; pub mod mt_sat; pub mod qmt_spgr; +pub mod vfa_t1; diff --git a/crates/qmrust-core/src/models/vfa_t1/config.rs b/crates/qmrust-core/src/models/vfa_t1/config.rs new file mode 100644 index 0000000..2d08784 --- /dev/null +++ b/crates/qmrust-core/src/models/vfa_t1/config.rs @@ -0,0 +1,127 @@ +//! VFA config, parsed from the top-level YAML keys (VFA fields are not nested). + +use anyhow::{bail, Result}; +use serde::{Deserialize, Serialize}; + +/// Fit algorithm. `Linear` is qMRLab's method: the Fram linearization solved in +/// closed form. `Nonlinear` minimises residuals on the signal equation itself +/// by Levenberg-Marquardt. +/// +/// The two differ in where the noise lives, not in the model. Dividing by +/// `sin`/`tan` to linearize also divides the noise, so each point is weighted by +/// an angle-dependent factor the least-squares solve does not know about — +/// biasing T1 when SNR is low or the flip angles are far apart. Fitting the +/// signal directly leaves the noise where it was, at the cost of an iterative +/// solve with no closed form. +#[derive(Debug, Clone, Copy, PartialEq, Eq, Default, Deserialize, Serialize)] +#[serde(rename_all = "lowercase")] +pub enum FitType { + #[default] + Linear, + Nonlinear, +} + +#[derive(Debug, Clone, Default, Deserialize, Serialize)] +pub struct VfaT1Config { + /// Nominal excitation flip angles in BIDS-native degrees, one per volume. + #[serde(default)] + pub flip_angles: Vec, + /// Excitation repetition time in seconds, shared by every volume. Both fit + /// methods assume a single TR across the series. + #[serde(default)] + pub repetition_time: Option, + #[serde(default)] + pub fit_type: FitType, +} + +impl VfaT1Config { + /// Config-intrinsic validation: options that make sense without a protocol. + /// VFA has no options — only an acquisition, checked once the protocol has + /// been folded in. + pub fn validate_options(&self) -> Result<()> { + Ok(()) + } + + /// Protocol-completeness validation: run once the flip angles and TR are + /// final (from `--config` for non-BIDS, or composed from sidecars for BIDS). + pub fn validate_protocol(&mut self) -> Result<()> { + if self.flip_angles.len() < 2 { + bail!( + "at least 2 flip angles required, got {}", + self.flip_angles.len() + ); + } + if self.flip_angles.iter().any(|&a| a <= 0.0 || a >= 90.0) { + bail!( + "flip angles must lie in (0, 90) degrees, got {:?}", + self.flip_angles + ); + } + match self.repetition_time { + None => bail!("vfa_t1 requires a repetition_time (seconds)"), + Some(tr) if tr <= 0.0 => bail!("repetition_time must be > 0, got {tr}"), + Some(_) => {} + } + self.flip_angles.sort_by(|a, b| a.partial_cmp(b).unwrap()); + Ok(()) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn parses_top_level_keys_and_sorts() { + let v: serde_yaml::Value = + serde_yaml::from_str("model: vfa_t1\nflip_angles: [20, 3]\nrepetition_time: 0.015\n") + .unwrap(); + let mut cfg: VfaT1Config = serde_yaml::from_value(v).unwrap(); + cfg.validate_options().unwrap(); + cfg.validate_protocol().unwrap(); + assert_eq!(cfg.flip_angles, vec![3.0, 20.0]); + assert_eq!(cfg.repetition_time, Some(0.015)); + } + + #[test] + fn validate_options_passes_without_acquisition() { + // `describe` runs options-only, before any sidecar is resolved. + VfaT1Config::default().validate_options().unwrap(); + } + + #[test] + fn validate_protocol_requires_two_angles_and_a_tr() { + let mut one_angle = VfaT1Config { + flip_angles: vec![3.0], + repetition_time: Some(0.015), + fit_type: FitType::Linear, + }; + assert!(one_angle.validate_protocol().is_err()); + + let mut no_tr = VfaT1Config { + flip_angles: vec![3.0, 20.0], + repetition_time: None, + fit_type: FitType::Linear, + }; + assert!(no_tr.validate_protocol().is_err()); + } + + #[test] + fn validate_protocol_rejects_out_of_range_angles() { + // The linearization divides by sin and tan of the flip angle, both + // degenerate at 0 degrees; tan is singular at 90. + let mut zero = VfaT1Config { + flip_angles: vec![0.0, 20.0], + repetition_time: Some(0.015), + fit_type: FitType::Linear, + }; + assert!(zero.validate_protocol().is_err()); + + let mut ninety = VfaT1Config { + flip_angles: vec![3.0, 90.0], + repetition_time: Some(0.015), + fit_type: FitType::Linear, + }; + assert!(ninety.validate_protocol().is_err()); + } +} diff --git a/crates/qmrust-core/src/models/vfa_t1/fit.rs b/crates/qmrust-core/src/models/vfa_t1/fit.rs new file mode 100644 index 0000000..e0fa234 --- /dev/null +++ b/crates/qmrust-core/src/models/vfa_t1/fit.rs @@ -0,0 +1,392 @@ +//! Variable flip angle T1 mapping — Fram et al. (1987) linearized SPGR fit. +//! +//! Signal model (spoiled gradient echo at steady state): +//! S(α) = M0 · sin(α·B1) · (1 − E) / (1 − E·cos(α·B1)), E = exp(−TR/T1) +//! +//! Dividing through linearizes it: with y = S/sin(α·B1) and x = S/tan(α·B1), +//! y = E·x + M0(1 − E) +//! so an ordinary least-squares line through (x, y) yields T1 = −TR/ln(slope) +//! and M0 = intercept/(1 − slope). The fit is closed form — no iteration. + +use levenberg_marquardt::{LeastSquaresProblem, LevenbergMarquardt}; +use nalgebra::{DMatrix, DVector, Dyn, Owned}; + +use crate::models::vfa_t1::config::FitType; + +/// qMRLab's declared bounds, in `param_names()` order [M0, T1] (T1 in seconds). +/// The linearized solve is unconstrained; these describe the physically +/// sensible range rather than constraining the solution. +pub const M0_BOUNDS: (f64, f64) = (0.0, 6000.0); +pub const T1_BOUNDS: (f64, f64) = (1e-5, 5.0); + +/// Pre-computed fitter for variable flip angle data. +/// +/// Build once with `new()`, then call `fit_voxel()` from the parallel engine. +pub struct VfaT1Fitter { + /// Nominal flip angles in degrees, in canonical (sorted) acquisition order. + flip_angles: Vec, + /// Excitation repetition time in seconds, shared by every volume. + tr: f64, + fit_type: FitType, +} + +impl VfaT1Fitter { + pub fn new(cfg: &super::config::VfaT1Config) -> Self { + Self { + flip_angles: cfg.flip_angles.clone(), + // `validate_protocol` guarantees a TR on the fit path. `describe` + // skips it to interrogate a model's structure before any sidecar is + // resolved, and reads neither `forward` nor `fit_voxel`. + tr: cfg.repetition_time.unwrap_or(f64::NAN), + fit_type: cfg.fit_type, + } + } + + pub fn param_names() -> [&'static str; 2] { + ["M0", "T1"] + } + + pub fn output_names() -> [&'static str; 2] { + ["M0", "T1"] + } + + /// Nominal flip angles (degrees) in the order `forward`/`fit_voxel` expect. + pub fn flip_angles(&self) -> &[f64] { + &self.flip_angles + } + + pub fn repetition_time(&self) -> f64 { + self.tr + } + + /// Noise-free SPGR signal at each flip angle. `b1` is the normalized + /// transmit field scaling the nominal angle (`α_actual = b1 · α_nominal`). + pub fn forward(&self, m0: f64, t1: f64, b1: f64) -> Vec { + let e = (-self.tr / t1).exp(); + self.flip_angles + .iter() + .map(|°| { + let a = (deg * b1).to_radians(); + m0 * a.sin() * (1.0 - e) / (1.0 - e * a.cos()) + }) + .collect() + } + + /// Fit a single voxel. Returns values in `output_names()` order — [M0, T1], + /// with T1 in seconds. + pub fn fit_voxel(&self, signal: &[f64], b1: f64) -> Vec { + let linear = self.fit_linear(signal, b1); + match self.fit_type { + FitType::Linear => linear, + // Seed the iterative solve with the closed-form answer: it is free, + // already in the right basin, and makes the result reproducible. + // A failed linearization leaves nothing to refine. + FitType::Nonlinear if linear[0].is_nan() => linear, + FitType::Nonlinear => self.fit_nonlinear(signal, b1, linear[0], linear[1]), + } + } + + /// qMRLab's method: the Fram linearization solved in closed form. A + /// non-physical solve (negative slope or intercept, or a degenerate + /// regression) yields NaN for both, matching `Compute_M0_T1_OnSPGR`. + fn fit_linear(&self, signal: &[f64], b1: f64) -> Vec { + let (x, y): (Vec, Vec) = self + .flip_angles + .iter() + .zip(signal) + .map(|(°, &s)| { + let a = (deg * b1).to_radians(); + (s / a.tan(), s / a.sin()) + }) + .unzip(); + + let (slope, intercept) = lin_least_squares(&x, &y); + if slope.is_nan() || slope < 0.0 || intercept.is_nan() || intercept < 0.0 { + return vec![f64::NAN, f64::NAN]; + } + vec![intercept / (1.0 - slope), -self.tr / slope.ln()] + } + + /// Levenberg-Marquardt on the signal equation itself, minimising + /// `S_i − S(α_i; M0, T1)`. Unconstrained, like the other iterative fitters + /// here — a bounded LM reparameterization distorts the step and is a trap + /// this codebase has hit before. + /// + /// Only a solve this method cannot stand behind is rejected: one that did + /// not converge, or a T1 that is not a positive finite number (the signal + /// equation is meaningless there). A large-but-finite T1 is reported as + /// fitted. Clamping to `T1_BOUNDS` here would make `fit_type` change the + /// NaN footprint rather than only the estimate, so the two methods would + /// disagree about which voxels were fitted at all — bounds are a policy + /// that must apply to both paths or neither, and the qMRLab-faithful + /// `Linear` default applies neither. + fn fit_nonlinear(&self, signal: &[f64], b1: f64, m0_init: f64, t1_init: f64) -> Vec { + let problem = VfaProblem { + p: DVector::from_vec(vec![m0_init, t1_init]), + alpha: self + .flip_angles + .iter() + .map(|°| (deg * b1).to_radians()) + .collect(), + signal: signal.to_vec(), + tr: self.tr, + }; + let (result, report) = LevenbergMarquardt::new().minimize(problem); + let (m0, t1) = (result.p[0], result.p[1]); + if !report.termination.was_successful() || !m0.is_finite() || !t1.is_finite() || t1 <= 0.0 { + return vec![f64::NAN, f64::NAN]; + } + vec![m0, t1] + } +} + +/// Residuals of the SPGR signal equation in `(M0, T1)`, for the `Nonlinear` +/// fit. `alpha` is already B1-scaled and in radians. +struct VfaProblem { + p: DVector, + alpha: Vec, + signal: Vec, + tr: f64, +} + +impl VfaProblem { + fn residual_for(&self, p: &DVector) -> DVector { + let (m0, t1) = (p[0], p[1]); + let e = (-self.tr / t1).exp(); + DVector::from_iterator( + self.alpha.len(), + self.alpha + .iter() + .zip(&self.signal) + .map(|(&a, &s)| m0 * a.sin() * (1.0 - e) / (1.0 - e * a.cos()) - s), + ) + } +} + +impl LeastSquaresProblem for VfaProblem { + type ParameterStorage = Owned; + type ResidualStorage = Owned; + type JacobianStorage = Owned; + + fn set_params(&mut self, p: &DVector) { + self.p = p.clone(); + } + fn params(&self) -> DVector { + self.p.clone() + } + fn residuals(&self) -> Option> { + Some(self.residual_for(&self.p)) + } + fn jacobian(&self) -> Option> { + // Central differences, as the other iterative fitters here do: the + // analytic Jacobian buys little for two parameters and is one more + // thing to keep in step with the equation above. + let m = self.signal.len(); + let n = self.p.len(); + let mut jac = DMatrix::zeros(m, n); + for k in 0..n { + let h = 1e-6 * (1.0 + self.p[k].abs()); + let (mut pp, mut pm) = (self.p.clone(), self.p.clone()); + pp[k] += h; + pm[k] -= h; + let col = (self.residual_for(&pp) - self.residual_for(&pm)) / (2.0 * h); + for i in 0..m { + jac[(i, k)] = col[i]; + } + } + Some(jac) + } +} + +/// Ordinary least-squares line through `(x, y)`, returning `(slope, intercept)`. +/// Uses slope = cov(x, y)/cov(x, x) and the fact that the line passes through +/// the sample mean. A zero denominator (all x identical) yields a NaN slope, +/// which the caller treats as a failed fit. +fn lin_least_squares(x: &[f64], y: &[f64]) -> (f64, f64) { + let n = x.len() as f64; + let sum_x: f64 = x.iter().sum(); + let sum_y: f64 = y.iter().sum(); + let sum_xy: f64 = x.iter().zip(y).map(|(a, b)| a * b).sum(); + let sum_xx: f64 = x.iter().map(|a| a * a).sum(); + + let slope = (sum_xy - sum_x * sum_y / n) / (sum_xx - sum_x * sum_x / n); + let intercept = sum_y / n - slope * sum_x / n; + (slope, intercept) +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::models::vfa_t1::config::VfaT1Config; + + fn fitter(flip_angles: Vec) -> VfaT1Fitter { + with_type(flip_angles, FitType::Linear) + } + + fn with_type(flip_angles: Vec, fit_type: FitType) -> VfaT1Fitter { + VfaT1Fitter::new(&VfaT1Config { + flip_angles, + repetition_time: Some(0.015), + fit_type, + }) + } + + /// Deterministic Gaussian noise: a fixed-seed LCG through Box-Muller, so + /// the comparison below is reproducible without pulling in an RNG crate. + struct Noise(u64); + + impl Noise { + fn unit(&mut self) -> f64 { + self.0 = self.0.wrapping_mul(6364136223846793005).wrapping_add(1); + ((self.0 >> 11) as f64) / ((1u64 << 53) as f64) + } + fn normal(&mut self) -> f64 { + let u1 = self.unit().max(1e-12); + let u2 = self.unit(); + (-2.0 * u1.ln()).sqrt() * (std::f64::consts::TAU * u2).cos() + } + fn apply(&mut self, signal: &[f64], sigma: f64) -> Vec { + signal.iter().map(|&s| s + sigma * self.normal()).collect() + } + } + + #[test] + fn nonlinear_recovers_known_params_on_clean_data() { + let f = with_type(vec![2.0, 5.0, 10.0, 20.0, 30.0], FitType::Nonlinear); + for &t1 in &[0.2, 0.5, 0.9, 1.5, 3.0] { + let clean = f.forward(750.0, t1, 1.0); + let out = f.fit_voxel(&clean, 1.0); + assert!((out[1] - t1).abs() < 1e-6, "T1={t1}: got {}", out[1]); + assert!((out[0] - 750.0).abs() < 1e-3, "T1={t1}: M0 {}", out[0]); + } + } + + #[test] + fn nonlinear_applies_b1_like_the_linear_path() { + let f = with_type(vec![3.0, 10.0, 20.0], FitType::Nonlinear); + let sig = f.forward(1000.0, 0.9, 1.15); + assert!((f.fit_voxel(&sig, 1.15)[1] - 0.9).abs() < 1e-6); + } + + #[test] + fn nonlinear_beats_the_linearization_across_noise_realizations() { + // The reason the option exists: linearizing divides the noise by + // sin/tan, so each point carries an angle-dependent weight the solve is + // blind to. Fitting the signal directly leaves the noise where it was. + // + // This is a statement about the estimator, not about any one draw — on + // a single realization either method can win by luck. Compare RMS error + // over many draws, which is the claim actually being made. + let angles = vec![2.0, 4.0, 8.0, 16.0, 32.0]; + let truth = 1.2; + let lin = with_type(angles.clone(), FitType::Linear); + let non = with_type(angles, FitType::Nonlinear); + let clean = lin.forward(1000.0, truth, 1.0); + + let mut noise = Noise(0x5EED); + let (mut sq_lin, mut sq_non, mut n) = (0.0, 0.0, 0u32); + for _ in 0..400 { + let data = noise.apply(&clean, 3.0); + let (a, b) = (lin.fit_voxel(&data, 1.0)[1], non.fit_voxel(&data, 1.0)[1]); + if !a.is_finite() || !b.is_finite() { + continue; // a failed fit is not evidence either way + } + sq_lin += (a - truth).powi(2); + sq_non += (b - truth).powi(2); + n += 1; + } + assert!(n > 300, "too few usable realizations: {n}"); + let (rmse_lin, rmse_non) = ((sq_lin / n as f64).sqrt(), (sq_non / n as f64).sqrt()); + assert!( + rmse_non < rmse_lin, + "nonlinear RMSE {rmse_non:.5} should beat linear {rmse_lin:.5} over {n} draws" + ); + } + + #[test] + fn nonlinear_reports_a_failed_linearization_as_a_failed_fit() { + // Nothing to seed from, so no refinement is possible; both report NaN + // rather than the nonlinear path inventing a starting point. + let f = with_type(vec![3.0, 20.0], FitType::Nonlinear); + let out = f.fit_voxel(&[0.0, 0.0], 1.0); + assert!(out.iter().all(|v| v.is_nan()), "{out:?}"); + } + + #[test] + fn both_fit_types_agree_on_which_voxels_were_fitted() { + // `fit_type` selects an estimator, not a masking policy. An exactly + // determined acquisition (as many angles as parameters) leaves no + // residual for the two methods to weigh differently, so they must agree + // voxel for voxel — including on a long-T1 voxel above the model's + // declared bound, which neither path is entitled to silently discard. + let lin = with_type(vec![3.0, 20.0], FitType::Linear); + let non = with_type(vec![3.0, 20.0], FitType::Nonlinear); + for &t1 in &[0.5, 1.2, 6.5] { + let data = lin.forward(1000.0, t1, 1.0); + let (a, b) = (lin.fit_voxel(&data, 1.0), non.fit_voxel(&data, 1.0)); + assert_eq!( + a[1].is_nan(), + b[1].is_nan(), + "T1={t1}: disagreement on whether the voxel was fitted" + ); + assert!((a[1] - b[1]).abs() < 1e-9, "T1={t1}: {a:?} vs {b:?}"); + } + } + + #[test] + fn default_fit_type_is_the_qmrlab_linear_path() { + // Default must not drift: it is what CI compares against qMRLab. + assert_eq!(VfaT1Config::default().fit_type, FitType::Linear); + } + + #[test] + fn forward_then_fit_recovers_params() { + let f = fitter(vec![3.0, 20.0]); + let sig = f.forward(1000.0, 0.9, 1.0); + let out = f.fit_voxel(&sig, 1.0); + assert!((out[0] - 1000.0).abs() < 1e-6, "M0: {}", out[0]); + assert!((out[1] - 0.9).abs() < 1e-9, "T1: {}", out[1]); + } + + #[test] + fn round_trip_over_a_range_of_t1() { + let f = fitter(vec![2.0, 5.0, 10.0, 20.0, 30.0]); + for &t1 in &[0.2, 0.5, 0.9, 1.5, 3.0] { + let out = f.fit_voxel(&f.forward(750.0, t1, 1.0), 1.0); + assert!((out[1] - t1).abs() < 1e-9, "T1={t1}: got {}", out[1]); + assert!((out[0] - 750.0).abs() < 1e-6, "T1={t1}: M0 {}", out[0]); + } + } + + #[test] + fn b1_scaling_is_inverted_by_the_fit() { + // A transmit field that departs from nominal biases the fit unless the + // same B1 is applied; supplying it recovers the truth exactly. + let f = fitter(vec![3.0, 20.0]); + let sig = f.forward(1000.0, 0.9, 1.15); + let corrected = f.fit_voxel(&sig, 1.15); + assert!((corrected[1] - 0.9).abs() < 1e-9, "T1: {}", corrected[1]); + let uncorrected = f.fit_voxel(&sig, 1.0); + assert!( + (uncorrected[1] - 0.9).abs() > 1e-3, + "ignoring B1 should bias T1, got {}", + uncorrected[1] + ); + } + + #[test] + fn non_physical_solve_yields_nan() { + // A flat (zero) signal gives a degenerate regression, not a T1. + let f = fitter(vec![3.0, 20.0]); + let out = f.fit_voxel(&[0.0, 0.0], 1.0); + assert!(out.iter().all(|v| v.is_nan()), "{out:?}"); + } + + #[test] + fn linearization_matches_ordinary_least_squares() { + // y = 2x + 1 exactly. + let (slope, intercept) = lin_least_squares(&[0.0, 1.0, 2.0, 3.0], &[1.0, 3.0, 5.0, 7.0]); + assert!((slope - 2.0).abs() < 1e-12); + assert!((intercept - 1.0).abs() < 1e-12); + } +} diff --git a/crates/qmrust-core/src/models/vfa_t1/mod.rs b/crates/qmrust-core/src/models/vfa_t1/mod.rs new file mode 100644 index 0000000..3b2b180 --- /dev/null +++ b/crates/qmrust-core/src/models/vfa_t1/mod.rs @@ -0,0 +1,7 @@ +//! Variable flip angle T1 mapping (Fram linearized SPGR). BIDS suffix: `VFA`. + +pub mod config; +pub mod fit; +pub mod model; + +pub use model::{build, describe, dump}; diff --git a/crates/qmrust-core/src/models/vfa_t1/model.rs b/crates/qmrust-core/src/models/vfa_t1/model.rs new file mode 100644 index 0000000..5468a82 --- /dev/null +++ b/crates/qmrust-core/src/models/vfa_t1/model.rs @@ -0,0 +1,383 @@ +//! VFA adapter onto the core `Model` trait. + +use crate::core::model::{ + Aux, BidsMap, BidsSpec, BidsVolume, EntityRole, FitStrategy, InputSpec, Measurement, + MeasurementKind, Meta, Model, ProtoParam, Protocol, Sample, Scope, Source, +}; +use crate::models::vfa_t1::config::VfaT1Config; +use crate::models::vfa_t1::fit::{VfaT1Fitter, M0_BOUNDS, T1_BOUNDS}; +use anyhow::{anyhow, Result}; +use serde_json::json; +use std::collections::BTreeMap; + +pub struct VfaT1Model { + fitter: VfaT1Fitter, +} + +/// One `{"FlipAngle": deg}` identity row per fitter flip angle, in canonical +/// order. +fn vfa_t1_rows(fitter: &VfaT1Fitter) -> Vec> { + fitter + .flip_angles() + .iter() + .map(|&fa| BTreeMap::from([("FlipAngle".to_string(), fa)])) + .collect() +} + +impl VfaT1Model { + pub fn new(cfg: VfaT1Config) -> Self { + Self { + fitter: VfaT1Fitter::new(&cfg), + } + } +} + +const VFA_ENTITIES: &[EntityRole] = &[EntityRole::Flip]; + +/// Excitation repetition time in seconds. BIDS names it +/// `RepetitionTimeExcitation` for a VFA series, but a dataset converted from a +/// plain gradient-echo acquisition often carries only `RepetitionTime`; both +/// denote the same interval here, so either resolves the protocol. +fn repetition_time(meta: &dyn Meta) -> Result { + meta.f64("RepetitionTimeExcitation") + .or_else(|| meta.f64("RepetitionTime")) + .ok_or_else(|| anyhow!("sidecar has neither RepetitionTimeExcitation nor RepetitionTime")) +} + +impl Model for VfaT1Model { + fn param_names(&self) -> Vec<&'static str> { + VfaT1Fitter::param_names().to_vec() + } + fn output_names(&self) -> Vec { + VfaT1Fitter::output_names() + .iter() + .map(|s| s.to_string()) + .collect() + } + fn param_bounds(&self) -> Vec<(f64, f64)> { + // qMRLab's lb/ub in BIDS-native units, in param_names order [M0, T1]. + // The linearized solve is closed form and does not enforce them. + vec![M0_BOUNDS, T1_BOUNDS] + } + fn fixed_mask(&self) -> Vec { + vec![false; 2] + } + fn required_inputs(&self) -> Vec { + // Normalized transmit field, used-if-present: it scales the nominal + // flip angle (α_actual = B1 · α_nominal). Absent, the nominal angles + // are taken at face value. + vec![InputSpec { + name: "B1map", + required: false, + bids: Some(BidsMap { + suffix: "TB1map", + entity: None, + }), + }] + } + fn measurement(&self) -> MeasurementKind { + MeasurementKind::Series { + rows: vfa_t1_rows(&self.fitter), + } + } + fn strategy(&self) -> FitStrategy { + FitStrategy::Voxelwise + } + fn forward(&self, params: &[f64], aux: &Aux) -> Measurement { + let values = self + .fitter + .forward(params[0], params[1], aux.get("B1map").unwrap_or(1.0)); + let samples = self + .fitter + .flip_angles() + .iter() + .zip(values) + .map(|(&fa, value)| Sample { + params: BTreeMap::from([("FlipAngle".to_string(), fa)]), + value, + }) + .collect(); + Measurement::Series(samples) + } + fn fit(&self, m: &Measurement, aux: &Aux) -> Vec { + // Assemble the signal in the fitter's own flip-angle order by matching + // each expected angle to its sample by identity — never positionally. An + // angle with no matching sample is a mislabeled measurement → panic (the + // engine records the voxel as a failed fit). Angles are assumed unique; + // first match wins. + let samples = m.series(); + let signal: Vec = self + .fitter + .flip_angles() + .iter() + .map(|&fa| { + samples + .iter() + .find(|s| s.params.get("FlipAngle") == Some(&fa)) + .map(|s| s.value) + .unwrap_or_else(|| panic!("measurement has no sample with FlipAngle={fa}")) + }) + .collect(); + self.fitter + .fit_voxel(&signal, aux.get("B1map").unwrap_or(1.0)) + } + fn n_volumes(&self) -> usize { + self.fitter.flip_angles().len() + } + fn bids_volume(&self, index: usize) -> BidsVolume { + BidsVolume { + entities: vec![("flip", (index + 1).to_string())], + sidecar: BTreeMap::from([ + ( + "FlipAngle".to_string(), + json!(self.fitter.flip_angles()[index]), + ), + ( + "RepetitionTimeExcitation".to_string(), + json!(self.fitter.repetition_time()), + ), + ]), + } + } + fn bids(&self) -> Option { + Some(BidsSpec { + suffix: "VFA", + entities: VFA_ENTITIES, + }) + } + fn protocol_schema(&self) -> Vec { + // Flip angle is the acquisition axis, so it alone identifies a volume: + // a `Series`' per-volume protocol rows *are* its volume identities + // (`engine::build_volume_ids`), and `forward` tags its samples the same + // way. TR is a constant shared by the series, so it is `Global` — as a + // per-volume param it would join the identity and no forward sample + // would match its volume. + vec![ + ProtoParam { + name: "FlipAngle", + source: Source::Field("FlipAngle"), + scope: Scope::PerVolume, + }, + ProtoParam { + name: "RepetitionTimeExcitation", + source: Source::Derived(repetition_time), + scope: Scope::Global, + }, + ] + } + fn bids_outputs(&self) -> Vec<(&'static str, &'static str, &'static str)> { + // T1map carries the quantitative time constant (seconds). M0map is the + // fitted equilibrium signal amplitude — receive-coil dependent, not a + // calibrated quantity — so its unit is left blank (arbitrary). + vec![("T1", "T1map", "s"), ("M0", "M0map", "")] + } +} + +impl crate::core::model::ModelConfig for VfaT1Config { + const NAME: &'static str = "vfa_t1"; + const SUBKEY: Option<&'static str> = None; + + fn validate_options(&mut self) -> Result<()> { + VfaT1Config::validate_options(self) + } + + fn ingest_protocol(&mut self, proto: &Protocol) -> Result<()> { + let angles: Vec = proto + .volumes + .iter() + .filter_map(|m| m.get("FlipAngle").copied()) + .collect(); + if !angles.is_empty() { + self.flip_angles = angles; + } + // Global scope, so this is resolved once for the collection rather than + // per volume — read it independently of the per-volume rows. + if let Some(&tr) = proto.global.get("RepetitionTimeExcitation") { + self.repetition_time = Some(tr); + } + Ok(()) + } + + fn validate_protocol(&mut self) -> Result<()> { + VfaT1Config::validate_protocol(self) + } + + fn into_model(self) -> Box { + Box::new(VfaT1Model::new(self)) + } +} + +/// Structural interrogation entry point (see [`describe_model`](crate::core::model::describe_model)). +pub fn describe(v: &serde_yaml::Value) -> Result> { + crate::core::model::describe_model::(v) +} + +/// Registry builder (see [`build_model`](crate::core::model::build_model)): the +/// shared parse → ingest protocol → validate → construct pipeline. +pub fn build(v: &serde_yaml::Value, proto: &Protocol) -> Result> { + crate::core::model::build_model::(v, proto) +} + +/// Registry dumper (see [`dump_model`](crate::core::model::dump_model)): prints +/// the fully-resolved effective config as YAML. +pub fn dump(v: &serde_yaml::Value) -> Result { + crate::core::model::dump_model::(v) +} + +#[cfg(test)] +mod tests { + use super::*; + + fn vfa_value() -> serde_yaml::Value { + serde_yaml::from_str("model: vfa_t1\nflip_angles: [3, 20]\nrepetition_time: 0.015\n") + .unwrap() + } + + /// A resolved protocol as the shell hands it over: one row per volume + /// carrying only the identifying axis, plus the collection-wide TR. + fn resolved_proto(angles: &[f64], tr: f64) -> Protocol { + Protocol { + volumes: angles + .iter() + .map(|&fa| BTreeMap::from([("FlipAngle".to_string(), fa)])) + .collect(), + global: BTreeMap::from([("RepetitionTimeExcitation".to_string(), tr)]), + } + } + + #[test] + fn build_and_roundtrip_via_trait() { + let m = build(&vfa_value(), &Protocol::default()).unwrap(); + assert_eq!(m.param_names(), vec!["M0", "T1"]); + let sig = m.forward(&[1000.0, 0.9], &Aux::new()); + assert_eq!(sig.series().len(), 2); + let fitted = m.fit(&sig, &Aux::new()); + assert!((fitted[0] - 1000.0).abs() < 1e-6, "M0: {}", fitted[0]); + assert!((fitted[1] - 0.9).abs() < 1e-9, "T1: {}", fitted[1]); + } + + #[test] + fn fit_assembles_by_identity_not_position() { + // Samples supplied in reversed order must give an identical fit; a + // positional assembly would pair each signal with the wrong angle. + let m = build(&vfa_value(), &Protocol::default()).unwrap(); + let sig = m.forward(&[1000.0, 0.9], &Aux::new()); + let mut reversed: Vec = match &sig { + Measurement::Series(s) => s + .iter() + .map(|s| Sample { + params: s.params.clone(), + value: s.value, + }) + .collect(), + _ => unreachable!(), + }; + reversed.reverse(); + let a = m.fit(&sig, &Aux::new()); + let b = m.fit(&Measurement::Series(reversed), &Aux::new()); + assert_eq!(a, b, "fit must be invariant to sample order"); + } + + #[test] + #[should_panic(expected = "no sample with FlipAngle")] + fn fit_panics_on_unmatched_identity() { + let m = build(&vfa_value(), &Protocol::default()).unwrap(); + let bogus = Measurement::Series(vec![Sample { + params: BTreeMap::from([("FlipAngle".to_string(), 77.0)]), + value: 1.0, + }]); + let _ = m.fit(&bogus, &Aux::new()); + } + + #[test] + fn bids_folds_flip_angles_and_tr_from_protocol() { + let proto = resolved_proto(&[4.0, 25.0], 0.018); + // Config carries no acquisition; the sidecars supply it. + let v: serde_yaml::Value = serde_yaml::from_str("model: vfa_t1\n").unwrap(); + let m = build(&v, &proto).unwrap(); + assert_eq!(m.n_volumes(), 2); + let second = m.bids_volume(1); + assert_eq!(second.entities, vec![("flip", "2".to_string())]); + assert_eq!(second.sidecar["FlipAngle"], json!(25.0)); + assert_eq!(second.sidecar["RepetitionTimeExcitation"], json!(0.018)); + } + + #[test] + fn forward_samples_carry_the_volume_identities_the_bids_path_builds() { + // A `Series` model's volume identities come from the resolved + // per-volume protocol (`engine::build_volume_ids`), while `forward` + // tags its samples from the model's own rows. Any protocol param the + // model does not also emit joins the identity on one side only, and + // every predicted sample then fails to match its volume — the fit still + // works (it queries one key), so the only symptom is a silently missing + // forward curve. Both sides must agree exactly. + let proto = resolved_proto(&[3.0, 20.0], 0.015); + let v: serde_yaml::Value = serde_yaml::from_str("model: vfa_t1\n").unwrap(); + let m = build(&v, &proto).unwrap(); + + let ids = crate::engine::build_volume_ids(m.measurement(), &proto, m.n_volumes()).unwrap(); + let sig = m.forward(&[1000.0, 0.9], &Aux::new()); + let samples = sig.series(); + assert_eq!(samples.len(), ids.len()); + for (id, sample) in ids.iter().zip(samples) { + let crate::core::model::VolumeId::Params(row) = id else { + panic!("vfa_t1 is a Series model; expected param-row identities") + }; + assert_eq!( + *row, sample.params, + "volume identity {row:?} has no matching forward sample identity {:?}", + sample.params + ); + } + } + + #[test] + fn b1_map_from_aux_scales_the_flip_angles() { + let m = build(&vfa_value(), &Protocol::default()).unwrap(); + let mut aux = Aux::new(); + aux.set("B1map", 1.2); + // Signal generated at B1=1.2 and fitted with the same B1 recovers truth; + // fitting it as if B1 were nominal does not. + let sig = m.forward(&[1000.0, 0.9], &aux); + assert!((m.fit(&sig, &aux)[1] - 0.9).abs() < 1e-9); + assert!((m.fit(&sig, &Aux::new())[1] - 0.9).abs() > 1e-3); + } + + #[test] + fn declares_bids_vfa_and_b1_aux() { + let m = build(&vfa_value(), &Protocol::default()).unwrap(); + assert_eq!(m.bids().unwrap().suffix, "VFA"); + let inputs = m.required_inputs(); + assert_eq!(inputs.len(), 1); + assert_eq!(inputs[0].name, "B1map"); + assert!(!inputs[0].required); + } + + #[test] + fn bids_outputs_reference_real_output_names() { + let m = build(&vfa_value(), &Protocol::default()).unwrap(); + let names = m.output_names(); + for (out, _suffix, _unit) in m.bids_outputs() { + assert!(names.iter().any(|n| n == out), "{out} not in {names:?}"); + } + } + + #[test] + fn describe_succeeds_without_an_acquisition_and_exposes_schema() { + let v: serde_yaml::Value = serde_yaml::from_str("model: vfa_t1\n").unwrap(); + let m = describe(&v).unwrap(); + let schema = m.protocol_schema(); + assert_eq!(schema[0].name, "FlipAngle"); + assert_eq!(schema[1].name, "RepetitionTimeExcitation"); + // FlipAngle identifies a volume; TR is one value for the collection. + assert!(matches!(schema[0].scope, Scope::PerVolume)); + assert!(matches!(schema[1].scope, Scope::Global)); + } + + #[test] + fn build_still_requires_an_acquisition_when_protocol_empty() { + let v: serde_yaml::Value = + serde_yaml::from_str("model: vfa_t1\nflip_angles: [3]\n").unwrap(); + assert!(build(&v, &Protocol::default()).is_err()); + } +} diff --git a/crates/qmrust-core/src/registry.rs b/crates/qmrust-core/src/registry.rs index 62ce2b2..17f9d7a 100644 --- a/crates/qmrust-core/src/registry.rs +++ b/crates/qmrust-core/src/registry.rs @@ -243,6 +243,43 @@ pub fn all() -> &'static [ModelEntry] { display_ranges: &[("T1", 0.0, 3.0)], }, }, + ModelEntry { + name: "vfa_t1", + bids_suffix: "VFA", + build: models::vfa_t1::build, + describe: models::vfa_t1::describe, + dump: models::vfa_t1::dump, + doc: ModelDoc { + title: "Variable flip angle T1", + category: Category::Relaxometry, + summary: "Fits the longitudinal relaxation time T1 from spoiled \ + gradient-echo images acquired at two or more excitation flip \ + angles and a single repetition time. Dividing the \ + steady-state signal by the sine of the flip angle \ + linearizes the model, so T1 and the equilibrium \ + magnetization follow from an ordinary least-squares line \ + through the transformed data — a closed-form solve, with no \ + iteration. That transform also divides the noise, which \ + biases the estimate at low SNR, so a nonlinear fit_type is \ + available that minimises residuals on the signal equation \ + itself. A transmit field map, when supplied, scales the \ + nominal flip angles to the actual ones before the fit.", + equation: r"S(\alpha) = M_0 \sin(\alpha)\,\frac{1 - e^{-T_R/T_1}}{1 - \cos(\alpha)\,e^{-T_R/T_1}}", + symbols: &[ + ("M0", "Equilibrium magnetization", ""), + ("T1", "Longitudinal relaxation time", "s"), + ], + citations: &["fram1987"], + source_dir: "crates/qmrust-core/src/models/vfa_t1", + recipes: Recipes { + bids: "recipes/bids/vfa_t1_config.yaml", + non_bids: "recipes/non-bids/vfa_t1_config.yaml", + sim: None, + }, + enums: &[("fit_type", &["linear", "nonlinear"])], + display_ranges: &[("T1", 0.0, 3.0)], + }, + }, ModelEntry { name: "qmt_spgr", bids_suffix: "QMTSPGR", diff --git a/crates/rust-bids/src/default_grouping.yaml b/crates/rust-bids/src/default_grouping.yaml index 97240a9..8209100 100644 --- a/crates/rust-bids/src/default_grouping.yaml +++ b/crates/rust-bids/src/default_grouping.yaml @@ -30,3 +30,6 @@ MTR: MToff: mt: "off" required: [MTon, MToff] +VFA: + sequential_set: + by: [flip] diff --git a/docs/references.bib b/docs/references.bib index c5da2a4..88dd8a7 100644 --- a/docs/references.bib +++ b/docs/references.bib @@ -1,3 +1,16 @@ +@article{fram1987, + author = {Fram, Evan K. and Herfkens, Robert J. and Johnson, G. Allan and + Glover, Gary H. and Karis, John P. and Shimakawa, Ann and + Perkins, Thomas G. and Pelc, Norbert J.}, + title = {Rapid calculation of {T1} using variable flip angle gradient + refocused imaging}, + journal = {Magnetic Resonance Imaging}, + volume = {5}, + number = {3}, + pages = {201--208}, + year = {1987} +} + @article{barral2010, author = {Barral, Jo{\"e}lle K. and Gudmundson, Erik and Stikov, Nikola and Etezadi-Amoli, Maryam and Stoica, Petre and Nishimura, Dwight G.}, diff --git a/recipes/bids/vfa_t1_config.yaml b/recipes/bids/vfa_t1_config.yaml new file mode 100644 index 0000000..70da333 --- /dev/null +++ b/recipes/bids/vfa_t1_config.yaml @@ -0,0 +1,14 @@ +model: vfa_t1 + +# BIDS input: FlipAngle and RepetitionTimeExcitation are read from the JSON +# sidecars via the model's protocol_schema(), so neither is declared here. + +# Fit algorithm (an option, not BIDS metadata): `linear` is qMRLab's closed-form +# Fram linearization; `nonlinear` minimises residuals on the signal equation by +# Levenberg-Marquardt, avoiding the bias the linearizing transform puts into the +# noise at low SNR. +fit_type: linear + +# BIDS mask selection — disambiguates which mask in the dataset to apply. +mask: + desc: brain diff --git a/recipes/non-bids/vfa_t1_config.yaml b/recipes/non-bids/vfa_t1_config.yaml new file mode 100644 index 0000000..0706043 --- /dev/null +++ b/recipes/non-bids/vfa_t1_config.yaml @@ -0,0 +1,14 @@ +model: vfa_t1 + +# non-BIDS: protocol from this file; mask via --mask +# Flip angles in degrees (BIDS-MRI convention), times in seconds (BIDS/SI). +# The linearization assumes one repetition time for the whole series. +flip_angles: +- 3 +- 20 +repetition_time: 0.015 + +# Fit algorithm. `linear` (default) is qMRLab's closed-form Fram linearization; +# `nonlinear` refines it with Levenberg-Marquardt on the signal equation, which +# avoids the bias the linearizing transform puts into the noise at low SNR. +fit_type: linear From 2d36e8c962b9f4fb1bc00ead337f566559124a43 Mon Sep 17 00:00:00 2001 From: Agah Date: Fri, 31 Jul 2026 11:09:53 -0400 Subject: [PATCH 02/10] fix(bids): stop .bidsignore hiding a model's own volumes Claude-Session: https://claude.ai/code/session_01UPdViMfzMRjrtkSmwWbG5F --- crates/qmrust-cli/src/bidsify.rs | 60 +++++++++++++++++++++++++++----- crates/rust-bids/src/table.rs | 36 ++++++++++++++----- crates/rust-bids/src/vocab.rs | 36 ++++++++++++++++--- 3 files changed, 110 insertions(+), 22 deletions(-) diff --git a/crates/qmrust-cli/src/bidsify.rs b/crates/qmrust-cli/src/bidsify.rs index f1cfb65..1418aa8 100644 --- a/crates/qmrust-cli/src/bidsify.rs +++ b/crates/qmrust-cli/src/bidsify.rs @@ -283,7 +283,7 @@ fn measurement_in_dir(dir: &Path, model: &dyn Model) -> Result { /// Write one dataset as a BIDS tree rooted at `out`, driven by /// `model`'s declared BIDS identity: `dataset_description.json`, -/// `participants.tsv`, a `.bidsignore` entry if `model`'s suffix is +/// `participants.tsv`, a `.bidsignore` entry iff `model`'s suffix is /// non-canonical, one `sub-/anat/sub-[_-...]_.nii.gz` /// (+ JSON sidecar, from `model.bids_volume(i)`) per volume in `data`'s 4th /// axis, a brain-mask derivative if `mask` is given, and each `aux` map @@ -312,7 +312,7 @@ pub fn write_bids_tree( std::fs::create_dir_all(out)?; write_dataset_description(out)?; write_participants_row(out, subject)?; - write_bidsignore_if_custom(out, spec.suffix)?; + sync_bidsignore(out, spec.suffix)?; let anat_dir = out.join(format!("sub-{subject}")).join("anat"); std::fs::create_dir_all(&anat_dir)?; @@ -492,17 +492,35 @@ fn write_derivative_dataset_description(pipeline: &Path, name: &str) -> Result<( Ok(()) } -/// Ensure the dataset root's `.bidsignore` contains a `**` line when -/// `suffix` is not a canonical BIDS suffix (a registered model's own -/// suffix is "custom" by construction — see `rust_bids::Vocabulary`). -/// Canonical suffixes need no entry. Creates the file if missing; never +/// Reconcile the dataset root's `.bidsignore` with `suffix`'s status: a +/// non-canonical suffix (like `QMTSPGR`) gets a `**` line so generic +/// BIDS validators don't choke on it, and a canonical one (like `VFA`) must +/// have no such line — an entry there would hide the acquisitions from any +/// validator that honours it. Both directions are enforced, so appending to a +/// root written before a suffix's status was settled corrects it rather than +/// leaving the stale line in place. Creates the file if missing; never /// duplicates the line. -fn write_bidsignore_if_custom(out: &Path, suffix: &str) -> Result<()> { +fn sync_bidsignore(out: &Path, suffix: &str) -> Result<()> { + let path = out.join(".bidsignore"); + let line = format!("*{suffix}*"); + if !rust_bids::Vocabulary::bids().is_custom_suffix(suffix) { + if !path.exists() { + return Ok(()); + } + let contents = std::fs::read_to_string(&path)?; + let kept: Vec<&str> = contents.lines().filter(|l| l.trim() != line).collect(); + if kept.len() == contents.lines().count() { + return Ok(()); + } + if kept.iter().all(|l| l.trim().is_empty()) { + std::fs::remove_file(&path)?; + } else { + std::fs::write(&path, format!("{}\n", kept.join("\n")))?; + } return Ok(()); } - let path = out.join(".bidsignore"); - let line = format!("*{suffix}*"); + if !path.exists() { std::fs::write(&path, format!("{line}\n"))?; return Ok(()); @@ -981,4 +999,28 @@ mod tests { let _ = std::fs::remove_dir_all(&dir); } + + /// A canonical BIDS suffix must never be `.bidsignore`d — an entry there + /// hides the acquisitions from any validator that honours it. Writing into + /// a root that already carries a stale line must clear it, while leaving + /// unrelated entries alone. + #[test] + fn bidsify_clears_a_stale_bidsignore_line_for_a_canonical_suffix() { + let dir = tmp_dir("vfa-bidsignore-canonical"); + std::fs::create_dir_all(&dir).unwrap(); + std::fs::write(dir.join(".bidsignore"), "*VFA*\n*SOMETHINGELSE*\n").unwrap(); + + let v: serde_yaml::Value = + serde_yaml::from_str("model: vfa_t1\nflip_angles: [3, 20]\nrepetition_time: 0.015\n") + .unwrap(); + let model = qmrust_core::models::vfa_t1::describe(&v).unwrap(); + let data = Array4::from_shape_fn((1, 1, 1, 2), |_| 1.0); + write_bids_tree(model.as_ref(), &data, None, &[], "01", &dir, None).unwrap(); + + let bidsignore = std::fs::read_to_string(dir.join(".bidsignore")).unwrap(); + assert!(!bidsignore.contains("*VFA*"), "{bidsignore}"); + assert!(bidsignore.contains("*SOMETHINGELSE*"), "{bidsignore}"); + + let _ = std::fs::remove_dir_all(&dir); + } } diff --git a/crates/rust-bids/src/table.rs b/crates/rust-bids/src/table.rs index 7e72879..44aa890 100644 --- a/crates/rust-bids/src/table.rs +++ b/crates/rust-bids/src/table.rs @@ -116,17 +116,19 @@ pub fn parse_to_table(fs: &F, vocab: &Vocabulary) -> Result Self { let mut vocab = Vocabulary { suffixes: CANONICAL_SUFFIXES.iter().copied().collect(), @@ -212,8 +214,26 @@ impl Vocabulary { } /// Whether `s` is a *custom* (non-canonical) suffix: registered model or - /// config-declared, but NOT a canonical BIDS suffix. + /// config-declared, but NOT a canonical BIDS suffix. A canonical suffix is + /// never custom, however it was declared — most registered models use one + /// (`VFA`, `IRT1`, `MTS`, …), and only a genuinely non-official suffix like + /// `QMTSPGR` needs a `.bidsignore` line written for it. + /// + /// This answers the *write* question ("does this dataset need a + /// `.bidsignore` entry?"). For the *read* question — "may a `.bidsignore` + /// hide this file from qmrust?" — see [`is_declared_suffix`](Self::is_declared_suffix). pub fn is_custom_suffix(&self, s: &str) -> bool { + !self.suffixes.contains(s) && self.custom_suffixes.contains(s) + } + + /// Whether `s` is a suffix qmrust itself declared: a registered model's own + /// suffix, or one this dataset's config named. Such a file must stay + /// visible to qmrust even when `.bidsignore` names it, canonical or not — + /// a dataset written before a suffix was recognized as canonical still + /// carries that line, and honouring it would hide the very volumes the + /// model was asked to fit. `.bidsignore` exists to keep third-party + /// validators quiet, never to hide data from the tool reading it. + pub fn is_declared_suffix(&self, s: &str) -> bool { self.custom_suffixes.contains(s) } @@ -235,8 +255,14 @@ mod tests { assert!(v.is_known_suffix("IRT1")); // A canonical suffix is known but not "custom". assert!(!v.is_custom_suffix("T1map")); - // Registered model suffixes are built in (compile-time), so known and - // custom (hence `.bidsignore`-exempt) with no config. + // Registered model suffixes are built in (compile-time), so known + // with no config — but a registered suffix that BIDS itself defines + // stays canonical, so it needs no `.bidsignore` exemption. + for canonical in ["IRT1", "MESE", "MTR", "MTS", "VFA"] { + assert!(v.is_known_suffix(canonical)); + assert!(!v.is_custom_suffix(canonical), "{canonical} is canonical"); + } + // Only a genuinely non-official suffix is custom. assert!(v.is_known_suffix("QMTSPGR")); assert!(v.is_custom_suffix("QMTSPGR")); assert!(v.is_datatype("anat")); From 480bc465b838d8ded3e3c6c7636ebc05e8116c0b Mon Sep 17 00:00:00 2001 From: Agah Date: Fri, 31 Jul 2026 11:09:54 -0400 Subject: [PATCH 03/10] fix(docsfig): discover aux maps filed under fmap Claude-Session: https://claude.ai/code/session_01UPdViMfzMRjrtkSmwWbG5F --- scripts/docsfig/dataset.py | 6 +++++- scripts/tests/test_dataset.py | 39 +++++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/scripts/docsfig/dataset.py b/scripts/docsfig/dataset.py index 237b73c..1dd5523 100644 --- a/scripts/docsfig/dataset.py +++ b/scripts/docsfig/dataset.py @@ -134,7 +134,11 @@ def find(parent, model): for spec in model["required_inputs"]: if not spec["bids_suffix"]: continue - found = sorted(deriv.glob(f"*/{subject}/anat/*_{spec['bids_suffix']}.nii*")) + # Any datatype directory: bidsify files a map by BIDS convention, so a + # transmit/off-resonance map lands in `fmap/` and a parameter map in + # `anat/`. Globbing only one silently drops the other, and the fit then + # runs uncorrected while the CLI applies it. + found = sorted(deriv.glob(f"*/{subject}/*/*_{spec['bids_suffix']}.nii*")) if found: aux[spec["name"]] = found[0] diff --git a/scripts/tests/test_dataset.py b/scripts/tests/test_dataset.py index 3ff5150..9e29ac9 100644 --- a/scripts/tests/test_dataset.py +++ b/scripts/tests/test_dataset.py @@ -160,5 +160,44 @@ def test_verify_probes_rejects_a_transposed_convention(self): figs._verify_probes(data_path, probes, transposed) +class TestAuxDiscovery(unittest.TestCase): + """A declared optional input must be found wherever `bidsify` files it. + + Maps are placed by BIDS datatype convention — a transmit/off-resonance map + under `fmap/`, a parameter map under `anat/` — so a discovery that searches + only one datatype silently drops the other. The symptom is the worst kind: + the app fits uncorrected while the CLI corrects, and both produce plausible + maps that simply disagree. + """ + + def _dataset(self, tmp, datatype): + model = named_model(required_inputs=[ + {"name": "B1map", "bids_suffix": "TB1map", "required": False}, + ]) + root = dataset.root_for(tmp, model) + anat = root / "sub-01" / "anat" + anat.mkdir(parents=True) + for mt in ("on", "off"): + nifti.write_nii(anat / f"sub-01_mt-{mt}_MTR.nii.gz", [[1.0, 1.0], [1.0, 1.0]]) + (anat / f"sub-01_mt-{mt}_MTR.json").write_text("{}") + aux_dir = root / "derivatives" / "preprocessed" / "sub-01" / datatype + aux_dir.mkdir(parents=True) + nifti.write_nii(aux_dir / "sub-01_TB1map.nii.gz", [[1.0, 1.0], [1.0, 1.0]]) + return model + + def test_finds_aux_under_fmap(self): + with tempfile.TemporaryDirectory() as tmp: + model = self._dataset(tmp, "fmap") + coll = dataset.find(tmp, model) + self.assertIn("B1map", coll.aux) + self.assertEqual(coll.aux["B1map"].name, "sub-01_TB1map.nii.gz") + + def test_finds_aux_under_anat(self): + with tempfile.TemporaryDirectory() as tmp: + model = self._dataset(tmp, "anat") + coll = dataset.find(tmp, model) + self.assertIn("B1map", coll.aux) + + if __name__ == "__main__": unittest.main() From 11bd1f347966d156a59799515f8f43731732050f Mon Sep 17 00:00:00 2001 From: Agah Date: Fri, 31 Jul 2026 11:09:54 -0400 Subject: [PATCH 04/10] fix(playground): land on the viewer after a dataset loads Claude-Session: https://claude.ai/code/session_01UPdViMfzMRjrtkSmwWbG5F --- docs/playground/inputs.js | 13 +++++++++++-- docs/playground/model.js | 5 ++++- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/docs/playground/inputs.js b/docs/playground/inputs.js index 6c86d4c..0cafe03 100644 --- a/docs/playground/inputs.js +++ b/docs/playground/inputs.js @@ -94,12 +94,21 @@ export function showLoading(note, expect = 12) { } } -// Leaves whichever tab the reader is on selected, now that it has real content. -export function endLoading() { +// Reveals the real content behind the skeletons. `prefer` names the tab to land +// on: a dataset that loaded is showing its image, so the viewer is what the +// reader wants, whatever tab they happened to leave selected — being stranded on +// a file list after a successful load reads as if nothing arrived. Callers that +// pass nothing keep the reader where they are, which is what the failure paths +// want: they have already selected Files to explain themselves. +export function endLoading(prefer = null) { app.loading = false; hideDownloadProgress(); $("skel-in").hidden = true; $("skel-out").hidden = true; + if (prefer) { + showInputsTab(prefer); + return; + } const onFiles = $("tab-files").classList.contains("active"); showInputsTab(onFiles ? "files" : "viewer"); } diff --git a/docs/playground/model.js b/docs/playground/model.js index 0d4504f..0f6037b 100644 --- a/docs/playground/model.js +++ b/docs/playground/model.js @@ -230,7 +230,10 @@ export async function loadModel(name) { showLoading(`fetching ${meta.archive}…`, (meta.dims?.[3] ?? 8) * 2 + 4); try { const ok = await loadModelFromBids(name, meta); - endLoading(); + // A dataset that resolved is showing its volumes: land on the viewer. One + // that resolved to nothing this model can fit has already selected Files + // to say why, so leave that standing. + endLoading(ok ? "viewer" : null); if (ok) return; } catch (e) { endLoading(); From 0e6c5720febb81ab433be9817a22f03de4d44f69 Mon Sep 17 00:00:00 2001 From: Agah Date: Fri, 31 Jul 2026 11:10:05 -0400 Subject: [PATCH 05/10] ci: build and validate the vfa_t1 example dataset Claude-Session: https://claude.ai/code/session_01UPdViMfzMRjrtkSmwWbG5F --- ci/integration_osf.sh | 41 ++++++++++++++++++++++++++++++++++- scripts/make_bids_examples.sh | 21 +++++++++++++++++- 2 files changed, 60 insertions(+), 2 deletions(-) diff --git a/ci/integration_osf.sh b/ci/integration_osf.sh index 54e6b73..42cf102 100755 --- a/ci/integration_osf.sh +++ b/ci/integration_osf.sh @@ -13,11 +13,13 @@ curl -L --fail -o "$DATA/qmt.zip" "https://osf.io/pzqyn/download?version=2" curl -L --fail -o "$DATA/mono_t2.zip" "https://osf.io/kujp3/download?version=3" curl -L --fail -o "$DATA/mtr.zip" "https://osf.io/erm2s/download?version=2" curl -L --fail -o "$DATA/mtsat.zip" "https://osf.io/c5wdb/download?version=4" +curl -L --fail -o "$DATA/vfa_t1.zip" "https://osf.io/7wcvh/download?version=3" unzip -o -q "$DATA/ir.zip" -d "$DATA/ir" unzip -o -q "$DATA/qmt.zip" -d "$DATA/qmt" unzip -o -q "$DATA/mono_t2.zip" -d "$DATA/mono_t2" unzip -o -q "$DATA/mtr.zip" -d "$DATA/mtr" unzip -o -q "$DATA/mtsat.zip" -d "$DATA/mtsat" +unzip -o -q "$DATA/vfa_t1.zip" -d "$DATA/vfa_t1" # Locate the datasets by their key files (robust to archive folder layout). IR_MAT="$(find "$DATA/ir" -name 'IRData.mat' | head -1)" @@ -58,6 +60,19 @@ MTSAT_REF_MTR="$(find "$DATA/mtsat" -path '*FitResults*' -name 'MTR.nii.gz' | he [ -n "$MTSAT_REF_SAT" ] || { echo "FitResults/MTSAT.nii.gz not found in MTsat archive"; exit 1; } MTSAT_DIR="$(dirname "$MTSAT_MTW")" +# vfa_t1 ships as a 4D NIfTI (VFAData.nii.gz, flip angles in the 4th axis) plus +# a transmit field map and a mask, with a qMRLab reference (FitResults/). +VFA_DATA="$(find "$DATA/vfa_t1" -name 'VFAData.nii.gz' | head -1)" +VFA_B1="$(find "$DATA/vfa_t1" -name 'B1map.nii.gz' | head -1)" +VFA_MASK="$(find "$DATA/vfa_t1" -name 'Mask.nii.gz' | head -1)" +VFA_REF_T1="$(find "$DATA/vfa_t1" -path '*FitResults*' -name 'T1.nii.gz' | head -1)" +VFA_REF_M0="$(find "$DATA/vfa_t1" -path '*FitResults*' -name 'M0.nii.gz' | head -1)" +[ -n "$VFA_DATA" ] || { echo "VFAData.nii.gz not found in VFA archive"; exit 1; } +[ -n "$VFA_B1" ] || { echo "B1map.nii.gz not found in VFA archive"; exit 1; } +[ -n "$VFA_MASK" ] || { echo "Mask.nii.gz not found in VFA archive"; exit 1; } +[ -n "$VFA_REF_T1" ] || { echo "FitResults/T1.nii.gz not found in VFA archive"; exit 1; } +[ -n "$VFA_REF_M0" ] || { echo "FitResults/M0.nii.gz not found in VFA archive"; exit 1; } + echo "Running IR fit..." "$BIN" fit --mat-data "$IR_MAT" --mask "$IR_MASK" \ --config recipes/non-bids/irt1_config.yaml --output-dir "$DATA/out_ir" @@ -99,12 +114,25 @@ echo "Running mt_sat bidsify + BIDS-path fit..." "$BIN" fit --bids-dir "$DATA/mtsat_bids" \ --config recipes/bids/mt_sat_config.yaml --output-dir "$DATA/out_mtsat" +echo "Running vfa_t1 bidsify + BIDS-path fit..." +# bidsify reads the 4D series from --nii-data and the transmit map via --aux; +# the non-BIDS recipe supplies the flip angles and TR, written into the VFA +# sidecars. The BIDS-path fit folds those sidecars back in and resolves the +# TB1map derivative as the model's optional B1map input. +"$BIN" bidsify --model vfa_t1 --nii-data "$VFA_DATA" --nii-mask "$VFA_MASK" \ + --aux "B1map=$VFA_B1" \ + --config recipes/non-bids/vfa_t1_config.yaml --subject 01 --out "$DATA/vfa_t1_bids" +"$BIN" fit --bids-dir "$DATA/vfa_t1_bids" \ + --config recipes/bids/vfa_t1_config.yaml --output-dir "$DATA/out_vfa_t1" + echo "Asserting outputs..." for f in "$DATA/out_ir/T1.nii.gz" "$DATA/out_ramani/F.nii.gz" "$DATA/out_srp/F.nii.gz" \ "$DATA/out_mono_t2/qmrust/sub-01/anat/sub-01_T2map.nii.gz" \ "$DATA/out_mtr/qmrust/sub-01/anat/sub-01_MTRmap.nii.gz" \ "$DATA/out_mtsat/qmrust/sub-01/anat/sub-01_MTsat.nii.gz" \ - "$DATA/out_mtsat/qmrust/sub-01/anat/sub-01_T1map.nii.gz"; do + "$DATA/out_mtsat/qmrust/sub-01/anat/sub-01_T1map.nii.gz" \ + "$DATA/out_vfa_t1/qmrust/sub-01/anat/sub-01_T1map.nii.gz" \ + "$DATA/out_vfa_t1/qmrust/sub-01/anat/sub-01_M0map.nii.gz"; do test -s "$f" || { echo "MISSING or empty: $f"; exit 1; } done @@ -141,4 +169,15 @@ python3 ci/compare_maps.py \ "$DATA/out_mtsat/qmrust/sub-01/anat/sub-01_MTRmap.nii.gz" "$MTSAT_REF_MTR" \ --rel-tol 0.001 --min-frac 0.99 --min-corr 0.999 --label mt_sat-MTR +# vfa_t1 is a closed-form linearized least-squares solve with the same B1 map +# qMRLab used, and both report T1 in seconds, so every masked voxel agrees to +# the float32 precision the maps are stored in. +echo "Comparing vfa_t1 maps to qMRLab FitResults..." +python3 ci/compare_maps.py \ + "$DATA/out_vfa_t1/qmrust/sub-01/anat/sub-01_T1map.nii.gz" "$VFA_REF_T1" \ + --rel-tol 0.001 --min-frac 0.999 --min-corr 0.999 --label vfa_t1-T1 +python3 ci/compare_maps.py \ + "$DATA/out_vfa_t1/qmrust/sub-01/anat/sub-01_M0map.nii.gz" "$VFA_REF_M0" \ + --rel-tol 0.001 --min-frac 0.999 --min-corr 0.999 --label vfa_t1-M0 + echo "OSF integration OK" diff --git a/scripts/make_bids_examples.sh b/scripts/make_bids_examples.sh index 737f1dc..68c9bf9 100644 --- a/scripts/make_bids_examples.sh +++ b/scripts/make_bids_examples.sh @@ -14,7 +14,7 @@ # # ds-irt1 inversion_recovery IRT1 ds-mts mt_sat MTS # ds-mese mono_t2 MESE ds-qmtspgr qmt_spgr QMTSPGR -# ds-mtr mt_ratio MTR +# ds-mtr mt_ratio MTR ds-vfa vfa_t1 VFA # # plus `ds-mts-b1`, the MTS + TB1map dataset the B1-correction path consumes. # It is a synthetic phantom rather than OSF data (see its section below). @@ -82,6 +82,7 @@ fetch qmt "https://osf.io/pzqyn/download?version=2" fetch mono_t2 "https://osf.io/kujp3/download?version=3" fetch mtr "https://osf.io/erm2s/download?version=2" fetch mtsat "https://osf.io/c5wdb/download?version=4" +fetch vfa_t1 "https://osf.io/7wcvh/download?version=3" # ─── ds-irt1 — inversion_recovery (IRT1) ─────────────────────────────────── # Stacked .mat measurement (9 inversion times) + a separate Mask.mat. @@ -157,6 +158,24 @@ echo "Building $OUT/ds-qmtspgr ..." --config recipes/bids/qmt_config_ramani.yaml --output-dir "$OUT/ds-qmtspgr/derivatives" assert_maps "$OUT/ds-qmtspgr" Fmap kRmap R1Fmap R1Rmap T2Fmap T2Rmap +# ─── ds-vfa — vfa_t1 (VFA) ───────────────────────────────────────────────── +# A 4D VFAData.nii.gz (2 flip angles) + Mask.nii.gz + B1map.nii.gz. A NIfTI +# source has no directory convention to discover aux from, so the transmit map +# is named explicitly with --aux; it lands in `derivatives/preprocessed` as the +# TB1map the model's optional B1map input resolves to. + +VFA_DATA="$(locate vfa_t1 'VFAData.nii.gz')" +VFA_MASK="$(locate vfa_t1 'Mask.nii.gz')" +VFA_B1="$(locate vfa_t1 'B1map.nii.gz')" + +echo "Building $OUT/ds-vfa ..." +"$BIN" bidsify --model vfa_t1 --nii-data "$VFA_DATA" --nii-mask "$VFA_MASK" \ + --aux "B1map=$VFA_B1" \ + --config recipes/non-bids/vfa_t1_config.yaml --subject 01 --out "$OUT/ds-vfa" +"$BIN" fit --bids-dir "$OUT/ds-vfa" \ + --config recipes/bids/vfa_t1_config.yaml --output-dir "$OUT/ds-vfa/derivatives" +assert_maps "$OUT/ds-vfa" T1map M0map + # ─── ds-mts-b1 — mt_sat with a B1 map, for the B1-correction path ────────── # The only dataset here that is not OSF-derived: a synthetic concentric phantom # (MTS roles + a TB1map spanning a range of transmit efficiencies) whose known From b5c2d3185fb80188b73b5a98e46d2c53bc2496d7 Mon Sep 17 00:00:00 2001 From: Agah Date: Fri, 31 Jul 2026 11:10:05 -0400 Subject: [PATCH 06/10] chore(playground): point dataset fetch at the new Zenodo record Claude-Session: https://claude.ai/code/session_01UPdViMfzMRjrtkSmwWbG5F --- docs/playground/data/sources.json | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/docs/playground/data/sources.json b/docs/playground/data/sources.json index 45803e3..f027ce7 100644 --- a/docs/playground/data/sources.json +++ b/docs/playground/data/sources.json @@ -1,9 +1,10 @@ { "_comment": "Where the playground fetches full BIDS datasets from. Each model's payload JSON names its own archive (ds-.zip); this file says only which host and record serves them, so adding a model needs no edit here. Built and zipped by scripts/make_bids_examples.sh --zip.", "_url_form": "Must be Zenodo's /api/ content URL. The human-facing /records//files/?download=1 form sends no Access-Control-Allow-Origin and is blocked by the browser; the /api/ form sends 'ACAO: *'.", + "_versioning": "'record' must be a concrete version id, not the concept id (10.5281/zenodo.21611551 / recid 21611551) — the concept id 404s on the /api/ files route. Adding an archive to Zenodo mints a NEW version id, so publishing a new dataset is the one case that does require editing 'record', 'doi' and 'base' here.", "host": "zenodo", - "record": "21611552", - "doi": "10.5281/zenodo.21611552", - "base": "https://zenodo.org/api/records/21611552/files", + "record": "21696048", + "doi": "10.5281/zenodo.21696048", + "base": "https://zenodo.org/api/records/21696048/files", "suffix": "/content" } From 4f173307a2a78be1050f34f625f885b96315781c Mon Sep 17 00:00:00 2001 From: Agah Date: Fri, 31 Jul 2026 11:10:05 -0400 Subject: [PATCH 07/10] docs(skill): add app-integration phase and the series-identity trap Claude-Session: https://claude.ai/code/session_01UPdViMfzMRjrtkSmwWbG5F --- .claude/skills/porting-qmrlab-models/SKILL.md | 65 ++++++++++++++++++- 1 file changed, 63 insertions(+), 2 deletions(-) diff --git a/.claude/skills/porting-qmrlab-models/SKILL.md b/.claude/skills/porting-qmrlab-models/SKILL.md index 29d2970..f921719 100644 --- a/.claude/skills/porting-qmrlab-models/SKILL.md +++ b/.claude/skills/porting-qmrlab-models/SKILL.md @@ -54,7 +54,7 @@ doubt, ask — that is cheaper at every phase than discovering it at validation. (or read it from a configured location) and confirm the target model name. It reads `.m` files directly with Read/Grep. Record how this model fetches its example data (an `onlineData` URL / demo `*_batch.m` / `qMRgenBatch` download) — the port depends -on it for the bidsify and validation gates. +on it for the bidsify, validation, and app-integration gates. **Phase 1 — Read the class.** Locate `equations`/`fit`/`Prot`/`xnames`/`st,lb,ub,fx` and options in the `.m` files. Produce a written statement of the signal equation, @@ -66,6 +66,19 @@ with their units. `TODO(port)` markers in `config.rs` (config fields), `fit.rs` (signal equation + fitter), `model.rs` (protocol mapping / `bids()`), and the `default_grouping.yaml` grouping block. Write the forward→fit round-trip test. + +For a `Series` model, **the per-volume protocol params *are* the volume +identity** (`engine::build_volume_ids` builds them from `proto.volumes`), and +`forward` must tag its samples with exactly the same keys. So a quantity that is +constant across the series — a single TR, a fixed TE — belongs in +`Scope::Global`, not `Scope::PerVolume`: as a per-volume param it silently joins +the identity on one side only, and no predicted sample matches its volume. The +fit keeps working, because it queries one key by name; the only symptom is a +missing forward curve in the app. Assert the two agree, don't eyeball it: +```rust +let ids = engine::build_volume_ids(m.measurement(), &proto, m.n_volumes())?; +// every ids[i] (VolumeId::Params) == m.forward(..).series()[i].params +``` → *Gate: confirm the translation; round-trip test passes.* **Phase 3 — Wire.** Confirm the registry line and grouping block the scaffold added; @@ -94,6 +107,49 @@ per-volume axis that `Protocol` already records from the sidecars. `FitResults` for the same dataset. → *Gate: human reviews the delta and signs off.* +**Phase 6 — Ship it in the app.** A model nobody can reach in the playground is +half-ported. The playground (`docs/playground/`) and `qmrust-wasm` are entirely +data-driven — no per-model JS, HTML, CSS, or wasm binding exists, and none should +be added. What the app needs is the model's *example dataset and payload*, both +generated: + +1. Add the model's block to `scripts/make_bids_examples.sh` — an OSF `fetch` + line, and a `ds-` section that bidsifies, fits, and + `assert_maps`-checks its outputs. Roots are named from the registry suffix, so + there is no model→directory table to edit. Run it with `--zip`. +2. Regenerate the catalog and the playground payload: + ```bash + ./target/release/qmrust catalog > catalog.json + python3 scripts/make_docs_figures.py --bids-dir \ + --catalog catalog.json --bundle-slice + ``` + This writes `docs/figures//*.webp`, `docs/playground/data/.json` + (+ its `.nii.gz` slices) and re-derives `docs/playground/data/index.json`, + which is what the model picker reads. A model missing from `index.json` means + its dataset root wasn't found — fix step 1, don't hand-edit the manifest. +3. Check the generated payload's `files.aux` lists every optional input the model + declares, and that its `probes` agree with the CLI's own maps. An aux map that + silently fails to resolve makes the app fit uncorrected while the CLI corrects + — the maps then differ with nothing to point at. +4. **Rebuild the playground wasm before serving locally.** No wasm *source* edit + is needed, but `docs/playground/pkg/` is a gitignored build artifact: a stale + one carries the old registry and the app fails with `Unknown model: ''` + while still rendering the pre-baked slice, which reads like a data problem and + is not. CI rebuilds it on deploy, so this bites local testing only. + ```bash + cd crates/qmrust-wasm && wasm-pack build --target web --out-dir ../../docs/playground/pkg + ``` + Then hard-reload — browsers cache the `.wasm`. +5. Upload `ds-.zip` to the Zenodo deposition behind + `docs/playground/data/sources.json` (the fetch path resolves + `${base}/${archive}${suffix}`). Adding a file mints a **new version id**, so + afterwards update `record`/`doi`/`base` to that id — the concept id 404s on + the `/api/` files route. Then confirm every model's archive still resolves + 200 with `Access-Control-Allow-Origin: *`, not just the new one. **This + publishes data externally — confirm with the user before uploading.** +→ *Gate: the model appears in `docs/playground/data/index.json`, its payload has +the expected aux + probes, and the user has confirmed the archive upload.* + ## Definition of done Always required: @@ -113,7 +169,12 @@ qMRLab model defines how to fetch it): suffix, per-volume entities, and sidecars match `bids()`/`bids_volume()`, voxel data byte-identical to source; - the model fits that bidsified data via `qmrust fit --bids-dir` with the BIDS recipe, - and its output provenance does not duplicate the acquisition axis into `Parameters`. + and its output provenance does not duplicate the acquisition axis into `Parameters`; +- the model is reachable in the playground: a `scripts/make_bids_examples.sh` block + builds its `ds-` root, and a regenerated + `docs/playground/data/{index.json,.json}` (+ slices) carries its aux maps and + CLI-agreeing probes. No per-model JS/HTML/CSS/wasm edit is ever part of this — if one + seems necessary, the app has grown a special case that belongs in the data instead. Required when a qMRLab reference result exists (e.g. `FitResults` on OSF): From fc1536422c28f0d45b9e12442938b42adc63548e Mon Sep 17 00:00:00 2001 From: Agah Date: Fri, 31 Jul 2026 11:10:05 -0400 Subject: [PATCH 08/10] docs: regenerate model pages, figures and playground bundles Claude-Session: https://claude.ai/code/session_01UPdViMfzMRjrtkSmwWbG5F --- docs/figures/qmt_spgr/aux.webp | Bin 13914 -> 53472 bytes docs/figures/qmt_spgr/curve.webp | Bin 35918 -> 35932 bytes docs/figures/vfa_t1/aux.webp | Bin 0 -> 7698 bytes docs/figures/vfa_t1/curve.webp | Bin 0 -> 16624 bytes docs/figures/vfa_t1/inputs.webp | Bin 0 -> 19240 bytes docs/figures/vfa_t1/outputs.webp | Bin 0 -> 21964 bytes docs/index.md | 8 + docs/models/index.md | 8 + docs/models/relaxometry/vfa_t1.md | 202 ++++++++++++++++++ docs/playground/data/index.json | 3 +- .../playground/data/inversion_recovery.nii.gz | Bin 175888 -> 175888 bytes .../data/inversion_recovery_mask.nii.gz | Bin 370 -> 370 bytes docs/playground/data/mono_t2.nii.gz | Bin 513728 -> 513728 bytes docs/playground/data/mono_t2_mask.nii.gz | Bin 338 -> 338 bytes docs/playground/data/mt_ratio.nii.gz | Bin 118474 -> 118474 bytes docs/playground/data/mt_ratio_mask.nii.gz | Bin 711 -> 711 bytes docs/playground/data/mt_sat.nii.gz | Bin 68128 -> 68128 bytes docs/playground/data/qmt_spgr.json | 84 ++++---- docs/playground/data/qmt_spgr.nii.gz | Bin 228803 -> 228803 bytes docs/playground/data/qmt_spgr_B0map.nii.gz | Bin 0 -> 29655 bytes docs/playground/data/qmt_spgr_B1map.nii.gz | Bin 0 -> 28749 bytes docs/playground/data/qmt_spgr_R1map.nii.gz | Bin 19913 -> 19913 bytes docs/playground/data/qmt_spgr_mask.nii.gz | Bin 370 -> 370 bytes docs/playground/data/vfa_t1.json | 127 +++++++++++ docs/playground/data/vfa_t1.nii.gz | Bin 0 -> 56380 bytes docs/playground/data/vfa_t1_B1map.nii.gz | Bin 0 -> 15865 bytes docs/playground/data/vfa_t1_mask.nii.gz | Bin 0 -> 353 bytes 27 files changed, 390 insertions(+), 42 deletions(-) create mode 100644 docs/figures/vfa_t1/aux.webp create mode 100644 docs/figures/vfa_t1/curve.webp create mode 100644 docs/figures/vfa_t1/inputs.webp create mode 100644 docs/figures/vfa_t1/outputs.webp create mode 100644 docs/models/relaxometry/vfa_t1.md create mode 100644 docs/playground/data/qmt_spgr_B0map.nii.gz create mode 100644 docs/playground/data/qmt_spgr_B1map.nii.gz create mode 100644 docs/playground/data/vfa_t1.json create mode 100644 docs/playground/data/vfa_t1.nii.gz create mode 100644 docs/playground/data/vfa_t1_B1map.nii.gz create mode 100644 docs/playground/data/vfa_t1_mask.nii.gz diff --git a/docs/figures/qmt_spgr/aux.webp b/docs/figures/qmt_spgr/aux.webp index 2f5954cca7823cfc83e5a6ef7dec9b63957f18e3..a7ce363ff37c9e1662c31f4e320b7c4401b26339 100644 GIT binary patch literal 53472 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

ax9dt{K39c3D4EdY`*_M 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 literal 13914 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 diff --git a/docs/figures/qmt_spgr/curve.webp b/docs/figures/qmt_spgr/curve.webp index 3561d16a96d2e304084e311127fe4f16075c05d4..4bdcc198992561850a439158bcef81aad2202774 100644 GIT binary patch literal 35932 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 E0K^ljxc~qF literal 35918 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

4xQC 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 E0K~U8m;e9( diff --git a/docs/figures/vfa_t1/aux.webp b/docs/figures/vfa_t1/aux.webp new file mode 100644 index 0000000000000000000000000000000000000000..15d82024b3a2053cd6ba9480f2829ad150ccce68 GIT binary patch literal 7698 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 literal 0 HcmV?d00001 diff --git a/docs/figures/vfa_t1/curve.webp b/docs/figures/vfa_t1/curve.webp new file mode 100644 index 0000000000000000000000000000000000000000..d4abacb9741e793e670b5a5673765fb4d38972f8 GIT binary patch literal 16624 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 P000000000000000)8(?G literal 0 HcmV?d00001 diff --git a/docs/figures/vfa_t1/outputs.webp b/docs/figures/vfa_t1/outputs.webp new file mode 100644 index 0000000000000000000000000000000000000000..a0cf965403994cd798c9d8088ef2d2a7dab7ca83 GIT binary patch literal 21964 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 literal 0 HcmV?d00001 diff --git a/docs/index.md b/docs/index.md index c3cd74f..14f8729 100644 --- a/docs/index.md +++ b/docs/index.md @@ -65,6 +65,14 @@ Fits the longitudinal relaxation time T1 from a series of inversion-recovery ima `IRT1` · `T1map` ::: +:::{card} +:header: Variable flip angle T1 +:link: models/relaxometry/vfa_t1.md + +Fits the longitudinal relaxation time T1 from spoiled gradient-echo images acquired at two or more excitation flip angles and a single repetition time. + +`VFA` · `M0map`, `T1map` +::: :::: diff --git a/docs/models/index.md b/docs/models/index.md index 14c4271..594330c 100644 --- a/docs/models/index.md +++ b/docs/models/index.md @@ -54,4 +54,12 @@ Fits the longitudinal relaxation time T1 from a series of inversion-recovery ima `IRT1` · `T1map` ::: +:::{card} +:header: Variable flip angle T1 +:link: relaxometry/vfa_t1.md + +Fits the longitudinal relaxation time T1 from spoiled gradient-echo images acquired at two or more excitation flip angles and a single repetition time. + +`VFA` · `M0map`, `T1map` +::: :::: diff --git a/docs/models/relaxometry/vfa_t1.md b/docs/models/relaxometry/vfa_t1.md new file mode 100644 index 0000000..d1e9686 --- /dev/null +++ b/docs/models/relaxometry/vfa_t1.md @@ -0,0 +1,202 @@ +--- +title: Variable flip angle T1 +subtitle: Relaxometry · BIDS suffix VFA +keywords: + - Relaxometry + - VFA +thumbnail: ../../figures/vfa_t1/outputs.webp +--- + + + +Config name +: `model: vfa_t1` +BIDS suffix +: `VFA` +Method family +: Relaxometry +Acquired volumes +: 2 +Fit granularity +: voxelwise + +Fits the longitudinal relaxation time T1 from spoiled gradient-echo images acquired at two or more excitation flip angles and a single repetition time. Dividing the steady-state signal by the sine of the flip angle linearizes the model, so T1 and the equilibrium magnetization follow from an ordinary least-squares line through the transformed data — a closed-form solve, with no iteration. That transform also divides the noise, which biases the estimate at low SNR, so a nonlinear fit_type is available that minimises residuals on the signal equation itself. A transmit field map, when supplied, scales the nominal flip angles to the actual ones before the fit. + +## Signal model + +```{math} +:label: eq-vfa_t1 +S(\alpha) = M_0 \sin(\alpha)\,\frac{1 - e^{-T_R/T_1}}{1 - \cos(\alpha)\,e^{-T_R/T_1}} +``` + +| Symbol | Quantity | Unit | +|---|---|---| +| `M0` | Equilibrium magnetization | — | +| `T1` | Longitudinal relaxation time | s | + +## What the model reads + +A series of 2 volumes indexed by `FlipAngle`. Volumes are matched to these identities by value, so reordering the acquisition yields an identical fit. + +| # | FlipAngle | +|---|---| +| 1 | 3 | +| 2 | 20 | + +### Where the protocol comes from + +In a BIDS dataset these values are resolved for you: + +| Protocol parameter | Source | Key | Resolved | +|---|---|---|---| +| `FlipAngle` | sidecar field | `FlipAngle` | per volume | +| `RepetitionTimeExcitation` | derived from sidecar metadata | — | whole collection | + +## Inputs + +```{figure} ../../figures/vfa_t1/inputs.webp +:label: fig-vfa_t1-inputs +The 2 acquired volumes, each labeled with the identity the model reads it by. +``` + +```{figure} ../../figures/vfa_t1/aux.webp +:label: fig-vfa_t1-aux +Auxiliary maps and the mask applied to this fit. +``` + +### Auxiliary maps + +| Input | Required | BIDS suffix | CLI flag | +|---|---|---|---| +| `B1map` | optional | `TB1map` | `--b1map` | + +## Outputs + +| Map | BIDS suffix | Unit | Fit bounds | Fitted | +|---|---|---|---|---| +| `M0` | `M0map` | — | 0 … 6000 | free | +| `T1` | `T1map` | s | 1e-05 … 5 | free | + +```{figure} ../../figures/vfa_t1/outputs.webp +:label: fig-vfa_t1-outputs +Fitted maps for one example subject. +``` + +## Usage + +::::{tab-set} +:::{tab-item} BIDS +:sync: bids + +The acquisition comes from the sidecars, so `recipes/bids/vfa_t1_config.yaml` carries only algorithm options: + +```yaml +model: vfa_t1 + +# BIDS input: FlipAngle and RepetitionTimeExcitation are read from the JSON +# sidecars via the model's protocol_schema(), so neither is declared here. + +# Fit algorithm (an option, not BIDS metadata): `linear` is qMRLab's closed-form +# Fram linearization; `nonlinear` minimises residuals on the signal equation by +# Levenberg-Marquardt, avoiding the bias the linearizing transform puts into the +# noise at low SNR. +fit_type: linear + +# BIDS mask selection — disambiguates which mask in the dataset to apply. +mask: + desc: brain +``` + +```bash +qmrust fit --bids-dir ds-mydata \ + --config recipes/bids/vfa_t1_config.yaml --output-dir out +``` + +Fitted maps are written as BIDS derivatives: + +```text +out/derivatives/qmrust/sub-01/anat/ + sub-01_M0map.nii.gz + sub-01_M0map.json + sub-01_T1map.nii.gz + sub-01_T1map.json +``` +::: + +:::{tab-item} Without BIDS +:sync: non-bids + +No sidecars, so `recipes/non-bids/vfa_t1_config.yaml` declares the acquisition itself: + +```yaml +model: vfa_t1 + +# non-BIDS: protocol from this file; mask via --mask +# Flip angles in degrees (BIDS-MRI convention), times in seconds (BIDS/SI). +# The linearization assumes one repetition time for the whole series. +flip_angles: +- 3 +- 20 +repetition_time: 0.015 + +# Fit algorithm. `linear` (default) is qMRLab's closed-form Fram linearization; +# `nonlinear` refines it with Levenberg-Marquardt on the signal equation, which +# avoids the bias the linearizing transform puts into the noise at low SNR. +fit_type: linear +``` + +```bash +qmrust fit --data data.nii.gz --mask mask.nii.gz \ + --config recipes/non-bids/vfa_t1_config.yaml \ + --b1map \ + --output-dir out +``` + +See [Fitting without BIDS](../../guide/non-bids.md). +::: + +:::{tab-item} Browser +:sync: wasm + +The same core, compiled to WebAssembly: + +```js +import init, { fit_volume } from './pkg/qmrust_wasm.js'; +await init(); +const maps = fit_volume(configYaml, data, [nx, ny, nz, nt], + JSON.stringify(volumeIds), mask, '{}'); +``` + +Try it on real data in the [playground](../../playground.md), or read [Browser & wasm](../../guide/browser.md). +::: +:::: + +```{figure} ../../figures/vfa_t1/curve.webp +:label: fig-vfa_t1-curve +One voxel's measured data with the model's forward signal at the fitted parameters. The curve is computed by the same Rust code that does the fitting. +``` + +## Implementation + +- [`model.rs`](https://github.com/qmrlab/qmrust/blob/main/crates/qmrust-core/src/models/vfa_t1/model.rs) — the `Model` implementation: measurement contract, protocol schema, BIDS outputs. +- [`fit.rs`](https://github.com/qmrlab/qmrust/blob/main/crates/qmrust-core/src/models/vfa_t1/fit.rs) — the numerical fit. +- [`config.rs`](https://github.com/qmrlab/qmrust/blob/main/crates/qmrust-core/src/models/vfa_t1/config.rs) — configuration and validation. + +:::{dropdown} Fully-resolved configuration +Every default materialized, as `qmrust dump-config` prints it. + +```yaml +model: vfa_t1 +flip_angles: +- 3.0 +- 20.0 +repetition_time: 0.015 +fit_type: linear +``` +::: + +## References + +@fram1987 diff --git a/docs/playground/data/index.json b/docs/playground/data/index.json index f5867b9..3f472df 100644 --- a/docs/playground/data/index.json +++ b/docs/playground/data/index.json @@ -4,6 +4,7 @@ "mono_t2", "mt_ratio", "mt_sat", - "qmt_spgr" + "qmt_spgr", + "vfa_t1" ] } \ No newline at end of file diff --git a/docs/playground/data/inversion_recovery.nii.gz b/docs/playground/data/inversion_recovery.nii.gz index f2a740f4b2fe4e737eb3f3745972d2a4e903adbd..f94ccd71bcd2f296bb0b7aa998deb40a9506fafb 100644 GIT binary patch delta 24 fcmbPmk88p`E_V5D4vy}G>_+xhcE+vjOq}ZhYOM#8 delta 24 gcmbPmk88p`E_V5D4vzk3DUIx{?2KF4nK;)20C3z0761SM diff --git a/docs/playground/data/inversion_recovery_mask.nii.gz b/docs/playground/data/inversion_recovery_mask.nii.gz index 917672db7000caa862bc920b309d189af27dfffe..3b9dff3f400cf77c0f7ef96e1fd8b3a8faacbc2a 100644 GIT binary patch delta 16 Xcmeyw^ofaGzMF%iJ0W``dp08gFc$?R delta 16 Xcmeyw^ofaGzMF%i|5?gL_H0G~Gc*OK diff --git a/docs/playground/data/mono_t2.nii.gz b/docs/playground/data/mono_t2.nii.gz index 69fe77cd3d6c4758eec4cfcdfa4310abe7f44468..e4a9743fb9e45ea1f7011bf20c14fd66db8ed812 100644 GIT binary patch delta 39 vcmX@GR{p?Rd3O134vwyb>_+xhcE(nArdD?5R(6(FcGgyQwyo^!JFfu%^t%gY delta 39 vcmX@GR{p?Rd3O134vxNODUIx{?2N7KOs(w9t?VqV?5wTqY+KpccU}Vk0;UV; diff --git a/docs/playground/data/mono_t2_mask.nii.gz b/docs/playground/data/mono_t2_mask.nii.gz index 197d93b8754b3403a662dcfc6490b0be96dcea65..a30f5114b1471e754589c9e195bc89a8f78689dd 100644 GIT binary patch delta 16 Xcmcb_bcu;wzMF%iD#m;KaSc6Rx04vvn5>_+yj?2L!c0RUDQ2gd*a delta 21 dcmX>#m;KaSc6Rx04vwB@DUIw~*%=R?0{~jS2uc6| diff --git a/docs/playground/data/mt_ratio_mask.nii.gz b/docs/playground/data/mt_ratio_mask.nii.gz index 4881938ba7493425adfabac5b6c340ca5e6d55ec..a3e9869b1912e72564b2305c77f6abd3907fa15b 100644 GIT binary patch delta 16 XcmX@kdYqMAzMF%iBO!Yu`vE2ZEB6H_ delta 16 XcmX@kdYqMAzMF%i=UK`|_5(}+FBAo; diff --git a/docs/playground/data/mt_sat.nii.gz b/docs/playground/data/mt_sat.nii.gz index 166043cbaa1be21687a811df47b4f3a8e01508cb..183a6230010311855994e6d74dcb76df9fc04b39 100644 GIT binary patch delta 21 ccmZ25g=N7M7Iyh=4vx-*>_+yj?2M9J088!#?f?J) delta 21 ccmZ25g=N7M7Iyh=4vwB@DUIw~*%>9d08oksZ~y=R diff --git a/docs/playground/data/qmt_spgr.json b/docs/playground/data/qmt_spgr.json index ccf231c..d1d3572 100644 --- a/docs/playground/data/qmt_spgr.json +++ b/docs/playground/data/qmt_spgr.json @@ -148,7 +148,9 @@ "data": "qmt_spgr.nii.gz", "mask": "qmt_spgr_mask.nii.gz", "aux": { - "R1map": "qmt_spgr_R1map.nii.gz" + "R1map": "qmt_spgr_R1map.nii.gz", + "B1map": "qmt_spgr_B1map.nii.gz", + "B0map": "qmt_spgr_B0map.nii.gz" } }, "probes": [ @@ -156,96 +158,96 @@ "x": 44, "y": 59, "expected": { - "F": 0.05300017487887694, - "kr": 1.372073608347935, - "R1f": 0.36202925148630255, + "F": 0.041972349090867486, + "kr": 1.759471728032511, + "R1f": 0.36540986647975354, "R1r": 1.0, - "T2f": 0.2192939290820705, - "T2r": 2.4956842789910963e-05 + "T2f": 0.24534524196001534, + "T2r": 2.4285383350978262e-05 } }, { "x": 44, "y": 60, "expected": { - "F": 0.06224555785830465, - "kr": 1.4047882495532462, - "R1f": 0.38172936155295517, + "F": 0.05345576802560642, + "kr": 1.645954774649812, + "R1f": 0.3843797749326214, "R1r": 1.0, - "T2f": 0.23266186218045734, - "T2r": 1.9616867190917142e-05 + "T2f": 0.25197324048665115, + "T2r": 1.9593605864564444e-05 } }, { "x": 45, "y": 59, "expected": { - "F": 0.05634560941595097, - "kr": 5.716135821733814, - "R1f": 0.5005926321293412, + "F": 0.04539985726113359, + "kr": 7.1472283111430635, + "R1f": 0.505079977099391, "R1r": 1.0, - "T2f": 0.09901627562308034, - "T2r": 1.683890127108225e-05 + "T2f": 0.11750031952555665, + "T2r": 1.6840706961429977e-05 } }, { "x": 43, "y": 59, "expected": { - "F": 0.11653333616795433, - "kr": 4.41546957970384, - "R1f": 0.5785705173026349, + "F": 0.091137522251265, + "kr": 5.707603041263472, + "R1f": 0.5868848643545267, "R1r": 1.0, - "T2f": 0.048270716331596825, - "T2r": 1.2295079651386293e-05 + "T2f": 0.05688939679075666, + "T2r": 1.2233467907302056e-05 } }, { "x": 45, "y": 60, "expected": { - "F": 0.0942517203658808, - "kr": 1.6108080848529764, - "R1f": 0.38526963507555695, + "F": 0.06884209221313731, + "kr": 2.291632741979387, + "R1f": 0.393562196505434, "R1r": 1.0, - "T2f": 0.18029568730812962, - "T2r": 1.7873164777900217e-05 + "T2f": 0.19932232895490987, + "T2r": 1.6836641709056026e-05 } }, { "x": 44, "y": 58, "expected": { - "F": 0.04062384173604257, - "kr": 2.2513276373760673, - "R1f": 0.3391302605377426, + "F": 0.036397172596203294, + "kr": 2.5370624527573797, + "R1f": 0.34077369115076434, "R1r": 1.0, - "T2f": 0.22583779353466388, - "T2r": 2.0639234177539614e-05 + "T2f": 0.24310588565382457, + "T2r": 2.064574908527275e-05 } }, { "x": 43, "y": 60, "expected": { - "F": 0.09843619114019068, - "kr": 7.0813932647058415, - "R1f": 0.5609265955317233, + "F": 0.08393498926334715, + "kr": 8.22153275303287, + "R1f": 0.5661992247949829, "R1r": 1.0, - "T2f": 0.05550944274651021, - "T2r": 1.091021834914503e-05 + "T2f": 0.06102644239541892, + "T2r": 9.286678498055602e-06 } }, { "x": 45, "y": 58, "expected": { - "F": 0.08500016571349665, - "kr": 3.754470613953896, - "R1f": 0.4457359363362734, + "F": 0.0692408780349158, + "kr": 4.679847895983417, + "R1f": 0.4521136529591253, "R1r": 1.0, - "T2f": 0.09049584862873235, - "T2r": 1.1962224219342986e-05 + "T2f": 0.10507429908578836, + "T2r": 1.1935427445800394e-05 } } ] diff --git a/docs/playground/data/qmt_spgr.nii.gz b/docs/playground/data/qmt_spgr.nii.gz index f57f89e03c608320097748894c77a92ba0cdccb2..43e14adb8dc9a3bc96702c0c07fcc517dd0dfdbe 100644 GIT binary patch delta 27 icmX^7oA>Z_+xhcE(nArmgJEdujoa^9f1- delta 27 jcmX^7oA>ZjRy!CT!U+H zcTJ|NaMwU^mcgZ`hd|NGxo`TzXx|C|5yC{WD2 zUs?2a@BPPZoed32>8FnlsyXxO>M6lF<%16u_0y$!MY`ADoUr(N#juZCofdkw`>x`2 zRr+xbov%Ll&*sG*-+wY2dJ_t>pi>Pxa> z`e}hS>PYbbJ%7(_wRo)SZmmCA4WE)#?c2UgT}{_g<=HpIxp?c8%kR%$+piY+juAx; zw31a`t`@}~eHKrSr4`|4_lOa@TFcN>1@yAF#q{5s|5O)mq}SDJTvIj6*Vi{!mY1>O zCe|g6)$lxRbHzzM+L6D_=qav0-7dEHP8WF!EpX>od8SGiODG+;ln!fMR+h?C|f12t6#jUrcd-NuM=E*Dk^nrB}ZK?=B{qxClh}R(62_OmgA>9 zbBAT|5iR>q@bq1~MU-tGq-vBNC6XttB>SzXtzZ08TyFoTk_6x8oquo{B@0xp zIQewRnAhrSy4rf-wo9IcWp{{DeGBWgd zp%c`x#KrX`aaO$=e$!2oV~t9_C%JpG&383yVl90x!$}dZ$WiqvOJ;qib#l3A`L@V) z&-SV&gU-6WZoP8f?!V^_Z+_18dlo1UFKH;dr8ups7Rey1#9Ay~t*k10f4dWOp;2Ph z`~DAuRiouuwHsDJM_+C&F#%VrW zJo=GY&c2aeHb2`>m8_c43GrK|&d&d!npSz|OpT6Gv!|8NCm%i(-M;(F9(fOmB<)-4 zi^-n}|8PgY{*hC*ne$w<3fn2p`81H5PCgeeBhqW+WAk8NohbUQdUy7K>hmd;yy!nt zHO~7Dp`((|jxhDAD8XZR#3a%pE zpf-=csSYQ9b>PXp-A?DeRn(Qc)72kgu4sI}t$38?kyGe#CjDf-55C(fd^I1L$&n2R+}Ty(JMm=%9io(D)23{y{t^re4GsmC9=uQd-PcE-+jPSj+2MiHvq~H1;+|s8^t7QKPn-N= z@wZ^PBc`jGGkU%_9UZJ1oKEM)jq}(E?(;(}X^=}UQcd;wuq9%0?_Q!=qXMGDo@ZiZ zJy)b2*HkB(^FZu7QB!Uo7^v4=%P&jaiLVdOD=r@v?IT)U_LUZRTn7%$z==D8X>JkGdIOo645NRG(*86{ZAjYKnB7XZ4TXIj!>t@vfEo#atv0LbF zKQ61@s~gC~2x6p)*DJjnATd?i7k~*WKnLbI*z^i)B=b=5Y19>^ zj&D|vS~k&18m7`&YHScMg8D>8&EF-?91l`cuO`)7qq51@Idf<*z1zK(JmC|pPlO&- zp`V)?*$S&xO!jZuLiQ@_5lfOT6v*`GN=@{;h8`K7=YzT<b_L)RRhRwRZa~6<*6@wvc;bY@6mH!O)Bb%UJhw zIwHjekMnbp+Slc)YQ8OnzBa9}j@kWM9PaNUyVP!~@>H#8@NN0Es=U>*p8n_2UJ<+8 zZ|cd+N-F=lBC2=E^m_Bz!D`^tSTg)@O`Z3Ah_2Xwp{U<4y^0=iN%X03LmZo3NYBVp zQf}LsTsY@ysPnbAs(2?7>&hd26}nZrRUTbpWNSHpb$OX7(L<4cZ8MP|@|5$v)(fZP zjS5m<+!Oir{jA7;_BWFS`{vcJJT)};JGD+zIj>_YRXzN)O8xGNnA-BWx^OCoY`d?b z^lg$^&xl`0ep%B+w1}v!6Z!5HpFH*S<@C8^$?mE2GEr6z9lA+H&5`oU`&RO=jt#YM z-yl6IaY5PnYJk4kxTL-vJEttNpn&vi-$?%ccPoj#oL~M<#LEXQbn15lodwN4c?QhR zF59KbAR`L5))`)&R^O6nu_vsI81lT5bU$U)FOq$87OomA)U5>i(^`LhXhvOe@m@KN zJmM=H@{eQqH+{-vdUvT^BCb5BhUahQX;|yFv*J)ronq){F}8b@Xx-dLcVAjsH`-KF zCtv8RvBNd<#nrtUcyzbgvBic38D(%-h$uE?hFY3xh1)7bsAZqtyKfHEadSr3l<$sJ zmVZa*m0-#}#B@w1_JkZ#HF^k@Yr%KbbxnNTvg2ph*DWRMb~!KFT+OOQ-skFFaALhX zUOc^W!2yNOP`i=8O!0dnx$&#NTs^#w?6qWyT7Pz<_}qVvI`*i9{NrUAy?f9mH+57U z`FP(K@pou0nc`C^c{xuT`7?{ZoZ05N_~TGM*|T|K{o9#9-Dz-H9ayG_Y+n7fnEErH z!XE0d_G)XrQnK8*QnE(EJaSvp`tti~f7#}|ln-)em*-M%5aa)8EZ0mJ>g4J=PgI*e zT$OruR$aXO)r_%6=ZdmIqGMvs`X3^0*Ifd94|a@l6aKr-ZPhoOULDjzZBt|23J*uP zPd4urgZz`|Z$0zr9t}!K&((^0?ekX=F^@9Im~_z!4nsft_M7gujX5T+HVRV@j~3Re zC)E|BH?3UI?3~juytIyq8zjpdUoI9V zk}_>T4pFu30&zZcthoJeO8GSY9MQ2sDJQyZT3z9<=?Yogu_}pPQ|zh8miv&K^L{T; zZ$yY{F|3TdTIRDjd1R&P@N$;Ne^+)rWc*9D^XwrTb?}LJ zUN*boho>`_i>{IDo$&<RHeC1Xh zZ>g=po7IV$6=mM6iS>xUcv>HcrK1m@Q&rZ+6NUQhaF#wxtMLikA=?GK6p^!p4r*IT z|BSApG9_sfRJ>7VRbYz0dfFnMMAo<0>aEWI)>;NdIeN&SAJz4Nc{Es+xmsH1UsY94 z3VNp&rRnR895LOA^QDMRH8PD_lf8v*-RFcyIyK#+$wNfK?TvLl{~03AjoR|SvTE|{ zDL>g~Tz=WM%Pk{kFJ9jkg^I*vnRf%VizH@zPE^p!KR_)#^bbAFAV6#3^H^*K&W znRr)nnRRkud9Uyp(N66%^1G+g0;AW_D$E1-oIP60?U2!<+ckM4PCg3MI~v#0v(}c^ z)l1!12Ua$fZ!h0cYyBp>?wyu0b7(EyTzygP!b_>7wco42@xZD7C8YT6bHH;VRjx^Q!oug(~j3N`PRiX_uluo2 z%uaVijL+Oeq)PHy%ze7hiTk*Ou`TN^gh+Je?z_^GG2y!(%n%{+&8{a)hr6m*!39c( zr&8zJ)Ri6k7t(VEM~hfv^C^5k-r>RvB9E+CY>e|bXC__hR!J|1ty86*_Eo8CHY^l@fcwrg5#ZNw2TtE|_ zCC}}ncV$kZi!RD73tm)ehxE}uRvuQ#6TLR}^nTMIi4ITkcT~+ym36wP=Hk(@Zfa%P z02$bQmzs{_CAN3UrtZ5zqW|rxvUTkf&afMQiSlCtWP_PY#l>+y zMdp~(VqMQIVo1X5I_{&&L8U%z71)nJH@`f5^_4*XqhpHch{OeT_Tshm$T}I+{y%Ss zWJlJC$(<6YnoANI8_;dEt5(-3uJ#_hr-(&vHoD@*)ZXmYtJli;aXg+T_KS@3LzRr* zT(^E(S}zR=k{utX(2Y`5myN!9jD5S5BAF9^tw+4xlv#&`RTpbl-V!CNrjhtaB^DLa z_~RSPWYN##CQ!ZC&5O+BA1*=*KM=Y?P2(TKrIlu_a`9as+^eD=g{7A@7T1v%^Cp+C z7Nk~js?-rVj(2k5dHkFqaboHEeapL-^X^f^uQ`fcbqZJWa*;RgNd9xP`lC{y9JkTS zgT+(pxn+_#K3mf%?DfhibKQ3PTZ?xkvdB&&o9XHo%V_ueBY}M6iYg|KmO1Y{+n3N0 zcQeaRWlM|o$6h;s?2B-o$LXaWEgmJ-&+w7H2Lt5MSn>6N@C^FWp_F=ijL^g`>(xnh z{l_{ndcsOI@P?x!R{pDosvd6bI4LzT-{A-M4;DHgBU=uCul6L(ZsLeGG40iXRjG8* z<5flG;Cm|F1b;cJ$|bQWc1byUbODJS1YbA_n>wX+pzPK=v%Ec}uxwl1*Tm#^qhA~oby}2=-G?qypL3VhTcYUv6=fI8*Vq)>4`by|x_4asEH7Mw@ zY86n^9ou)32v-$FMA!^L%#+~lV|PcbaOcka5LxB%7%?(Ps+M{8h`_p~Wsiyr)!FR# z)RX0@)w`-SBOfKoB=8Ntv|p;oWgJiw`w7}Rn8{5{-LUJ z{r-lM+{3r4?^MCzT}9jPFP$GrUj}VFa@gsbwy0dwHm!^^IarHNxnzNX4^_{cc_chN zacxOmqS(LUOP%bI#2WzvyQ(5@N{T)2SF6+~nnuR-t|uP#pP=UWij&00S{KCU0d-~SV<{zZ zbiO=!GTzsXNT7NN(p6qwmh1;sNk5NZ&-gSvb$Ar&u@LQYjy5vrnT}Tc( zR9-j8<)g_x)YyMTjPNvHb%=Un&a&Vkswof6mQsl#oqi#a`4i1J_3n_L$@ zeX(gZW!$wN-Acaobpp?Pm$>)P%m779T)KHWy);%9U9UzNxgp;EVqb=O>GoLk505B05Z~tZQ8U>e*Q) zm;RD4h5j>OmwV(xRufO{m{-slxVffiJI*(f7`s=MWe&N=lFKXV8~Yu(Y*RX?a6o`s zncnN4du{x!jZNg%nE7Ht_1mIX*NSeT+7-qAk6n#Fn8uS_TSnVVx}fD3;GlpCnX zlSN-Usy@7ZFH$XStrz*`ln>LDl3Akui!X?)ZU<~u=vBWKnPkOr9%H|kHz=aXiM4*6 zTN5jC3}Zie4+!wcJfK{(tFvu{C~Yk(A@qpA)O- z5gGmEgNUuFP{MkKf5{zA>X1y<-rd-Jc<_j)$IOe zUWhV!r08^}pYau9U0&g!!$bb6=WJ=6$B8GpIjb^FavtUA=!i_A&iWrdB3|-!Mz=He zz7dFx`6uwJQ#i1L@Za2B?EK!uIkdECQcH46_)s-t?NE;l_{Z!Rn*3~a=dUWvDC+d4}N=-h)BhzYl4<93ke<|H}ejk-~RS_AlYBBxlLjpNt zW@!^EfUjT8S*ljSO6pqXdjcFQMHG<-f0UGuw&u~~$vT}&q;oy+`g*BP8{gwph5E8h z^kb7#ES-OgL;iVIxtSuPXM!5BV3qpw-AjN~vW7)yuPMM3MZ(<@tS!oIB%B zs!@$w>hVtpsr%jEslY?!Wt&TlfSso;LlDYE=As2J23Ld=gBTH>~AycIn;pg(XczuyU%kjJ-O>3 zf9aPO6n$^z6sOY_6-5uMa`Hy(6nA^>P<__cRM?s$dzuC=uRp-Sr{DV}sY{+cR`y4p z0l(#OYn3bIp6KN3rdsti@>W=S2iw!LZ9%=cb#@sZy+s^aJ3JY1?JV2EzQxJR5Fdp3yf{*%RqjOz@(*dWF^Vc|wM%ai81 zQjN)i7!uzUAGh1TdFA*sdGxA8HDo}V8LH~fA}(=zff0_HTQQ})aJ`je{MdSY6Jn6k zPY*g37p*yn?f#i7&;jF0;Q7>DMA{i6^zqwh@ZQ3Mq&4s=W9fl5>p~KP3~**ocMRl zdC6|AoExwGO>U1Gz@ll>#K{i*44>RAT+#VAdWzxi)WeTC1v|cVd<&EozsDLOHa|=( z6V}cpB0|&4sCfg$hnrP(x4C;%?W*$?u}Hh9Z6eU;vB;2MjHvlKnatU1i<<45UtB+w zME(_BPx0@SZya>+C98ZdZ}^wmMzMX(G_{??-Sg{p{qySKIi{&CmjYzYp24!(z~(0R z@FU$mwJPa$mA<5-=Z>tVvo;ITG0}3m{{xH(?a6mwB_n$&NYEc-;XwO3vW=vK@ae;kyHEvYMZAbCX0J9 zmyB2^^!!|$pWpXb3|)|%emAzts;bB7?FCf3AA->(ALy@(!N>eCJRj|5+5%tD&#uk%!w{3k>?4!v+0Uk zTBsMlT@>=)Ao*!nA~}2Id2w)Spe9E&AgZh&zR7&{gIXS*z~IZ+h{ff?j4ENez9Q}6 zBsyE3?7BtvPl|d~(H1Rq&D0I0n6l3$w?z(n;<9FvxDA_?cvchD<9K3GY}qI0R@-?l ze!=wnFATr_(|TS|fpf{7aaE*f98*SYUsF!Nfz+L`x7a#tJvI*8A1`x0r%IA%o{?*( zds0@Z=-H4k#4~U0M)Ui%wW^AlVOd3tTi8R)fe*|pZ>@oPHq>+)9mu<&Axv#leaF1)NN+x#43U=k=4xPUrVmoz82sh~#q@h#bB*RQ3{M zT>l=8)T&9(%pUyQ%C0itxlA7MybQc79Jvfbg4fqxdyQzxA zToco`tW^zH710I!D`@h7E&cOr^3(n^O2|xAlZ)Ti*3z3thpU*`Y4wb1La+FmQj$Ny zo)F*OtRC*!lj^;vcGynOy{&_T@DK4#;ee_-POMyf{^JsdcZT#gJ_e#pjPF6?yUJi{~k9 z%i}el)sDTsMtdom!%UH4+Z;?9W_TRPf6ws9z#W!~pnO=ohutxu*)5+!%FJd@gcIiKFT`aI%dJ z)~$-|d|rRUvt`j!^WxmZzi>C-b8h4eT*3Ec_mm#^7M=%Jc!6W6i}CwAmA{#I5I-88 zI*_c4@dqCc^EKDOx8BoH$Q7}>ig6J$M6WT^9C{LnPv8VNhTI^zZgOLtbYiu>#%@I) z2)3A7YQb0~^}Opn9CF>G<~&gNY2PN^bg*>=Iy**wuLez3i>~BRb2}H+_)p6V6qA*z zy>l<8@|D-43#sHO6Y7nttIAHD9=PPY@p+zQ&8mo7=>xgY>R)GD>SKcVmV5#_i5(j} zFq4?Eth6{cA%X7QFMZ_S?FvUSX1Ieq7hDUb z=7RY|Kag81zwib4HjFjGGyCOeqesX(^R_!UrNex_yz$OMyvMn?#_9(ZBAJIZJ1TnM zPPmb}5BGq~_5aJMn!#!u04ir93hpULkV^rUTi4;8x_&2x4lou}-j(5qS98A4L zWb3rUJ^y!YJ?GdR<3CVWB^QkEJooHU5wKZ`ks%SHUhgXU=7kvbrxRDwX9BlgZ_`*J zo6{1d5hWX?GC9E+*=stShcUyUCE7GHJUMAZR<-DOeNzYbPD>CvPhAE6*q$+o!53Kr zH)It&%Pm-H@Z%WtoZn#2I0m1LYhW+QFW@Iwe*wIC=UC1OCg>w_O3Vaz@fp9H>o6yb ziJa1pm`X0WqO2VUi|A(U1U&n3^Fj}N0e6jWb=En%tbszV!FBM|#5${-AWHf^R!e)u zHZ`4@5srqV*8Du_CJd-0j{Ce*AL~^x{4lD|iwu?)JC5fa94yYIs*d)M7h#UTg=_PIFOaz%vAzW{CXUCi zKv$SA&d>PZjseBTn)4v*{5D_4B*s3jJX6BdAn_l*clcd^C1XRr0~_yjL!)yFe87r7 z!vucw_k%Z8yW^z<{w~)<&mKhyHCqi($2(`$%wzf`84SM9d>^~n+BVnZ-RC^pq?Wd< zC%f&dqeC(lk)u=07Zn42WZ=NYnqGwJw^oV1yGFV`F9*Bi0q_y9BN@Y%IMl8)3=9<1 zUKkTO60k?MxOZfT`{df#ALIyM0DVASzy#T~7<1pq7}&u*9QV59dBYdTDfqw(@IA7F z{PJ&{3l8A?oC}!yI7m z@VV(tVZQK@Z!XRt$pL$OubCINje70$@La0Wv=$nl4}44O%<9Uc?J8-+6BT$TiLNrzua4|f?PaO$l&mVVqe1<&WB~G1@ZQip?M&OpR6s$MGp4$rrwJd2Imf>t_Itf%u>(hCO|Vd5 z*TO&mYdD!*5WbfG$_6n#_Y;uq36$EG*(i;wX2O&z%_c6r$+$38`jw&UY# zk!Zq7(c8_X=^xmZyQ8Zk0%Xm$-4uC6(8(SrD?wP%bXp0YkDc)<&d z$#N_AiawE(;5+mkj^ud0L#B~mY!$Kvj$n?=fgSkbi-9+D-JsCR2=bc6iwueYE6#;| z!>+;Oh5FnubH{c0jLh3}GB^Cq@Ai-Mi#*dKTV$7io;dV?(!XN!dyVEzb%;rc_r~Nn z;XG^5P8{$w*VMuB4d}BGYqDr+sf9PDl&ik(Q!QT}GxqIpz1rGyyQSux{xZ4Xj*8W{ zr1UMAOnyAINKo@4&c(-h6PVrPDabDqV-inMJ0zd=tYLXsr&M3paxIv0FT7j(2EN=Y zx(gR0Q`jP83_Rg#WRm#I`ds`L{pI)QJvm_b7d)uvP`4`D_ERJ=HGUCuCqCsjF$1y+ zXQMB02Xn;yFqiNTe=|m|MP8KOlf$3fr>1;8zmoW~?RbIQZg0NU#3}fotwU-$Az7+8 z#O}%3R1n~qxJE@8wIG=$mOor8+T>yBH38qxn{sMTKndBTUwzqg?`p+s&c}vg;?vxM zTxHDfe~H4y0|asUx&5gGc5Kl84d(CbWn!Bi(8xK*1$7C|hdf|&z=r$bZ|>#bhfsqn zID!?Nfqa7(pW#RN8QJCY`KC!Cz>ybo1a4r(ahwy`Mt1QNiJeyT3wGblUgDzj#Dnb#?tSx7(y!adW zM6SV(-y&Cx4X%KT!2%gfcs;3!FTja&qt|T@jE*F?M17eaP<}_xBRYpIg%>O?@HEF$ z3r6-CFXsSfdW)!&z{QF0t&hAvIg2}VQ9-v}t7(E92Jr~@)Nod4B=zqRiBm>C-rQI{ zY~Eaxf4H!Bv~pt{(_1urM0G{a3uAel_mJtG>%612P>Fm+#rD;muaoL)`Vq;MR=U^8 z;l9W*U=yjM&=c7{exR(A{F>?2`?9mF3*N{M*jQQNGcRPBdjv;5qmSTfa|pb!WgG`? za3eAgmf(%-^1DuF8#}~h@#C~Ln879Zfc^61aCf!q<_-w!;^M=STTgwatjR4gZ}>0p z3Hpz0CU}_M$SD}%dr%ie7m#akM~(+2DqWRhcVSlGGRIS0dK?>rI$T4kV~;kVsp5 zzNtCz@9*~)Fuuu={5?gD%LQF>i;NAqv~@>oJHQw|=5OQ|F0fd0403JrH5|)3a>hL) zv)Frnk6lByxkqY6=sWX+JkI!>J95Xtgl_G>rbkkHX1>YWkShRR z%WFO(t2X~eZU}6VZ;qkvMNSL-9d~WL2wVEp@M8M?r=7_iiwW}X9e6W z_9o5?(-)Sb|5;<-9u_Dle=qh*;9qCEdrCxZyDQe@3Kd)Xj}dS^dFd*h(uz~V<~m(^ ze|9>@j}q>v3!>A)5{iBWc#Bxn@~Gtk>pLK;$e@h{kR@wdc<~u*!4yt~3z1bm^KW2@ z-@EqOJP+{{HCE;T9~gY$d-R;R1s)t-Y?s4W;SO^MxbfVDyFG^EdLr zJ3c-yY6HkJwa%UqN7T2Oo5gQyR|skXozx|#SJiZa{+O%7M?3W7bYGNP&njM8)1Ubv zw1TSZWRjjZv5b97`=+{@-#oKAe>9!kH}$Qc4}F_kUl21;`=(x4Gj%glBYPK}UR)lR zKyJ)CUf`Etzvz|4hS(SZY>;6aBUy~OSBs^URq#bV`5pfT52C9a%lF(rzsIk_&xrqL zJX7zqJ}{hVtC(4e6tU9|lK+3;GAP&G;^`)yOFREBA-*3QowT zwfopJ^c*e#bNCWm(MjwUK0Tk2Rf{=t1E$=!jn_Cge;)j0qrU!zU7#jo5^j5|cYh`+Pn2XWD4P5Lh z_?!L$-?oaL6}UIy=x9a%2l%e;G)2+(O-&EZ{;N_==T3u7E_??6j44*c)B>7Mn=O1} z)zXV^O;Y5io4i_RI1T(Pp5VvJ+AfQY#oFe=!PW8~c|yj)-@L5sGhgrm`9tDf`~c3w zwQP(*9KvU8D>e{b0bBS0T7gaCh!C=lWXzb7rcq>0ZZhJ zzwv?LS1{oiY#6e~ePLIcmOK;zKic_0rfseQT)~0gf+aEzCPsd}FTUgV$Uk_}??cQn zc~WfCzXpGr>v@j_W6sBU(FMlFc#zq&O?Mjqf*gd*l)$Vl3VBx9VEgvU6qkP0h6UP4 z`WLCeuyzlBx9+-Xs%yHJik`G}f1VX#smi$RDjrs>DFI(<7xa-*=cG35*LtF&Cloy< z??C)X+#T}tjo|OFDqmc=8;*rnBzDP*Mj%Kh`;$QvPXYF_T2GY{2s=L9Kgejhu_)wm~p}hypVPH z7Q2JKQ>%UMo6n`!ymE_)?(MAW%v#j_pO(AeOHM0!TtBmh5_s73uyRc($1U@LX8=QGZ7x<0k7-SW@2qreCNQ{jf zG6!%2x&uaxHO;#;Mz_Jq^ssq#4Zqgr%D87!AN5`r{ljM9gFU;D^b1CcEVP(Lekc z^bcHYEQIXwvi>i;0M^_SvWfhm(|iwh+?&+{>=3`@Sg?a9z!e=fF|2n!zz9wTU;Gnz z1U=zin4`VE=Z!3)bTZy&>4Zg#-EL8N^ zpB$c4u-3A>UrIsWA~iqyPqCA!iY!+2uhSDt-iTZZJ&wo=;{spw%-SZa7DpMe9M2{$6AV9odZ&3(bY;0T6RmcbNRMW&Et z&Np^fO@lYQ!SAtC9B*S5uq6)0PceC1uN~lb%$d~(>zi0PX3m&T#(`aB{M3K2Z))I; z$UJxQyML~748Fw2zK2%2a40&w)~}FS6Ovi<=`}*J_JBC+@|hS9{ig>C?-H$&E)&fL z`U-j+jC~szC~hxS3Vi694xaWik~M_AC(KoUN9R^ilP;?=JFBY9A1^p-g2G*DrRf{B za@Qp+=i(=lcV+(JI50y#xfkq-S&QZU4%xMNaX6TN2Twa6$P#`8cFy__V2WPgW0-S$ z->t8VeuE>Q@ddz_c|@+Q@5_8}ZI0o1=8bDu-_7{hURkzwfSd#N5Z#5tu|@QhzVRRK zQrjgL!J4nV4QnWReXfT$R$F#I6l$HZ`T43l$upu zaqq+?Ny~3>JM4~hpKqUPzGtl%>w=CgtfMbvIpA|7|%-qzRvZNc7J~MO1 zHNg}A5*y5UxUP*Et$)t-EFa^W;oH)Whpgd0!4IrA>rv>WduI7jmwW>GW!9y$#)UOi ztnVTB^{nGeK|PILNY-^5KI^|%F<&`b?NQg?_!{4Vbpok&jZ^*o0u>xgf7{Bu#}&4Z z`~>SE-e!Mk>@7OQ*pU#A(P4__C%B zd`;Cv3{1*F&Zo$X@MBg|3fRC0rxpc$I4lwqdJq6egr1$M)iggclW95(#4pjVbU8RGz7))$OFcisKF)oe9A$0CL7MkN@b0tA9>`5*k3pFHuSipG!ocYjl}4)gTrC2G^fQO37pZ6#dX)ss&3om@f{=)BbU?f5Xs zOCOC)cI&C(MC=bX9~^BB0*t^1Jw!%qy$gK6-sUT~XLtnJ1$$)7+Iw3!x4gmmO+Ny1 z{;ThS+!_2!zX1JZvu3U_Jy>SlmY1{e)0ltc7p!gUV(V9ofw6L3@TG?vy(E@}gOMk4 z#d!xsa?n{CUg z1;vXfdR6J4W-SnQbZvTHwId*-!mq&pCjP{(;YXS}fcKs8A(PybiOalt&)?u+brS5k zFL(ot%=!=SG5D^whlG45@??Eqn_s{lA=~&*ww{Lk5nE7?r#EfQ@NmP$)TQxXOn%qv zdto2&)xno@TJExAu>En&1IH2{!-3>>h+&a2Fd$DpW7agq-Yao+VYT4LP<5f|RQ0(1 zOf|1>Nmc9XBD1D}+}Xq8|MmZFPI1ieZm#8f-Tcq8D)tg8asG*mZ?=v@Xco-iT@^9#mshfCZ8Emb;4aakD zFIvTOlYGl>d|+y)lP3L#G5H$o7kiKlThPYn`Qk0*6mbOmAl*K^Pq2rQNL$VD1AYQI z5b{KYXO9 z0Ro=y0(!DFWxxr2|=%!2LczH^nCo%khFSDv&4*BXtW&LyX zWR>~KMkBxUJ+ao8`(%zy-OS59tkae1~n~7=F*c&&yod=r;0?e!vU#H`*Q- z+e>6I25;`s_Fz~}!?!@j;UaQ8^aGK9!xzR+16%e9atm&lOtdwyqOfy$X8a z64x%SKho@f!dm!3r{ijD8P{d4Y4OnGW^D?2bJmk_-^?X1@)7v$$ToQ?VjSCp@jsvU zmuy;})aDX7KY#NwHttss4V(u?^!*~Y;9=tqblUb^qW8?L#S;v`8Xtq49OHzGiHoiL z!a?LLkx{S(N3Mzdn)&(Vi!7#8Xv*Zku;v4Y;9xv%S<4UL2u|!z0N&h(jp=Ni)9}Kt{DiH8@)#*g)W$M5h%Y<~p0!MN}v85?6o7Qoc@J;2e}HS!POyX@0x6K9Y& zK)%R#lMjX$$l1fm#2xhFV53+&@#3sds^SX88o<@VH@dHzy*2#Hx+iQe>+aC0Lt&dt zjhlN#e&AR>b03>42O6Eh#(}Yo!8i|NB^I!9Yx9VV-{cj4<#?>m03J48<~ZA5!a4Yx zc$m-N+U03(ByeiR(fe4{+;bd>={v-Se!iia&OxVsEl9HOBq7 zf8XfU;_!ttg7xXtx6vtlO6(!~4bUUUIw~;2wsL*Ag18ubZ66o!hHt&L%GQT$?UV0q zFP-H88#{rI$^Uro->z4o9%|z}u*Kd{pQk@H{p-H}TL%W-_+)T}T~`QCm_Dmt{x0(m zpK&fY0Q&)^_{8uo_kz9VMIMOtBIqe{G_h_)vkwI^FMb-fuEE<76JL@0A-;nziMjAC zRu%v1{s{8Zc{dys2hWT(`Cs;MfnQmJj_sy5qkFB1reBA5)*_HAW}Oe?wK9N>!{!=J z@NyXPfKO?CG>fm1-Cr_|uEQ5bURht|#ogA;t-ox0OL#9m(AQ(@I$#T~%(v}%W_5A`eW%zUFejE(VFUk4uzKhxBfz4wDJk6l4__`YxLZ>FCO%*>vwUfV_;87?L_ z%RF-|^MM?5zG?wm&Hf0~+3D9^J;F~=qh~yM+U_xXpQ2a9?R|Vx3ieH4%>i|zBfMnWETeY<1!r(nH3y;7_rWlZQ4V}cW`Psz*nH5d-|VrBe^Up}z?Y}RS~>d}EO zEY9!(Hp;9a^!l!s3QRHf3;hRUWYz2i^Q)hio;PAP@(=I?-;;l^eelRU=VLC7kK`Sv zt;Zpw+yi=z3}V0GJd>mF@&bMX7~}JTE1U}#fG5Y;x>m0#LtW;FJr?K>CU;ApS^n@k znswT60oR`K;-i?geXY2b&NcfiU>8-)YLO}Wg_>GCj%XiNR3OLH^ypn=P8lb%3&!l3 zh)sqY&_NsH8~gN&1Hm16wmAjsBf%YT1O6*E$@a77`f<+4DY}l&MNbo0gFoMcFLGel zanQ?!&9ky?eO=4-T#xIUx}W#m_QxQ{#8Xc;+&8rX>=d}Nmkl{~TSGQBtW;mOXO=rI z_5pq5THFh~guJt!fc?kVx2;_ItuA^9zSPymgwIe{LlO)2`DI;e@aE!Xefhk#Nd&)( z?DfoHe_mvU`L=#9Yu3RTUkA*=%=XgQ9v$Yu))Z~c2K~1-&G!8ntjW(#+Uz-Arlzq| z__g%-vo6E-^?@_^vi6f$0#1XQ;R^64&%-%wzlG&0uFE*F%jhA#0x!mm{KCiN0pQlO zy-JzhGI*E#VbOv8UG}nIZ85R{7jex|wceZc{jB|G-6rcbdc-=V+>b{DISBA2Pu`;B zXOS`P5F_WElZQF0Zl)ABjs=Mo$sMz1`G--C6QC`Ko(5S+{Dn1imJQ@ZN`w+u-`c>F*j`8814BoWRB0hq*tm zOxd+0{1#g`_;Ll~v!N5VCkHu(AK+E+f&;)9eqhZX-&3zZmWVC+cWfZs%iP(%0ItKe zt&fXc4qDgDZ~*mad|<|HeF}0r#BTU##245)-pTF45A+zb_5`_Q?*rsu-{HkB>*Pv3 z_fzcU;*xSY$R=Ii#bQ*@T9Gi~f++gEjbN=NIJ0-v<4YeLYR>dmf-k+U z$SAUe%vnE-cp2`650Gha#;>>cM*oJDb#S*iZLs~nJ+5{g0h|EFV2ym*xB(jo7Z9(p z7YDM8&tTVMaz4vj;Az(l!UJH*+%wnwJNVkVysgz@>)5-AI0M_qarj}ZNy5h^9;p6i zgoCZZcftO$Zi4k-dp@PtOJ`hmShF2HVuF$1-#<5y7e8JQ>vv61+4tNQM;9*@?59CY z!J5~gFn_W2MklfDY#!q`v)2RjkKM$Ea1XYI&bV#-!F_=xev$Pr!5jMmN7%fN^_#(j z@qiINJaUXY;s?M5CLZw~2M53v@B;r1t~TaCo@`%*$%%T8Cl3Wr*?J2(5oFb_CE|O= z2-dcDjaV5>c@e8U(;r>-4PyV+*lnfR%Y^k`^#0{Y)Yj-adtRM!Um8ruzH>#r`}s_L zXv5KR`f-6Wnth~Hp=2^!t`wSmO|d2Pud^>3Yxh}W$bMF=?Lco#AG24dZ7-6^VSC4g zEa21z9_^bjFErmSi3)g?cw9R zT+j5;difU&kwwPIXKEU@e~vllI9oTM#*Q2#NB9`n#%fJ_JC}T?nEjb%hORL=8f*xh zM$Ij<=vQaau>pepobRoRgH3-(Q+Pc7@ZIA))cq-j!{oCLCp>>{6Fi5+HKHb&xm@U_^tE7qMwQ*+u-!4bRyWt>erA^9|`_VAusgeR-ujKh%dOV?WYANFvK6TF?{-s z=gmE!Ta26WqksGx_lOL0&-l-Lk3RDmd0ldWcb(tqp2wiqnf z7vf|{DZ#qOuOhhws|68D#JSEHB+mijUU(+MyXbVfU`P}BqEcb`b>b%h{*Rj6H2dGN z9|zANIyrf?!=6>_2lFx4b<<;QZ4~?pPK=j)DLy26Mt+_#5^sXH?Rn=|_zzoyu7WL? zgB>v!HqOMgUb%)-@iUNP><;#mSPg#y+?fOBf;imxdtQ9;(RtZ*6<`a_$N>1_d%?3{ z2oEstij+%Iv z`{f=AOemsxK2zw2YI0wxToSvIutW~QT1fIk^be29_1^d->_^J_NcQkR4o%;Nmw(|o z{0C%!+$rzq8rXt2SW_DSe`JT=6m*lnxo6I0*ZN=+O})&E4f=sBnzc4wE<*RQb;v66 zY;$h-`!*k9>#W=xM8gKH^oKja8sC9> z5_LKD28$SO4RVQ%0#{zt+HB9H-2>+TuKTog3FZe*$9LeIb{!jY$ve7*?jg5u z0b`&hhE0YiY`)$0)nj|fbNv=}*6BC=cZaB!e%{0K+b_cVg{a&jtIQU^_yKlyTpj zIBohMu7oI;ecsuFio7M)O5Ed?%busmFnYy!$@3p+;JAbCRyFcVevk8zFCj05Z1X*F zC;b528*|U!*cmWFe&7i>+4idu!`U86WEh@BhX1!#%PXt++syNVCjx?y^z zy;#G)TnAgg3oOX@+Wgt~m`mn3u4{X^i3M4|%D$gJnr(Js=JquEz{AC11A3X9d8cj- zG=|{!ux}`f~Qw z2j4rxh2+@;;8^Eb88z_uBEh;Z`dbUOJ)?MLA8|3yl|jx~9~yl0qN!<^wJUE|m}d=v zFC0LuPA-}?8f&+-UHzXxCNz@KKFJNL=_A&bZ^IGX&O zSAV&Gc$d$%K1^)JTyq}yl=H$7@BkPhv%J%fgD#P`VGQ`V$Q#FFAFviMZMZN)!4Uq|HL)>_9Z@k z+8OU;(%cKrT^!lwj>ubly;zsdU!X_q|Hv9-<`Y|ro=^`Xw@F_MJiu6~|Akx_>GI5$ zDmncldGEPr^R&H!pk?^cP#jyIGUs#Rl6*>`V@c zwQKM?9E9A$OZbN58R0By!srs%QnSQX@NdX9@8}zQsK*~U+W4ic#e{dsMdJ5@#oVr= z1Z(7rr0p**FW9Kq-*jWgGe%z7>+sa}O)7JHWj^m(_EddTMRfCA@ig`PZv*Fux(j-$ zmeT??`}DH5gPb6}@;s}NdIvEEJ|KBZd?NZZ!3;d<hek_to*R+X@b1uLbrmCNH` z>wqb;fbE5|>^c^%1$Uj?b6UObliTd2L!N;+fa}yazFCmlr(UM2N2`1LuZcE^?wV)N z{GF|^h6j^XEu-U{%Px5iLDk~|3-%S46gWu!~)1HvTJh;*i0KkGFO)C zkzH_Q4v}5(<~wla`p7ruPFtjaWGxW6EcWn0e(+h?e}FiE{YQK@KNMrKpA+qBtQLQN z8fkK1NnVDS=L+zg!eMO-$sFf=<&;HVjr=}uT*^H2l{_T6!L#i~`EOM`w~+N5#P-zi z*t?5Z8Qx_NC7vBX?TP)ViCO70Zjf=J*+;(7$qi;rG|$NZXZA{fd+3p;4p1aujCp}E zybbptOK=7pX?r*EtBAkg3+unyycRr7jF10{{9>Ezb4lo_tDTd0Pm7#f(PmUM_$oa;t0DYlA16zzpGIR<${Z|#f6}B@=%tX^2LXr;!Ddsa?0y8 z<~c07-b%sqV5V;Ik<(RGBfmVi`Cz4*nr92cHRwIH;$-C(3)Y7ZDpN$m0X$!lXCh8o zwqH<-Y4Itkv3uruDF=^uSWmz@XnF<79f2up=a64;X75(|;^BfjN{NBZ`X zr72!PemZ!>?6GsQ;eXG+I5j1Q7Bb3&k~}BgB-maKFH*ere4|R65p}DU{{al?%%U6|F0h&jM+aP9|L{C zuYf1;Cs>P$4+19WEPfPt6LTYb=rg!jeBoF8IopE=rpP5d3+RJAujzaAzT+o?F~5OR z(FN=$&yyXvtfrcs`J}_XZ<&tdG<#X&gJR3sZ<4+Huipw9{BR_wc+zU^S;v-Ysy z`Hkeqo5!gqSm)xiCD1&NjhqMfKrDp~n%E-TCBMPCIeItQ4~XOG%V6F3fi*{5`dnC# z4!-a)`&VH9=;6S}z_&o|u=QX}EQq{ehxiVCwz*mx3xX$WBv^}bb9!&{jt`C)K}5&)OzadCGQB>`#pSB}RBqe3k0@_OM&wKykA# z3Ttjz+kp({TX@Fh-@um_b`ZPA3*Q1C10N5piK*dCvtHDTH~11K5|8{}nZ+kS&XG@W zWqvpp{fuxbFaGZKZ|Oildu4HNPGh~k@(E(66{gVGr_R8ufh{*YW?IhuqCE%{(4e5qVIqG z3FObu7FGhA%(D>SMX&{vh2P^#_ARO&Rm0TP=Dsap_O1QlSMtC3EprLMeyQJj-xbK* zq0rjqS$bPKR+Q%tA5up<_)2O@MN<_p&&SPFI<^FNo((YPW|Shozc?zT+S_QQd8Qw^ zEox+cv^}oKN3hNYTL-S}0fY>*mKUDDp8#WI89$l+doW==HR~YZ3v?Tw5BbDTWshli z0$kw*utNUe8L;K~VRfgjHohVHk#pNB;~(-pemQw-aNJ|nf?9u*Ad`?Kg%;qGW1HUpLTI%`~Ep3c5LwbgtFYwM3QG6@jOF(G3)|0 zo$w+X6*V$)F4Q2qbdIZr@60anv)I!ssLFrx3$|uWh}X{mV|us1g#9JJ18(Pq%(15j z+=`4^KMVclZ|pwtH@*n#(^x|SmSFon>>o3C_%2)n-a%)GJ>&4G%52#SiJC@#(o3gQABphA{uW)9TK zk>(axIKtcm)HGKa;$EDiIdhAWJ4a@j3l%3{pXc-F`yYIN`~JWqEt5Crbzb+luIs+9 zPZT&lJM8glE93j2!B_9bq$~wzfd@D9@$MbwtGnwR4bLBs--~(w)35WH?l!As@TOoV zHGW5D&Mnc@kmzF2Qn6!h#@}Uhex?}iBYqg{#it(!XXEn_AJJzGd{nJA$I~^~A9t1+8+?zz&cT+!%(yefw*8{< zK*MMK?vK&(Ah&@*i-PG*y40c(k_Lgfd*8;)}9^^%qDTD75dw{7sCiICk^QSr)p8w@( zKKh#%J{C{o^TR{hJ)@-u=(GD*Ywp>NQzx=B9Jc@8Gv#OJ*Zh;;bNBE?X8wtI!T&=a zLY(C1=3J?p?Yz_YjrMsFm-svE9PjDhv$>nhyARCxEBoo_$2KN0W69hfm^Jt&`e4o% zT;Y?Ex2!KCHN8*uK6-QULWUjIJ$!mdn<4d0e9v%0A6u?$oEaD9Vtx0RbLDf<=P}db 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 literal 0 HcmV?d00001 diff --git a/docs/playground/data/qmt_spgr_B1map.nii.gz b/docs/playground/data/qmt_spgr_B1map.nii.gz new file mode 100644 index 0000000000000000000000000000000000000000..cac91ebb7e64b90c2264fe359c9a70a194231c6c GIT binary patch literal 28749 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 delta 18 acmX>(oAKmqMt1pb4vzk3DI3`j`2qk$X9p|* diff --git a/docs/playground/data/qmt_spgr_mask.nii.gz b/docs/playground/data/qmt_spgr_mask.nii.gz index 3077c4b37bcf8b76e38472c739c313b565a49e68..75a088a93a46af33530ee254284a34afba66cde9 100644 GIT binary patch delta 16 Xcmeyw^ofaGzMF%iCn0+ydp08gFdhXZ delta 16 Xcmeyw^ofaGzMF%i|5?gL_H0G~Gc*OK diff --git a/docs/playground/data/vfa_t1.json b/docs/playground/data/vfa_t1.json new file mode 100644 index 0000000..a991da9 --- /dev/null +++ b/docs/playground/data/vfa_t1.json @@ -0,0 +1,127 @@ +{ + "model": "vfa_t1", + "title": "Variable flip angle T1", + "dims": [ + 128, + 128, + 1, + 2 + ], + "factor": 1, + "volume_ids": [ + { + "FlipAngle": 3.0 + }, + { + "FlipAngle": 20.0 + } + ], + "labels": [ + "FlipAngle=3", + "FlipAngle=20" + ], + "params": [ + "M0", + "T1" + ], + "outputs": [ + { + "name": "M0", + "unit": "", + "display_range": null + }, + { + "name": "T1", + "unit": "s", + "display_range": [ + 0.0, + 3.0 + ] + } + ], + "enums": [ + { + "key": "fit_type", + "values": [ + "linear", + "nonlinear" + ] + } + ], + "config": "model: vfa_t1\n\n# non-BIDS: protocol from this file; mask via --mask\n# Flip angles in degrees (BIDS-MRI convention), times in seconds (BIDS/SI).\n# The linearization assumes one repetition time for the whole series.\nflip_angles:\n- 3\n- 20\nrepetition_time: 0.015\n\n# Fit algorithm. `linear` (default) is qMRLab's closed-form Fram linearization;\n# `nonlinear` refines it with Levenberg-Marquardt on the signal equation, which\n# avoids the bias the linearizing transform puts into the noise at low SNR.\nfit_type: linear\n", + "config_bids": "model: vfa_t1\n\n# BIDS input: FlipAngle and RepetitionTimeExcitation are read from the JSON\n# sidecars via the model's protocol_schema(), so neither is declared here.\n\n# Fit algorithm (an option, not BIDS metadata): `linear` is qMRLab's closed-form\n# Fram linearization; `nonlinear` minimises residuals on the signal equation by\n# Levenberg-Marquardt, avoiding the bias the linearizing transform puts into the\n# noise at low SNR.\nfit_type: linear\n\n# BIDS mask selection \u2014 disambiguates which mask in the dataset to apply.\nmask:\n desc: brain\n", + "archive": "ds-vfa.zip", + "files": { + "data": "vfa_t1.nii.gz", + "mask": "vfa_t1_mask.nii.gz", + "aux": { + "B1map": "vfa_t1_B1map.nii.gz" + } + }, + "probes": [ + { + "x": 63, + "y": 59, + "expected": { + "M0": 2017.1513907209396, + "T1": 1.4076235954840055 + } + }, + { + "x": 64, + "y": 59, + "expected": { + "M0": 2111.823122138415, + "T1": 1.4562254803249461 + } + }, + { + "x": 63, + "y": 60, + "expected": { + "M0": 2145.100057682434, + "T1": 1.5859305684325227 + } + }, + { + "x": 64, + "y": 60, + "expected": { + "M0": 2108.1317440617295, + "T1": 1.4006565344003077 + } + }, + { + "x": 63, + "y": 58, + "expected": { + "M0": 2015.2958905178357, + "T1": 1.3885884764696066 + } + }, + { + "x": 64, + "y": 58, + "expected": { + "M0": 2192.3412331455734, + "T1": 1.5275379988657982 + } + }, + { + "x": 62, + "y": 59, + "expected": { + "M0": 2190.2632839853895, + "T1": 1.3987500936664004 + } + }, + { + "x": 65, + "y": 59, + "expected": { + "M0": 2194.8853412259723, + "T1": 1.495468881160807 + } + } + ] +} \ No newline at end of file diff --git a/docs/playground/data/vfa_t1.nii.gz b/docs/playground/data/vfa_t1.nii.gz new file mode 100644 index 0000000000000000000000000000000000000000..5e0af7dbe6616d91d469704968d75449a02fc021 GIT binary patch literal 56380 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 literal 0 HcmV?d00001 diff --git a/docs/playground/data/vfa_t1_B1map.nii.gz b/docs/playground/data/vfa_t1_B1map.nii.gz new file mode 100644 index 0000000000000000000000000000000000000000..0a83441007bdbc5375e891d5bba0f12ea033bf1c GIT binary patch literal 15865 zcmaiaWm6mq(`<4G5Zv8@ySoQl+!iNTU>A2;91ia8?(Xgo+!lx6zE~i*>wBIbaO=*8 zsrlMfQ(ezq%gvTDONF+)-K62Q(RSN+ zZ<`0$M#p@&7x1bU0FPgUER^ew8xr6XI~N9i_j1dE7Vnbk*_3sBMd27^Xr!&6~0D zm#(qz;EOp0ne0%I{KwStBmtP~wJZ8>99U#d-t)JTv?$?QI+WUS)sYj>zVS z*|Jx6dgvSD{oILW0)5jVSR|8R4)=m0!6o`5sc?6VvD@v5vo2da#5Dl74r|E6;+vNH z7cM6tM-y{cqpKAIyoRJDw{ZM0y9KuQbe`X) zT4!QT{=`f2@IhEOm8(3V@^UbY^yWi)#n6;1u|=ao+eXOvbPDvd|5IWbqO*?$=4ZYB zY7y*-s7b8kb)w;_F$OlixcsF^HRrUiw98kH)mk_LsTuMkZh|t1%$5eg>BbOXuHOXg z@f0<2rqspR7r8eu;t_rrQ-G4xea^&w8>QGiZ-*59-G9JroyYkib7EggL(tWY*x|KI zqxz51bSwIIQTFf_Pst2tq3AL&bwX?0PY+#Ev>Yet4?L-u7iqysLQ`jYf|$X^yZo&|IA`b+~}%ojTn9 z3C=~}>Er7`+>49lo)Ypwraa;>DtTtv!r`8)xu?Z-x$Gyz*6__fa%hL_PbDwnad~%C z_q8GJLJ2BFw+NAw`0pjXP8*%1QXSY0(Ml>iZcDCgA9TaniqoSJ&Is-)8lci_v9g25 z^Qalw$qG$X!1E1iDywSA+NyNxN4VKeJmE7tTG_|N`4CXQeUq0sRa9KoqeN(Jl6?9C z_EiOrF0Eod$Q-*j%&L2anbxm78a#aPr4uIIs$KuLCy@9`;Tc`iS+Zj14~-zJy#k{P zRnP(AyoVlB#*&N~BQBZ3Rp>hmIX!i7;e$?-ktlWq6Dr#8IkfdD)&L2nzih%JAIOM_ z551zN#C>OtCflT9FcyeBG&37}#+AK;MBH|zN^h$$icBO;q)aka&z7pu(u81VFc$MF zmaIRzX5Nm2$|WXdYq{83lDK)*`b+f`fMBNDJfM@Xyv!^UEqPs_Reo zL`XPsI47v%(E|YV5|F}gFMdRc9W%MEB@{i4@CPc)`${(1by}@e3xB&aOF;E^= zylb>+D^n(%l!qpEaoBTJ#G)#^2sKWCt7LC}{j$6(Lwd<(la zdJN=i$VgyX0+mbQtf&tpr%#4i7nC0O@-B&2Ak|kgHX02>O=#=*#u=%5wV!xWdY^DC zA2}jv`6WB}XfVNb8PyoM34@#dpHy(;%r#FL5)oy0D3d!0{+V0($I_EMd_C|5hbW<1 zIkNQagmB}e;fvQE$Gv>MV;D{2HmzAjh5}aqONzM_2u+@v#$Cu4BA;(S=htTrtcB2F z44*&5B_%fNDTD(iND4lep-;>mX*b*kWOmi@48S#?Syh*`NJ=@Y@(!jlRXlcOFK`0S zZ557I0K4otdnc}RiTwjXo$M3i!5>xW4?LmP!i5YREP)mD17rGlk>&u7r4Qs{mr2Y{ z8QDw5Z=tI?d&h4=xph4_iOK@OFXA9F8j?g`v41<`m?uxw?`OW&AC0$Cn|-l_xr_}B_$vNmhvglC0Ix(qF?8O5;Eh}9@qrFSS1F<}Sbiv4ux?E5^(Tv12<61Bwp|6zdN7hJ?g;lpV zjYy9(LXtgrw$Y6)BPgWThTEz^JgNO}#^NbuNzd_f%L~H_VIj;`5ibO#Jj3w&U?edy zwzHKZ1Mef)x}#otG-Jvuah*gi-P**tF`$PLA$OVYl2=#tgHechaiQ_BF!MJAPdG19 zPoKW%AP>9JNU8Yf(GnY+An5ZRrQ5?8yIi+N
bB*Di_gVa`#fkLk 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 literal 0 HcmV?d00001 From d653dd16cbec2851227d9593b1b7fb930caac89d Mon Sep 17 00:00:00 2001 From: Agah Date: Sat, 1 Aug 2026 00:58:07 -0400 Subject: [PATCH 09/10] fix(vfa_t1): reject non-finite and repeated flip angles; fail on ambiguous aux Claude-Session: https://claude.ai/code/session_01UPdViMfzMRjrtkSmwWbG5F --- .../qmrust-core/src/models/vfa_t1/config.rs | 58 ++++++++++++++++++- scripts/docsfig/dataset.py | 10 ++++ scripts/tests/test_dataset.py | 16 +++++ 3 files changed, 82 insertions(+), 2 deletions(-) diff --git a/crates/qmrust-core/src/models/vfa_t1/config.rs b/crates/qmrust-core/src/models/vfa_t1/config.rs index 2d08784..b867e07 100644 --- a/crates/qmrust-core/src/models/vfa_t1/config.rs +++ b/crates/qmrust-core/src/models/vfa_t1/config.rs @@ -51,9 +51,16 @@ impl VfaT1Config { self.flip_angles.len() ); } - if self.flip_angles.iter().any(|&a| a <= 0.0 || a >= 90.0) { + // Non-finite first: NaN compares false against both bounds, so it would + // pass a range test and then reach the `partial_cmp` below, where an + // unwrap on `None` panics instead of reporting a bad recipe. + if self + .flip_angles + .iter() + .any(|&a| !a.is_finite() || a <= 0.0 || a >= 90.0) + { bail!( - "flip angles must lie in (0, 90) degrees, got {:?}", + "flip angles must be finite and lie in (0, 90) degrees, got {:?}", self.flip_angles ); } @@ -62,7 +69,17 @@ impl VfaT1Config { Some(tr) if tr <= 0.0 => bail!("repetition_time must be > 0, got {tr}"), Some(_) => {} } + // Safe now that every angle is finite. self.flip_angles.sort_by(|a, b| a.partial_cmp(b).unwrap()); + // A repeated angle would leave `fit` matching two expected angles to the + // same sample, since it resolves each by identity and takes the first + // hit: one acquired volume would be read twice and another never. + if let Some(pair) = self.flip_angles.windows(2).find(|w| w[0] == w[1]) { + bail!( + "flip angles must be distinct, got {} more than once", + pair[0] + ); + } Ok(()) } } @@ -106,6 +123,43 @@ mod tests { assert!(no_tr.validate_protocol().is_err()); } + #[test] + fn validate_protocol_rejects_a_non_finite_angle() { + // NaN compares false against both bounds, so a range test alone lets it + // through to the sort, where `partial_cmp(...).unwrap()` panics. A bad + // recipe must be reported, never a panic. + for bad in [f64::NAN, f64::INFINITY, f64::NEG_INFINITY] { + let mut cfg = VfaT1Config { + flip_angles: vec![3.0, bad], + repetition_time: Some(0.015), + fit_type: FitType::Linear, + }; + assert!(cfg.validate_protocol().is_err(), "accepted {bad}"); + } + } + + #[test] + fn validate_protocol_rejects_repeated_angles() { + // `fit` resolves each expected angle by identity and takes the first + // hit, so a repeat would read one acquired volume twice and another + // never. + let mut repeated = VfaT1Config { + flip_angles: vec![3.0, 20.0, 3.0], + repetition_time: Some(0.015), + fit_type: FitType::Linear, + }; + let err = format!("{:#}", repeated.validate_protocol().unwrap_err()); + assert!(err.contains("distinct"), "{err}"); + + let mut distinct = VfaT1Config { + flip_angles: vec![3.0, 20.0], + repetition_time: Some(0.015), + fit_type: FitType::Linear, + }; + distinct.validate_protocol().unwrap(); + assert_eq!(distinct.flip_angles, vec![3.0, 20.0]); + } + #[test] fn validate_protocol_rejects_out_of_range_angles() { // The linearization divides by sin and tan of the flip angle, both diff --git a/scripts/docsfig/dataset.py b/scripts/docsfig/dataset.py index 1dd5523..3fdd81c 100644 --- a/scripts/docsfig/dataset.py +++ b/scripts/docsfig/dataset.py @@ -139,6 +139,16 @@ def find(parent, model): # `anat/`. Globbing only one silently drops the other, and the fit then # runs uncorrected while the CLI applies it. found = sorted(deriv.glob(f"*/{subject}/*/*_{spec['bids_suffix']}.nii*")) + if len(found) > 1: + # Several derivatives claim the same input. Picking one silently + # would fit against a map nobody chose, and the figures and the + # playground payload would disagree with a CLI run that picked + # differently. + raise ValueError( + f"{model['name']}: {len(found)} candidates for aux input " + f"'{spec['name']}' ({spec['bids_suffix']}): " + f"{[str(p) for p in found]}. Leave exactly one in the dataset." + ) if found: aux[spec["name"]] = found[0] diff --git a/scripts/tests/test_dataset.py b/scripts/tests/test_dataset.py index 9e29ac9..f952319 100644 --- a/scripts/tests/test_dataset.py +++ b/scripts/tests/test_dataset.py @@ -192,6 +192,22 @@ def test_finds_aux_under_fmap(self): self.assertIn("B1map", coll.aux) self.assertEqual(coll.aux["B1map"].name, "sub-01_TB1map.nii.gz") + def test_two_candidates_for_one_aux_input_is_an_error(self): + # The glob spans every pipeline and datatype, so two derivatives can + # claim the same input. Taking the first silently fits against a map + # nobody chose, and a CLI run that picked the other would disagree. + with tempfile.TemporaryDirectory() as tmp: + model = self._dataset(tmp, "fmap") + second = ( + dataset.root_for(tmp, model) + / "derivatives" / "other" / "sub-01" / "anat" + ) + second.mkdir(parents=True) + nifti.write_nii(second / "sub-01_TB1map.nii.gz", [[2.0, 2.0], [2.0, 2.0]]) + with self.assertRaises(ValueError) as caught: + dataset.find(tmp, model) + self.assertIn("TB1map", str(caught.exception)) + def test_finds_aux_under_anat(self): with tempfile.TemporaryDirectory() as tmp: model = self._dataset(tmp, "anat") From 4f67f4f4f303e8d37c763703255afcfc2ddee5e5 Mon Sep 17 00:00:00 2001 From: Agah Date: Sat, 1 Aug 2026 01:02:12 -0400 Subject: [PATCH 10/10] docs(skill): make the Series identity check executable Claude-Session: https://claude.ai/code/session_01UPdViMfzMRjrtkSmwWbG5F --- .claude/skills/porting-qmrlab-models/SKILL.md | 21 +++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/.claude/skills/porting-qmrlab-models/SKILL.md b/.claude/skills/porting-qmrlab-models/SKILL.md index f921719..3dec058 100644 --- a/.claude/skills/porting-qmrlab-models/SKILL.md +++ b/.claude/skills/porting-qmrlab-models/SKILL.md @@ -76,9 +76,26 @@ the identity on one side only, and no predicted sample matches its volume. The fit keeps working, because it queries one key by name; the only symptom is a missing forward curve in the app. Assert the two agree, don't eyeball it: ```rust -let ids = engine::build_volume_ids(m.measurement(), &proto, m.n_volumes())?; -// every ids[i] (VolumeId::Params) == m.forward(..).series()[i].params +// Compared by volume index: any drift between the protocol-derived identity +// and the sample `forward` emits for that volume fails here, immediately. +let ids = crate::engine::build_volume_ids(m.measurement(), &proto, m.n_volumes()).unwrap(); +let sig = m.forward(¶ms, &Aux::new()); +let samples = sig.series(); +assert_eq!(samples.len(), ids.len()); +for (id, sample) in ids.iter().zip(samples) { + let crate::core::model::VolumeId::Params(row) = id else { + panic!("a Series model must yield param-row identities") + }; + assert_eq!( + *row, sample.params, + "volume identity {row:?} has no matching forward sample {:?}", + sample.params + ); +} ``` +`models/vfa_t1/model.rs` carries this as +`forward_samples_carry_the_volume_identities_the_bids_path_builds`; copy it and +swap the model. → *Gate: confirm the translation; round-trip test passes.* **Phase 3 — Wire.** Confirm the registry line and grouping block the scaffold added;