diff asca_wrapper.R @ 0:93312041f1d5 draft default tip

planemo upload for repository https://github.com/workflow4metabolomics/ascaw4m commit 7ea9b0f8abc5a60c2c04fd2098788497f14766b6
author marie-tremblay-metatoul
date Fri, 21 Sep 2018 05:51:14 -0400
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/asca_wrapper.R	Fri Sep 21 05:51:14 2018 -0400
@@ -0,0 +1,237 @@
+#!/usr/bin/env Rscript
+
+###################################################################################################
+#
+# MetStaT ASCA.calculate function
+#
+#
+# R-Package: MetStaT
+#
+# Version: 1.0
+#
+# Author (asca.calculate): Tim Dorscheidt
+# Author (wrapper & .r adaptation for workflow4metabolomics.org): M. Tremblay-Franco & Y. Guitton #
+# 
+# Expected parameters from the commandline
+# input files:
+#             dataMatrix
+#             sampleMetadata
+#             variableMetadata
+# params:
+#             Factors (Factor1 & Factor2)
+#             scaling
+#             Number of permutations
+#             Significance threshold
+# output files:
+#             sampleMetadata
+#             variableMetadata
+#			  Graphical outputs
+#			  Information text
+###################################################################################################
+pkgs=c("MetStaT","batch","pcaMethods")
+for(pkg in pkgs) {
+  suppressPackageStartupMessages( stopifnot( library(pkg, quietly=TRUE, logical.return=TRUE, character.only=TRUE)))
+  cat(pkg,"\t",as.character(packageVersion(pkg)),"\n",sep="")
+}
+
+
+listArguments = parseCommandArgs(evaluate=FALSE) #interpretation of arguments given in command line as an R list of objects
+
+#Redirect all stdout to the log file
+sink(listArguments$information)
+
+# ----- PACKAGE -----
+cat("\tPACKAGE INFO\n")
+sessionInfo()
+
+source_local <- function(fname) {
+    argv <- commandArgs(trailingOnly = FALSE)
+    base_dir <- dirname(substring(argv[grep("--file=", argv)], 8))
+    source(paste(base_dir, fname, sep="/"))
+}
+
+#load asca_w4m function
+source_local("asca_w4m.R")
+source_local("ASCA.Calculate_w4m.R")
+source_local("ASCA.PlotScoresPerLevel_w4m.R")
+print("first loadings OK")
+
+## libraries
+##----------
+
+cat('\n\nRunning ASCA.calculate\n');
+options(warn=-1);
+#remove rgl warning
+options(rgl.useNULL = TRUE);
+
+
+## constants
+##----------
+
+modNamC <- "asca" ## module name
+
+topEnvC <- environment()
+flgC <- "\n"
+
+## functions
+##----------For manual input of function
+##--end function
+
+flgF <- function(tesC,
+                 envC = topEnvC,
+                 txtC = NA) { ## management of warning and error messages
+
+    tesL <- eval(parse(text = tesC), envir = envC)
+
+    if(!tesL) {
+
+        sink(NULL)
+        stpTxtC <- ifelse(is.na(txtC),
+                          paste0(tesC, " is FALSE"),
+                          txtC)
+
+        stop(stpTxtC,
+             call. = FALSE)
+
+    }
+
+} ## flgF
+
+
+## log file
+##---------
+cat("\nStart of the '", modNamC, "' Galaxy module call: ",
+    format(Sys.time(), "%a %d %b %Y %X"), "\n", sep="")
+
+
+## arguments
+##----------
+## loading files and checks
+xMN <- t(as.matrix(read.table(listArguments[["dataMatrix_in"]],
+                              check.names = FALSE,
+                              header = TRUE,
+                              row.names = 1,
+                              sep = "\t")))
+varIdDM <- rownames(xMN)
+
+samDF <- read.table(listArguments[["sampleMetadata_in"]],
+                    check.names = FALSE,
+                    header = TRUE,
+                    row.names = 1,
+					          sep = "\t")
+obsIdSMD <- rownames(samDF)
+
+varDF <- read.table(listArguments[["variableMetadata_in"]],
+                    check.names = FALSE,
+                    header = TRUE,
+                    row.names = 1,
+					          sep = "\t")
+varIdVDM <- rownames(varDF)
+
+result <- asca_w4m(xMN, samDF, c(listArguments[["factor1"]],listArguments[["factor2"]]), varDF, as.numeric(listArguments[["threshold"]]), 
+                   scaling=listArguments[["scaling"]], listArguments[["nPerm"]])
+
+
+##saving
+
+if (exists("result")) {
+	## writing output files
+	cat("\n\nWriting output files\n\n");
+	write.table(data.frame(cbind(obsIdSMD, result[[4]])),
+        			file = listArguments$sampleMetadata_out,
+        			quote = FALSE,
+        			row.names = FALSE,
+        			sep = "\t")
+
+	write.table(data.frame(cbind(varIdVDM, result[[5]])),
+        			file = listArguments$variableMetadata_out,
+        			quote = FALSE,
+        			row.names = FALSE,
+        			sep = "\t")
+
+	# Graphical display for each significant parameter
+	print(result[[3]])
+	cat("\n p-value of Residuals must not be taken into account\n")
+	
+	if (any(result[[2]] < as.numeric(listArguments[["threshold"]])))
+	{
+		data.asca.permutation <- result[[2]]
+		design <- data.matrix(samDF[, colnames(samDF) %in% c(listArguments[["factor1"]],listArguments[["factor2"]])])
+		
+		pdf(listArguments$figure, onefile=TRUE)
+		par(mfrow=c(1,3))
+		if (data.asca.permutation[1] < as.numeric(listArguments[["threshold"]]))
+		{
+			eigenvalues <- data.frame(1:length(unique(design[,1])), result[[1]]$'1'$svd$var.explained[1:length(unique(design[,1]))])
+			colnames(eigenvalues) <- c("PC", "explainedVariance")
+			barplot(eigenvalues[,2], names.arg=eigenvalues[,1], ylab="% of explained variance", xlab="Principal component")
+			noms <- levels(as.factor(samDF[, listArguments$factor1]))
+			ASCA.PlotScoresPerLevel_w4m(result[[1]], ee="1", interaction=0, factorName=listArguments$factor1, factorModalite=noms)
+
+			v1 <- paste(listArguments[["factor1"]],"_XLOAD-p1", sep="")
+			v2 <- paste(listArguments[["factor1"]],"_XLOAD-p2", sep="")
+			f1.loadings <- data.matrix(result[[5]][,c(v1, v2)])
+			f1.loadings.leverage <- diag(f1.loadings%*%t(f1.loadings))
+			names(f1.loadings.leverage) <- colnames(xMN)
+			f1.loadings.leverage <- sort(f1.loadings.leverage, decreasing=TRUE)
+			barplot(f1.loadings.leverage[f1.loadings.leverage > 0.001], main="Leverage values")
+		}
+		if (data.asca.permutation[2] < as.numeric(listArguments[["threshold"]]))
+		{
+			eigenvalues <- data.frame(1:length(unique(design[,2])), result[[1]]$'2'$svd$var.explained[1:length(unique(design[,2]))])
+			colnames(eigenvalues) <- c("PC", "explainedVariance")
+			barplot(eigenvalues[,2], names.arg=eigenvalues[,1], ylab="% of explained variance", xlab="Principal component")    
+			noms <- levels(as.factor(samDF[, listArguments$factor2]))
+			ASCA.PlotScoresPerLevel_w4m(result[[1]], ee="2", interaction=0, factorName=listArguments$factor2, factorModalite=noms)
+
+			v1 <- paste(listArguments[["factor2"]],"_XLOAD-p1", sep="")
+			v2 <- paste(listArguments[["factor2"]],"_XLOAD-p2", sep="")
+			f2.loadings <- data.matrix(result[[5]][,c(v1, v2)])
+			f2.loadings.leverage <- diag(f2.loadings%*%t(f2.loadings))
+			names(f2.loadings.leverage) <- colnames(xMN)
+			f2.loadings.leverage <- sort(f2.loadings.leverage, decreasing=TRUE)
+			barplot(f2.loadings.leverage[f2.loadings.leverage > 0.001], main="Leverage values")
+		}
+  	if (data.asca.permutation[3] < as.numeric(listArguments[["threshold"]]))
+  	{
+  	  eigenvalues <- data.frame(1:(length(unique(design[,1]))*length(unique(design[,2]))), result[[1]]$'12'$svd$var.explained[1:(length(unique(design[,1]))*length(unique(design[,2])))])
+  	  colnames(eigenvalues) <- c("PC", "explainedVariance")
+  	  barplot(eigenvalues[,2], names.arg=eigenvalues[,1], ylab="% of explained variance", xlab="Principal component")
+  	  noms1 <- data.matrix(levels(as.factor(samDF[, listArguments$factor1])))
+  	  noms2 <- data.matrix(levels(as.factor(samDF[, listArguments$factor2])))
+  	  noms <- apply(noms1, 1, FUN=function(x){paste(x, "-", noms2, sep="")})
+  	  noms <- apply(noms, 1, FUN=function(x){c(noms)})
+  	  ASCA.PlotScoresPerLevel_w4m(result[[1]], ee="12", interaction=1, factorModalite=noms[,1])
+  	  
+  	  v1 <- "Interact_XLOAD-p1"
+  	  v2 <- "Interact_XLOAD-p2"
+  	  f1f2.loadings <- data.matrix(result[[5]][, c(v1, v2)])
+  	  f1f2.loadings.leverage <- diag(f1f2.loadings%*%t(f1f2.loadings))
+  	  names(f1f2.loadings.leverage) <- colnames(xMN)
+  	  f1f2.loadings.leverage <- sort(f1f2.loadings.leverage, decreasing=TRUE)
+  	  barplot(f1f2.loadings.leverage[f1f2.loadings.leverage > 0.001], main="Leverage values")
+  	}
+    dev.off()
+	}
+
+	tryCatch({
+	save(result, file="asca.RData");
+	}, warning = function(w) {
+	print(paste("Warning: ", w));
+	}, error = function(err) {
+	stop(paste("ERROR saving result RData object:", err));
+	});
+}
+
+## ending
+##-------
+
+cat("\nEnd of the '", modNamC, "' Galaxy module call: ",
+    format(Sys.time(), "%a %d %b %Y %X"), "\n", sep = "")
+
+sink()
+
+# options(stringsAsFactors = strAsFacL)
+
+
+rm(list = ls())