pub struct FieldMappingConfig {
pub unwrapping_algorithm: UnwrappingAlgorithm,
pub phase_offset_removal: bool,
pub phase_offset_sigma_mm: [f64; 3],
pub bipolar_correction: bool,
pub b0_estimation: B0EstimationMethod,
pub laplacian_solver: LaplacianSolver,
pub laplacian_unmasked: bool,
pub romeo_params: RomeoParams,
pub prelude_params: PreludeParams,
}Expand description
Field mapping configuration
Fields§
§unwrapping_algorithm: UnwrappingAlgorithm§phase_offset_removal: bool§phase_offset_sigma_mm: [f64; 3]Gaussian smoothing sigma of the MCPC-3D-S phase offsets, in mm per axis (default
[7, 7, 7]); divided by the voxel size to give the smoothing in voxels
(Self::phase_offset_sigma_voxels). The default is the ROMEO command line’s (what
users run, romeo -B): --phase-offset-smoothing-sigma-mm, “default: [7,7,7]”, divided
by the NIfTI voxel size (ROMEO.jl 08776d4, ext/RomeoApp/argparse.jl l. 79-84 and
217-224, caller.jl l. 137-138). The same physical width at every resolution.
MriResearchTools’ mcpc3ds function itself defaults to sigma = [10, 10, 5] in voxels
(src/mcpc3ds.jl l. 39), which QSM.rs used before; that is 10/10/5 mm at 1 mm voxels but
a different width at any other resolution.
Measured on 1 mm data (ROMEO field, default V-SHARP, RTS), where the old default is 10/10/5 mm: χ moves by at most 0.003 XSIM, on the qsm-forward phantom XSIM 0.254 → 0.256, NRMSE 85.9 → 85.7 %, and on an in-vivo 3T Philips scan, agreement with the UK Biobank pipeline’s χ, XSIM 0.714 → 0.714, NRMSE 69.7 → 69.4 %.
bipolar_correction: bool§b0_estimation: B0EstimationMethodHow the unwrapped echoes are combined, with that method’s own settings (default
B0EstimationMethod::WeightedAvg with B0WeightType::PhaseSNR).
laplacian_solver: LaplacianSolverPoisson solver used when unwrapping_algorithm is UnwrappingAlgorithm::Laplacian
(default LaplacianSolver::Dct). With LaplacianSolver::Fft { pad: [64; 3] } and
b0_estimation B0EstimationMethod::WeightedAvg with
B0WeightType::AssumedDecay at 40 ms, a multi-echo run gives UK Biobank’s field map
(see run_field_mapping).
laplacian_unmasked: boolLaplacian unwrapping on the raw phase over the whole volume, instead of on the phase
zeroed outside the brain mask (default false). Zeroing first keeps the noise outside the
brain out of the global Poisson solve, and is what UK Biobank (MRPhaseUnwrap(mask .* phase)) does. QSM.jl’s unwrap_laplacian takes the raw phase: its :dct solver (this
crate’s LaplacianSolver::Dct) ignores the mask, so it is laplacian_unmasked: true
here, while its default :mgpcg (not ported) multiplies the Laplacian by the mask and
solves with a Dirichlet boundary on it, which also removes the background (see
crate::unwrap::laplacian). STI Suite 3.0’s QSM_GUI and QSMART unwrap the raw phase
(rules sti.unwrap-unmasked, qsmart.unwrap-unmasked; see crate::unwrap::laplacian).
With B0EstimationMethod::QsmartEchofit the unwrapped echoes are also kept over the
whole volume, as QSMART fits them; the other combinations use the voxels inside the mask.
Only with Laplacian unwrapping.
romeo_params: RomeoParamsROMEO’s settings (default RomeoParams::default, ROMEO.jl’s API defaults).
RomeoParams::romeo_cli gives the romeo command line’s (romeo3 weights with a
magnitude, no temporal re-unwrapping), which with the rest of this default config is the
CLI’s B0 pipeline. Which of the two QSMxT should default to is being measured (QSM.rs#319).
prelude_params: PreludeParamsPRELUDE’s settings, used when unwrapping_algorithm is UnwrappingAlgorithm::Prelude
(default PreludeParams::default: FSL prelude’s defaults, 8 phase partitions with
regions labelled slice by slice, and the median wrap count removed per echo as FSL’s
output has it).
Implementations§
Source§impl FieldMappingConfig
impl FieldMappingConfig
Sourcepub fn phase_offset_sigma_voxels(&self, voxel_size: (f64, f64, f64)) -> [f64; 3]
pub fn phase_offset_sigma_voxels(&self, voxel_size: (f64, f64, f64)) -> [f64; 3]
phase_offset_sigma_mm in voxels of voxel_size
(mm), as the ROMEO command line converts it.
Trait Implementations§
Source§impl Clone for FieldMappingConfig
impl Clone for FieldMappingConfig
Source§fn clone(&self) -> FieldMappingConfig
fn clone(&self) -> FieldMappingConfig
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for FieldMappingConfig
impl Debug for FieldMappingConfig
Auto Trait Implementations§
impl Freeze for FieldMappingConfig
impl RefUnwindSafe for FieldMappingConfig
impl Send for FieldMappingConfig
impl Sync for FieldMappingConfig
impl Unpin for FieldMappingConfig
impl UnsafeUnpin for FieldMappingConfig
impl UnwindSafe for FieldMappingConfig
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