Skip to main content

A python library for neuroimaging transformations

Project description

warpkit

Build PyPI docker

A python library for neuroimaging transforms

If you've landed here, you're probably interested in the Multi-Echo DIstortion Correction (MEDIC) algorithm, which this library implements.

You can find the pre-print for MEDIC here: https://www.biorxiv.org/content/10.1101/2023.11.28.568744v1.

See below for usage details.

Installation

Julia

warpkit requires julia installed on your system ensure that you have the julia executable in your path, and the julia libraries correctly setup in your ld.so.conf. See the below instructions for both Linux and macOS.

Linux

If you installed julia via a package manager, library configuration should be done for you (most of the time) already. However, if you installed Julia manually, you may need to tell ldconfig where the julia libraries are. For example, on debian based systems you can do this with:

# /path to julia installation (the lib folder will have libjulia.so)
echo /path/to/julia/lib > /etc/ld.so.conf.d/julia.conf
ldconfig

If you have done this correctly, you should see libjulia.so in your ldconfig:

ldconfig -p | grep julia                                                                                        
	libjulia.so.1 (libc6,x86-64) => /usr/lib/libjulia.so.1
	libjulia.so (libc6,x86-64) => /usr/lib/libjulia.so

The above may require root privileges. The alternative to the above is to set the LD_LIBRARY_PATH environment variable to the path of the julia libraries.

# /path to julia installation (the lib folder will have libjulia.so)
export LD_LIBRARY_PATH=/path/to/julia/lib:$LD_LIBRARY_PATH

Note however, that you must type the above each time you open a new terminal. To make this permanent, you can add the above line to your shell's profile file.

macOS

If you installed julia through brew, this should be done for you already.

However, if you get an error saying that libjulia cannot be found, you may need to add the julia libraries via your DYLD_LIBRARY_PATH environment variable. For example, if you installed julia to /Applications/Julia-1.6.app, you would add the following to your shell's profile file:

export DYLD_LIBRARY_PATH=/Applications/Julia-1.6.app/Contents/Resources/julia/lib:$DYLD_LIBRARY_PATH

Installing through pip

Assuming you have julia installed and configured correctly, you can install warpkit through pip:

pip install warpkit

If you encounter any errors during the installation process, please report them to the issue tracker with the logs reported from pip install warpkit -v.

Installing through conda

Another way to install warpkit is through a conda environment. Currently, warpkit is not uploaded to any conda channels, so you will need to build it from source (Looking for help on this issue).

[!NOTE] For advanced users only A meta.yaml file is present in the conda folder in the root of the repo. If you are familiar with conda-build you should be able to build this with your existing conda install.

Fortunately, there is an automated script that will download micromamba (a conda variant), create a new environment, and build/install warpkit for you automagically. To do this, clone this repo and run the following:

# switch to conda directory in repo
cd conda
# run the install script (use -p or --path to specify an install prefix)
# by default this is set to ~/micromamba
./warpkit-conda-install.sh

# in your shell profile add the following lines
# or just execute them in your current shell
# but it won't be permanent
export MAMBA_ROOT_PREFIX=/whatever/path/you/installed/micromamba/prefix/above
eval "$(/whatever/path/you/installed/micromamba/prefix/above/bin/micromamba shell hook -s posix)"

# if you added the above to your profile
# restart your shell then activate the environment
#
# unless you have already executed the above in your current shell
# then you don't need to restart it and can just activate the environment
micromamba activate base

# you should now be able to import/use warpkit
python -c "import warpkit"  # should return no errors
medic --help  # should return help

After installing and configuring everything, you must type micromamba activate base each time you open a new terminal to get back into the conda environment to use warpkit. To make this permanent, you can add the above line to your shell's profile file.

Installing through docker

If you are familiar with docker, you can also install warpkit through a docker container.

docker run -it --rm ghcr.io/vanandrew/warpkit:latest

Note that the default entrypoint is the medic CLI script, so you can run medic --help to get the help message.

Building and installing from source

To build and install from source, clone this repo and run the following in the repo directory. I highly recommend installing it in editable mode (with the strict option, see here):

pip install -e ./[dev] -v --config-settings editable_mode=strict

You will need a C++ compiler with C++17 support, as well as Julia pre-installed on your system. See the Julia section for more details.

The build process uses CMake to build the C++/Python Extension. If you encounter an error during the build process, please report the full logs of the build process using the -v flag to the pip command above.

What is MEDIC?

MEDIC takes your ME-EPI phase data from this:

phase

to this:

field map

for each frame of your data. You can then use these field maps to distortion correct your data.

MEDIC Usage

The warpkit library is meant for integration into a larger neuroimaging pipeline/software package.

An example of how to call MEDIC from python is provided below:

import nibabel as nib
from warpkit.distortion import medic
from warpkit.utilities import displacement_map_to_warp

