--- a
+++ b/R/ich_preprocess.R
@@ -0,0 +1,181 @@
+#' @title Preprocess data for ICH Segmentation
+#' @description Will do skull stripping and registration to the CT template
+#'
+#' @param img CT image, object of class \code{nifti} or
+#' character filename
+#' @param skull_strip Should the image be skull stripped? If not,
+#' a mask must be specified.  If mask specified, will override this
+#' option
+#' @param mask binary brain mask, object of class \code{nifti} or
+#' character filename
+#' @param robust If skull stripping, should
+#' \code{\link{CT_Skull_Strip_robust}}
+#' be used vs. \code{\link{CT_Skull_Strip}}
+#' @param template.file Template to register to (Skull stripped template)
+#' @param outprefix Passed to \code{\link[extrantsr]{registration}} for
+#' the output transformations
+#' @param typeofTransform Transformation to the template
+#' @param interpolator Interpolation to be done after transformation
+#' @param outfile Output filename for transformed registered image
+#' @param verbose Print diagnostic output
+#' @param shiny Should shiny progress be called?
+#' @param ... Additional options passsed to \code{\link{CT_Skull_Strip_robust}}
+#' or \code{\link{CT_Skull_Strip}}
+#' @param roi Filename of ROI, which will be transformed
+#' @param n4_correct Should N4 bias-field correction be done after
+#' skull-stripping
+#' @param ss.template.file Template file to pass to
+#' \code{\link{CT_Skull_Strip_robust}} robust registration/neck removal
+#' @param ss.template.mask Template mask to pass to
+#' \code{\link{CT_Skull_Strip_robust}} robust registration/neck removal
+#'
+#'
+#' @return List of output images and transformations
+#' @importFrom neurobase check_nifti mask_img window_img
+#' @importFrom extrantsr registration ants_apply_transforms bias_correct
+#' @export
+ich_preprocess = function(
+  img,
+  skull_strip = TRUE,
+  robust = TRUE,
+  mask = NULL,
+  n4_correct = FALSE,
+  template.file = system.file(
+    "scct_unsmooth_SS_0.01.nii.gz",
+    package = "ichseg"),
+  outprefix = NULL,
+  typeofTransform = c("Rigid", "Affine"),
+  interpolator = "Linear",
+  outfile = NULL,
+  verbose = TRUE,
+  shiny = FALSE,
+  roi = NULL,
+  ss.template.file =
+    system.file("scct_unsmooth_SS_0.01.nii.gz",
+                package = "ichseg"),
+  ss.template.mask =
+    system.file("scct_unsmooth_SS_0.01_Mask.nii.gz",
+                package = "ichseg"),
+  ...) {
+
+  if (skull_strip & is.null(mask)) {
+    if (shiny) {
+      shiny::incProgress(message = "Skull Stripping Image")
+    }
+    if (robust) {
+      ss = CT_Skull_Strip_robust(img, retimg = TRUE, ...,
+                                 template.file = ss.template.file,
+                                 template.mask = ss.template.mask)
+    } else {
+      ss = CT_Skull_Strip(img, retimg = TRUE, ...)
+    }
+    mask = ss > 0
+  } else {
+    stopifnot(!is.null(mask))
+  }
+  mask = check_nifti(mask)
+  mask = mask > 0
+
+  img = check_nifti(img)
+  ss = mask_img(img, mask)
+  ss = window_img(ss, window = c(0, 100), replace = "zero")
+
+
+  if (n4_correct) {
+    if (verbose) {
+      msg = "# Running N4 Correction"
+      message(msg)
+    }
+    n4_img = extrantsr::bias_correct(
+      ss, correction = "N4",
+      mask = mask,
+      verbose = verbose > 1)
+    ss = n4_img
+  }
+
+
+  if (is.null(outprefix)) {
+    outprefix = tempfile()
+  }
+  msg = "# Rigid-Body Registration"
+  if (verbose) {
+    message(msg)
+  }
+  if (shiny) {
+    shiny::incProgress(message = msg)
+  }
+  typeofTransform = match.arg(typeofTransform)
+  res = registration(
+    filename = ss,
+    skull_strip = FALSE,
+    correct = FALSE,
+    outfile = outfile,
+    retimg = TRUE,
+    typeofTransform = typeofTransform,
+    template.file = template.file,
+    interpolator = interpolator,
+    remove.warp = FALSE,
+    outprefix = outprefix,
+    verbose = verbose > 1)
+
+  omask = ants_apply_transforms(fixed = template.file,
+                                moving = mask,
+                                # typeofTransform = typeofTransform,
+                                interpolator = interpolator,
+                                transformlist = res$fwdtransforms)
+  if (!is.null(roi)) {
+    roi_interpolator = "genericLabel"
+    oroi = ants_apply_transforms(fixed = template.file,
+                                 moving = roi,
+                                 # typeofTransform = typeofTransform,
+                                 interpolator = roi_interpolator,
+                                 transformlist = res$fwdtransforms)
+    res$roi_interpolator = roi_interpolator
+  } else {
+    oroi = NULL
+  }
+
+  res$mask = mask
+  res$transformed_roi = oroi
+  res$ss_image = ss
+  res$transformed_image = res$outfile
+  res$transformed_mask = omask
+  res$outfile = NULL
+
+  return(res)
+
+}
+
+#' @export
+#' @rdname ich_preprocess
+ich_cnn_preprocess = function(
+  ...,
+  template.file = system.file(
+    "scct_unsmooth_SS_0.01_128x128x128.nii.gz",
+    package = "ichseg")
+) {
+  args = list(...)
+  nargs = names(args)
+  if ("skull_strip" %in% nargs) {
+    skull_strip = args$robust
+    if (!skull_strip) {
+      warning("ich_cnn_preprocess needs skull_strip = TRUE")
+    }
+    args$skull_strip = TRUE
+  }
+  if ("robust" %in% nargs) {
+    robust = args$robust
+    if (!robust) {
+      warning("ich_cnn_preprocess needs robust = TRUE")
+    }
+    args$robust = TRUE
+  }
+  args$template.file = template.file
+  args$smooth_before_threshold = TRUE
+  args$smooth.factor = 1
+  args$remove.neck = TRUE
+  args$recog = FALSE
+  args$nvoxels = 0
+  res = do.call(ich_preprocess, args = args)
+  return(res)
+}