Learn R Programming

⚠️There's a newer version (0.17.4) of this package.Take me there.

ciftiTools

CIFTI files contain brain imaging data in “grayordinates,” which represent the gray matter as cortical surface vertices (left and right) and subcortical voxels (cerebellum, basal ganglia, and other deep gray matter). ciftiTools provides a unified environment for reading, writing, visualizing and manipulating CIFTI-format data. It supports the “dscalar,” “dlabel,” and “dtseries” intents. Grayordinate data is read in as a "xifti" object, which is structured for convenient access to the data and metadata, and includes support for surface geometry files to enable spatially-dependent functionality such as static or interactive visualizations and smoothing.

Citation

If you use ciftiTools, please cite our paper:

Pham, D. D., Muschelli, J., & Mejia, A. F. (2022). ciftiTools: A package for reading, writing, visualizing, and manipulating CIFTI files in R. NeuroImage, 250, 118877.

You can also obtain citation information from within R like so:

citation("ciftiTools")

Installation

You can install ciftiTools from CRAN with:

install.packages("ciftiTools")

Additionally, most of the ciftiTools functions require the Connectome Workbench, which can be installed from the HCP website.

Quick start guide

# Load the package and point to the Connectome Workbench --------
library(ciftiTools)
ciftiTools.setOption("wb_path", "path/to/workbench")

# Read and visualize a CIFTI file -------------------------------
cifti_fname <- ciftiTools::ciftiTools.files()$cifti["dtseries"]
surfL_fname <- ciftiTools.files()$surf["left"]
surfR_fname <- ciftiTools.files()$surf["right"]

xii <- read_cifti(
  cifti_fname, 
  surfL_fname=surfL_fname, surfR_fname=surfR_fname,
  resamp_res=4000
)

view_xifti_surface(xii) # or plot(xii)
# view_xifti_volume(xii) if subcortex is present

# Access CIFTI data ---------------------------------------------
cortexL <- xii$data$cortex_left
cortexL_mwall <- xii$meta$medial_wall_mask$left
cortexR <- xii$data$cortex_right
cortexR_mwall <- xii$meta$medial_wall_mask$right
# subcortVol <- xii$data$subcort
# subcortLabs <- xii$meta$subcort$labels
# subcortMask <- xii$meta$subcort$mask
surfL <- xii$surf$cortex_left
surfR <- xii$surf$cortex_right

# Create a `"xifti"` from data ----------------------------------
xii2 <- as.xifti(
  cortexL=cortexL, cortexL_mwall=cortexL_mwall,
  cortexR=cortexR, cortexR_mwall=cortexR_mwall,
  #subcortVol=subcortVol, subcortLabs=subcortLabs,
  #subcortMask=subcortMask,
  surfL=surfL, surfR=surfR
)

# Write a CIFTI file --------------------------------------------
write_cifti(xii2, "my_cifti.dtseries.nii")

Vignette

See this link to view the tutorial vignette.

List of commonly-used functions

Basics: reading, plotting, writing

  • ciftiTools.setOption: Necessary to point to the Connectome Workbench each time ciftiTools is loaded.
  • read_cifti: Read in a CIFTI file as a "xifti" object.
  • view_xifti Plot the cortex and/or subcortex. Has many options for controlling the visualization.
  • write_cifti: Write a "xifti" object to a CIFTI file.

Manipulating CIFTI files

  • resample_cifti: Resample to a different resolution.
  • separate_cifti: Separate a CIFTI file into GIFTI and NIFTI files.
  • smooth_cifti: Smooth the data along the surface.
  • (Use run_wb_cmd to execute Connectome Workbench commands from R)

Manipulating "xifti" objects

  • apply_xifti: Similar to base::apply.
  • combine_xifti: Combine "xifti"s with non-overlapping brain structures.
  • convert_xifti: Convert between dlabel, dscalar, and dtseries.
  • merge_xifti: Concatenate "xifti"s.
  • move_from_mwall: Convert the medial wall mask to a data value, deleting the mask.
  • move_to_mwall: Mask out a particular data value.
  • newdata_xifti: Replace the data values.
  • resample_xifti: Resample to a different resolution.
  • scale_xifti: Similar to base::scale.
  • select_xifti: Rearrange the columns to reorder, take a subset, or repeat them.
  • smooth_xifti: Smooth the data along the surface.
  • transform_xifti: Apply a vectorizable function.

Surface gemoetry

  • load_surf: Load a surface geometry included in the package.
  • read_surf: Read in a GIFTI surface geometry file as a "surf" object.
  • write_surf: Write a "surf" object to a GIFTI surface geometry file.

