pub struct TfiParams {Show 15 fields
pub lambda: f64,
pub precond: f64,
pub merit: bool,
pub linear: bool,
pub data_weighting: i32,
pub percentage: f64,
pub cg_tol: f64,
pub cg_max_iter: usize,
pub max_iter: usize,
pub tol: f64,
pub b0: f64,
pub echo_times: Vec<f64>,
pub te: EchoTime,
pub kernel: TfiKernel,
pub precision: TfiPrecision,
}Expand description
TFI parameters (2024 MEDI_L1.m / parse_QSM_input.m defaults; P_B and the linear data
term from Liu et al. 2017)
Fields§
§lambda: f64Weight of the data-fidelity term ('lambda'): larger fits the data more closely
precond: f64Preconditioner outside the mask, P_B (1 inside); Liu et al. 2017 use 30 in vivo
merit: boolMERIT: reweight the noise by the data residual after each iteration ('merit')
linear: boolLinear data term ||m (D P y − f)||² ('linear', Liu et al. 2017 eq. 5); false gives
MEDI_L1’s default exponential term ||m (exp(i D P y) − exp(i f))||²
data_weighting: i32Data weighting: 0 uniform (1 everywhere), 1 SNR (mask / n_std, mean 1 in the mask)
percentage: f64Edge fraction for the gradient mask ('percentage')
cg_tol: f64CG relative residual tolerance
cg_max_iter: usizeMaximum CG iterations per Gauss-Newton step
max_iter: usizeMaximum Gauss-Newton iterations
tol: f64Stop when ||dy|| / ||y|| falls below this
b0: f64Field strength in Tesla (scan parameter, for the radian conversion)
echo_times: Vec<f64>Echo times in seconds, in acquisition order (scan parameter, for the radian conversion).
te: EchoTimeWhich echo time the radian conversion uses. Default EchoTime::Spacing: the MEDI
toolbox’s MEDI_L1.m works on the field in radians over delta_TE
(x/(2*pi*delta_TE*CF)*1e6), which its readers set to TE(2) - TE(1), or TE for one echo
(Read_Siemens_DICOM.m lines 176-178).
kernel: TfiKernelDipole kernel (default TfiKernel::Dft). MEDI_L1.m calls dipole_kernel.m, whose
k-space grid is half a step off on axes with an odd number of voxels; there it is not the
dipole field. On QSM-CI’s simulated head (164×205×205) that scales χ by ~1.3 against the
DFT-grid kernel and fits the true χ worse (in the mask, demeaned: NRMSE 71.4 % against
62.1 %, r 0.718 against 0.785), so the DFT-grid kernel is the default and
TfiKernel::MediOddGrid the parity option. On even grids they are the same.
precision: TfiPrecisionArithmetic (default TfiPrecision::Double). MEDI_L1.m runs in single precision, by
accident of tempn = single(N_std) (see TfiPrecision::Single); the CG solves at
cg_tol 0.01 then stop at different points from double precision, which moves χ by about
1 % (KKI travelling head) from the same inputs. Double precision solves the same equations
more accurately, so it is the default and single precision the parity option.
Trait Implementations§
Auto Trait Implementations§
impl Freeze for TfiParams
impl RefUnwindSafe for TfiParams
impl Send for TfiParams
impl Sync for TfiParams
impl Unpin for TfiParams
impl UnsafeUnpin for TfiParams
impl UnwindSafe for TfiParams
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<T> CloneAny for T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>, which can then be
downcast into Box<dyn ConcreteType> where ConcreteType implements Trait.§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>, which can then be further
downcast into Rc<ConcreteType> where ConcreteType implements Trait.§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.§impl<T> DowncastSend for T
impl<T> DowncastSend for T
§impl<T> DowncastSync for T
impl<T> DowncastSync for T
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more