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, brainstructures="all", 
  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.14.0

License

GPL-3

Issues

Pull Requests

Stars

Forks

Maintainer

Amanda Mejia

Last Published

February 24th, 2024

Functions in ciftiTools (0.14.0)

brainstructures_Param_all

brainstructures
ciftiTools.files

ciftiTools files
ciftiTools.getOption

Get a ciftiTools option
area_target_Param

area_target_Param
ciftiTools_msg

Print suppressible message
as.xifti

Assemble a "xifti" from data
as.metric_gifti

Format metric data as a "gifti"
ciftiTools.listOptions

List ciftiTools options
dim.xifti

Dimensions of a "xifti"
ciftiTools.setOption

Set a ciftiTools option
dist_from_mask_surf

Distance from mask on surface
convert_to_dlabel

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

Flatten a "xifti"
coordlist_to_vol

Convert coordinate list to volume
cifti_component_suffix

Get CIFTI component suffix default
ciftiTools

ciftiTools: Tools for Reading and Visualizing CIFTI Brain Files
header_cifti

Get NIFTI header (of a CIFTI)
ciftiTools_warn

Print suppressible warning
format_path

Format a path
as.surf_gifti

Format surface data as a "gifti"
assure_parc

Assure this is a parcellation
cifti_fname_Param

cifti_fname
fix_xifti

Fix a "xifti"
idx_Param

idx
fix_gifti_mwall

Fix GIFTI medial wall
crop_vol

Crop a 3D array
get_cifti_extn

Get CIFTI file extension
.onAttach

Message on attach
combine_xifti

Combine "xifti"s with non-overlapping brain structures
is.fname

Is this an existing file path?
is.nummat

Validate a numeric matrix
ciftiTools.checkOption

Validate a ciftiTools option and value
expect_equal_xifti

Expect these "xifti"s to match
get_data_meta_from_cifti_xml

Extract data-related metadata from CIFTI
crop_image

Crop image
edit_mask_surf

Edit mask on surface
make_cortex

Make the cortical components of a "xifti"
make_subcort

Make the subcortical components of a "xifti"
confirm_wb_cmd_path

Confirm the Connectome Workbench command path
original_fnames_Param_remapped

original_fnames: for remapping
is.subcort_labs

Validate a factor vector of subcortical labels
even_vert_samp

Evenly sample vertices of mesh
plot.surf

S3 method: plot surface
faces_Param

faces
get_intn_meta_from_cifti_xml

Extract intent-specific metadata from CIFTI
is.surf

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

mask: vertices
mask_surf

Mask surface
parc_vals_to_xifti

Convert parcellation values to "xifti"
original_fnames_Param_resampled

original_fnames: for resampling
is.xifti

Validate a "xifti" object.
read_xifti2

Read in GIFTI files as a "xifti" object
info_cifti

Get CIFTI metadata
infer_resolution

Infer resolution from "xifti" and surfaces
move_to_mwall

Move data locations to the medial wall
get_wb_cmd_path

Get the Connectome Workbench command path
load_parc

Load a parcellation included in ciftiTools
remove_xifti

Remove a component from a "xifti"
ncol_xifti

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

Load subcortical parcellation
is.xifti_data

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

Extract misc metadata from CIFTI
get_kwargs

Get kwargs
remap_cifti

Remap CIFTI data
expand_color_pal

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

Get resampled file name default
resample_cifti_from_template

Resample a CIFTI from a template
resamp_method_Param

resamp_method
rotate_surf

Rotate a "surf" object
rgl_static_plots_Description

Embedding the Static Plots
read_cifti

Read a CIFTI file
mask_with_boundary_surf

Apply Mask With Boundary To Mesh
match_input

Match user inputs to expected values
merge_kwargs

Merges two kwargs
match_exactly

Do these character vectors match exactly?
merge_xifti

Concatenate "xifti"s
move_from_mwall

Move data locations from medial wall
read_cifti_convert

Read a CIFTI file quickly
surfL_original_fname_Param

surfL_original_fname
make_trans_mat

Make the subcortical transformation matrix
make_xifti

Assemble a "xifti" object
surfL_fname_Param

surfL_fname
scale_xifti

Scale CIFTI
surfR_target_fname_Param

surfR_target_fname
run_wb_cmd

Wrapper for Connectome Workbench Commands
supported_intents

The NIFTI intents supported by ciftiTools
plot.xifti

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

Read only the data matrix in a CIFTI file
is.3D_mask

Validate a 3d binary mask
surfL_Param_optional