Parcellations

  • apply_parc: Apply a function to each parcel separately.
  • load_parc: Load a parcellation included in the package.

See NAMESPACE for a full list of all exported functions.

Illustrations

FAQ

Why is a CIFTI file that has been read in called a "xifti"?

The "xifti" object is a general interface for not only CIFTI files, but also GIFTI and NIFTI files. For example, we can plot a surface GIFTI:

xii <- as.xifti(surfL=read_surf(ciftiTools.files()$surf["left"]))
plot(xii)

We can also convert metric GIFTI files and/or NIFTI files to CIFTI files (or vice versa) using the "xifti" object as an intermediary.

How do I visualize cortical data without applying shading to the mesh geometry?

The 3D shading may make certain plots more difficult to interpret, if the color scale varies from light to dark: darker regions might be in a shadow, or their values might be higher. To skip shading, use the argument material=list(lit=FALSE) to view_xifti_surface.

How do I get VoxelIndicesIJK or the MNI coordinates for the subcortex?

For a "xifti" object xii with subcortical data, the mask of data locations are saved in xii$meta$subcort$mask. To obtain the array coordinates of the in-mask locations, use which(xii$meta$subcort$mask, arr.ind=TRUE) - 1. This matrix has each subcortical voxel along the rows, and its I, J, and K array coordinates along the three columns. 1 is subtracted because the coordinates should begin with 0 rather than 1. It’s equivalent to the original CIFTI metadata entry VoxelIndicesIJK. To convert array coordinates to MNI coordinates, multiply by the transformation matrix xii$meta$subcort$trans_mat:

VoxIJK <- which(xii$meta$subcort$mask, arr.ind=TRUE) - 1
VoxIJK <- cbind(VoxIJK, 1) # for 4th col of transform mat (translation)
VoxXYZ <- t(xii$meta$subcort$trans_mat[seq(3),] %*% t(VoxIJK)) # MNI coords

Related R extensions

  • NIFTI files: oro.nifti, RNifti
  • GIFTI files: gifti
  • CIFTI files: cifti can read in any CIFTI file, whereas ciftiTools provides a user-friendly interface for CIFTI files with the dscalar, dlabel, and dtseries intents only.
  • Other structural neuroimaging files: fsbrain
  • xml files: xml2
  • Interactive 3D rendering: rgl

Data acknowledgement

The following data are included in the package for convenience:

Example CIFTI files provided by NITRC.

Cortical surfaces provided by the HCP, according to the Data Use Terms:

Data were provided [in part] by the Human Connectome Project, WU-Minn Consortium (Principal Investigators: David Van Essen and Kamil Ugurbil; 1U54MH091657) funded by the 16 NIH Institutes and Centers that support the NIH Blueprint for Neuroscience Research; and by the McDonnell Center for Systems Neuroscience at Washington University.

Several parcellations provided by Thomas Yeo’s Computational Brain Imaging Group (CBIG):

  1. Yeo, B. T. T. et al. The organization of the human cerebral cortex estimated by intrinsic functional connectivity. J Neurophysiol 106, 1125–1165 (2011).
  2. Schaefer, A. et al. Local-Global Parcellation of the Human Cerebral Cortex from Intrinsic Functional Connectivity MRI. Cereb Cortex 28, 3095–3114 (2018).
  3. Kong, R. et al. Individual-Specific Areal-Level Parcellations Improve Functional Connectivity Prediction of Behavior. Cerebral Cortex (2021).

Copy Link

Version

Install

install.packages('ciftiTools')

Monthly Downloads

564

Version

0.16.1

License

GPL-3

Issues

Pull Requests

Stars

Forks

Maintainer

Amanda Mejia

Last Published

September 20th, 2024

Functions in ciftiTools (0.16.1)

ROY_BIG_BL

"ROY_BIG_BL" color palette
as.surf_gifti

Format surface data as a "gifti"
as.metric_gifti

Format metric data as a "gifti"
boundary_mask_surf

Boundary region of a mask
area_target_Param

area_target_Param
S3_Math

"xifti" S3 Math methods
cifti_component_suffix

Get CIFTI component suffix default
ciftiTools_warn

Print suppressible warning
check_cifti_type

Check CIFTI type
as.xifti

Assemble a "xifti" from data
dist_from_mask_surf

Distance from mask on surface
confirm_wb_cmd_path

Confirm the Connectome Workbench command path
assure_parc

