Learn R Programming

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.
  • impute_xifti: Impute data values from neighboring vertices/voxels.
  • 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:

gii_surf <- read_surf(ciftiTools.files()$surf["left"])
xii <- as.xifti(surfL=gii_surf)
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 convert to CIFTI Format…

…from NIFTI volumetric cortical data?

The cortex data will have to be projected to the surface. There are options from other software packages including the Connectome Workbench, FreeSurfer, ciftify, and Nilearn.

…from NIFTI volumetric subcortical data?

Use the Connectome Workbench command -cifti-create-dense-from-template.

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 dark to light: darker regions might be in a shadow, or their values might be lower. 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 is 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.17.4

License

GPL-3

Issues

Pull Requests

Stars

Forks

Maintainer

Amanda Mejia

Last Published

January 23rd, 2025

Functions in ciftiTools (0.17.4)

check_cifti_type

Check CIFTI type
ciftiTools

ciftiTools: Tools for Reading and Visualizing CIFTI Brain Files
combine_xifti

Combine "xifti"s with non-overlapping brain structures
as.surf_gifti

Format surface data as a "gifti"
ciftiTools.files

ciftiTools files
area_target_Param

area_target_Param
cifti_fname_Param

cifti_fname
ciftiTools_warn

Print suppressible warning
coordlist_to_vol

Convert coordinate list to volume
ciftiTools.getOption

Get a ciftiTools option
even_vert_samp

Evenly sample vertices of mesh
ciftiTools.listOptions

List ciftiTools options
ciftiTools.setOption

Set a ciftiTools option
as.matrix.xifti

Convert a "xifti" to a matrix
cifti_component_suffix

Get CIFTI component suffix default
ciftiTools.checkOption

Validate a ciftiTools option and value
fix_xifti

Fix a "xifti"
dim.xifti

Dimensions of a "xifti"
expand_color_pal

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

Edit mask on surface
format_path

Format a path
ciftiTools_msg

Print suppressible message
crop_vol

Crop a 3D array
get_data_meta_from_cifti_xml

Extract data-related metadata from CIFTI
crop_image

Crop image
dist_from_mask_surf

Distance from mask on surface
confirm_wb_cmd_path

Confirm the Connectome Workbench command path
.onAttach

Message on attach
get_intn_meta_from_cifti_xml

Extract intent-specific metadata from CIFTI
get_wb_cmd_path

Get the Connectome Workbench command path
convert_xifti

Convert "xifti"
header_cifti

Get NIFTI header (of a CIFTI)
idx_Param

idx
expect_equal_xifti

Expect these "xifti"s to match
is.xifti

Validate a "xifti" object.
infer_resolution

Infer resolution from "xifti" and surfaces
impute_xifti

Impute "xifti" data
load_parc

Load a parcellation included in ciftiTools
flatten_xifti

Flatten a "xifti"
is.xifti_data

Validate the "data" component of a "xifti" object
is.cifti

Validate a "xifti" object
faces_Param

faces
info_cifti

Get CIFTI metadata
load_sub_parc

Load subcortical parcellation
get_cifti_extn

Get CIFTI file extension
is.3D_mask

Validate a 3d binary mask
fix_gifti_mwall

Fix GIFTI medial wall
get_kwargs

Get kwargs
labels_Description

labels
is.xifti_meta

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

Extract misc metadata from CIFTI
load_surf

Load a "surf" included in ciftiTools
match_exactly

Do these character vectors match exactly?
mask_with_boundary_surf

Apply Mask With Boundary To Mesh
make_color_pal

Make a color palette.
make_xifti

Assemble a "xifti" object
make_trans_mat

Make the subcortical transformation matrix
move_from_submask

Move data locations from subcortex mask
move_from_mwall

Move data locations from medial wall
move_to_mwall

Move data locations to the medial wall
is.surf

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

Concatenate "xifti"s
is.subcort_labs

Validate a factor vector of subcortical labels
is.fname

Is this an existing file path?
mask_Param_vertices

mask: vertices
mask_surf

Mask surface
parc_add_subcortex

Add subcortex to cortical parcellation
plot.surf

S3 method: plot surface
parc_vals_to_xifti

Convert parcellation values to "xifti"
match_input

Match user inputs to expected values
make_cortex

Make the cortical components of a "xifti"
is.nummat

Validate a numeric matrix
merge_kwargs

Merges two kwargs
original_fnames_Param_remapped

original_fnames: for remapping
make_subcort

Make the subcortical components of a "xifti"
pad_vol

Pad a 3D Array
plot.xifti

S3 method: use view_xifti to plot a "xifti" object
newdata_xifti

Replace the data in a "xifti"
read_cifti

Read a CIFTI file
radial_order_surf

Order Vertices on Circular Manifold
read_cifti_flat

Read only the data matrix in a CIFTI file
read_cifti_convert

Read a CIFTI file quickly
original_fnames_Param_resampled

original_fnames: for resampling
remap_gifti

