Repository 'edger'
hg clone https://toolshed.g2.bx.psu.edu/repos/amawla/edger

Changeset 0:91ca33096034 (2015-01-13)
Next changeset 1:aab4a565c0e8 (2015-08-04)
Commit message:
Uploaded
added:
edgeR.pl
edgeR.xml
b
diff -r 000000000000 -r 91ca33096034 edgeR.pl
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/edgeR.pl Tue Jan 13 21:12:26 2015 -0500
[
b'@@ -0,0 +1,389 @@\n+#!/bin/perl\n+\n+#EdgeR.pl Version 0.0.3\n+#Contributors: Monica Britton, Blythe Durbin-Johnson, Joseph Fass, Nikhil Joshi, Alex Mawla\n+\n+use strict;\n+use warnings;\n+use Getopt::Std;\n+use File::Basename;\n+use File::Path qw(make_path remove_tree);\n+\n+$| = 1;\n+\n+my %OPTIONS = (a => "glm",  d => "tag", f => "BH", r => 5, u => "movingave");\n+\n+getopts(\'a:d:e:f:h:lmn:o:r:tu:\', \\%OPTIONS);\n+\n+ \n+die qq(\n+Usage:   edgeR.pl [OPTIONS] factor::factor1::levels [factor::factor2::levels ...] cp::cont_pred1::values [cp::cont_pred2::values ...] cnt::contrast1 [cnt::contrast2] matrix\n+\n+OPTIONS:\t-a\tSTR\tType Of Analysis [glm, pw, limma] (default: $OPTIONS{a})\n+\t\t\t-d\tSTR\tThe dispersion estimate to use for GLM analysis [tag] (default: $OPTIONS{d})\n+\t\t\t-e\tSTR\tPath to place additional output files\n+\t\t\t-f\tSTR\tFalse discovery rate adjustment method [BH] (default: $OPTIONS{f})\n+\t\t\t-h\tSTR\tName of html file for additional files\n+\t\t\t-l\t\tOutput the normalised digital gene expression matrix in log2 format (only applicable when using limma and -n is also specified)\n+\t\t\t-m\t\tPerform all pairwise comparisons\n+\t\t\t-n\tSTR\tFile name to output the normalised digital gene expression matrix (only applicable when usinf glm or limma model)\n+\t\t\t-o\tSTR\tFile name to output csv file with results\n+\t\t\t-r\tINT\tCommon Dispersion Rowsum Filter, ony applicable when 1 factor analysis selected (default: $OPTIONS{r})\n+\t\t\t-t\t\tEstimate Tagwise Disp when performing 1 factor analysis\n+\t\t\t-u\tSTR\tMethod for allowing the prior distribution for the dispersion to be abundance- dependent ["movingave"] (default: $OPTIONS{u})\n+ \n+) if(!@ARGV);\n+\n+my $matrix = pop @ARGV;\n+\n+make_path($OPTIONS{e});\n+open(Rcmd,">$OPTIONS{e}/r_script.R") or die "Cannot open $OPTIONS{e}/r_script.R\\n\\n";\n+print Rcmd "\n+zz <- file(\\"$OPTIONS{e}/r_script.err\\", open=\\"wt\\")\n+sink(zz)\n+sink(zz, type=\\"message\\")\n+\n+library(edgeR)\n+library(limma)\n+\n+toc <- read.table(\\"$matrix\\", sep=\\"\\\\t\\", comment=\\"\\", as.is=T)\n+groups <- sapply(toc[1, -1], strsplit, \\":\\")\n+for(i in 1:length(groups)) { g <- make.names(groups[[i]][2]); names(groups)[i] <- g; groups[[i]] <- groups[[i]][-2] }\n+colnames(toc) <- make.names(toc[2,])\n+toc[,1] <- gsub(\\",\\", \\".\\", toc[,1])\n+tagnames <- toc[-(1:2), 1]\n+rownames(toc) <- toc[,1]\n+toc <- toc[-(1:2), -1]\n+for(i in colnames(toc)) toc[, i] <- as.numeric(toc[,i])\n+norm_factors <- calcNormFactors(as.matrix(toc))\n+\n+pw_tests <- list()\n+uniq_groups <- unique(names(groups))\n+for(i in 1:(length(uniq_groups)-1)) for(j in (i+1):length(uniq_groups)) pw_tests[[length(pw_tests)+1]] <- c(uniq_groups[i], uniq_groups[j])\n+DGE <- DGEList(toc, lib.size=norm_factors*colSums(toc), group=names(groups))\n+pdf(\\"$OPTIONS{e}/MA_plots_normalisation.pdf\\", width=14)\n+for(i in 1:length(pw_tests)) {\n+\tj <- c(which(names(groups) == pw_tests[[i]][1])[1], which(names(groups) == pw_tests[[i]][2])[1])\n+\tpar(mfrow = c(1, 2))\n+\tmaPlot(toc[, j[1]], toc[, j[2]], normalize = TRUE, pch = 19, cex = 0.2, ylim = c(-10, 10), main=paste(\\"MA Plot\\", colnames(toc)[j[1]], \\"vs\\", colnames(toc)[j[2]]))\n+\tgrid(col = \\"blue\\")\n+\tabline(h = log2(norm_factors[j[2]]), col = \\"red\\", lwd = 4)\n+\tmaPlot(DGE\\$counts[, j[1]]/DGE\\$samples\\$lib.size[j[1]], DGE\\$counts[, j[2]]/DGE\\$samples\\$lib.size[j[2]], normalize = FALSE, pch = 19, cex = 0.2, ylim = c(-8, 8), main=paste(\\"MA Plot\\", colnames(toc)[j[1]], \\"vs\\", colnames(toc)[j[2]], \\"Normalised\\"))\n+\tgrid(col = \\"blue\\")\n+}\n+dev.off()\n+pdf(file=\\"$OPTIONS{e}/MDSplot.pdf\\")\n+plotMDS(DGE, main=\\"MDS Plot\\", col=as.numeric(factor(names(groups)))+1, xlim=c(-3,3))\n+dev.off()\n+tested <- list()\n+";\n+\n+my $all_cont;\n+my @add_cont;\n+my @fact;\n+my @fact_names;\n+my @cp;\n+my @cp_names;\n+if(@ARGV) {\n+\tforeach my $input (@ARGV) {\n+\t\tmy @tmp = split "::", $input;\n+\t\tif($tmp[0] eq "factor") {\n+\t\t\t$tmp[1] =~ s/[ \\?\\(\\)\\[\\]\\/\\\\=+<>:;\\"\\\',\\*\\^\\|\\&-]/./g;\n+\t\t\tpush @fact_names, $tmp[1];\n+\t\t\t$tmp[2] =~ s/:/\\", \\"/g;\n+\t\t\t$tmp[2] = "\\"".$tmp[2]."\\"";\n+\t\t\tpush @fact, $tmp[2];\n+\t\t} elsif($tmp[0] eq "cp") {\n+\t'..b'", colnames(design))\n+";\n+\tforeach my $fct (@fact_names) {\n+\t\tprint Rcmd "\n+colnames(design) <- make.names(sub(\\"factor.$fct.\\", \\"\\", colnames(design)))\n+";\n+\t}\n+\tprint Rcmd "\n+isexpr <- rowSums(cpm(toc)>1) >= 1\n+toc <- toc[isexpr, ]\n+pdf(file=\\"$OPTIONS{e}/LIMMA_voom.pdf\\")\n+y <- voom(toc, design, plot=TRUE, lib.size=colSums(toc)*norm_factors)\n+dev.off()\n+\n+pdf(file=\\"$OPTIONS{e}/LIMMA_MDS_plot.pdf\\")\n+plotMDS(y, labels=colnames(toc), col=as.numeric(factor(names(groups)))+1, gene.selection=\\"common\\")\n+dev.off()\n+fit <- lmFit(y, design)\n+";\n+\tif(defined $OPTIONS{n}) {\n+\t\tif(defined $OPTIONS{l}) {\n+\t\t\tprint Rcmd "\n+tab <- data.frame(ID=rownames(y\\$E), y\\$E, stringsAsFactors=F)\n+";\n+\t\t} else {\n+\t\t\tprint Rcmd "\n+tab <- data.frame(ID=rownames(y\\$E), 2^y\\$E, stringsAsFactors=F)\n+";\n+\t\t}\n+\t\tprint Rcmd "\n+write.table(tab, \\"$OPTIONS{n}\\", quote=F, sep=\\"\\\\t\\", row.names=F)\n+";\n+\t}\n+\tif(@add_cont) {\n+\t\t$all_cont = "\\"".join("\\", \\"", @add_cont)."\\"";\n+\t\tprint Rcmd "\n+cont <- c(${all_cont})\n+for(i in uniq_groups)  cont <- gsub(paste(groups[[i]], \\"([^0-9])\\", sep=\\"\\"), paste(i, \\"\\\\\\\\1\\", sep=\\"\\"), cont)\n+for(i in uniq_groups)  cont <- gsub(paste(groups[[i]], \\"\\$\\", sep=\\"\\"), i, cont)\n+";\n+\t} else {\n+\t\tprint Rcmd "\n+cont <- NULL\n+";\n+\t}\n+\tif(defined $OPTIONS{m}) {\n+\t\tprint Rcmd "\n+for(i in 1:length(pw_tests)) cont <- c(cont, paste(pw_tests[[i]][2], \\"-\\", pw_tests[[i]][1], sep=\\"\\"))\n+";\n+\t}\n+\tif(!defined $OPTIONS{m} && !@add_cont){\n+\t\tdie("No Contrasts have been specified, you must at least either select multiple pairwise comparisons or specify a custom contrast\\n");\n+\t}\n+\tprint Rcmd "\n+cont <- makeContrasts(contrasts=cont, levels=design)\n+fit2 <- contrasts.fit(fit, cont)\n+fit2 <- eBayes(fit2)\n+";\n+} else {\n+\tdie("Anaysis type $OPTIONS{a} not found\\n");\n+\n+}\n+if($OPTIONS{a} ne "limma") {\n+\tprint Rcmd "\n+options(digits = 6)\n+tab <- NULL\n+for(i in names(tested)) {\n+\ttab_tmp <- topTags(tested[[i]], n=Inf, adjust.method=\\"$OPTIONS{f}\\")[[1]]\n+\tcolnames(tab_tmp) <- paste(i, colnames(tab_tmp), sep=\\":\\")\n+\ttab_tmp <- tab_tmp[tagnames,]\n+\tif(is.null(tab)) {\n+\t\ttab <- tab_tmp\n+\t} else tab <- cbind(tab, tab_tmp)\n+}\n+tab <- cbind(Feature=rownames(tab), tab)\n+";\n+} else {\n+\tprint Rcmd "\n+tab <- NULL\n+options(digits = 6)\n+for(i in colnames(fit2)) {\n+\ttab_tmp <- topTable(fit2, coef=i, n=Inf, sort.by=\\"none\\", adjust.method=\\"$OPTIONS{f}\\")\n+\tcolnames(tab_tmp)[-1] <- paste(i, colnames(tab_tmp)[-1], sep=\\":\\")\n+\tif(is.null(tab)) {\n+\t\ttab <- tab_tmp\n+\t} else tab <- cbind(tab, tab_tmp[,-1])\n+}\n+";\n+}\n+print Rcmd "\n+write.table(tab, \\"$OPTIONS{o}\\", quote=F, sep=\\"\\\\t\\", row.names=F)\n+sink(type=\\"message\\")\n+sink()\n+";\n+close(Rcmd);\n+system("R --no-restore --no-save --no-readline < $OPTIONS{e}/r_script.R > $OPTIONS{e}/r_script.out");\n+\n+open(HTML, ">$OPTIONS{h}");\n+print HTML "<html><head><title>EdgeR: Empirical analysis of digital gene expression data</title></head><body><h3>EdgeR Additional Files:</h3><p><ul>\\n";\n+print HTML "<li><a href=MA_plots_normalisation.pdf>MA_plots_normalisation.pdf</a></li>\\n";\n+print HTML "<li><a href=MDSplot.pdf>MDSplot.pdf</a></li>\\n";\n+if($OPTIONS{a} eq "pw") {\n+\tif(defined $OPTIONS{t}) {\n+\t\tprint HTML "<li><a href=Tagwise_Dispersion_vs_Abundance.pdf>Tagwise_Dispersion_vs_Abundance.pdf</a></li>\\n";\n+\t}\n+\tprint HTML "<li><a href=Smear_Plots.pdf>Smear_Plots.pdf</a></li>\\n";\n+} elsif($OPTIONS{a} eq "glm" && $OPTIONS{d} eq "tag") {\n+\tprint HTML "<li><a href=Tagwise_Dispersion_vs_Abundance.pdf>Tagwise_Dispersion_vs_Abundance.pdf</a></li>\\n";\n+\tprint HTML "<li><a href=Smear_Plots.pdf>Smear_Plots.pdf</a></li>\\n";\n+} elsif($OPTIONS{a} eq "limma") {\n+\tprint HTML "<li><a href=LIMMA_MDS_plot.pdf>LIMMA_MDS_plot.pdf</a></li>\\n";\n+\tprint HTML "<li><a href=LIMMA_voom.pdf>LIMMA_voom.pdf</a></li>\\n";\n+}\n+print HTML "<li><a href=r_script.R>r_script.R</a></li>\\n";\n+print HTML "<li><a href=r_script.out>r_script.out</a></li>\\n";\n+print HTML "<li><a href=r_script.err>r_script.err</a></li>\\n";\n+print HTML "</ul></p>\\n";\n+close(HTML);\n+\n'
b
diff -r 000000000000 -r 91ca33096034 edgeR.xml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/edgeR.xml Tue Jan 13 21:12:26 2015 -0500
[
b'@@ -0,0 +1,178 @@\n+<tool id="edgeR" name="edgeR" version="0.0.3">\n+  <description> - Estimates differential gene expression for short read sequence count using methods appropriate for count data</description>\n+  <requirements>\n+        <requirement type="R-module">edgeR</requirement>\n+        <requirement type="R-module">limma</requirement>\n+  </requirements>\n+  <command interpreter="perl">\n+  \tedgeR.pl -a $analysis_type.analysis -e $html_file.files_path -f BH -h $html_file -o $output\n+\n+  \t<!--Pairwise comparisons 1 Factor Analysis-->\n+  \t#if $analysis_type.analysis == "pw":\n+   \t\t-r $analysis_type.rowsumfilter\n+\t\t#if $analysis_type.tagwise_disp.twd == "TRUE":\n+      \t\t\t-u movingave\n+      \t\t\t-t \n+     \t\t#end if\n+ \t<!--GLM Generalized Linear Models (Multiple Factors)-->\n+  \t#else if $analysis_type.analysis == "glm":\n+\t\t#if $analysis_type.exp.export_norm == "true":\n+\t\t\t-n $norm_exp\n+\t\t#end if\n+ \t\t-d tag\n+\t\t$analysis_type.cont_pw\n+\t\t#for $cnt in $analysis_type.contrasts:\n+\t\t\t"cnt::${cnt.add_cont}"\n+\t\t#end for\n+\n+\t<!--LIMMA Linearized Models (Multiple Factors)-->\n+\t#else\n+\t\t#if $analysis_type.exp.export_norm == "true":\n+\t\t\t-n $norm_exp $analysis_type.exp.log\n+\t\t#end if\n+\t\t$analysis_type.cont_pw\n+\t\t#for $cnt in $analysis_type.contrasts:\n+\t\t\t"cnt::${cnt.add_cont}"\n+\t\t#end for\n+\t#end if\n+\t$matrix\n+\t\t\t\t\n+  </command>\n+\n+  <inputs>\n+  \t<param name="matrix" type="data" format="tabular" label="Digital Expression Matrix"/>\n+  \t<conditional name="analysis_type">\n+\t\t<param name="analysis" type="select" label="Type Of Analysis">\n+\t\t\t<option value="pw">Pairwise comparisons (1 Factor Analysis)</option>\n+\t\t\t<option value="glm" selected="true">Generalized Linear Models (Multiple Factor Analysis using GLM)</option>\n+\t\t\t<option value="limma">Linear Models for RNA-Seq (Multiple Factor Analysis using LIMMA)</option>\n+\t\t</param>\n+\t\t<when value="pw">\n+\t\t\t<param name="rowsumfilter" type="integer" value="5" label="Common Dispersion Rowsum Filter" help="Numeric scalar giving a value for the filtering out of low abundance tags in the estimation of the common dispersion. Only tags with total sum of counts above this value are used in the estimation of the common dispersion. Low abundance tags can adversely affect the estimation of the common dispersion, so this argument allows the user to select an appropriate filter threshold for the tag abundance."/>\n+ \t\t<conditional name="tagwise_disp">\n+    \t\t\t\t<param name="twd" type="select" label="Maximize the Negative Binomial Weighted Conditional Likelihood" help="Calculate and use an estimate of the dispersion parameter for each tag">\n+    \t\t\t\t\t<option value="TRUE" selected="true">True</option>\n+    \t\t\t\t\t<option value="FALSE">False</option>\n+   \t\t\t\t</param>\n+    \t\t\t</conditional>         \n+\t\t</when>\n+\t\t<when value="glm">\n+\t\t\t<param name="cont_pw" type="boolean" truevalue="-m" falsevalue="" checked="True" label="Perform all pairwise comparisons" help="Include all pairwise comparisons in the contrast matrix."/>\n+\t\t\t<repeat name="contrasts" title="Contrast">\n+\t\t\t\t<param name="add_cont" title="Contrast" type="text" label="Enter the contrast of interest, e.g. (G1+G2)/2-G3 (no spaces or commas)"/>\n+\t\t\t</repeat>\n+\t\t\t<conditional name="exp">\t\n+\t\t\t\t<param name="export_norm" type="select" label="Save Normalised DGE Matrix">\n+\t\t\t\t\t<option value="true">Yes</option>\n+\t\t\t\t\t<option value="false">No</option>\n+\t\t\t\t</param>\n+\t\t\t</conditional>\n+\t\t</when>\n+\t\t<when value="limma">\n+\t\t\t<param name="cont_pw" type="boolean" truevalue="-m" falsevalue="" checked="True" label="Perform all pairwise comparisons" help="Include all pairwise comparisons in the contrast matrix."/>\n+\t\t\t<repeat name="contrasts" title="Contrast">\n+\t\t\t\t<param name="add_cont" title="Contrast" type="text" label="Enter the contrast of interest, e.g. (G1+G2)/2-G3 (no spaces or commas)"/>\n+\t\t\t</repeat>\n+\t\t\t<conditional name="exp">\t\n+\t\t\t\t<param name="export_norm" type="select" label="Save Normalised DGE Matrix">\n+\t\t\t\t\t<option value="true">Yes</option>\n+\t\t\t\t\t<option value'..b'GE Matrix in Log2" help="Selecting this will log base 2 transform the Normalised Digital Gene Expression Matrix."/>\n+\t\t\t\t</when>\n+\t\t\t</conditional>\n+\t\t</when>\n+\t</conditional>\n+  </inputs>\n+  \n+  <outputs>\n+    \t<data format="tabular" name="output" label="EdgeR analysis on ${matrix.name}"/>\n+    \t<data name="html_file" format="html" label="EdgeR analysis plots for ${matrix.name}"/>\n+    \t<data name="norm_exp" format="tabular" label="EdgeR Norm Expr Matrix for ${matrix.name}">\n+    \t\t<filter>analysis_type[ "analysis" ] != "pw" and analysis_type[ "exp" ][ "export_norm" ] == "true"</filter>\n+    \t</data>\n+  </outputs>\n+  \t\n+\t<help>\n+\n+.. class:: infomark\n+    \n+**What it does**\n+\n+Estimates differential gene expression for short read sequence count using methods appropriate for count data.\n+If you have paired data you may also want to consider Tophat/Cufflinks. \n+Input must be raw count data for each sequence arranged in a rectangular matrix as a tabular file.\n+Note - no scaling - please make sure you have untransformed raw counts of reads for each sequence.\n+ \n+Performs digital differential gene expression analysis between groups (eg a treatment and control).\n+Biological replicates provide information about experimental variability required for reliable inference.\n+\n+**What it does not do**\n+edgeR_ requires biological replicates. \n+Without replicates you can\'t account for known important experimental sources of variability that the approach implemented here requires.\n+\n+\n+**Input**\n+A count matrix containing sequence names as rows and sample specific counts of reads from this sequence as columns.\n+The matrix must have 2 header rows, the first indicating the group assignment and the second uniquely identifiying the samples. It must also contain a unique set of (eg Feature) names in the first column. \n+\n+Example::\n+\n+\t#\tG1:Mut\tG1:Mut\tG1:Mut\tG2:WT\tG2:WT\tG2:WT\n+\t#Feature\tSpl1\tSpl2\tSpl3\tSpl4\tSpl5\tSpl6\n+\tNM_001001130\t97\t43\t61\t34\t73\t26\n+\tNM_001001144\t25\t8\t9\t3\t5\t5\n+\tNM_001001152\t72\t45\t29\t20\t31\t13\n+\tNM_001001160\t0\t1\t1\t1\t0\t0\n+\tNM_001001177\t0\t1\t0\t4\t3\t3\n+\tNM_001001178\t0\t2\t1\t0\t4\t0\n+\tNM_001001179\t0\t0\t0\t0\t0\t2\n+\tNM_001001180\t0\t0\t0\t0\t0\t2\n+\tNM_001001181\t415\t319\t462\t185\t391\t155\n+\tNM_001001182\t1293\t945\t987\t297\t938\t496\n+\tNM_001001183\t5\t4\t11\t7\t11\t2\n+\tNM_001001184\t135\t198\t178\t110\t205\t64\n+\tNM_001001185\t186\t1\t0\t1\t1\t0\n+\tNM_001001186\t75\t90\t91\t34\t63\t54\n+\tNM_001001187\t267\t236\t170\t165\t202\t51\n+\tNM_001001295\t5\t2\t6\t1\t7\t0\n+\tNM_001001309\t1\t0\t0\t1\t2\t1\n+\t...\n+\t\n+\n+Please use the "Count reads in features with htseq-count" tool to generate the count matrix.\n+\n+**Output**\n+\n+A tabular file containing relative expression levels, statistical estimates of differential expression probability, R scripts, log, and some helpful diagnostic plots.\n+\n+**Fixed Parameters**\n+ \n+Method for allowing the prior distribution for the dispersion to be abundance-dependent used: movingave\n+\n+False discovery rate adjustment method used: Benjamini and Hochberg (1995)\n+\n+GLM dispersion estimate used: Tagwise Dispersion\n+\n+Gene filter used: less than 1 count per million reads\n+ \n+.. class:: infomark\n+\n+**Attribution**\n+This tool wraps the edgeR_ Bioconductor package so all calculations and plots are controlled by that code. See edgeR_ for all documentation and appropriate attribution. \n+Recommended reference is Mark D. Robinson, Davis J. McCarthy, Gordon K. Smyth, PMCID: PMC2796818\n+\n+.. class:: infomark\n+\n+**Attribution**\n+When applying the LIMMA (Linear models for RNA-Seq) anlysis the tool also makes use of the limma_ Bioconductor package.\n+Recommended reference is Smyth, G. K. (2005). Limma: linear models for microarray data. In: \'Bioinformatics and Computational Biology Solutions using R and Bioconductor\'. R. Gentleman, V. Carey, S. Dudoit, R. Irizarry, W. Huber (eds), Springer, New York, pages 397--420.\n+\n+ .. _edgeR: http://www.bioconductor.org/packages/release/bioc/html/edgeR.html\n+ .. _limma: http://www.bioconductor.org/packages/release/bioc/html/limma.html\n+\n+\n+\t</help>\n+  \n+</tool>\n'