Assure this is a parcellation
get_data_meta_from_cifti_xml

Extract data-related metadata from CIFTI
as.matrix.xifti

Convert a "xifti" to a matrix
cifti_fname_Param

cifti_fname
S3_Ops

"xifti" S3 Ops methods
ciftiTools.files

ciftiTools files
ciftiTools

ciftiTools: Tools for Reading and Visualizing CIFTI Brain Files
ciftiTools.setOption

Set a ciftiTools option
convert_to_dlabel

Convert the intent of a CIFTI file or "xifti" object
combine_xifti

Combine "xifti"s with non-overlapping brain structures
coordlist_to_vol

Convert coordinate list to volume
faces_Param

faces
format_path

Format a path
.onAttach

Message on attach
fix_xifti

Fix a "xifti"
ciftiTools.checkOption

Validate a ciftiTools option and value
ciftiTools_msg

Print suppressible message
brainstructures_Param_all

brainstructures
get_cifti_extn

Get CIFTI file extension
is.fname

Is this an existing file path?
info_cifti

Get CIFTI metadata
idx_Param

idx
flatten_xifti

Flatten a "xifti"
header_cifti

Get NIFTI header (of a CIFTI)
crop_image

Crop image
is.3D_mask

Validate a 3d binary mask
fix_gifti_mwall

Fix GIFTI medial wall
ciftiTools.getOption

Get a ciftiTools option
labels_Description

labels
edit_mask_surf

Edit mask on surface
is.cifti

Validate a "xifti" object
nrow_xifti

Counts the number of rows (vertices + voxels) in a "xifti".
move_from_mwall

Move data locations from medial wall
is.nummat

Validate a numeric matrix
is.surf

Validate a "surf" object (vertices + faces)
move_to_mwall

Move data locations to the medial wall
even_vert_samp

Evenly sample vertices of mesh
make_subcort

Make the subcortical components of a "xifti"
load_sub_parc

Load subcortical parcellation
load_surf

Load a "surf" included in ciftiTools
is.subcort_labs

Validate a factor vector of subcortical labels
infer_resolution

Infer resolution from "xifti" and surfaces
ciftiTools.listOptions

List ciftiTools options
is.xifti

Validate a "xifti" object.
make_color_pal

Make a color palette.
crop_vol

Crop a 3D array
make_cortex

Make the cortical components of a "xifti"
parc_mean_mat

Make parcellation mean matrix
get_intn_meta_from_cifti_xml

Extract intent-specific metadata from CIFTI
ncol_xifti

Counts the number of columns in a "xifti".
match_exactly

Do these character vectors match exactly?
resample_surf

Resample a "surf" object
make_trans_mat

Make the subcortical transformation matrix
merge_kwargs

Merges two kwargs
merge_xifti

Concatenate "xifti"s
radial_order_surf

Order Vertices on Circular Manifold
dim.xifti

Dimensions of a "xifti"
original_fnames_Param_remapped

original_fnames: for remapping
parc_vals_to_xifti

Convert parcellation values to "xifti"
remap_cifti

Remap CIFTI data
move_to_submask

Move data locations to the subcortex mask
get_kwargs

Get kwargs
read_cifti

Read a CIFTI file
match_input

Match user inputs to expected values
resample_cifti

Resample CIFTI data
remap_cifti_wrapper

remap_cifti wrapper
get_wb_cmd_path

Get the Connectome Workbench command path
expand_color_pal

Interpolates between entries in the input palette to make a larger palette with COLOR_RES entries.
separate_cifti_wrapper

separate_cifti wrapper
expect_equal_xifti

Expect these "xifti"s to match
resamp_res_Param_required

resamp_res: required
set_names_xifti

Set "xifti" column names
newdata_xifti

Replace the data in a "xifti"
parc_add_subcortex

Add subcortex to cortical parcellation
substructure_table

Substructure table
get_misc_meta_from_cifti_xml

Extract misc metadata from CIFTI
read_dir_Param_separated

read_dir: separated files
parc_borders

Parcellation borders
remove_xifti

Remove a component from a "xifti"
resample_cifti_components

Resample a series of GIFTIs related to a CIFTI file
rgl_interactive_plots_Description

Navigating and Embedding the Interactive Plots
read_cifti_flat

Read only the data matrix in a CIFTI file
read_cifti_convert

Read a CIFTI file quickly
plot.xifti

S3 method: use view_xifti to plot a "xifti" object
summary.surf

Summarize a "surf" object
surfR_Param_optional

surfR
use_color_pal

Use a color palette
surfR_fname_Param