# load phase and magnitude images into lists
# each element in list is a different echo
phases = [nib.load(p) for p in phases_paths]
magnitudes = [nib.load(p) for p in magnitude_paths]
TEs = [TE1, TE2, ...] # in milliseconds
effective_echo_spacing = ... # in seconds
phase_encoding_direction = either i, j, k, i-, j-, k-, x , y, z, x-, y-, z- 

# call the medic function
field_maps_native, displacement_maps, field_maps = medic(
    phases, magnitudes, TEs, effective_echo_spacing, phase_encoding_direction)

# field_maps_native are returned in the distorted space (Hz) (mainly for reference/debugging purposes)
# you shouldn't need to use these probably???
# displacement_maps are returned in the undistorted space (mm) (see below for usage)
# field_maps are returned in the undistorted space (Hz) (same field map output as topup/fugue, but framewise)

# returns are nibabel Nifti1Image objects, so they can be saved to file by:

# displacement_maps to file
displacement_maps.to_filename("/path/to/save.nii.gz")

# these should be converted to displacement fields
# by the displacement_map_to_field function
# and specifying the appropriate type (i.e. itk, ants, afni, fsl)

displacement_field = displacement_map_to_field(displacement_maps, axis="y", format="itk", frame=0)

# where axis specifies the phase encoding direction, format is the desired output format, and frame is the index of
# displacement map to convert to a displacement field

# the displacement field can then be saved to file by the to_filename method
# Each file can be applied with the respective software's displacement field application tool:
# itk: the internal format warpkit uses. See utilities.resample_image
# ants: antsApplyTransforms (note that even though ants also uses itk, warpkit's itk warp format is NOT equivalent)
# afni: 3dNwarpApply
# fsl: applywarp

# if you are using fsl and instead want to use fugue to distortion correction, you can use the field_maps outputs
# (these are the equivalent field maps of that you would get from fugue, but with multiple frames)

You can also use the provided CLI script medic to run MEDIC from the command line. The script is installed to your PATH when you install the package. medic takes the following arguments:

usage: medic [-h] --magnitude MAGNITUDE [MAGNITUDE ...] --phase PHASE
             [PHASE ...] --metadata METADATA [METADATA ...]
             [--out_prefix OUT_PREFIX] [-f NOISEFRAMES] [-n N_CPUS]
             [--debug] [--wrap_limit]

Multi-Echo DIstortion Correction

options:
  -h, --help            show this help message and exit
  --magnitude MAGNITUDE [MAGNITUDE ...]
                        Magnitude data
  --phase PHASE [PHASE ...]
                        Phase data
  --metadata METADATA [METADATA ...]
                        JSON sidecar for each echo
  --out_prefix OUT_PREFIX
                        Prefix to output field maps and displacment maps.
  -f NOISEFRAMES, --noiseframes NOISEFRAMES
                        Number of noise frames
  -n N_CPUS, --n_cpus N_CPUS
                        Number of CPUs to use.
  --debug               Debug mode
  --wrap_limit          Turns off some heuristics for phase unwrapping

Vahdeta Suljic <suljic@wustl.edu>, Andrew Van <vanandrew@wustl.edu>
12/09/2022

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

warpkit-0.1.1.tar.gz (155.4 kB view details)

Uploaded Source

Built Distributions

warpkit-0.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.12 manylinux: glibc 2.17+ x86-64

warpkit-0.1.1-cp312-cp312-macosx_10_9_universal2.whl (2.2 MB view details)

Uploaded CPython 3.12 macOS 10.9+ universal2 (ARM64, x86-64)

warpkit-0.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.11 manylinux: glibc 2.17+ x86-64

warpkit-0.1.1-cp311-cp311-macosx_10_9_universal2.whl (2.2 MB view details)

Uploaded CPython 3.11 macOS 10.9+ universal2 (ARM64, x86-64)

warpkit-0.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ x86-64

warpkit-0.1.1-cp310-cp310-macosx_10_9_universal2.whl (2.2 MB view details)

Uploaded CPython 3.10 macOS 10.9+ universal2 (ARM64, x86-64)

warpkit-0.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ x86-64

warpkit-0.1.1-cp39-cp39-macosx_10_9_universal2.whl (2.2 MB view details)

Uploaded CPython 3.9 macOS 10.9+ universal2 (ARM64, x86-64)

warpkit-0.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.8 manylinux: glibc 2.17+ x86-64

warpkit-0.1.1-cp38-cp38-macosx_10_9_universal2.whl (2.2 MB view details)

Uploaded CPython 3.8 macOS 10.9+ universal2 (ARM64, x86-64)

File details

Details for the file warpkit-0.1.1.tar.gz.

File metadata

  • Download URL: warpkit-0.1.1.tar.gz
  • Upload date:
  • Size: 155.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/4.0.2 CPython/3.11.7

File hashes

