Repository 'prisca'
hg clone https://toolshed.g2.bx.psu.edu/repos/davidvanzessen/prisca

Changeset 0:ed6885c85660 (2016-08-31)
Next changeset 1:75853bceec00 (2017-01-17)
Commit message:
Uploaded
added:
ALL.xml
RScript.r
jquery-1.11.0.min.js
script.js
style.css
tabber.js
wrapper.sh
b
diff -r 000000000000 -r ed6885c85660 ALL.xml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ALL.xml Wed Aug 31 05:31:47 2016 -0400
b
@@ -0,0 +1,46 @@
+<tool id="prisca" name="PRISCA" version="1.0">
+ <description>PRecISe Clonal Analysis</description>
+ <command interpreter="bash">
+ wrapper.sh $in_file $out_file $out_file.files_path $min_freq $min_cells $merge_on
+ </command>
+ <inputs>
+ <param name="in_file" format="tabular" type="data" label="Data to Process" />
+ <param name="min_freq" type="text" label="Minimum Frequency, between 0 and 100 in percentage" value='0'/>
+ <param name="min_cells" type="text" label="Minimum cell count" value='0'/>
+ <param name="merge_on" type="select" label="Merge On">
+ <option value="Clone_Sequence">Clone_Sequence</option>
+ <option value="V_J_CDR3">V+J+CDR3</option>
+ </param>
+ </inputs>
+ <outputs>
+ <data format="html" name="out_file" />
+ </outputs>
+ <help>
+Takes a tabular file as input, it needs to following columns:
+
++----------------------------------+----------------------------------------------+
+| **Column name**                  | **Column contents**                          |
++----------------------------------+----------------------------------------------+
+| Patient                          | The patient ID                               |
++----------------------------------+----------------------------------------------+
+| Sample                           | The Sample ID, one, two or three per Patient |
++----------------------------------+----------------------------------------------+
+| Cell_Count                       | The cell count within a sample/loci          |
++----------------------------------+----------------------------------------------+
+| Clone_Molocule_Count_From_Spikes | The count of a clone                         |
++----------------------------------+----------------------------------------------+
+| Log10_Frequency                  | The frequency of a clone in log10            |
++----------------------------------+----------------------------------------------+
+| J_Segment_Major_Gene             | The J Gene of this clone                     |
++----------------------------------+----------------------------------------------+
+| V_Segment_Major_Gene             | The V Gene of this clone                     |
++----------------------------------+----------------------------------------------+
+| Clone_Sequence                   | The entire sequence                          |
++----------------------------------+----------------------------------------------+
+| CDR3_Sense_Sequence              | The CDR3 sequence region.                    |
++----------------------------------+----------------------------------------------+
+
+
+And generate a detailed HTML report on the sequences found in indiviual samples and in both samples.
+ </help>
+</tool>
b
diff -r 000000000000 -r ed6885c85660 RScript.r
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/RScript.r Wed Aug 31 05:31:47 2016 -0400
[
b'@@ -0,0 +1,1076 @@\n+args <- commandArgs(trailingOnly = TRUE)\r\n+options(scipen=999)\r\n+\r\n+inFile = args[1]\r\n+outDir = args[2]\r\n+logfile = args[3]\r\n+min_freq = as.numeric(args[4])\r\n+min_cells = as.numeric(args[5])\r\n+mergeOn = args[6]\r\n+\r\n+cat("<html><table><tr><td>Starting analysis</td></tr>", file=logfile, append=F)\r\n+\r\n+library(ggplot2)\r\n+library(reshape2)\r\n+library(data.table)\r\n+library(grid)\r\n+library(parallel)\r\n+#require(xtable)\r\n+cat("<tr><td>Reading input</td></tr>", file=logfile, append=T)\r\n+dat = read.table(inFile, header=T, sep="\\t", dec=".", fill=T, stringsAsFactors=F)\r\n+dat = dat[,c("Patient",  "Receptor", "Sample", "Cell_Count", "Clone_Molecule_Count_From_Spikes", "Log10_Frequency", "Total_Read_Count", "J_Segment_Major_Gene", "V_Segment_Major_Gene", "CDR3_Sense_Sequence", "Clone_Sequence")]\r\n+dat$dsPerM = 0\r\n+dat = dat[!is.na(dat$Patient),]\r\n+dat$Related_to_leukemia_clone = F\r\n+\r\n+setwd(outDir)\r\n+cat("<tr><td>Selecting first V/J Genes</td></tr>", file=logfile, append=T)\r\n+dat$V_Segment_Major_Gene = as.factor(as.character(lapply(strsplit(as.character(dat$V_Segment_Major_Gene), "; "), "[[", 1)))\r\n+dat$J_Segment_Major_Gene = as.factor(as.character(lapply(strsplit(as.character(dat$J_Segment_Major_Gene), "; "), "[[", 1)))\r\n+\r\n+cat("<tr><td>Calculating Frequency</td></tr>", file=logfile, append=T)\r\n+\r\n+dat$Frequency = ((10^dat$Log10_Frequency)*100)\r\n+\r\n+dat = dat[dat$Frequency >= min_freq,]\r\n+\r\n+triplets = dat[grepl("VanDongen_cALL_14696", dat$Patient) | grepl("(16278)|(26402)|(26759)", dat$Sample),]\r\n+\r\n+cat("<tr><td>Normalizing to lowest cell count within locus</td></tr>", file=logfile, append=T)\r\n+\r\n+dat$locus_V = substring(dat$V_Segment_Major_Gene, 0, 4)\r\n+dat$locus_J = substring(dat$J_Segment_Major_Gene, 0, 4)\r\n+min_cell_count = data.frame(data.table(dat)[, list(min_cell_count=min(.SD$Cell_Count)), by=c("Patient", "locus_V", "locus_J")])\r\n+\r\n+dat$min_cell_paste = paste(dat$Patient, dat$locus_V, dat$locus_J)\r\n+min_cell_count$min_cell_paste = paste(min_cell_count$Patient, min_cell_count$locus_V, min_cell_count$locus_J)\r\n+\r\n+min_cell_count = min_cell_count[,c("min_cell_paste", "min_cell_count")]\r\n+print(paste("rows:", nrow(dat)))\r\n+dat = merge(dat, min_cell_count, by="min_cell_paste")\r\n+print(paste("rows:", nrow(dat)))\r\n+dat$normalized_read_count = round(dat$Clone_Molecule_Count_From_Spikes / dat$Cell_Count * dat$min_cell_count / 2, digits=2) #??????????????????????????????????? wel of geen / 2\r\n+\r\n+dat = dat[dat$normalized_read_count >= min_cells,]\r\n+\r\n+dat$paste = paste(dat$Sample, dat$Clone_Sequence)\r\n+\r\n+patients = split(dat, dat$Patient, drop=T)\r\n+intervalReads = rev(c(0,10,25,50,100,250,500,750,1000,10000))\r\n+intervalFreq = rev(c(0,0.01,0.05,0.1,0.5,1,5))\r\n+V_Segments = c(".*", "IGHV", "IGHD", "IGKV", "IGKV", "IgKINTR", "TRGV", "TRDV", "TRDD" , "TRBV")\r\n+J_Segments = c(".*", ".*", ".*", "IGKJ", "KDE", ".*", ".*", ".*", ".*", ".*")\r\n+Titles = c("Total", "IGH-Vh-Jh", "IGH-Dh-Jh", "Vk-Jk", "Vk-Kde" , "Intron-Kde", "TCRG", "TCRD-Vd-Dd", "TCRD-Dd-Dd", "TCRB-Vb-Jb")\r\n+Titles = factor(Titles, levels=Titles)\r\n+TitlesOrder = data.frame("Title"=Titles, "TitlesOrder"=1:length(Titles))\r\n+\r\n+single_patients = data.frame("Patient" = character(0),"Sample" = character(0), "on" = character(0), "Clone_Sequence" = character(0), "Frequency" = numeric(0), "normalized_read_count" = numeric(0), "V_Segment_Major_Gene" = character(0), "J_Segment_Major_Gene" = character(0), "Rearrangement" = character(0))\r\n+\r\n+patient.merge.list = list() #cache the \'both\' table, 2x speedup for more memory...\r\n+patient.merge.list.second = list()\r\n+  scatter_locus_data_list = list()\r\n+cat(paste("<table border=\'0\' style=\'font-family:courier;\'>", sep=""), file="multiple_matches.html", append=T)\r\n+cat(paste("<table border=\'0\' style=\'font-family:courier;\'>", sep=""), file="single_matches.html", append=T)\r\n+patientCountOnColumn <- function(x, product, interval, on, appendtxt=F){\r\n+  if (!is.data.frame(x) & is.list(x)){\r\n+    x = x[[1]]\r\n+  }\r\n+  #x$Sample = facto'..b'td></tr>", file=logfile, append=T)\r\n+\r\n+  triplets$locus_V = substring(triplets$V_Segment_Major_Gene, 0, 4)\r\n+  triplets$locus_J = substring(triplets$J_Segment_Major_Gene, 0, 4)\r\n+  min_cell_count = data.frame(data.table(triplets)[, list(min_cell_count=min(.SD$Cell_Count)), by=c("uniqueID", "locus_V", "locus_J")])\r\n+  \r\n+  triplets$min_cell_paste = paste(triplets$uniqueID, triplets$locus_V, triplets$locus_J)\r\n+  min_cell_count$min_cell_paste = paste(min_cell_count$uniqueID, min_cell_count$locus_V, min_cell_count$locus_J)\r\n+  \r\n+  min_cell_count = min_cell_count[,c("min_cell_paste", "min_cell_count")]\r\n+  \r\n+  triplets = merge(triplets, min_cell_count, by="min_cell_paste")\r\n+  \r\n+  triplets$normalized_read_count = round(triplets$Clone_Molecule_Count_From_Spikes / triplets$Cell_Count * triplets$min_cell_count / 2, digits=2) #??????????????????????????????????? wel of geen / 2\r\n+  \r\n+  triplets = triplets[triplets$normalized_read_count >= min_cells,]\r\n+  \r\n+  column_drops = c("min_cell_count", "min_cell_paste")\r\n+  \r\n+  triplets = triplets[,!(colnames(triplets) %in% column_drops)]\r\n+\r\n+  cat("<tr><td>Starting Cell Count analysis</td></tr>", file=logfile, append=T)\r\n+\r\n+  interval = intervalReads\r\n+  intervalOrder = data.frame("interval"=paste(">", interval, sep=""), "intervalOrder"=1:length(interval))\r\n+  product = data.frame("Titles"=rep(Titles, each=length(interval)), "interval"=rep(interval, times=10), "V_Segments"=rep(V_Segments, each=length(interval)), "J_Segments"=rep(J_Segments, each=length(interval)))\r\n+  \r\n+  one = triplets[triplets$Sample == "14696_reg_BM",]\r\n+  two = triplets[triplets$Sample == "24536_reg_BM",]\r\n+  three = triplets[triplets$Sample == "24062_reg_BM",]\r\n+  tripletAnalysis(one, "14696_1_Trio", two, "14696_2_Trio", three, "14696_3_Trio", product=product, interval=interval, on="normalized_read_count", T)\r\n+  \r\n+  one = triplets[triplets$Sample == "16278_Left",]\r\n+  two = triplets[triplets$Sample == "26402_Left",]\r\n+  three = triplets[triplets$Sample == "26759_Left",]\r\n+  tripletAnalysis(one, "16278_Left_Trio", two, "26402_Left_Trio", three, "26759_Left_Trio", product=product, interval=interval, on="normalized_read_count", T)\r\n+  \r\n+  one = triplets[triplets$Sample == "16278_Right",]\r\n+  two = triplets[triplets$Sample == "26402_Right",]\r\n+  three = triplets[triplets$Sample == "26759_Right",]\r\n+  tripletAnalysis(one, "16278_Right_Trio", two, "26402_Right_Trio", three, "26759_Right_Trio", product=product, interval=interval, on="normalized_read_count", T)\r\n+  \r\n+  cat("<tr><td>Starting Frequency analysis</td></tr>", file=logfile, append=T)\r\n+\r\n+  interval = intervalFreq\r\n+  intervalOrder = data.frame("interval"=paste(">", interval, sep=""), "intervalOrder"=1:length(interval))\r\n+  product = data.frame("Titles"=rep(Titles, each=length(interval)), "interval"=rep(interval, times=10), "V_Segments"=rep(V_Segments, each=length(interval)), "J_Segments"=rep(J_Segments, each=length(interval)))\r\n+  \r\n+  one = triplets[triplets$Sample == "14696_reg_BM",]\r\n+  two = triplets[triplets$Sample == "24536_reg_BM",]\r\n+  three = triplets[triplets$Sample == "24062_reg_BM",]\r\n+  tripletAnalysis(one, "14696_1_Trio", two, "14696_2_Trio", three, "14696_3_Trio", product=product, interval=interval, on="Frequency", F)\r\n+  \r\n+  one = triplets[triplets$Sample == "16278_Left",]\r\n+  two = triplets[triplets$Sample == "26402_Left",]\r\n+  three = triplets[triplets$Sample == "26759_Left",]\r\n+  tripletAnalysis(one, "16278_Left_Trio", two, "26402_Left_Trio", three, "26759_Left_Trio", product=product, interval=interval, on="Frequency", F)\r\n+  \r\n+  one = triplets[triplets$Sample == "16278_Right",]\r\n+  two = triplets[triplets$Sample == "26402_Right",]\r\n+  three = triplets[triplets$Sample == "26759_Right",]\r\n+  tripletAnalysis(one, "16278_Right_Trio", two, "26402_Right_Trio", three, "26759_Right_Trio", product=product, interval=interval, on="Frequency", F)\r\n+} else {\r\n+  cat("", file="triplets.txt")\r\n+}\r\n+cat("</table></html>", file=logfile, append=T)\r\n'
b
diff -r 000000000000 -r ed6885c85660 jquery-1.11.0.min.js
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jquery-1.11.0.min.js Wed Aug 31 05:31:47 2016 -0400
[
b'@@ -0,0 +1,4 @@\n+/*! jQuery v1.11.0 | (c) 2005, 2014 jQuery Foundation, Inc. | jquery.org/license */\n+!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k="".trim,l={},m="1.11.0",n=function(a,b){return new n.fn.init(a,b)},o=/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g,p=/^-ms-/,q=/-([\\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return n.each(this,a,b)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(n.isPlainObject(c)||(b=n.isArray(c)))?(b?(b=!1,f=a&&n.isArray(a)?a:[]):f=a&&n.isPlainObject(a)?a:{},g[d]=n.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray||function(a){return"array"===n.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){return a-parseFloat(a)>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==n.type(a)||a.nodeType||n.isWindow(a))return!1;try{if(a.constructor&&!j.call(a,"constructor")&&!j.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(l.ownLast)for(b in a)return j.call(a,b);for(b in a);return void 0===b||j.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(b){b&&n.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=s(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:k&&!k.call("\\ufeff\\xa0")?function(a){return null==a?"":k.call(a)}:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(g)return g.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=s(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:functio'..b'=!1&&(b.url+=(xc.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||n.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,ad.push(e)),g&&n.isFunction(f)&&f(g[0]),g=f=void 0}),"script"):void 0}),n.parseHTML=function(a,b,c){if(!a||"string"!=typeof a)return null;"boolean"==typeof b&&(c=b,b=!1),b=b||z;var d=v.exec(a),e=!c&&[];return d?[b.createElement(d[1])]:(d=n.buildFragment([a],b,e),e&&e.length&&n(e).remove(),n.merge([],d.childNodes))};var cd=n.fn.load;n.fn.load=function(a,b,c){if("string"!=typeof a&&cd)return cd.apply(this,arguments);var d,e,f,g=this,h=a.indexOf(" ");return h>=0&&(d=a.slice(h,a.length),a=a.slice(0,h)),n.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(f="POST"),g.length>0&&n.ajax({url:a,type:f,dataType:"html",data:b}).done(function(a){e=arguments,g.html(d?n("<div>").append(n.parseHTML(a)).find(d):a)}).complete(c&&function(a,b){g.each(c,e||[a.responseText,b,a])}),this},n.expr.filters.animated=function(a){return n.grep(n.timers,function(b){return a===b.elem}).length};var dd=a.document.documentElement;function ed(a){return n.isWindow(a)?a:9===a.nodeType?a.defaultView||a.parentWindow:!1}n.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=n.css(a,"position"),l=n(a),m={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=n.css(a,"top"),i=n.css(a,"left"),j=("absolute"===k||"fixed"===k)&&n.inArray("auto",[f,i])>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),n.isFunction(b)&&(b=b.call(a,c,h)),null!=b.top&&(m.top=b.top-h.top+g),null!=b.left&&(m.left=b.left-h.left+e),"using"in b?b.using.call(a,m):l.css(m)}},n.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){n.offset.setOffset(this,a,b)});var b,c,d={top:0,left:0},e=this[0],f=e&&e.ownerDocument;if(f)return b=f.documentElement,n.contains(b,e)?(typeof e.getBoundingClientRect!==L&&(d=e.getBoundingClientRect()),c=ed(f),{top:d.top+(c.pageYOffset||b.scrollTop)-(b.clientTop||0),left:d.left+(c.pageXOffset||b.scrollLeft)-(b.clientLeft||0)}):d},position:function(){if(this[0]){var a,b,c={top:0,left:0},d=this[0];return"fixed"===n.css(d,"position")?b=d.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),n.nodeName(a[0],"html")||(c=a.offset()),c.top+=n.css(a[0],"borderTopWidth",!0),c.left+=n.css(a[0],"borderLeftWidth",!0)),{top:b.top-c.top-n.css(d,"marginTop",!0),left:b.left-c.left-n.css(d,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||dd;while(a&&!n.nodeName(a,"html")&&"static"===n.css(a,"position"))a=a.offsetParent;return a||dd})}}),n.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c=/Y/.test(b);n.fn[a]=function(d){return W(this,function(a,d,e){var f=ed(a);return void 0===e?f?b in f?f[b]:f.document.documentElement[d]:a[d]:void(f?f.scrollTo(c?n(f).scrollLeft():e,c?e:n(f).scrollTop()):a[d]=e)},a,d,arguments.length,null)}}),n.each(["top","left"],function(a,b){n.cssHooks[b]=Mb(l.pixelPosition,function(a,c){return c?(c=Kb(a,b),Ib.test(c)?n(a).position()[b]+"px":c):void 0})}),n.each({Height:"height",Width:"width"},function(a,b){n.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){n.fn[d]=function(d,e){var f=arguments.length&&(c||"boolean"!=typeof d),g=c||(d===!0||e===!0?"margin":"border");return W(this,function(b,c,d){var e;return n.isWindow(b)?b.document.documentElement["client"+a]:9===b.nodeType?(e=b.documentElement,Math.max(b.body["scroll"+a],e["scroll"+a],b.body["offset"+a],e["offset"+a],e["client"+a])):void 0===d?n.css(b,c,g):n.style(b,c,d,g)},b,f?d:void 0,f,null)}})}),n.fn.size=function(){return this.length},n.fn.andSelf=n.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return n});var fd=a.jQuery,gd=a.$;return n.noConflict=function(b){return a.$===n&&(a.$=gd),b&&a.jQuery===n&&(a.jQuery=fd),n},typeof b===L&&(a.jQuery=a.$=n),n});\n'
b
diff -r 000000000000 -r ed6885c85660 script.js
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/script.js Wed Aug 31 05:31:47 2016 -0400
[
@@ -0,0 +1,86 @@
+function tsvToTable(data){
+ var lines = data.split("\n");
+ var tbl = document.createElement('table');
+ tbl.className = "result_table";
+ tbl.border="1"
+ var thead = document.createElement('thead');
+ var tr = document.createElement('tr');
+ tr.className = "evenrowcolor";
+ var cells = lines[0].split("\t");
+ var cdr3column = [];
+ for(var a = 0;a < cells.length;++a){
+ if(cells[a] == "CDR3 Sequence" || cells[a] == "CDR3_Sense_Sequence" || cells[a] == "Clone Sequence"){
+ cdr3column.push(a);
+ }
+ var td = document.createElement('td');
+ td.appendChild(document.createTextNode(cells[a]));
+ tr.appendChild(td);
+ }
+ thead.appendChild(tr);
+ tbl.appendChild(thead);
+ var tbdy = document.createElement('tbody');
+
+ for(var a = 1;a < lines.length;++a){
+ tr = document.createElement('tr');
+ var cells = lines[a].split("\t");
+ if(cells.length == 1){
+ continue;
+ }
+ for(var b = 0;b < cells.length;++b){
+ td = document.createElement('td');
+ td.appendChild(document.createTextNode(cells[b]));
+ if(cdr3column.indexOf(b) != -1){
+ td.className = td.className + " cdr3sequence"
+ }
+ tr.appendChild(td)
+ }
+
+ if(a % 2 == 0){
+ tr.className = "evenrowcolor";
+ } else {
+ tr.className = "oddrowcolor";
+ }
+
+ tbdy.appendChild(tr);
+ }
+ tbl.appendChild(tbdy);
+ return tbl;
+}
+
+function loadfile(file, patient, type){
+ patient = patient.replace(".", "\\.");
+ $('#hidden_div').load(file, function(){
+ $('#result_div_' + patient + '_' + type).html(tsvToTable($('#hidden_div').html()));
+ $('#result_div_' + patient + '_' + type + ' tr').hover(function() {
+ $(this).addClass('hover');
+ }, function() {
+ $(this).removeClass('hover');
+ });
+ $('#result_div_' + patient + '_' + type + ' table').addClass('result_table');
+ //$('#result_div_' + patient + ' tr:odd').addClass("oddrowcolor");
+ //$('#result_div_' + patient + ' tr:even').addClass("evenrowcolor");
+ $('#result_div_' + patient + '_' + type + ' table').before( "<a href='" + file + "'>Download " + file.replace(".txt", "") + "</a>" );
+ });
+}
+
+var currentTD = new Array();
+
+$( document ).ready(function() {
+ $('.summary_table tr').hover(function() {
+ $(this).addClass('hover');
+ }, function() {
+ $(this).removeClass('hover');
+ });
+
+ $('.summary_table tr:odd').addClass("oddrowcolor");
+ $('.summary_table tr:even').addClass("evenrowcolor");
+
+ $('.summary_table td[data-patient]').click(function() {
+ var tmp = $(this);
+ if(currentTD[tmp.attr("data-patient")] != null){
+ currentTD[tmp.attr("data-patient")].removeClass("clicked_summary");
+ }
+ currentTD[tmp.attr("data-patient")] = tmp;
+ currentTD[tmp.attr("data-patient")].addClass("clicked_summary");
+ });
+});
b
diff -r 000000000000 -r ed6885c85660 style.css
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/style.css Wed Aug 31 05:31:47 2016 -0400
b
@@ -0,0 +1,150 @@
+/* $Id: example.css,v 1.5 2006/03/27 02:44:36 pat Exp $ */
+
+/*--------------------------------------------------
+  REQUIRED to hide the non-active tab content.
+  But do not hide them in the print stylesheet!
+  --------------------------------------------------*/
+.tabberlive .tabbertabhide {
+ display:none;
+}
+
+/*--------------------------------------------------
+  .tabber = before the tabber interface is set up
+  .tabberlive = after the tabber interface is set up
+  --------------------------------------------------*/
+.tabber {
+}
+.tabberlive {
+ margin-top:1em;
+}
+
+/*--------------------------------------------------
+  ul.tabbernav = the tab navigation list
+  li.tabberactive = the active tab
+  --------------------------------------------------*/
+ul.tabbernav
+{
+ margin:0;
+ padding: 3px 0;
+ border-bottom: 1px solid #778;
+ font: bold 12px Verdana, sans-serif;
+}
+
+ul.tabbernav li
+{
+ list-style: none;
+ margin: 0;
+ display: inline;
+}
+
+ul.tabbernav li a
+{
+ padding: 3px 0.5em;
+ margin-left: 3px;
+ border: 1px solid #778;
+ border-bottom: none;
+ background: #DDE;
+ text-decoration: none;
+}
+
+ul.tabbernav li a:link { color: #448; }
+ul.tabbernav li a:visited { color: #667; }
+
+ul.tabbernav li a:hover
+{
+ color: #000;
+ background: #AAE;
+ border-color: #227;
+}
+
+ul.tabbernav li.tabberactive a
+{
+ background-color: #fff;
+ border-bottom: 1px solid #fff;
+}
+
+ul.tabbernav li.tabberactive a:hover
+{
+ color: #000;
+ background: white;
+ border-bottom: 1px solid white;
+}
+
+/*--------------------------------------------------
+  .tabbertab = the tab content
+  Add style only after the tabber interface is set up (.tabberlive)
+  --------------------------------------------------*/
+.tabberlive .tabbertab {
+ padding:5px;
+ border:1px solid #aaa;
+ border-top:0;
+
+ /* If you don't want the tab size changing whenever a tab is changed
+    you can set a fixed height */
+
+ /* height:200px; */
+
+ /* If you set a fix height set overflow to auto and you will get a
+    scrollbar when necessary */
+
+ /* overflow:auto; */
+}
+
+/* If desired, hide the heading since a heading is provided by the tab */
+.tabberlive .tabbertab h2 {
+ display:none;
+}
+.tabberlive .tabbertab h3 {
+ display:none;
+}
+
+/* Example of using an ID to set different styles for the tabs on the page */
+.tabberlive#tab1 {
+}
+.tabberlive#tab2 {
+}
+.tabberlive#tab2 .tabbertab {
+  height:200px;
+  overflow:auto;
+}
+
+.result_table tr:hover {
+    background-color:#999999;
+}
+
+table.result_table {
+ font-family: verdana,arial,sans-serif;
+ font-size:11px;
+ color:#333333;
+ border-width: 1px;
+ border-color: #666666;
+ border-collapse: collapse;
+}
+table.result_table th {
+ border-width: 1px;
+ padding: 8px;
+ border-style: solid;
+ border-color: #666666;
+}
+table.result_table td {
+ border-width: 1px;
+ padding: 8px;
+ border-style: solid;
+ border-color: #666666;
+}
+
+.clicked_summary {
+ background-color:#A0A0A0;
+}
+
+.oddrowcolor{
+ background-color:#F4F4F4;
+}
+
+.evenrowcolor{
+ background-color:#E5E5E5;
+}
+
+.cdr3sequence {
+ text-align: right;
+}
b
diff -r 000000000000 -r ed6885c85660 tabber.js
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tabber.js Wed Aug 31 05:31:47 2016 -0400
[
@@ -0,0 +1,40 @@
+/* Copyright (c) 2006 Patrick Fitzgerald */
+
+function tabberObj(argsObj)
+{var arg;this.div=null;this.classMain="tabber";this.classMainLive="tabberlive";this.classTab="tabbertab";this.classTabDefault="tabbertabdefault";this.classNav="tabbernav";this.classTabHide="tabbertabhide";this.classNavActive="tabberactive";this.titleElements=['h2','h3','h4','h5','h6'];this.titleElementsStripHTML=true;this.removeTitle=true;this.addLinkId=false;this.linkIdFormat='<tabberid>nav<tabnumberone>';for(arg in argsObj){this[arg]=argsObj[arg];}
+this.REclassMain=new RegExp('\\b'+this.classMain+'\\b','gi');this.REclassMainLive=new RegExp('\\b'+this.classMainLive+'\\b','gi');this.REclassTab=new RegExp('\\b'+this.classTab+'\\b','gi');this.REclassTabDefault=new RegExp('\\b'+this.classTabDefault+'\\b','gi');this.REclassTabHide=new RegExp('\\b'+this.classTabHide+'\\b','gi');this.tabs=new Array();if(this.div){this.init(this.div);this.div=null;}}
+tabberObj.prototype.init=function(e)
+{var
+childNodes,i,i2,t,defaultTab=0,DOM_ul,DOM_li,DOM_a,aId,headingElement;if(!document.getElementsByTagName){return false;}
+if(e.id){this.id=e.id;}
+this.tabs.length=0;childNodes=e.childNodes;for(i=0;i<childNodes.length;i++){if(childNodes[i].className&&childNodes[i].className.match(this.REclassTab)){t=new Object();t.div=childNodes[i];this.tabs[this.tabs.length]=t;if(childNodes[i].className.match(this.REclassTabDefault)){defaultTab=this.tabs.length-1;}}}
+DOM_ul=document.createElement("ul");DOM_ul.className=this.classNav;for(i=0;i<this.tabs.length;i++){t=this.tabs[i];t.headingText=t.div.title;if(this.removeTitle){t.div.title='';}
+if(!t.headingText){for(i2=0;i2<this.titleElements.length;i2++){headingElement=t.div.getElementsByTagName(this.titleElements[i2])[0];if(headingElement){t.headingText=headingElement.innerHTML;if(this.titleElementsStripHTML){t.headingText.replace(/<br>/gi," ");t.headingText=t.headingText.replace(/<[^>]+>/g,"");}
+break;}}}
+if(!t.headingText){t.headingText=i+1;}
+DOM_li=document.createElement("li");t.li=DOM_li;DOM_a=document.createElement("a");DOM_a.appendChild(document.createTextNode(t.headingText));DOM_a.href="javascript:void(null);";DOM_a.title=t.headingText;DOM_a.onclick=this.navClick;DOM_a.tabber=this;DOM_a.tabberIndex=i;if(this.addLinkId&&this.linkIdFormat){aId=this.linkIdFormat;aId=aId.replace(/<tabberid>/gi,this.id);aId=aId.replace(/<tabnumberzero>/gi,i);aId=aId.replace(/<tabnumberone>/gi,i+1);aId=aId.replace(/<tabtitle>/gi,t.headingText.replace(/[^a-zA-Z0-9\-]/gi,''));DOM_a.id=aId;}
+DOM_li.appendChild(DOM_a);DOM_ul.appendChild(DOM_li);}
+e.insertBefore(DOM_ul,e.firstChild);e.className=e.className.replace(this.REclassMain,this.classMainLive);this.tabShow(defaultTab);if(typeof this.onLoad=='function'){this.onLoad({tabber:this});}
+return this;};tabberObj.prototype.navClick=function(event)
+{var
+rVal,a,self,tabberIndex,onClickArgs;a=this;if(!a.tabber){return false;}
+self=a.tabber;tabberIndex=a.tabberIndex;a.blur();if(typeof self.onClick=='function'){onClickArgs={'tabber':self,'index':tabberIndex,'event':event};if(!event){onClickArgs.event=window.event;}
+rVal=self.onClick(onClickArgs);if(rVal===false){return false;}}
+self.tabShow(tabberIndex);return false;};tabberObj.prototype.tabHideAll=function()
+{var i;for(i=0;i<this.tabs.length;i++){this.tabHide(i);}};tabberObj.prototype.tabHide=function(tabberIndex)
+{var div;if(!this.tabs[tabberIndex]){return false;}
+div=this.tabs[tabberIndex].div;if(!div.className.match(this.REclassTabHide)){div.className+=' '+this.classTabHide;}
+this.navClearActive(tabberIndex);return this;};tabberObj.prototype.tabShow=function(tabberIndex)
+{var div;if(!this.tabs[tabberIndex]){return false;}
+this.tabHideAll();div=this.tabs[tabberIndex].div;div.className=div.className.replace(this.REclassTabHide,'');this.navSetActive(tabberIndex);if(typeof this.onTabDisplay=='function'){this.onTabDisplay({'tabber':this,'index':tabberIndex});}
+return this;};tabberObj.prototype.navSetActive=function(tabberIndex)
+{this.tabs[tabberIndex].li.className=this.classNavActive;return this;};tabberObj.prototype.navClearActive=function(tabberIndex)
+{this.tabs[tabberIndex].li.className='';return this;};function tabberAutomatic(tabberArgs)
+{var
+tempObj,divs,i;if(!tabberArgs){tabberArgs={};}
+tempObj=new tabberObj(tabberArgs);divs=document.getElementsByTagName("div");for(i=0;i<divs.length;i++){if(divs[i].className&&divs[i].className.match(tempObj.REclassMain)){tabberArgs.div=divs[i];divs[i].tabber=new tabberObj(tabberArgs);}}
+return this;}
+function tabberAutomaticOnLoad(tabberArgs)
+{var oldOnLoad;if(!tabberArgs){tabberArgs={};}
+oldOnLoad=window.onload;if(typeof window.onload!='function'){window.onload=function(){tabberAutomatic(tabberArgs);};}else{window.onload=function(){oldOnLoad();tabberAutomatic(tabberArgs);};}}
+if(typeof tabberOptions=='undefined'){tabberAutomaticOnLoad();}else{if(!tabberOptions['manualStartup']){tabberAutomaticOnLoad(tabberOptions);}}
\ No newline at end of file
b
diff -r 000000000000 -r ed6885c85660 wrapper.sh
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/wrapper.sh Wed Aug 31 05:31:47 2016 -0400
[
b'@@ -0,0 +1,348 @@\n+#!/bin/bash\n+\n+inputFile=$1\n+outputFile=$2\n+outputDir=$3\n+min_freq=$4\n+min_cells=$5\n+merge_on="$6"\n+\n+dir="$(cd "$(dirname "$0")" && pwd)"\n+mkdir $outputDir\n+\n+\n+Rscript --verbose $dir/RScript.r $inputFile $outputDir $outputFile $min_freq $min_cells "${merge_on}" 2>&1\n+cp $dir/jquery-1.11.0.min.js $outputDir\n+cp $dir/script.js $outputDir\n+cp $dir/style.css $outputDir\n+cp $dir/tabber.js $outputDir\n+mv "$outputFile" "$outputDir/log.html"\n+\n+echo "<html><center><h1><a href=\'index.html\'>Click here for the results</a></h1>Tip: Open it in a new tab (middle mouse button or right mouse button -> \'open in new tab\' on the link above)</center></html>" > $outputFile\n+\n+cd $outputDir\n+\n+header="<html><head><script type=\'text/javascript\' src=\'jquery-1.11.0.min.js\'></script><script type=\'text/javascript\' src=\'tabber.js\'></script><script type=\'text/javascript\' src=\'script.js\'></script><link rel=\'stylesheet\' type=\'text/css\' href=\'style.css\'></head><div id=\'hidden_div\' style=\'display: none;\'></div>"\n+singles=()\n+pairs_BM_PB=()\n+pairs_Left_Right=()\n+pairs_R_Dx=()\n+while read patient sample1 sample2 type\n+do\n+\techo "$patient"\n+\thtml="${patient}.html"\n+\techo "$header" > "$html"\n+\tif [[ "$type" == *pair* ]] ; then\n+\t\tif [[ "$sample1" == *_BM* ]] || [[ "$sample1" == *_PB* ]] ; then\n+\t\t\tpairs_BM_PB+=( "$patient" )\n+\t\telif [[ "$sample1" == *_Left* ]] || [[ "$sample1" == *_Right* ]] ; then\n+\t\t\tpairs_Left_Right+=( "$patient" )\n+\t\telse\n+\t\t\tpairs_R_Dx+=( "$patient" )\n+\t\tfi\n+\telse\n+\t\tsingles+=( "$patient" )\n+\tfi\n+\toldLocus=""\n+\tsample1="$(echo ${sample1} | tr -d \'\\r\' | tr -d \'\\n\')"\n+\tsample2="$(echo ${sample2} | tr -d \'\\r\' | tr -d \'\\n\')"\n+\ttail -n+2 ${patient}_freq.txt | sed "s/>//" > tmp.txt\n+\techo "<div class=\'tabber\'>" >> "$html"\n+\techo "<div class=\'tabbertab\' title=\'Data frequency\'>" >> "$html"\n+\techo "<table><tr><td style=\'vertical-align:top;\'>" >> "$html"\n+\techo "<table border = 1 class=\'result_table summary_table\' id=\'summary_table_${patient}_freq\'>" >> "$html"\n+\techo "<thead><th>Ig/TCR gene rearrangement type</th><th>Proximal gene segment</th><th>Distal gene segment</th><th>Cut off value</th><th>Number of sequences ${patient}_Both</th><th>Number of sequences_$sample1</th><th>Read Count $sample1</th><th>Number of sequences_$sample2</th><th>Read Count $sample2</th><th>Sum number of sequences $patient</th><th>Percentage of sequences ${patient}_both</th></thead>" >> "$html"\n+\techo "<tbody>" >> "$html"\n+\tscatterplot_tab="<div class=\'tabbertab\' title=\'Scatter Plots Frequency\'><table border=\'0\'><tr>"\n+\twhile read locus j_segment v_segment cut_off_value both one read_count1 two read_count2 sum percent locusreadsum1 locusreadsum2\n+\tdo\n+\t\tif [ "$locus" != "$oldLocus" ] ; then\n+\t\t\techo "<tr><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr><tr>" >> "$html"\n+\t\t\techo "<tr><td><b>$locus</b></td>" >> "$html"\n+\t\telse\n+\t\t\techo "<td></td>" >> "$html"\n+\t\tfi\n+\t\techo "<td>$v_segment</td>" >> "$html"\n+\t\techo "<td>$j_segment</td>" >> "$html"\n+\t\techo "<td>>$cut_off_value</td>" >> "$html" \n+\t\tif [ "$both" != "0" ] ; then\n+\t\t\techo "<td data-patient=\'${patient}\' style=\'cursor:pointer\' onclick=\'javascript:loadfile(\\"${sample1}_${sample2}_${locus}_${cut_off_value}.txt\\", \\"$patient\\", \\"freq\\")\'>$both</td>" >> "$html"\n+\t\telse\n+\t\t\techo "<td>$both</td>" >> "$html"\n+\t\tfi\n+\t\tif [ "$one" != "0" ] && [ "$cut_off_value" != "0" ] ; then\n+\t\t\techo "<td data-patient=\'${patient}\' style=\'cursor:pointer\' onclick=\'javascript:loadfile(\\"${sample1}_${locus}_${cut_off_value}.txt\\", \\"$patient\\", \\"freq\\")\'>$one</td>" >> "$html"\n+\t\telse\n+\t\t\techo "<td>$one</td>" >> "$html"\n+\t\tfi\n+\t\techo "<td>$read_count1</td>" >> "$html"\n+\t\tif [ "$two" != "0" ] && [ "$cut_off_value" != "0" ] ; then\n+\t\t\techo "<td data-patient=\'${patient}\' style=\'cursor:pointer\' onclick=\'javascript:loadfile(\\"${sample2}_${locus}_${cut_off_value}.txt\\", \\"$patient\\", \\"freq\\")\'>$two</td>" >> "$html"\n+\t\telse\n+\t\t\techo "<td>$two</td>" >> "$html"\n+\t\tfi\n+\t\techo "<t'..b'ble border=\'0\'><tr>"\n+\twhile read locus j_segment v_segment cut_off_value all one two three one_two one_three two_three \n+\tdo\n+\t\tif [ "$locus" != "$oldLocus" ] ; then\n+\t\t\techo "<tr><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr><tr>" >> "$html"\n+\t\t\techo "<tr><td><b>$locus</b></td>" >> "$html"\n+\t\telse\n+\t\t\techo "<td></td>" >> "$html"\n+\t\tfi\n+\t\techo "<td>$v_segment</td>" >> "$html"\n+\t\techo "<td>$j_segment</td>" >> "$html"\n+\t\techo "<td>>$cut_off_value</td>" >> "$html" \n+\t\tif [ "$all" != "0" ] ; then\n+\t\t\techo "<td data-patient=\'${patient}\' style=\'cursor:pointer\' onclick=\'javascript:loadfile(\\"${sample1}_${sample2}_${sample3}_${locus}_${cut_off_value}.txt\\", \\"$patient\\", \\"reads\\")\'>$all</td>" >> "$html"\n+\t\telse\n+\t\t\techo "<td>$all</td>" >> "$html"\n+\t\tfi\n+\t\tif [ "$one" != "0" ] && [ "$cut_off_value" != "0" ] ; then\n+\t\t\techo "<td data-patient=\'${patient}\' style=\'cursor:pointer\' onclick=\'javascript:loadfile(\\"${sample1}_${locus}_${cut_off_value}.txt\\", \\"$patient\\", \\"reads\\")\'>$one</td>" >> "$html"\n+\t\telse\n+\t\t\techo "<td>$one</td>" >> "$html"\n+\t\tfi\n+\t\tif [ "$two" != "0" ] && [ "$cut_off_value" != "0" ] ; then\n+\t\t\techo "<td data-patient=\'${patient}\' style=\'cursor:pointer\' onclick=\'javascript:loadfile(\\"${sample2}_${locus}_${cut_off_value}.txt\\", \\"$patient\\", \\"reads\\")\'>$two</td>" >> "$html"\n+\t\telse\n+\t\t\techo "<td>$two</td>" >> "$html"\n+\t\tfi\n+\t\tif [ "$three" != "0" ] && [ "$cut_off_value" != "0" ] ; then\n+\t\t\techo "<td data-patient=\'${patient}\' style=\'cursor:pointer\' onclick=\'javascript:loadfile(\\"${sample3}_${locus}_${cut_off_value}.txt\\", \\"$patient\\", \\"reads\\")\'>$three</td>" >> "$html"\n+\t\telse\n+\t\t\techo "<td>$three</td>" >> "$html"\n+\t\tfi\n+\t\t\n+\t\tif [ "${one_two}" != "0" ] && [ "$cut_off_value" != "0" ] ; then\n+\t\t\techo "<td data-patient=\'${patient}\' style=\'cursor:pointer\' onclick=\'javascript:loadfile(\\"${sample1}_${sample2}_${locus}_${cut_off_value}reads.txt\\", \\"$patient\\", \\"reads\\")\'>${one_two}</td>" >> "$html"\n+\t\telse\n+\t\t\techo "<td>${one_two}</td>" >> "$html"\n+\t\tfi\n+\t\tif [ "${one_three}" != "0" ] && [ "$cut_off_value" != "0" ] ; then\n+\t\t\techo "<td data-patient=\'${patient}\' style=\'cursor:pointer\' onclick=\'javascript:loadfile(\\"${sample1}_${sample3}_${locus}_${cut_off_value}reads.txt\\", \\"$patient\\", \\"reads\\")\'>${one_three}</td>" >> "$html"\n+\t\telse\n+\t\t\techo "<td>${one_three}</td>" >> "$html"\n+\t\tfi\n+\t\tif [ "${two_three}" != "0" ] && [ "$cut_off_value" != "0" ] ; then\n+\t\t\techo "<td data-patient=\'${patient}\' style=\'cursor:pointer\' onclick=\'javascript:loadfile(\\"${sample2}_${sample3}_${locus}_${cut_off_value}reads.txt\\", \\"$patient\\", \\"reads\\")\'>${two_three}</td>" >> "$html"\n+\t\telse\n+\t\t\techo "<td>${two_three}</td>" >> "$html"\n+\t\tfi\n+\t\t\n+\t\techo "</tr>" >> "$html"\n+\t\toldLocus="$locus"\n+\t\tif [ "${cut_off_value}" == "0" ] ; then\n+\t\t\tscatterplot_tab="${scatterplot_tab}<td><img src=\'${sample1}_${sample2}_${sample3}_reads_${locus}_scatter.png\' /></td>"\n+\t\tfi\n+\tdone < tmp.txt\n+\techo "</tbody></table>" >> "$html"\n+\techo "</td><td style=\'vertical-align:top;\'><div id=\'result_div_${patient}_reads\'></div></td></tr></table>" >> "$html"\n+\techo "</div>" >> "$html"\n+\techo "<div class=\'tabbertab\' title=\'Graphs reads\'>" >> "$html"\n+\techo "<a href=\'${patient}_reads_total_all.png\'><img src=\'${patient}_reads_total_all.png\' width=\'1280\' height=\'720\' /></a><br />" >> "$html"\n+\techo "<a href=\'${patient}_reads_indiv_all.png\'><img src=\'${patient}_reads_indiv_all.png\' width=\'1280\' height=\'720\' /></a><br /></div>" >> "$html"\n+\techo "${scatterplot_tab}</tr></table></div>" >> "$html"\n+\techo "</div>" >> "$html"\n+\techo "</div>" >> "$html"\n+\techo "</html>" >> "$html"\n+done < triplets.txt\n+rm tmp.txt\n+\n+\n+html="index.html"\n+\n+echo "</table>" >> "$html"\n+echo "<a href=\'log.html\'>log</a><br />" >> "$html"\n+echo "<a href=\'single_matches.html\'>single_matches</a><br />" >> "$html"\n+echo "<a href=\'multiple_matches.html\'>multiple_matches</a><br />" >> "$html"\n+echo "</html>" >> "$html"\n+\n+cp "index.html" "$outputFile"\n+\n'