kwneuro¶
Copyright (c) 2024 Kitware. All rights reserved.
kwneuro: Processing pipelines to extract brain microstructure from diffusion MRI
Submodules¶
Classes¶
Context manager that activates caching for all |
|
Explicit cache spec for |
|
A diffusion weighted image. |
|
A structural (e.g. T1-weighted) MRI image. |
Functions¶
|
Decorator that adds transparent caching when a Cache context is active. |
|
Create a DWI from a NIfTI volume and FSL b-value/b-vector files. |
|
Create a structural image from a lazy NIfTI volume resource. |
|
Create a lazy volume resource from a NIfTI path. |
|
Write a DWI to NIfTI plus FSL b-value/b-vector files. |
|
Write a structural image to a NIfTI path and return the on-disk image. |
|
Write a volume resource to a NIfTI path and return the on-disk resource. |
Package Contents¶
- class kwneuro.Cache¶
Context manager that activates caching for all
@cacheable-decorated functions.Scalar arguments and imaging data arguments are fingerprinted automatically. Changes to either trigger a cache miss on the next run. Arguments that cannot be fingerprinted issue a UserWarning. Each subject should use a distinct cache_dir to avoid races.
- cache_dir: pathlib.Path¶
Directory where cached outputs and per-step sidecar files are stored. Created automatically.
- force: bool | set[str] = False¶
Cache bypass control. False uses all cached outputs, True recomputes everything, a set of step names recomputes only those steps.
- is_cached(step_name: str, files: list[str], scalars: dict[str, Any] | None = None, hashes: dict[str, str] | None = None) bool¶
Return True when all output files exist, the step is not forced, and the stored fingerprint matches.
The sidecar file stores two sections: “scalars” for human-readable scalar argument values and “hashes” for sha256 content fingerprints. A mismatch in either section, or a missing sidecar when params are expected, is treated as a cache miss.
- Parameters:
step_name – Name of the cache step, used to locate the sidecar file.
files – Output filenames relative to cache_dir that must all exist for a cache hit.
scalars – Scalar argument values to compare against the stored sidecar, or None.
hashes – Content fingerprints to compare against the stored sidecar, or None.
Returns: True on a cache hit, False on a miss.
- status(steps: list[collections.abc.Callable[Ellipsis, Any]]) dict[str, bool]¶
Return a mapping of each step’s qualified name to whether all its cached output files exist.
Non-decorated callables in steps are silently skipped.
- Parameters:
steps – List of cacheable-decorated functions to check.
Returns: Dict mapping fn.__qualname__ to True if all cached outputs exist, False otherwise.
- class kwneuro.CacheSpec¶
Bases:
Generic[T]Explicit cache spec for
@cacheablewhen the return type does not implement the cache protocol.Use the bare
@cacheabledecorator instead when the return type implements_cache_files,_cache_save, and_cache_load.- save: collections.abc.Callable[[T, pathlib.Path], None]¶
Callable that persists the result to the cache directory.
- load: collections.abc.Callable[[pathlib.Path], T]¶
Callable that reconstructs the result from the cache directory.
- kwneuro.cacheable(fn_or_spec: collections.abc.Callable[Ellipsis, Any] | CacheSpec[Any]) Any¶
Decorator that adds transparent caching when a Cache context is active.
Outside a
with Cache(...)block the function runs normally with no overhead. Scalar and dataclass arguments are fingerprinted automatically; a change in either causes a cache miss. Arguments that cannot be fingerprinted trigger a UserWarning.Can be used in two ways. As a bare decorator when the return type implements the cache protocol (_cache_files, _cache_save, _cache_load):
@cacheable def estimate_dti(dwi: Dwi, mask: VolumeResource | None = None) -> Dti: ...
Or with an explicit CacheSpec for return types that cannot carry the protocol:
@cacheable(CacheSpec(files=[...], save=..., load=...)) def compute_csd_peaks(...) -> tuple[VolumeResource, VolumeResource]: ...
- class kwneuro.Dwi¶
A diffusion weighted image.
- volume: kwneuro.resource.VolumeResource¶
The DWI image volume. It is assumed to be a 4D volume, with the first three dimensions being spatial and the final dimension indexing the diffusion weightings.
- bval: kwneuro.resource.BvalResource¶
The DWI b-values
- bvec: kwneuro.resource.BvecResource¶
The DWI b-vectors
- load() Dwi¶
Load any on-disk resources into memory and return a Dwi with all loadable resources loaded.
- save(path: kwneuro.util.PathLike, basename: str) Dwi¶
Save all resources to disk and return a Dwi with all resources being on-disk.
- Parameters:
path – The desired save directory.
basename – The desired file basenames, i.e. without an extension.
Returns: A Dwi with its internal resources being on-disk.
- get_gtab() dipy.core.gradients.GradientTable¶
Get the GradientTable for this DWI.
- compute_mean_b0() kwneuro.resource.InMemoryVolumeResource¶
Compute the mean of the b=0 images of a DWI.
- static concatenate(dwis: list[Dwi]) Dwi¶
Concatenate a list of
Dwis into a single (loaded) DWI.The affine and metadata of the first
Dwiin the list will be used to concatenate volumes.
- extract_brain() kwneuro.resource.InMemoryVolumeResource¶
Extract brain mask. This is meant to be convenient rather than efficient. Using this in a loop could result in unnecessary repetition of file I/O operations. For efficiency, see
kwneuro.masks.brain_extract_dwi_batch().
- estimate_dti(mask: kwneuro.resource.VolumeResource | None = None) kwneuro.dti.Dti¶
Estimate diffusion tensor image from this DWI
- estimate_noddi(mask: kwneuro.resource.VolumeResource | None = None, dpar: float = 0.0017, n_kernel_dirs: int = 500, regenerate_kernels: bool = True) kwneuro.noddi.Noddi¶
Estimate NODDI model parameters from this DWI. See
kwneuro.noddi.Noddi.estimate_noddi()for details.
- kwneuro.read_dwi_fsl(volume: kwneuro.util.PathLike, bval: kwneuro.util.PathLike | None = None, bvec: kwneuro.util.PathLike | None = None) kwneuro.dwi.Dwi¶
Create a DWI from a NIfTI volume and FSL b-value/b-vector files.
When
bvalorbvecare omitted, they are inferred from the DWI volume path by replacing a.niior.nii.gzsuffix with.bvaland.bvec. This covers common BIDS-style DWI sidecars when the NIfTI path is passed directly.
- kwneuro.read_structural(path: kwneuro.util.PathLike) kwneuro.structural.StructuralImage¶
Create a structural image from a lazy NIfTI volume resource.
- kwneuro.read_volume(path: kwneuro.util.PathLike) kwneuro.io.NiftiVolumeResource¶
Create a lazy volume resource from a NIfTI path.
- kwneuro.write_dwi_fsl(dwi: kwneuro.dwi.Dwi, volume: kwneuro.util.PathLike, bval: kwneuro.util.PathLike | None = None, bvec: kwneuro.util.PathLike | None = None) kwneuro.dwi.Dwi¶
Write a DWI to NIfTI plus FSL b-value/b-vector files.
When
bvalorbvecare omitted, sidecar paths are inferred from the output volume path in the same way asread_dwi_fsl().
- kwneuro.write_structural(structural: kwneuro.structural.StructuralImage, path: kwneuro.util.PathLike) kwneuro.structural.StructuralImage¶
Write a structural image to a NIfTI path and return the on-disk image.
- kwneuro.write_volume(volume: kwneuro.resource.VolumeResource, path: kwneuro.util.PathLike) kwneuro.io.NiftiVolumeResource¶
Write a volume resource to a NIfTI path and return the on-disk resource.
- class kwneuro.StructuralImage¶
A structural (e.g. T1-weighted) MRI image.
- volume: kwneuro.resource.VolumeResource¶
The structural MRI volume. Expected to be a 3D volume.
- load() StructuralImage¶
Load any on-disk resources into memory and return a StructuralImage with all resources loaded.
- save(path: kwneuro.util.PathLike, basename: str) StructuralImage¶
Save the volume to disk and return a StructuralImage with an on-disk resource.
- Parameters:
path – The desired save directory.
basename – The desired file basename (without extension).
Returns: A StructuralImage with its internal resource being on-disk.
- correct_bias() StructuralImage¶
Apply N4 bias field correction using ANTsPy.
Returns: A new StructuralImage with the bias-corrected volume.
- extract_brain() kwneuro.resource.InMemoryVolumeResource¶
Extract a brain mask using HD-BET.
This is meant to be convenient rather than efficient. Using this in a loop could result in unnecessary repetition of file I/O operations. For efficiency, see
kwneuro.masks.brain_extract_structural_batch().
- segment_tissues(mask: kwneuro.resource.VolumeResource | None = None, method: str = 'atropos') kwneuro.resource.InMemoryVolumeResource¶
Segment brain tissues into labeled classes.
- Parameters:
mask – Optional brain mask. Used only with
method="atropos"; when omitted a mask is generated automatically viaants.get_mask(). Ignored formethod="deep_atropos", which handles preprocessing internally.method –
Segmentation method. One of:
"atropos"(default): Classical ANTsPy k-means Atropos. Returns a 3-class labeled volume (1=CSF, 2=GM, 3=WM). No extra installation required."deep_atropos": Deep-learning segmentation via ANTsPyNet. Returns a 6-class labeled volume (1=CSF, 2=GM, 3=WM, 4=deep GM, 5=cerebellum, 6=brainstem). Requirespip install kwneuro[antspynet].
Returns: A labeled segmentation volume.
- parcellate(method: str = 'dkt') kwneuro.resource.InMemoryVolumeResource¶
Cortical parcellation.
- Parameters:
method – Parcellation method. Currently only
"dkt"is supported: Desikan-Killiany-Tourville (DKT) cortical labeling via ANTsPyNet (~84 regions). Requirespip install kwneuro[antspynet].
Returns: A DKT-labeled parcellation volume.