R/ich_segment.R

Defines functions ich_process_predictors ich_segment

Documented in ich_process_predictors ich_segment

#' @title Predict ICH Segmentation
#' @description Will preprocess and predict the ICH voxels
#'
#' @param img CT image, object of class \code{nifti} or
#' character filename
#' @param mask binary brain mask, object of class \code{nifti} or
#' character filename
#' @param model model to use for prediction,
#' either the random forest (rf) or logistic
#' @param save_imgs Logical to save all images that are created as
#' predictors
#' @param outdir Output directory of saved images, needs to be set
#' if \code{save_imgs = TRUE}
#' @param stub Basename to write image names if \code{save_imgs = TRUE}
#' @param verbose Print diagnostic output
#' @param shiny Should shiny progress be called?
#' @param roi Filename of ROI, which will be transformed
#' @param erode_mask Should the brain mask be eroded?
#' @param outfile filename for native-space, smoothed,
#' thresholded image.
#' @param ... Additional options passsed to \code{\link{ich_preprocess}}
#'
#' @return List of output prediction/probability images
#' @export
#' @importFrom fslr have.fsl
ich_segment = function(img,
                       ...,
                       verbose = TRUE,
                       shiny = FALSE,
                       model = c("rf", "logistic", "big_rf"),
                       outfile = NULL) {

  model = match.arg(model)

  L = ich_process_predictors(
    img = img,
    ...,
    verbose = verbose,
    roi = NULL)
  df = L$img.pred$df
  nim = L$img.pred$nim
  L$img.pred = NULL
  preprocess = L$preprocess
  rm(list = "L");   gc()


  # data(MOD)
  ##############################################################
  # Making prediction images
  ##############################################################
  # grabbing the environment to extract exported stuff
  if (verbose) {
    msg = "# Running ich_predict"
    message(msg)
  }
  if (shiny) {
    shiny::setProgress(message = msg, value = 3/3 - 0.3)
  }
  L = ich_predict(df = df,
                  nim = nim,
                  model = model,
                  native_img = img,
                  native = TRUE,
                  verbose = verbose,
                  transformlist = preprocess$invtransforms,
                  interpolator = preprocess$interpolator,
                  shiny = shiny,
                  outfile = outfile)
  L$preprocess = preprocess
  if (shiny) {
    shiny::setProgress(value = 3/3)
  }
  return(L)

}


#' @rdname ich_segment
#' @export
ich_process_predictors = function(
  img,
  mask = NULL,
  save_imgs = FALSE,
  outdir = NULL,
  stub = NULL,
  verbose = TRUE,
  shiny = FALSE,
  roi = NULL,
  erode_mask = TRUE,
  ...) {

  if (!have.fsl()) {
    stop("FSL Path Not Found!")
  }

  if (verbose) {
    msg = "# Processing The Data"
    message(msg)
  }
  if (shiny) {
    shiny::setProgress(message = msg, value = 0)
  }
  if (save_imgs) {
    if (is.character(img)) {
      if (is.null(stub)) {
        stub = paste0(nii.stub(img, bn = TRUE), "_reg_")
      }
    }
  }

  if (save_imgs) {
    stopifnot(!is.null(outdir))
    stopifnot(!is.null(stub))
  }
  if (is.null(outdir)) {
    outdir = tempdir()
  }

  trans_fname = trans_mask_fname = trans_roi_fname = ""
  if (save_imgs) {
    trans_fname = file.path(outdir, paste0(stub, "_", "image.nii.gz"))
    if (!is.null(roi)) {
      trans_roi_fname = file.path(outdir, paste0(stub, "_", "roi.nii.gz"))
    } else {
      trans_roi_fname = NULL
    }
    trans_mask_fname = file.path(outdir, paste0(stub, "_", "mask.nii.gz"))
  }

  fnames = c(trans_fname, trans_roi_fname, trans_mask_fname)

  if (!all(file.exists(fnames))) {
    # orig.img = img
    preprocess = ich_preprocess(
      img = img,
      mask = mask,
      verbose = verbose,
      shiny = shiny,
      roi = roi,
      ...)

    timg = preprocess$transformed_image
    troi = preprocess$transformed_roi
    tmask = preprocess$transformed_mask > 0.5

    if (save_imgs) {
      writenii(timg, trans_fname)
      if (!is.null(troi)) {
        writenii(troi, trans_roi_fname)
      }
      writenii(tmask, trans_mask_fname)
    }
  } else {
    timg = readnii(trans_fname)
    if (file.exists(trans_roi_fname)) {
      troi = readnii(trans_roi_fname)
    } else {
      troi = NULL
    }
    tmask = readnii(trans_mask_fname)
    preprocess = list(
      transformed_roi = troi,
      transformed_image = timg,
      transformed_mask = tmask
    )
  }


  L = list(
    preprocess = preprocess
  )
  rm(list = "preprocess"); gc()

  if (verbose) {
    msg = "# Making Predictors"
    message(msg)
  }
  if (shiny) {
    shiny::setProgress(message = msg, value = 1/3)
  }

  img.pred = make_predictors(
    timg, mask = tmask,
    roi = troi,
    save_imgs = save_imgs,
    stub = stub,
    outdir = outdir,
    verbose = verbose,
    shiny = shiny,
    erode_mask = erode_mask)
  L$img.pred = img.pred
  rm(list = "img.pred")
  gc()

  if (shiny) {
    shiny::setProgress(value = 2/3)
  }
  return(L)
}
neuroconductor/ichseg documentation built on Sept. 29, 2020, 2:31 p.m.