diff MS2snoop.R @ 1:df2672c37732 draft

planemo upload commit 42359ca78388ce5221bc88905a78c996c758aa43
author workflow4metabolomics
date Tue, 24 May 2022 18:14:49 +0000
parents 91a3242fd67f
children c68c94865667
line wrap: on
line diff
--- a/MS2snoop.R	Mon Apr 25 08:23:54 2022 +0000
+++ b/MS2snoop.R	Tue May 24 18:14:49 2022 +0000
@@ -13,8 +13,22 @@
 #'
 #' @import optparse
 #'
-NULL
+
+
+assign("MS2SNOOP_VERSION", "1.0.1")
+lockBinding("MS2SNOOP_VERSION", globalenv())
+
+assign("MISSING_PARAMETER_ERROR", 1)
+lockBinding("MISSING_PARAMETER_ERROR", globalenv())
 
+assign("BAD_PARAMETER_VALUE_ERROR", 2)
+lockBinding("BAD_PARAMETER_VALUE_ERROR", globalenv())
+
+assign("MISSING_INPUT_FILE_ERROR", 3)
+lockBinding("MISSING_INPUT_FILE_ERROR", globalenv())
+
+assign("NO_ANY_RESULT_ERROR", 255)
+lockBinding("NO_ANY_RESULT_ERROR", globalenv())
 
 assign("DEFAULT_PRECURSOR_PATH", "peaklist_precursors.tsv")
 assign("DEFAULT_FRAGMENTS_PATH", "peaklist_fragments.tsv")
@@ -47,9 +61,6 @@
 lockBinding("DEFAULT_EXTRACT_FRAGMENTS_TOLRT", globalenv())
 
 
-debug <- FALSE
-
-
 ########################################################################
 
 #' @title plot_pseudo_spectra
@@ -213,7 +224,7 @@
     ## files (collision energy)
     ## this lead to a processing for each fileid
     mf <- levels(as.factor(sprecini$fileid))
-    if (length(mf) > 1) {
+    if (length(mf) > 1 && global_verbose) {
       cat(" several files detected for this compounds :\n")
     }
 
@@ -239,7 +250,9 @@
       ## creation of cross table row=scan col=mz X=ra
       vmz <- levels(as.factor(sfrgtfil$mznominal))
 
-      cat(" fragments :", vmz)
+      if (global_verbose) {
+        cat(" fragments :", vmz)
+      }
 
       ## mz of precursor in data precursor to check correlation with
       mz_prec <- paste0("mz", round(mean(sprec$mz), mzdecimal))
@@ -271,7 +284,8 @@
           )
         }
       }
