MRdataset : unified interface to various neuroimaging datasets#
Description#
Provides a unified interface for horizontal and vertical traversal of various neuroimaging datasets (DICOM) and any other generic format etc.
Ensures that the DICOM files are valid imaging DICOMs and provides the option to skip phantoms, localizer, head scouts etc.
Provides flexibility to ignore automatically generated derived scans such as MoCo series, Single-band references, perfusion weighted scans.
Verifies if each DICOM slice belongs to the same scan volume and, then subsequently organizes all scans are hierarchical fashion (Subject > Session > Sequence > Run)
Identifies sequences acquired within the same session, which is especially useful for associating field maps with their corresponding functional (EPI) scans.
Tutorial: Please refer to the Jupyter Notebook tutorial.
Documentation: https://open-minds-lab.github.io/MRdataset/
API usage#
To use MRdataset in a project -
import MRdataset
The most important method is import_dataset
. The dataset type
such as dicom
or bids
can be specified using the ds_format
argument.
from MRdataset import import_dataset
Given a valid folder path to a dataset of MR images (e.g. DICOM images), it creates a dataset.
data_folder = '/home/user/datasets/XYZ'
dataset = import_dataset(data_source=data_folder,
ds_format='dicom')
By default, the import_dataset
expects a DICOM dataset. However, this can
be changed using ds_format
argument. For example, use ds_format='bids'
for
importing a BIDS dataset.
We follow a hierarchical structure in our dataset as shown above. And we provide methods for
accessing each of these elements. These access-methods are traverse_horizontal
and traverse_vertical2
. For example, we can traverse through all the subjects for a given sequence
using traverse_horizontal
method.
seq_name = '3D_T2_FLAIR'
for subject, session, run, sequence in dicom_dataset.traverse_horizontal(seq_name):
print(f"Subject: {subject},\nSession: {session},\nRun: {run},\nSequence: {sequence}")
Similarly, we can traverse through all the sequences/modality for a given subject using traverse_vertical2 method. It is helpful for retrieving epi and corresponding fieldmaps for a given subject. Let's see an example.
seq_id1 = 'me_fMRI'
seq_id2 = 'me_FieldMap_GRE'
for subject, session, run1, run2, seq1, seq2 in dicom_dataset.traverse_vertical2(seq_id1, seq_id2):
print(seq1)
print(seq2)
break
Finally, save_mr_dataset
and load_mr_dataset
can be used to save and load a
dataset. For example, to save a dataset
from MRdataset import save_mr_dataset
save_mr_dataset(dataset, '/home/user/datasets/xyz.mrds.pkl')
Similarly, to load a dataset
from MRdataset import load_mr_dataset
dataset = load_mr_dataset('/home/user/datasets/xyz.mrds.pkl')
Note that the dataset is saved as a pickle file with an extension .mrds.pkl
.
Command line usage#
MRdataset can be used on the command line interface. For a DICOM dataset
mrds --data-source /path/to/dataset --format dicom
For a BIDS dataset
mrds --data-source /path/to/dataset --format bids
- cli()
The following arguments are supported:
- -d, --data-sourcestr
directory containing downloaded dataset with dicom files, supports nested hierarchies
- --configstr
path to config file
- -o, --output-dirstr
specify the directory where the dataset would be saved.
- -f, --formatstr
choose type of dataset, expected one of [dicom|bids]
- -n, --namestr
provide an identifier/name for dataset. If not provided, the name of the dataset will be a random string e.g. '54321'
- --is-partialbool
flag dataset as a partial dataset. The flag is useful while reading a dataset in chunks e.g. when the dataset is too large to fit in memory. If the dataset is complete, the flag should not be set.
Examples
mrds -d /path/to/my/data/ --format dicom --name abcd_baseline --config mri-config.json --output-dir /path/to/my/output/dir/