paper_code.R

# Install Rxnat dependencies for the examplein the paper
# The paper example requires cmake, ITK and FSL, as a system dependencies
# cmake installation guide can be found here: https://cmake.org/install/
# To install FSL please follow this guide: https://fsl.fmrib.ox.ac.uk/fsl/fslwiki/FslInstallation
# The ITK installation guide can be found here: https://itk.org/download/
#
# The R dependencies can be installed easily using 
# `install.packages()` function 
# install.packages(c('dplyr','scales'))
#
# For the `fslr`, `extrantsr`, `malf.templates` and `WhiteStripe`
# we recomment using the Neuroconductor platform to easily install them
# source("https://neuroconductor.org/neurocLite.R")
# neuro_install('fslr')
# neuro_install('extrantsr')
# neuro_install('malf.templates')
# neuro_install('WhiteStripe')
#
# Instead of installing all the system dependencies and package dependencies 
# from above, one can easily download the neurodocker image from this
# page: https://neuroconductor.org/docker-release
#
# Authentication against the XNAT server can be done in two
# different ways by setting up environment variables in R, or 
# by providing the user credentials in the `xnat_connect()`
# function. The recommended and more secure method is by
# setting up the environment variables in the .Renvion file.
# The .Renviron file is located in the user folder (eg. ~/.Renviron)
# and the variable names for the XNAT connection need to be in the 
# form NITRC_RXNAT_USER and NITRC_RXNAT_PASS (for NITRC connection).
# As an example, we can set NITRC_RXNAT_USER="testuser" and 
# NITRC_RXNAT_PASS="testpassword" in the .Renviron file, start 
# (re-start) R and initiate the NITRC connection with 
# nitrc <- xnat_connect("https://nitrc.org/ir", xnat_name="NITRC")
# For any other XNAT server, please replace the first part of the
# environment variable with the XNAT server name (for example
# HCP will have HCP_RXNAT_USER and HCP_RXNAT_PASS). Please make
# sure that the `xnat_name` parameter in the `xnat_connect` call
# is using the same name as the first part of the environment variables
# (eg. NITRC, HCP).

library(dplyr)
library(fslr)
library(extrantsr)
library(malf.templates)
library(scales)
library(WhiteStripe)

##install.packages('Rxnat')

# Establish XNAT connections
library(Rxnat)
nitrc <- xnat_connect("https://nitrc.org/ir", xnat_name="NITRC")
hcp <- xnat_connect("https://db.humanconnectome.org", xnat_name = "hcp")

# Get list subjects from XNAT
nitrc_subjects <- nitrc$subjects()
hcp_subjects <- hcp$subjects()
all_subjects <- bind_rows(nitrc_subjects, hcp_subjects)
colnames(all_subjects)

# Extract experiment data
nitrc_T1_scan_resources <- nitrc$scans(type="T1")
nitrc_T1_scan_resources <- nitrc_T1_scan_resources %>%
  mutate(source = "nitrc", scantype = "T1")
hcp_T1_scan_resources <- hcp$scans(type="T1w")
hcp_T1_scan_resources <- hcp_T1_scan_resources %>%
  mutate(source = "hcp", scantype = "T1")

# Filter resources and select subjects between 26 and 40 years
T1_resources <- bind_rows(nitrc_T1_scan_resources, hcp_T1_scan_resources)
T1_resources <- left_join(
  T1_resources,
  all_subjects,
  by = c("subject_ID" = "ID")
)
age_26_to_40_group <- T1_resources %>%
  filter(Age>26) %>%
  filter(Age<40)


# Download the first subject T1 weighted image
file_path <- nitrc$download_dir(
  experiment_ID = age_26_to_40_group$experiment_ID[8],
  scan_type = "T1",
  extract = TRUE
)


# Read T1 image
t1 <- readrpi(file_path[1])
ortho2(t1, add.orient = TRUE)

# Remove neck and drop empty dimensions
noneck = remove_neck( file_path,
                      template.file = fslr::mni_fname(brain = TRUE, mm = 1),
                      template.mask = fslr::mni_fname(mm = 1, brain = TRUE, mask = TRUE)
)
red = dropEmptyImageDimensions(noneck)
red <- readrpi(red)


# Inhomegeneity correction
t1_n4 = bias_correct(red,
                     correction = "N4",
                     outfile = tempfile(fileext = ".nii.gz"), retimg = FALSE
)
t1_n4 <- readrpi(t1_n4)

# Perform registration against malf
timgs = mass_images(n_templates = 35)
ss = malf(infile = t1_n4,
          template.images = timgs$images,
          template.structs = timgs$masks,
          keep_images = FALSE)

# Perform skull stripping
proc_outfile <- paste0("T1_Processed.nii.gz")
proc_outfile <- file.path(tempdir(),proc_outfile)
skull_ss <- preprocess_mri_within(
  files = t1_n4,
  outfiles = proc_outfile,
  correction = "N4",
  maskfile = ss,
  correct_after_mask = FALSE)
t1_ss <- readrpi(proc_outfile)

# Perform WhiteStripe intensity normalization
ind = whitestripe(img = t1_ss, type = "T1", stripped = TRUE)$whitestripe.ind
ws_t1 = whitestripe_norm(t1_ss, ind)

# Perform segmentation
ss_tcs = fslr::fast_nobias(ws_t1,
                           verbose = TRUE)

# Generate Panel A
ortho2(red,
       add.orient = TRUE,
       addlegend = TRUE,
       leg.cex = 1.5,
       leg.title = "Panel A",
       leg.col = "red",
       legend = "T1 Image Neck Removed",
       leg.x = 0
)

# Generate Panel B
ortho2(red,
       t1_ss,
       col.y=alpha("red", 0.3),
       add.orient = TRUE,
       addlegend = TRUE,
       leg.cex = 1.5,
       leg.title = "Panel B",
       leg.col = "red",
       legend = "T1 Image Brain Mask",
       leg.x = 0
)

# Generate Panel C
double_ortho(ws_t1,
             ss_tcs,
             add.orient=TRUE,
             addlegend =TRUE,
             leg.cex=1.5,
             leg.title="Panel C",
             leg.col="red",
             legend="Segmentation results",
             leg.x=0
)
adigherman/Rxnat documentation built on Oct. 7, 2021, 2:53 p.m.