Remap GIFTI metric or label data
read_xifti2

Read in GIFTI files as a "xifti" object
remap_cifti

Remap CIFTI data
resample_cifti_wrapper

resample_cifti wrapper
remap_cifti_wrapper

remap_cifti wrapper
resamp_res_Param_required

resamp_res: required
nrow_xifti

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

resamp_res: optional
resample_cifti

Resample CIFTI data
resamp_method_Param

resamp_method
remove_xifti

Remove a component from a "xifti"
run_wb_cmd

Wrapper for Connectome Workbench Commands
scale_xifti

Scale CIFTI
resample_cifti_components

Resample a series of GIFTIs related to a CIFTI file
rotate_surf

Rotate a "surf" object
read_cifti_separate

Read a CIFTI file with optional resampling
rgl_static_plots_Description

Embedding the Static Plots
resample_gifti

Resample a GIFTI file (with its ROI)
separate_cifti

Separate a CIFTI file
select_xifti

Select columns of a "xifti"
smooth_gifti

Smooth a metric GIFTI file
surfL_Param_optional

surfL
substructure_table

Substructure table
supported_intents

The NIFTI intents supported by ciftiTools
separate_cifti_files

Separate CIFTI: file names
summary.xifti

Summarize a "xifti" object
summary.surf

Summarize a "surf" object
surfR_Param_optional

surfR
transform_xifti

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

surfL_target_fname
template_xifti

Make a template "xifti" object
smooth_cifti

Smooth CIFTI data
set_names_xifti

Set "xifti" column names
surf_area

Surface area calculation
surface_plot_Params

Surface plot
separate_cifti_wrapper

separate_cifti wrapper
unmask_subcortex

Undo the volumetric mask to the subcortex
use_color_pal

Use a color palette
surfR_fname_Param

surfR_fname
unvec_vol

Convert vectorized data back to volume
unmask_cortex

Unmask cortex
surfR_target_fname_Param

surfR_target_fname
surfR_original_fname_Param

surfR_original_fname
move_to_submask

Move data locations to the subcortex mask
parc_borders

Parcellation borders
vertices_Param

vertices
verbose_Param_FALSE

verbose: FALSE
ncol_xifti

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

Vertex Adjacency Matrix
view_xifti_surface

View cortical surface data in a "xifti"
view_xifti.cleg

Draw color legend for qualitative mode
sys_path

view_surf

View "surf" object(s)
view_comp

View composite of images
view_xifti_surface.mesh_val

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

verbose: TRUE
read_surf

Get a "surf" object
parc_mean_mat

Make parcellation mean matrix
resample_cifti_default_fname

Get resampled file name default
read_dir_Param_separated

read_dir: separated files
view_xifti_volume

View subcortical data in a "xifti"
view_xifti.title

Get title for view_xifti_surface or view_xifti_volume
write_cifti

Write a CIFTI file from a "xifti" object
wb_path_request

Request "wb_path"
write_cifti_from_separate

Write a CIFTI file from NIFTI and GIFTI files
view_xifti_surface.surf_hemi

Sort out surface & hemisphere args for view_xifti_surface
welcome_msg

Welcome message
xifti_Param

xifti
xml_cifti

Get XML of a CIFTI
view_xifti

View a "xifti" object
write_subcort_nifti

Write subcortical data to NIFTI files
resample_cifti_from_template

Resample a CIFTI from a template
resample_surf

Resample a "surf" object
view_xifti_surface.color

Get the palettes and data color mapping for view_xifti_surface
view_xifti.cbar

Make the colorbar for view_xifti_surface
write_xifti2

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

Write a data matrix to a GIFTI metric file
write_spheres

Generate GIFTI sphere surface files
vox_locations

Get spatial locations of each voxel
rgl_interactive_plots_Description

Navigating and Embedding the Interactive Plots
view_xifti_surface.draw_mesh

Draw brain hemisphere mesh in RGL
surfL_fname_Param

surfL_fname
x_Param_xifti

x: xifti
surfL_original_fname_Param

surfL_original_fname
write_label_table

Write label table to text file
write_dir_Param_generic

write_dir: generic
view_xifti_surface.draw_title

Draw title in RGL
write_surf_gifti

Write a "surf" to a GIFTI surface file
all_integers

All integers?
apply_xifti

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

"xifti" S3 Ops methods
S3_Math

"xifti" S3 Math methods
area_original_Param

area_original_Param
as.metric_gifti

Format metric data as a "gifti"
add_surf

Add HCP surface(s) to a "xifti"
S3_Summary

"xifti" S3 Summary methods
boundary_mask_surf

Boundary region of a mask
apply_parc

Apply function over locations in each parcel
brainstructures_Param_existing

brainstructures
as.xifti

Assemble a "xifti" from data
ROI_brainstructures_Param_all

ROI_brainstructures
assure_parc

Assure this is a parcellation
ROY_BIG_BL

"ROY_BIG_BL" color palette