-      if (debug) {
+      if (global_debug) {
+        print(ds_abs_int)
         write.table(
           x = ds_abs_int,
           file = paste0(c_name, "ds_abs_int.txt"),
@@ -358,7 +372,9 @@
       if (!is.null(res_comp_by_file)) {
         res_comp <- rbind(res_comp, res_comp_by_file)
       }
-      cat("\n")
+      if (global_verbose) {
+        cat("\n")
+      }
       dev.off()
     }
   } else {
@@ -368,6 +384,25 @@
   return(res_comp)
 }
 
+set_global <- function(var, value) {
+  assign(var, value, envir = globalenv())
+}
+
+set_debug <- function() {
+  set_global("global_debug", TRUE)
+}
+
+unset_debug <- function() {
+  set_global("global_debug", FALSE)
+}
+
+set_verbose <- function() {
+  set_global("global_verbose", TRUE)
+}
+
+unset_verbose <- function() {
+  set_global("global_verbose", FALSE)
+}
 
 create_parser <- function() {
   parser <- optparse::OptionParser()
@@ -376,7 +411,27 @@
     c("-v", "--verbose"),
     action = "store_true",
     default = FALSE,
-    help = "Print extra output [default %default]"
+    help = paste(
+      "[default %default]",
+      "Print extra output"
+    )
+  )
+  parser <- optparse::add_option(
+    parser,
+    c("-V", "--version"),
+    action = "store_true",
+    default = FALSE,
+    help = "Prints version and exits"
+  )
+  parser <- optparse::add_option(
+    parser,
+    c("-d", "--debug"),
+    action = "store_true",
+    default = FALSE,
+    help = paste(
+      "[default %default]",
+      "Print debug outputs"
+    )
   )
   parser <- optparse::add_option(
     parser,
@@ -416,7 +471,11 @@
     type = "numeric",
     action = "store",
     default = DEFAULT_TOLMZ,
-    metavar = "number"
+    metavar = "number",
+    help = paste(
+      "[default %default]",
+      "Tolerance for MZ (in Dalton) to match the standard in the compounds"
+    )
   )
   parser <- optparse::add_option(
     parser,
@@ -424,16 +483,23 @@
     type = "integer",
     action = "store",
     default = DEFAULT_TOLRT,
-    metavar = "number"
+    metavar = "number",
+    help = paste(
+      "[default %default]",
+      "RT (in seconds) to match the standard in the compounds"
+    )
   )
   parser <- optparse::add_option(
     parser,
     c("--seuil_ra"),
     type = "numeric",
     action = "store",
-    help = "relative intensity threshold",
     default = DEFAULT_SEUIL_RA,
-    metavar = "number"
+    metavar = "number",
+    help = paste(
+      "[default %default]",
+      "relative intensity threshold"
+    ),
   )
   parser <- optparse::add_option(
     parser,
@@ -441,7 +507,10 @@
     type = "integer",
     default = DEFAULT_MZDECIMAL,
     action = "store",
-    help = "nb decimal for mz",
+    help = paste(
+      "[default %default]",
+      "Number of decimal to write for MZ"
+    ),
     metavar = "number"
   )
   parser <- optparse::add_option(
@@ -450,8 +519,9 @@
     type = "integer",
     default = DEFAULT_R_THRESHOLD,
     action = "store",
-    help = paste0(
-      "r pearson correlation threshold between precursor and fragment ",
+    help = paste(
+      "[default %default]",
+      "R-Pearson correlation threshold between precursor and fragment",
       "absolute intensity"
     ),
     metavar = "number"
@@ -462,17 +532,112 @@
     type = "numeric",
     action = "store",
     default = DEFAULT_MINNUMBERSCAN,
-    help = paste0(
-      "fragments are kept if there are found in a minimum number ",
-      "of scans"
+    help = paste(
+      "[default %default]",
+      "Fragments are kept if there are found in a minimum number",
+      "of min_number_scan scans"
     ),
     metavar = "number"
   )
   return(parser)
 }
 
+stop_with_status <- function(msg, status) {
+  message(sprintf("Error: %s", msg))
+  message(sprintf("Error code: %s", status))
+  base::quit(status = status)
+}
+
+check_args_validity <- function(args) { ## nolint cyclocomp_linter
+  sysvars <- Sys.getenv()
+  sysvarnames <- names(sysvars)
+  if (length(args$output) == 0 || nchar(args$output[1]) == 0) {
+    stop_with_status(
+      "Missing output parameters. Please set it with --output.",
+      MISSING_PARAMETER_ERROR
+    )
+  }
+  if (length(args$precursors) == 0 || nchar(args$precursors[1]) == 0) {
+    stop_with_status(
+      "Missing precursors parameters. Please set it with --precursors.",
+      MISSING_PARAMETER_ERROR
+    )
+  }
+  if (length(args$fragments) == 0 || nchar(args$fragments[1]) == 0) {
+    stop_with_status(
+      "Missing fragments parameters. Please set it with --fragments.",
+      MISSING_PARAMETER_ERROR
+    )
+  }
+  if (length(args$compounds) == 0 || nchar(args$compounds[1]) == 0) {
+    stop_with_status(
+      "Missing compounds parameters. Please set it with --compounds.",
+      MISSING_PARAMETER_ERROR
+    )
+  }
+  if (!file.exists(args$precursors)) {
+    stop_with_status(
+      sprintf(
+        "Precursors file %s does not exist or cannot be accessed.",
+        args$precursors
+      ),
+      MISSING_INPUT_FILE_ERROR
+    )
+  }
+  if (!file.exists(args$fragments)) {
+    stop_with_status(
+      sprintf(
+        "Fragments file %s does not exist or cannot be accessed.",
+        args$fragments
+      ),
+      MISSING_INPUT_FILE_ERROR
+    )
+  }
+  if (!file.exists(args$compounds)) {
+    stop_with_status(
+      sprintf(
+        "Compounds file %s does not exist or cannot be accessed.",
+        args$compounds
+      ),
+      MISSING_INPUT_FILE_ERROR
+    )
+  }
+  if (
+    "_GALAXY_JOB_HOME_DIR" %in% sysvarnames
+    || "_GALAXY_JOB_TMP_DIR" %in% sysvarnames
+    || "GALAXY_MEMORY_MB" %in% sysvarnames
+    || "GALAXY_MEMORY_MB_PER_SLOT" %in% sysvarnames
+    || "GALAXY_SLOTS" %in% sysvarnames
+  ) {
+    check_galaxy_args_validity(args)
+  }
+}
+
+check_galaxy_args_validity <- function(args) {
+  if (!file.exists(args$output)) {
+    stop_with_status(
+      sprintf(
+        "Output file %s does not exist or cannot be accessed.",
+        args$output
+      ),
+      MISSING_INPUT_FILE_ERROR
+    )
+  }
+}
+
 main <- function(args) {
-  ## FOLDER AND FILES
+  if (args$version) {
+    cat(sprintf("%s\n", MS2SNOOP_VERSION))
+    base::quit(status = 0)
+  }
+  sessionInfo()
+  check_args_validity(args)
+  if (args$debug) {
+    set_debug()
+  }
+  if (args$verbose) {
+    set_verbose()
+  }
   ## MSpurity precursors file
   precursors <- read.table(
     file = args$precursors,
@@ -494,22 +659,8 @@
     quote = "\"",
     header = TRUE
   )
-  ## PARAMETERS
-  ## tolerance for mz(dalton) rt(seconds) to match the standard in the compounds
-  ## list with the precursor MSpurity file
-  tolmz <- args$tolmz
-  tolrt <- args$tolrt
 
-  ##  relative intensity threshold
-  seuil_ra <- args$seuil_ra
-  ## nb decimal for mz
-  mzdecimal <- args$mzdecimal
-  ## r pearson correlation threshold between precursor and
-  # #fragment absolute intensity
-  r_threshold <- args$r_threshold
-  ## fragments are kept if there are found in a minimum number of scans
-  min_number_scan <- args$min_number_scan
-
+  res_all <- NULL
   for (i in seq_len(nrow(compounds))) {
     ## loop execution for all compounds in the compounds file
     res_cor <- NULL
@@ -519,22 +670,24 @@
       mzref = compounds[[2]][i],
       rtref = compounds[[3]][i],
       c_name = compounds[[1]][i],
-      min_number_scan = min_number_scan,
-      mzdecimal = mzdecimal,
-      r_threshold = r_threshold,
-      seuil_ra = seuil_ra,
-      tolmz = tolmz,
-      tolrt = tolrt
+      min_number_scan = args$min_number_scan,
+      mzdecimal = args$mzdecimal,
+      r_threshold = args$r_threshold,
+      seuil_ra = args$seuil_ra,
+      tolmz = args$tolmz,
+      tolrt = args$tolrt
     )
-    if (i == 1 & !is.null(res_cor)) {
-      res_all <- res_cor
-    } else if (!is.null(res_cor)) {
-      res_all <- rbind(res_all, res_cor)
+    if (!is.null(res_cor)) {
+      if (is.null(res_all)) {
+        res_all <- res_cor
+      } else {
+        res_all <- rbind(res_all, res_cor)
+      }
     }
   }
 
   if (is.null(res_all)) {
-    stop("No result at all!")
+    stop_with_status("No result at all!", NO_ANY_RESULT_ERROR)
   }
   write.table(
     x = res_all,
@@ -544,8 +697,9 @@
   )
 }
 
+unset_debug()
+unset_verbose()
 args <- optparse::parse_args(create_parser())
-sessionInfo()
 main(args)
 
 warnings()