surfL
template_xifti

Make a template "xifti" object
transform_xifti

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

Order Vertices on Circular Manifold
surf_area

Surface area calculation
verbose_Param_FALSE

verbose: FALSE
remap_gifti

Remap GIFTI metric or label data
parc_borders

Parcellation borders
resample_cifti

Resample CIFTI data
is.cifti

Validate a "xifti" object
parc_mean_mat

Make parcellation mean matrix
unvec_vol

Convert vectorized data back to volume
remap_cifti_wrapper

remap_cifti wrapper
resample_cifti_components

Resample a series of GIFTIs related to a CIFTI file
set_names_xifti

Set "xifti" column names
resample_gifti

Resample a GIFTI file (with its ROI)
read_cifti_separate

Read a CIFTI file with optional resampling
verbose_Param_TRUE

verbose: TRUE
smooth_cifti

Smooth CIFTI data
newdata_xifti

Replace the data in a "xifti"
load_surf

Load a "surf" included in ciftiTools
make_color_pal

Make a color palette.
resample_cifti_wrapper

resample_cifti wrapper
is.xifti_meta

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

labels
read_surf

Get a "surf" object
use_color_pal

Use a color palette
resamp_res_Param_optional

resamp_res: optional
wb_path_request

Request "wb_path"
read_dir_Param_separated

read_dir: separated files
select_xifti

Select columns of a "xifti"
separate_cifti

Separate a CIFTI file
summary.surf

Summarize a "surf" object
view_xifti_surface

View cortical surface data in a "xifti"
view_xifti_surface.mesh_val

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

resamp_res: required
write_metric_gifti

Write a data matrix to a GIFTI metric file
unmask_subcortex

Undo the volumetric mask to the subcortex
unmask_cortex

Unmask cortex
view_xifti_surface.surf_hemi

Sort out surface & hemisphere args for view_xifti_surface
parc_add_subcortex

Add subcortex to cortical parcellation
surfL_target_fname_Param

surfL_target_fname
surfR_Param_optional

surfR
vertices_Param

vertices
nrow_xifti

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

Pad a 3D Array
welcome_msg

Welcome message
view_xifti_surface.draw_mesh

Draw brain hemisphere mesh in RGL
write_spheres

Generate GIFTI sphere surface files
vert_adjacency

Vertex Adjacency Matrix
summary.xifti

Summarize a "xifti" object
view_surf

View "surf" object(s)
view_comp

View composite of images
view_xifti_surface.draw_title

Draw title in RGL
rgl_interactive_plots_Description

Navigating and Embedding the Interactive Plots
separate_cifti_files

Separate CIFTI: file names
resample_surf

Resample a "surf" object
view_xifti.cleg

Draw color legend for qualitative mode
surfR_fname_Param

surfR_fname
surfR_original_fname_Param

surfR_original_fname
smooth_gifti

Smooth a metric GIFTI file
write_surf_gifti

Write a "surf" to a GIFTI surface file
substructure_table

Substructure table
write_subcort_nifti

Write subcortical data to NIFTI files
separate_cifti_wrapper

separate_cifti wrapper
view_xifti_surface.color

Get the palettes and data color mapping for view_xifti_surface
write_cifti

Write a CIFTI file from a "xifti" object
write_cifti_from_separate

Write a CIFTI file from NIFTI and GIFTI files
xml_cifti

Get XML of a CIFTI
surface_plot_Params

Surface plot
sys_path

xifti_Param

xifti
view_xifti.title

Get title for view_xifti_surface or view_xifti_volume
view_xifti

View a "xifti" object
view_xifti.cbar

Make the colorbar for view_xifti_surface
view_xifti_volume

View subcortical data in a "xifti"
x_Param_xifti

x: xifti
write_xifti2

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

Write label table to text file
vox_locations

Get spatial locations of each voxel
write_dir_Param_generic

write_dir: generic
apply_xifti

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

area_original_Param
ROI_brainstructures_Param_LR

ROI_brainstructures
apply_parc

Apply function over locations in each parcel
S3_Summary

"xifti" S3 Summary methods
S3_Math

"xifti" S3 Math methods
S3_Ops

"xifti" S3 Ops methods
ROY_BIG_BL

"ROY_BIG_BL" color palette
add_surf

Add surface(s) to a "xifti"
all_integers

All integers?
as.matrix.xifti

Convert a "xifti" to a matrix
check_cifti_type

Check CIFTI type
boundary_mask_surf

Boundary region of a mask
brainstructures_Param_LR

brainstructures