--- a
+++ b/R/outbreaker.R
@@ -0,0 +1,163 @@
+#' outbreaker2: main function for reconstructing disease outbreaks
+#'
+#' The function \code{outbreaker} is the main function of the package. It runs
+#' processes various inputs (data, configuration settings, custom priors,
+#' likelihoods and movement functions) and explores the space of plausible
+#' transmission trees of a densely sampled outbreaks.\cr
+#'
+#' The emphasis of 'outbreaker2' is on modularity, which enables customisation
+#' of priors, likelihoods and even movements of parameters and augmented data by
+#' the user. This the dedicated vignette on this topic
+#' \code{vignette("outbreaker2_custom")}.\cr
+#'
+#' 
+#'
+#' @export
+#'
+#' @aliases outbreaker
+#'
+#' @rdname outbreaker
+#'
+#' @author Thibaut Jombart (\email{thibautjombart@@gmail.com}).
+#'
+#' @references Jombart T, Cori A, Didelot X, Cauchemez S, Fraser C and Ferguson
+#'     N (2014).  Bayesian reconstruction of disease outbreaks by combining
+#'     epidemiologic and genomic data. PLoS Computational Biology.
+#'
+#' @seealso \code{\link{outbreaker_data}} to process input data, and
+#'     \code{\link{create_config}} to process/set up parameters
+#'
+#' @param data a list of named items containing input data as returned by
+#'     \code{\link{outbreaker_data}}.
+#'
+#' @param config a set of settings as returned by \code{\link{create_config}}.
+#'
+#' @param likelihoods a set of log-likelihood functions as returned by
+#'     \code{\link{custom_likelihoods}}.
+#'
+#' @param priors a set of log-prior functions as returned by
+#'     \code{\link{custom_priors}}.
+#'
+#' @param moves a set of movement functions as returned by
+#'     \code{\link{custom_moves}}.
+
+#' @seealso
+#'
+#' \itemize{
+#'
+#' \item \code{\link{outbreaker_data}}: function to process input data.
+#'
+#' \item \code{\link{create_config}}: function to create default and customise
+#' configuration settings.
+#'
+#' \item \code{\link{custom_priors}}: function to specify customised prior
+#' functions.
+#'
+#' \item \code{\link{custom_likelihoods}}: function to specify customised likelihoods
+#' functions.
+#'
+#' \item \code{\link{custom_moves}}: function to create default and customise movement
+#' functions.
+#'
+#' }
+#'
+#' @examples
+#'
+#' ## get data
+#' data(fake_outbreak)
+#' dat <- fake_outbreak
+#'
+#' \dontrun{
+#' ## run outbreaker
+#' out <- outbreaker(data = list(dna = dat$dna, dates = dat$onset, w_dens = dat$w),
+#' config = list(n_iter = 2e4, sample_every = 200))
+#' plot(out)
+#' as.data.frame(out)
+#'
+#' ## run outbreaker, no DNA sequences
+#' out2 <- outbreaker(data = list(dates = dat$onset, w_dens = w),
+#' config = list(n_iter = 2e4, sample_every = 200))
+#' plot(out2)
+#' as.data.frame(out2)
+#'
+#' }
+outbreaker <- function(data = outbreaker_data(),
+                       config = create_config(),
+                       priors = custom_priors(),
+                       likelihoods = custom_likelihoods(),
+                       moves = custom_moves()
+                       ) {
+
+    ## CHECKS / PROCESS DATA ##
+    data <- outbreaker_data(data = data)
+    
+    ## CHECK / PROCESS CONFIG ##
+    config <- create_config(config, data = data)
+
+    ## ADD CONVOLUTIONS TO DATA ##
+    data <- add_convolutions(data = data, config = config)
+
+    ## PROCESS CUSTOM FUNCTIONS FOR PRIORS AND LIKELIHOOD ##
+    priors <- custom_priors(priors)
+    loglike <- custom_likelihoods(likelihoods)
+
+
+    ## CREATE AND INITIALIZE MCMC CHAIN ##
+    temp <- create_param(data = data, config = config)
+    param_store <- temp$store
+    param_current <- temp$current
+    param_store <- outbreaker_init_mcmc(data, param_current, param_store,
+                                        loglike, priors, config)
+
+
+    ## here we create a list of function for moving parameters
+    moves <- bind_moves(moves = moves,
+                        config = config,
+                        data = data,
+                        likelihoods = loglike,
+                        priors = priors)
+
+
+    ## IMPORTS
+
+    ## preliminary run to detect imported cases this relies on a shorter run of
+    ## the MCMC, then computing the average 'global influence' (-loglike) of
+    ## each data point, identifying outliers (based on fixed threshold) and
+    ## marking outliers down as 'imported cases'.
+
+    temp <- outbreaker_find_imports(moves = moves,
+                                    data = data,
+                                    param_current = param_current,
+                                    param_store = param_store,
+                                    config = config,
+                                    likelihoods = loglike)
+    param_current <- temp$param_current
+    param_store <- temp$param_store
+    config <- temp$config
+
+
+    ## PERFORM MCMC
+
+    ## procedure is the same as before, with some cases fixed as 'imported'
+
+    param_store <- outbreaker_move(moves = moves,
+                                   data = data,
+                                   param_current = param_current,
+                                   param_store = param_store,
+                                   config = config,
+                                   likelihoods = loglike,
+                                   priors = priors)
+
+
+    ## SHAPE RESULTS
+
+    ## this takes the chains generated by 'outbreaker_move', stored as a list,
+    ## and puts everything back together as a single data.frame; augmented data
+    ## stored as vectors (e_g. 'alpha') become numbered columns of the
+    ## data.frame (e_g. 'alpha_1', 'alpha_2' etc.)
+
+    out <- outbreaker_mcmc_shape(param_store, data)
+
+    return(out)
+}
+