surfR_fname
mask_Param_vertices

mask: vertices
is.xifti_data

Validate the "data" component of a "xifti" object
separate_cifti_files

Separate CIFTI: file names
resample_cifti_default_fname

Get resampled file name default
load_parc

Load a parcellation included in ciftiTools
original_fnames_Param_resampled

original_fnames: for resampling
verbose_Param_FALSE

verbose: FALSE
view_xifti_surface.surf_hemi

Sort out surface & hemisphere args for view_xifti_surface
view_xifti_surface.draw_title

Draw title in RGL
mask_surf

Mask surface
view_xifti_surface.mesh_val

Get the mesh(es) and data values for view_xifti_surface
mask_with_boundary_surf

Apply Mask With Boundary To Mesh
view_surf

View "surf" object(s)
scale_xifti

Scale CIFTI
rgl_static_plots_Description

Embedding the Static Plots
vert_adjacency

Vertex Adjacency Matrix
rotate_surf

Rotate a "surf" object
remap_gifti

Remap GIFTI metric or label data
read_xifti2

Read in GIFTI files as a "xifti" object
is.xifti_meta

Validate the "meta" component of a "xifti" object
write_subcort_nifti

Write subcortical data to NIFTI files
write_spheres

Generate GIFTI sphere surface files
make_xifti

Assemble a "xifti" object
resamp_method_Param

resamp_method
welcome_msg

Welcome message
move_from_submask

Move data locations from subcortex mask
resamp_res_Param_optional

resamp_res: optional
surfL_target_fname_Param

surfL_target_fname
summary.xifti

Summarize a "xifti" object
surfL_original_fname_Param

surfL_original_fname
pad_vol

Pad a 3D Array
resample_gifti

Resample a GIFTI file (with its ROI)
read_cifti_separate

Read a CIFTI file with optional resampling
template_xifti

Make a template "xifti" object
sys_path

view_xifti_volume

View subcortical data in a "xifti"
view_xifti_surface.color

Get the palettes and data color mapping for view_xifti_surface
view_xifti

View a "xifti" object
plot.surf

S3 method: plot surface
surfR_original_fname_Param

surfR_original_fname
run_wb_cmd

Wrapper for Connectome Workbench Commands
resample_cifti_from_template

Resample a CIFTI from a template
verbose_Param_TRUE

verbose: TRUE
separate_cifti

Separate a CIFTI file
supported_intents

The NIFTI intents supported by ciftiTools
write_label_table

Write label table to text file
resample_cifti_wrapper

resample_cifti wrapper
surf_area

Surface area calculation
wb_path_request

Request "wb_path"
unmask_cortex

Unmask cortex
transform_xifti

Apply a univariate transformation to a "xifti" or pair of "xifti"s.
vox_locations

Get spatial locations of each voxel
write_metric_gifti

Write a data matrix to a GIFTI metric file
read_surf

Get a "surf" object
smooth_gifti

Smooth a metric GIFTI file
write_dir_Param_generic

write_dir: generic
xifti_Param

xifti
write_cifti_from_separate

Write a CIFTI file from NIFTI and GIFTI files
x_Param_xifti

x: xifti
surface_plot_Params

Surface plot
surfL_Param_optional

surfL
write_surf_gifti

Write a "surf" to a GIFTI surface file
select_xifti

Select columns of a "xifti"
view_comp

View composite of images
surfL_fname_Param

surfL_fname
write_xifti2

Write a "xifti" object to GIFTI and NIFTI files
unmask_subcortex

Undo the volumetric mask to the subcortex
view_xifti_surface.draw_mesh

Draw brain hemisphere mesh in RGL
unvec_vol

Convert vectorized data back to volume
xml_cifti

Get XML of a CIFTI
surfR_target_fname_Param

surfR_target_fname
view_xifti.cbar

Make the colorbar for view_xifti_surface
view_xifti.cleg

Draw color legend for qualitative mode
view_xifti.title

Get title for view_xifti_surface or view_xifti_volume
smooth_cifti

Smooth CIFTI data
view_xifti_surface

View cortical surface data in a "xifti"
vertices_Param

vertices
write_cifti

Write a CIFTI file from a "xifti" object
ROI_brainstructures_Param_all

ROI_brainstructures
all_integers

All integers?
apply_parc

Apply function over locations in each parcel
S3_Summary

"xifti" S3 Summary methods
add_surf

Add surface(s) to a "xifti"
apply_xifti

Apply a function along the rows or columns of a "xifti"
area_original_Param

area_original_Param