| 0 | 1 #!/usr/local/public/bin/Rscript --vanilla --slave --no-site-file | 
|  | 2 # version="0.1.0" | 
|  | 3 #@author Gildas Le Corguille lecorguille@sb-roscoff.fr ABIMS TEAM | 
|  | 4 | 
|  | 5 | 
|  | 6 | 
|  | 7 # ----- ARGUMENTS BLACKLIST ----- | 
|  | 8 #xcms.r | 
|  | 9 argBlacklist=c("zipfile","xfunction","xsetRdataOutput","sampleMetadataOutput","ticspdf","bicspdf","rplotspdf") | 
|  | 10 #CAMERA.r | 
|  | 11 argBlacklist=c(argBlacklist,"dataMatrixOutput","variableMetadataOutput","new_file_path") | 
|  | 12 | 
|  | 13 # ----- PACKAGE ----- | 
|  | 14 | 
|  | 15 pkgs=c("parallel","BiocGenerics", "Biobase", "Rcpp", "mzR", "tcltk","igraph", "xcms","snow","CAMERA","multtest","batch") | 
|  | 16 for(pkg in pkgs) { | 
|  | 17     suppressPackageStartupMessages( stopifnot( library(pkg, quietly=TRUE, logical.return=TRUE, character.only=TRUE))) | 
|  | 18 } | 
|  | 19 | 
|  | 20 | 
|  | 21 # ----- FUNCTION ----- | 
|  | 22 writehtml = function(...) { cat(...,"\n", file=htmlOutput,append = TRUE,sep="") } | 
|  | 23 | 
|  | 24 | 
|  | 25 # ----- ARGUMENTS ----- | 
|  | 26 | 
|  | 27 listArguments = parseCommandArgs(evaluate=FALSE) #interpretation of arguments given in command line as an R list of objects | 
|  | 28 | 
|  | 29 | 
|  | 30 # ----- ARGUMENTS PROCESSING ----- | 
|  | 31 | 
|  | 32 #image is an .RData file necessary to use xset variable given by previous tools | 
|  | 33 load(listArguments[["image"]]); | 
|  | 34 | 
|  | 35 htmlOutput = "summary.html" | 
|  | 36 if (!is.null(listArguments[["htmlOutput"]])) htmlOutput = listArguments[["htmlOutput"]]; | 
|  | 37 | 
|  | 38 user_email = NULL | 
|  | 39 if (!is.null(listArguments[["user_email"]])) user_email = listArguments[["user_email"]]; | 
|  | 40 | 
|  | 41 # if the RData come from CAMERA | 
|  | 42 if (!exists("xset") & exists("xa")) xset=xa@xcmsSet | 
|  | 43 | 
|  | 44 # retrocompatability | 
| 1 | 45 if (!exists("sampleNamesList")) sampleNamesList=list("sampleNamesMakeNames"=make.names(sampnames(xset))) | 
| 0 | 46 | 
|  | 47 if (!exists("xset")) stop("You need at least a xset or a xa object.") | 
|  | 48 | 
|  | 49 | 
|  | 50 | 
|  | 51 # ----- MAIN PROCESSING INFO ----- | 
|  | 52 writehtml("<!DOCTYPE html>") | 
|  | 53 writehtml("<HTML lang='en'>") | 
|  | 54 | 
|  | 55 writehtml("<HEAD>") | 
|  | 56     writehtml("<meta http-equiv='Content-Type' content='text/html; charset=UTF-8' />") | 
|  | 57 | 
|  | 58     writehtml("<title>[W4M] XCMS analysis summary</title>") | 
|  | 59 | 
|  | 60     writehtml("<style>") | 
|  | 61         writehtml("table, tr, td, th { border: 1px solid #000000; border-collapse:collapse; }") | 
|  | 62         writehtml("td,th { padding: 5px; padding-right: 12px; }") | 
|  | 63         writehtml("th { background: #898989; text-align:left;color: white;}") | 
|  | 64         writehtml("h2 { color: #FFA212; }") | 
|  | 65         writehtml("ul li { margin-bottom:10px; }") | 
|  | 66     writehtml("</style>") | 
|  | 67 writehtml("</HEAD>") | 
|  | 68 | 
|  | 69 writehtml("<BODY>") | 
|  | 70     writehtml("<div><h1>___ XCMS analysis summary using Workflow4Metabolomics ___</h1>") | 
|  | 71     # to pass the planemo shed_test | 
|  | 72     if (user_email != "test@bx.psu.edu") { | 
|  | 73         if (!is.null(user_email)) writehtml("By: ",user_email," - ") | 
|  | 74         writehtml("Date: ",format(Sys.time(), "%y%m%d-%H:%M:%S")) | 
|  | 75     } | 
|  | 76     writehtml("</div>") | 
|  | 77 | 
|  | 78     writehtml("<h2>Samples used:</h2>") | 
|  | 79     writehtml("<div><table>") | 
| 2 | 80         if (all(sampnames(xset) == sampleNamesList$sampleNamesMakeNames)) { | 
| 0 | 81             sampleNameHeaderHtml = paste("<th>sample</th>") | 
|  | 82             sampleNameHtml = paste("<td>",sampnames(xset),"</td>") | 
|  | 83         } else { | 
|  | 84             sampleNameHeaderHtml = paste("<th>sample</th><th>sample renamed</th>") | 
|  | 85             sampleNameHtml = paste("<td>",sampnames(xset),"</td><td>",sampleNamesList$sampleNamesMakeNames,"</td>") | 
|  | 86         } | 
|  | 87 | 
|  | 88         if (!exists("md5sumList")) { | 
|  | 89             md5sumHeaderHtml = "" | 
|  | 90             md5sumHtml = "" | 
|  | 91             md5sumLegend="" | 
| 2 | 92         } else if (is.null(md5sumList$removalBadCharacters)) { | 
| 0 | 93             md5sumHeaderHtml = paste("<th>md5sum<sup>*</sup></th>") | 
|  | 94             md5sumHtml = paste("<td>",md5sumList$origin,"</td>") | 
|  | 95             md5sumLegend = "<br/><sup>*</sup>The program md5sum is designed to verify data integrity. So you can check if the data were uploaded correctly or if the data were chancged during the process." | 
|  | 96         } else { | 
|  | 97             md5sumHeaderHtml = paste("<th>md5sum<sup>*</sup></th><th>md5sum<sup>**</sup> after bad characters removal</th>") | 
|  | 98             md5sumHtml = paste("<td>",md5sumList$origin,"</td><td>",md5sumList$origin,"</td>") | 
|  | 99             md5sumLegend = "<br/><sup>*</sup>The program md5sum is designed to verify data integrity. So you can check if the data were uploaded correctly or if the data were chancged during the process.<br/><sup>**</sup>Because some bad characters (eg: accent) were removed from your original file, the checksum have changed too.<br/>" | 
|  | 100         } | 
|  | 101 | 
|  | 102         writehtml("<tr>",sampleNameHeaderHtml,"<th>filename</th>",md5sumHeaderHtml,"</tr>") | 
|  | 103         writehtml(paste("<tr>",sampleNameHtml,"<td>",xset@filepaths,"</td>",md5sumHtml,"</tr>")) | 
|  | 104 | 
|  | 105     writehtml("</table>") | 
|  | 106     writehtml(md5sumLegend) | 
|  | 107     writehtml("</div>") | 
|  | 108 | 
|  | 109     writehtml("<h2>Function launched:</h2>") | 
|  | 110     writehtml("<div><table>") | 
|  | 111         writehtml("<tr><th>timestamp<sup>***</sup></th><th>function</th><th>argument</th><th>value</th></tr>") | 
|  | 112         for(tool in names(listOFlistArguments)) { | 
|  | 113             listOFlistArgumentsDisplay=listOFlistArguments[[tool]][!(names(listOFlistArguments[[tool]]) %in% argBlacklist)] | 
|  | 114 | 
|  | 115             timestamp = strsplit(tool,"_")[[1]][1] | 
|  | 116             xcmsFunction = strsplit(tool,"_")[[1]][2] | 
|  | 117             writehtml("<tr><td rowspan='",length(listOFlistArgumentsDisplay),"'>",timestamp,"</td><td rowspan='",length(listOFlistArgumentsDisplay),"'>",xcmsFunction,"</td>") | 
|  | 118             line_begin="" | 
|  | 119             for (arg in names(listOFlistArgumentsDisplay)) { | 
|  | 120                 writehtml(line_begin,"<td>",arg,"</td><td>",unlist(listOFlistArgumentsDisplay[arg][1]),"</td></tr>") | 
|  | 121                 line_begin="<tr>" | 
|  | 122             } | 
|  | 123         } | 
|  | 124     writehtml("</table>") | 
|  | 125     writehtml("<br/><sup>***</sup>timestamp format: yymmdd-hh:mm:ss") | 
|  | 126     writehtml("</div>") | 
|  | 127 | 
|  | 128     writehtml("<h2>Informations about the xcmsSet object:</h2>") | 
|  | 129 | 
|  | 130     writehtml("<div><pre>") | 
|  | 131         log_file=file(htmlOutput, open = "at") | 
|  | 132         sink(log_file) | 
|  | 133         sink(log_file, type = "output") | 
|  | 134             xset | 
|  | 135         sink() | 
|  | 136     writehtml("</pre></div>") | 
|  | 137 | 
|  | 138     if (exists("xa")) { | 
|  | 139         writehtml("<h2>Informations about the CAMERA object:</h2>") | 
|  | 140 | 
|  | 141         writehtml("<div>") | 
|  | 142             writehtml("Number of pcgroup:",length(xa@pspectra)) | 
|  | 143         writehtml("</div>") | 
|  | 144     } | 
|  | 145 | 
|  | 146     writehtml("<h2>Citations:</h2>") | 
|  | 147     writehtml("<div><ul>") | 
|  | 148         writehtml("<li>To cite the <b>XCMS</b> package in publications use:") | 
|  | 149             writehtml("<ul>") | 
|  | 150             writehtml("<li>","Smith, C.A. and Want, E.J. and O'Maille, G. and Abagyan,R. and Siuzdak, G.XCMS: Processing mass spectrometry data for metabolite profiling using nonlinear peak alignment, matching and identification, Analytical Chemistry, 78:779-787 (2006)","</li>") | 
|  | 151             writehtml("<li>","Ralf Tautenhahn, Christoph Boettcher, Steffen Neumann: Highly sensitive feature detection for high resolution LC/MS BMC Bioinformatics, 9:504 (2008)","</li>") | 
|  | 152             writehtml("<li>","H. Paul Benton, Elizabeth J. Want and Timothy M. D. Ebbels Correction of mass calibration gaps in liquid chromatography-mass spectrometry metabolomics data Bioinformatics, 26:2488 (2010)","</li>") | 
|  | 153             writehtml("</ul>") | 
|  | 154         writehtml("</li>") | 
|  | 155 | 
|  | 156         writehtml("<li>To cite the <b>CAMERA</b> package in publications use:") | 
|  | 157             writehtml("<ul>") | 
|  | 158             writehtml("<li>","Kuhl, C., Tautenhahn, R., Boettcher, C., Larson, T. R. and Neumann,S. CAMERA: an integrated strategy for compound spectra extraction and annotation of liquid chromatography/mass spectrometry data sets. Analytical Chemistry, 84:283-289 (2012)","</li>") | 
|  | 159             writehtml("</ul>") | 
|  | 160         writehtml("</li>") | 
|  | 161 | 
|  | 162         writehtml("<li>To cite the <b>Workflow4Metabolimics (W4M)</b> project in publications use:") | 
|  | 163             writehtml("<ul>") | 
|  | 164             writehtml("<li>","Franck Giacomoni, Gildas Le Corguillé, Misharl Monsoor, Marion Landi, Pierre Pericard, Mélanie Pétéra, Christophe Duperier, Marie Tremblay-Franco, Jean-François Martin, Daniel Jacob, Sophie Goulitquer, Etienne A. Thévenot and Christophe Caron (2014). Workflow4Metabolomics: A collaborative research infrastructure for computational metabolomics. Bioinformatics  doi:10.1093/bioinformatics/btu813","</li>") | 
|  | 165             writehtml("</ul>") | 
|  | 166         writehtml("</li>") | 
|  | 167     writehtml("</ul></div>") | 
|  | 168 | 
|  | 169 writehtml("</BODY>") | 
|  | 170 | 
|  | 171 writehtml("</HTML>") | 
|  | 172 |