Hashes for warpkit-0.1.1.tar.gz
Algorithm Hash digest
SHA256 da21123d511cf3b66baffe884e13a14ecc3465066c5c6a56cbfc2fdd870c402e
MD5 49fca0fdc4fa1f510316c06a038d17fa
BLAKE2b-256 c6cfe66ff329cc01f6ea3a026f1388295fbfb8758f72aa64ba3a21fc370857dd

See more details on using hashes here.

File details

Details for the file warpkit-0.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for warpkit-0.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 0476fc272d508e5548a6e58fe722067ab3d5bf69bc4f39d4d71cb13025e41905
MD5 dca90453bdfaacbff941e6113934f37b
BLAKE2b-256 ec60905190eb699606753d768a7cde7bac9d00663f6b34e50f6bc4a1ac8851af

See more details on using hashes here.

File details

Details for the file warpkit-0.1.1-cp312-cp312-macosx_10_9_universal2.whl.

File metadata

File hashes

Hashes for warpkit-0.1.1-cp312-cp312-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 dfbf56d4a3269549bcbbcd54386d1bdbc338365b5c55ea8867a982d622b5754b
MD5 fea80039694f3dd185e9752e4cce1778
BLAKE2b-256 20d716551324bbe5d82a690cb4cc976be214df1a4c69435bd60c394b54d047f2

See more details on using hashes here.

File details

Details for the file warpkit-0.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for warpkit-0.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 c40ef782b5cf67a249b79e1692c432c559823d8132bb346bf8960c0860593496
MD5 24d3482b4ae3dc78e5faf779e5364efe
BLAKE2b-256 ca00c97877e09b25db6f62e523d52d2442b4506b8ff643b04cafe361511159e2

See more details on using hashes here.

File details

Details for the file warpkit-0.1.1-cp311-cp311-macosx_10_9_universal2.whl.

File metadata

File hashes

Hashes for warpkit-0.1.1-cp311-cp311-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 7312b41256bb8fbd8144cdb9c333245dc4a2278c1de772ddb7c98dc0b1982e91
MD5 cddbc7e653282989239d9c6f5f76823f
BLAKE2b-256 7f05554caebddf86f3eb7701fb74cb7c3e726edec54aaf63b7c5534415aec483

See more details on using hashes here.

File details

Details for the file warpkit-0.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for warpkit-0.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 7bf2adc4725ead1b4c3ad3e5b8283be349aac31f6b02f144525eba18576babe2
MD5 1a20684d3672c689f14430e693615d7b
BLAKE2b-256 c3ba9b33bae50923d615dd022276ba503f433ded19078635e51658dfb316f47d

See more details on using hashes here.

File details

Details for the file warpkit-0.1.1-cp310-cp310-macosx_10_9_universal2.whl.

File metadata

File hashes

Hashes for warpkit-0.1.1-cp310-cp310-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 880f23427b7def04e55a8f58368fb0fc5c4e7bea00906ebd3d77587302fe4120
MD5 263b34464f2bfd8f2de5bd9821eca7c2
BLAKE2b-256 4c120d8d9fca8ec790501e5697945949afe97939c48d5edcc05f82afd8f4d923

See more details on using hashes here.

File details

Details for the file warpkit-0.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for warpkit-0.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 ba5e3d5b34e24af3423cab824b1ecddf5a6d6ad2fd191cda5185b191f4586a86
MD5 f8cb070839656a26229d469005ec9131
BLAKE2b-256 80cb021cb36b01a1d0942b7205baea1686543d70b4fa83c451e750ecaba27800

See more details on using hashes here.

File details

Details for the file warpkit-0.1.1-cp39-cp39-macosx_10_9_universal2.whl.

File metadata

File hashes

Hashes for warpkit-0.1.1-cp39-cp39-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 53240067f7746894be269ef333caa39e195bb25d44cf4c9beed9ca6867d241fd
MD5 0cabd77df8af71f67280ef87c3169298
BLAKE2b-256 93c54217e2a820b166c6c91379c20836f1f18982765bd443c680ecab91a85a35

See more details on using hashes here.

File details

Details for the file warpkit-0.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for warpkit-0.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 3451eeecd42af0d6e95cb4647746f6759b87d062b95f0b2460058bf4a8f4ae4d
MD5 ac94acdaa745e19fc1fb02b0a8b6d74c
BLAKE2b-256 7fb51596adc97f035461a4628d447a69f1d063f750fb3bfdb64638dde1933ca2

See more details on using hashes here.

File details

Details for the file warpkit-0.1.1-cp38-cp38-macosx_10_9_universal2.whl.

File metadata

File hashes

Hashes for warpkit-0.1.1-cp38-cp38-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 9272ef11754b531ccde4c3d00fcb1e009d460d1aa69c76867c2bbd853a0901d4
MD5 d9db2a96f94a0b46017b02ec831050a2
BLAKE2b-256 b2f8d815b1dcecb82d1f778dc3df18c0d9c1331a0b3b11865920d2bd3f99d1cb

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page