ciftiTools Mini Demo

Damon Pham & Amanda Mejia

2025-01-23

ciftiTools is an R package for working with CIFTI-2 format brain imaging data. Used in conjunction with GIFTI surface geometry files, CIFTI files enable surface-based analysis of gray matter data, which has several advantages over traditional volumetric/voxel-based analysis. Because of this, the CIFTI-2 format is used by recent neuroimaging studies including the Human Connectome Project (HCP). ciftiTools supports reading, writing, visualizing, resampling, and other operations for CIFTI files with the ".dscalar.nii", ".dtseries.nii", and ".dlabel.nii" intents. Several of these operations are made possible by the Connectome Workbench.

Several key operations in ciftiTools, including reading and writing CIFTI files, are made possible by the Connectome Workbench. Since the Workbench must be locally installed, this vignette made for CRAN can only demonstrate a few functions. Please refer to the full vignette on GitHub.

To get started, the first time you use ciftiTools, install it from either CRAN with install.packages() or Github with devtools::install_github(). Here, we will use the CRAN version.

# Check if package installed. If not, install it.
if(!require('ciftiTools', quietly=TRUE)){
  install.packages('ciftiTools')
  # devtools::install_github('mandymejia/ciftiTools') # development version
}

Now we load the ciftiTools package.

library(ciftiTools)

Next, we indicate where to find the Connectome Workbench. This can be the full path to the Connectome Workbench executable file, or the path to its containing folder, in which case ciftiTools will locate the full path. Here, we will use the latter.

Note that this step is skipped with eval=FALSE for the purpose of including the vignette on CRAN.

# Replace '~/Applications' with the actual path to the 
#   Connectome Workbench folder on your computer. If
#   successful, the Workbench executable path will be printed.
ciftiTools.setOption('wb_path', '~/Applications')

Since reading in CIFTI files requires the Connectome Workbench, let’s instead use load_parc to load one of the cortex parcellations included in ciftiTools.

xii <- load_parc() # Loads the Schaefer 100 parcellation.
xii # Summary of the `"xifti"` object.
## ====CIFTI METADATA===================
## Intent:           3007 (dlabel)
## - names           "parcels"
## Measurements:     1 column
## 
## ====BRAIN STRUCTURES=================
## - left cortex     32492 data vertices
## 
## - right cortex    32492 data vertices

Visualization

Cortex plots in ciftiTools are made possible by the rgl package. To prepare the R Markdown document for knitting we need to do the following:

library(rgl)
## Warning: package 'rgl' was built under R version 4.4.1
rgl::setupKnitr()

# Sometimes the first OpenGL window does not render properly.
rgl::open3d(); rgl::close3d()
## glX 
##   1
# These are also required.
library(manipulateWidget)
library(ggpubr)
## Loading required package: ggplot2

Now we can use view_xifti_surface(xii) to display the cortical data on the surface mesh. This function has several primary arguments:

Let’s plot our "xifti" object. Note that interactively, a color legend which displays the label names will also be printed.

# Normally `cex.title` doesn't need to be set, as it defaults to a good choice.
#   But when knitting static images this way, the default becomes a bit too big
#   based on how knitting works.
view_xifti_surface(xii, idx=1, title='Schaefer 100', cex.title=1.2)
Schaefer 100 parcellation
Schaefer 100 parcellation

Manipulation

add_surf adds surface geometry to the "xifti" object.

xii <- add_surf(xii, "midthickness", "midthickness")
xii
## ====CIFTI METADATA===================
## Intent:           3007 (dlabel)
## - names           "parcels"
## Measurements:     1 column
## 
## ====BRAIN STRUCTURES=================
## - left cortex     32492 data vertices
##                   left surface geometry is present
## 
## - right cortex    32492 data vertices
##                   right surface geometry is present

remove_xifti removes a brain structure.

xii <- remove_xifti(xii, c("cortex_right", "surf_right"))
xii
## ====CIFTI METADATA===================
## Intent:           3007 (dlabel)
## - names           "parcels"
## Measurements:     1 column
## 
## ====BRAIN STRUCTURES=================
## - left cortex     32492 data vertices
##                   left surface geometry is present

transform_xifti applies a function to the data values. Let’s isolate and view the frontal pole cortex. Note the midthickness surface that was added will be used now, instead of the default inflated surface.

label_to_viz <- "17networks_LH_DefaultB_FPole_1"
key_idx <- which(rownames(xii$meta$cifti$labels$parcels)==label_to_viz)
key <- xii$meta$cifti$labels$parcels$Key[key_idx]
xii <- transform_xifti(xii, function(v){ifelse(v==key, v, 0)})
view_xifti_surface(xii)
Plotting the FPole parcel
Plotting the FPole parcel

Citing ciftiTools

A citation for the package itself can be printed with:

citation("ciftiTools")
## To cite {ciftiTools} in publications use:
## 
##   Pham DD, Muschelli J, Mejia AF (2021). "ciftiTools: A package for
##   reading, writing, visualizing and manipulating CIFTI files in R."
##   _NeuroImage_, *250*. doi:10.1016/j.neuroimage.2022.118877
##   <https://doi.org/10.1016/j.neuroimage.2022.118877>.
## 
## A BibTeX entry for LaTeX users is
## 
##   @Article{,
##     title = {{ciftiTools}: A package for reading, writing, visualizing and manipulating {CIFTI} files in {R}},
##     author = {Damon D Pham and John Muschelli and Amanda F Mejia},
##     year = {2021},
##     journal = {NeuroImage},
##     volume = {250},
##     doi = {10.1016/j.neuroimage.2022.118877},
##   }

Refer to the README for citation information for the surfaces, parcellations, and other data included in ciftiTools, as well as the Connectome Workbench. Also check the DESCRIPTION file to get a list of R packages used, including rgl and papayar. Lastly, check out the full vignette on GitHub.