#' Save normalized population data to a directory or h5 file
#'
#' This function simplifies the steps of saving a population (image) analysis
#' into an efficient hdf5 file, using the h5 library or to a directory. The
#' population image data is stored as a matrix. Along with the matrix will be a
#' data frame with population demographics. The number of matrix columns will be
#' defined by a mask that the user should also supply. Finally, a boolean
#' vector should be passed in that matches the images to the demographics. This
#' function cannot check if the matching between demographics and images is
#' correct and, as such, the user should take care in creating the inputs.
#' WARNING: when using h5, the demographics file will currently be cast to a data.matrix so
#' one should not reuse this file as the reference demographics file.
#'
#' @param demographics data frame that identifies the variables of interest.
#' @param imageMat a matrix that stores the normalized image data.
#' @param imageMask mask with number of non-zero entries defining the matrix columns.
#' @param imageBoolean a vector of booleans with length equal to the number of
#' rows in the demographics data frame and number of true values equal to the
#' number of rows in the image matrix.
#' @param filename output filename for hdf5 file (if .h5) or directory name.
#' @return successOrFailure boolean
#' @author Avants BB
#' @examples
#' # read below will test out writing as well
#' \dontrun{
#' ilist <- getANTsRData("population")
#' mask <- getMask(ilist[[1]])
#' imat <- imageListToMatrix(ilist, mask)
#' demog <- data.frame(
#' id = c("A", "B", "C", NA),
#' age = c(11, 7, 18, 22), sex = c("M", "M", "F", "F")
#' )
#' ibool <- c(TRUE, TRUE, TRUE, FALSE)
#' tfn <- tempfile(fileext = ".h5")
#' if (usePkg("hdf5r")) {
#' demographics <- demog
#' imageMat <- imat
#' imageMask <- mask
#' imageBoolean <- ibool
#' filename <- tfn
#' writeNormalizedPopulationData(
#' demog, imat, mask, ibool,
#' tfn
#' )
#' }
#' }
#' @export writeNormalizedPopulationData
writeNormalizedPopulationData <- function(
demographics,
imageMat,
imageMask,
imageBoolean,
filename) {
outputToDir <- length(grep("h5", filename)) == 0
if (!outputToDir) {
if (!usePkg("hdf5r")) {
stop("Please install package hdf5r in order to use this function.")
}
}
if (sum(imageMask > 0.5) != ncol(imageMat)) {
stop("stopping because sum( imageMask > 0.5 ) != ncol( imageMat )")
}
if (sum(imageBoolean) != nrow(imageMat)) {
stop("stopping because sum( imageBoolean ) != nrow( imageMat )")
}
if (length(imageBoolean) != nrow(demographics)) {
stop("stopping because length( imageBoolean ) != nrow( demographics )")
}
if (file.exists(filename)) {
stop("stopping because file.exists( filename )")
}
if (outputToDir) {
dir.create(filename, showWarnings = TRUE, recursive = FALSE, mode = "0777")
write.csv(demographics, paste(filename, "/demog.csv", sep = ""), row.names = FALSE)
haveImageDf <- data.frame(haveImage = imageBoolean)
write.csv(haveImageDf, paste(filename, "/haveImage.csv", sep = ""), row.names = FALSE)
antsImageWrite(imageMask, paste(filename, "/imageMask.nii.gz", sep = ""))
antsImageWrite(as.antsImage(imageMat), paste(filename, "/imageMat.mha", sep = ""))
return(TRUE)
}
file <- hdf5r::h5file(filename)
file$create_group("antsrpopdata")
# file[["antsrpopdata/demographics"]] <- data.matrix( demographics )
file[["antsrpopdata/demographics"]] <- demographics
# hdf5r::h5attr(file[["antsrpopdata/demographics"]], "colnames") <- colnames(demographics)
file[["antsrpopdata/imageMat"]] <- imageMat
file[["antsrpopdata/imageMask"]] <- as.array(imageMask)
hdf5r::h5attr(file[["antsrpopdata/imageMask"]], "spacing") <- antsGetSpacing(imageMask)
hdf5r::h5attr(file[["antsrpopdata/imageMask"]], "direction") <- antsGetDirection(imageMask)
hdf5r::h5attr(file[["antsrpopdata/imageMask"]], "origin") <- antsGetOrigin(imageMask)
file[["antsrpopdata/imageBoolean"]] <- imageBoolean
file[["antsrpopdata/filename"]] <- filename
hdf5r::h5close(file)
return(TRUE)
}
#' Read normalized population from h5 file or directory
#'
#' This function reads a file created by \code{writeNormalizedPopulationData}.
#'
#' @param filename input filename for hdf5 file.
#' @return list containing demographics, imageMat, imageMask and imageBoolean
#' @author Avants BB
#' @examples
#' tfn <- system.file("extdata", "normpop.h5", package = "ANTsR")
#' if (file.exists(tfn)) {
#' dlist <- readNormalizedPopulationData(tfn)
#' }
#' \dontrun{
#' ilist <- getANTsRData("population")
#' mask <- getMask(ilist[[1]])
#' imat <- imageListToMatrix(ilist, mask)
#' demog <- data.frame(age = c(11, 7, 18, 22), sex = c("M", "M", "F", "F"))
#' ibool <- c(TRUE, TRUE, TRUE, FALSE)
#' tfn <- tempfile(fileext = ".h5")
#' if (usePkg("hdf5r")) writeNormalizedPopulationData(demog, imat, mask, ibool, tfn)
#' if (usePkg("hdf5r")) {
#' dlist <- readNormalizedPopulationData(tfn)
#' all.equal(dlist$demographics, demog)
#' all.equal(dlist$imageMat, imat)
#' all.equal(as.array(dlist$imageMask), as.array(mask))
#' all.equal(dlist$imageBool, ibool)
#' }
#' }
#' @export readNormalizedPopulationData
readNormalizedPopulationData <- function(filename) {
outputToDir <- length(grep("h5", filename)) == 0
if (!outputToDir) {
if (!usePkg("hdf5r")) {
stop("Please install package hdf5r in order to use this function.")
}
}
if (outputToDir) {
if (!dir.exists(filename)) {
stop(paste(filename, "directory does not exist."))
}
demographics <- read.csv(paste(filename, "/demog.csv", sep = ""))
imageBoolean <- read.csv(paste(filename, "/haveImage.csv", sep = ""))$haveImage
imageMask <- antsImageRead(paste(filename, "/imageMask.nii.gz", sep = ""))
imageMat <- as.matrix(antsImageRead(paste(filename, "/imageMat.mha", sep = "")))
} else {
file <- hdf5r::h5file(filename)
demog <- file[["antsrpopdata/demographics"]]
demographics <- demog$read()
# hdf5r::h5attr( demog, "colnames" )
# colnames( demographics ) <- hdf5r::h5attr( demog, "colnames" )
temp <- file[["antsrpopdata/imageMat"]]
imageMat <- temp$read()
temp <- file[["antsrpopdata/imageMask"]]
imageMask <- as.antsImage(temp$read())
k <- antsSetSpacing(imageMask, hdf5r::h5attr(temp, "spacing"))
k <- antsSetOrigin(imageMask, hdf5r::h5attr(temp, "origin"))
k <- antsSetDirection(imageMask, hdf5r::h5attr(temp, "direction"))
temp <- file[["antsrpopdata/imageBoolean"]]
imageBoolean <- temp$read()
hdf5r::h5close(file)
}
return(
list(
demographics = data.frame(demographics),
imageMat = imageMat,
imageMask = imageMask,
imageBoolean = imageBoolean
)
)
}
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.