Skip to main content

Grid

Struct Grid 

Source
pub struct Grid {
    pub dims: (usize, usize, usize),
    pub voxel_size: (f64, f64, f64),
}
Expand description

A 3D volume grid with dimensions and voxel sizes.

Fields§

§dims: (usize, usize, usize)

Volume dimensions (nx, ny, nz)

§voxel_size: (f64, f64, f64)

Voxel sizes in mm (vsx, vsy, vsz)

Implementations§

Source§

impl Grid

Source

pub fn new( nx: usize, ny: usize, nz: usize, vsx: f64, vsy: f64, vsz: f64, ) -> Self

Create a new Grid from dimensions and voxel sizes.

Source

pub fn nx(&self) -> usize

Source

pub fn ny(&self) -> usize

Source

pub fn nz(&self) -> usize

Source

pub fn vsx(&self) -> f64

Source

pub fn vsy(&self) -> f64

Source

pub fn vsz(&self) -> f64

Source

pub fn n_total(&self) -> usize

Total number of voxels.

Source

pub fn spacing(&self, axis: usize) -> f64

Spacing along one axis, in mm. axis is 0 = x, 1 = y, 2 = z.

§Panics

If axis is not 0, 1 or 2.

Source

pub fn extent(&self, axis: usize) -> usize

Number of samples along one axis. axis is 0 = x, 1 = y, 2 = z.

§Panics

If axis is not 0, 1 or 2.

Source

pub fn require_contiguous_slices_if_known( &self, slices: Option<SliceGeometry>, ) -> Result<(), SliceGapError>

Check contiguity against slice geometry the acquisition may not have recorded.

None means the acquisition did not say how thick its slices are, and a gap then cannot be detected — nothing in a NIfTI distinguishes 3 mm slices every 3 mm from 2 mm slices every 3 mm, because the spacing is the pitch. This returns Ok in that case, deliberately and in one place rather than at each call site: refusing every acquisition that failed to record a recommended BIDS field would block the vast majority of data, which has no gap. The missing information is in the input, not in this crate, and the right response is for the host to say so once.

The name says if_known so no call site can read as though a gap had been ruled out. Where the thickness is known, this is Grid::require_contiguous_slices.

Source

pub fn require_contiguous_slices( &self, slice_thickness: f64, slice_axis: usize, ) -> Result<(), SliceGapError>

Check that the volume is contiguous along the slice axis, as the FFT dipole kernel requires.

A 2D multi-slice acquisition often leaves a gap between slices: the excited slab is thinner than the slice-to-slice pitch, so the sampled volume has holes in it. A Grid cannot express that — its voxel_size is the pitch, and nothing records the thickness — so the gap has to be supplied, normally from the acquisition’s SliceThickness sidecar field.

It matters because the dipole kernel, and the spherical kernels of the SHARP family, are evaluated as FFTs on a uniform grid. That is not an approximation that degrades with the gap; the convolution being computed is simply not the one the physics calls for, and the resulting map is wrong rather than noisy — wrong in a way that still looks like a susceptibility map. So this refuses rather than warns.

In-plane work is unaffected: a gap along z does not disturb a purely in-plane kernel, so slice-wise unwrapping is valid on gapped data and deliberately does not call this. Anything that convolves along the slice axis has to.

§Arguments
  • slice_thickness - Excited slice thickness in mm. For a contiguous acquisition this equals the slice spacing, which is what a 3D acquisition should pass.
  • slice_axis - Axis the slices are stacked along: 0 = x, 1 = y, 2 = z.
§Panics

If slice_axis is not 0, 1 or 2.

Trait Implementations§

Source§

impl Clone for Grid

Source§

fn clone(&self) -> Grid

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Copy for Grid

Source§

impl Debug for Grid

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl PartialEq for Grid

Source§

fn eq(&self, other: &Grid) -> bool

Equality operator ==. Read more
1.0.0 (const: unstable) · Source§

fn ne(&self, other: &Rhs) -> bool

Inequality operator !=. Read more
Source§

impl StructuralPartialEq for Grid

Auto Trait Implementations§

§

impl Freeze for Grid

§

impl RefUnwindSafe for Grid

§

impl Send for Grid

§

impl Sync for Grid

§

impl Unpin for Grid

§

impl UnsafeUnpin for Grid

§

impl UnwindSafe for Grid

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CloneAny for T
where T: Any + Clone,

Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<T> Downcast for T
where T: Any,

§

fn into_any(self: Box<T>) -> Box<dyn Any>

Converts 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>

Converts 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)

Converts &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)

Converts &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
where T: Any + Send,

§

fn into_any_send(self: Box<T>) -> Box<dyn Any + Send>

Converts Box<Trait> (where Trait: DowncastSend) to Box<dyn Any + Send>, which can then be downcast into Box<ConcreteType> where ConcreteType implements Trait.
§

impl<T> DowncastSync for T
where T: Any + Send + Sync,

§

fn into_any_sync(self: Box<T>) -> Box<dyn Any + Send + Sync>

Converts Box<Trait> (where Trait: DowncastSync) to Box<dyn Any + Send + Sync>, which can then be downcast into Box<ConcreteType> where ConcreteType implements Trait.
§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Send + Sync> ⓘ

Converts Arc<Trait> (where Trait: DowncastSync) to Arc<Any>, which can then be downcast into Arc<ConcreteType> where ConcreteType implements Trait.
Source§

impl<T> DynClone for T
where T: Clone,

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ

Converts 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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
where F: FnOnce(&Self) -> bool,

Converts 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
§

impl<T> Pointable for T

§

const ALIGN: usize

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.