diff --git a/public/biopet-tools-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/tools/KrakenReportToJson.scala b/public/biopet-tools-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/tools/KrakenReportToJson.scala index 44567a15a123b84cd0f09c24a1b90d4a21d15666..8e67f29d52574f1ac444c31c6f58bc2a880d7494 100644 --- a/public/biopet-tools-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/tools/KrakenReportToJson.scala +++ b/public/biopet-tools-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/tools/KrakenReportToJson.scala @@ -21,13 +21,13 @@ class KrakenReportToJson(val root: Configurable) extends ToolCommandFuntion with def toolObject = nl.lumc.sasc.biopet.tools.KrakenReportToJson @Input(doc = "Input Kraken Full report", shortName = "inputReport", required = true) - var inputReport: File = null + var inputReport: File = _ @Argument(required = false) var skipNames: Boolean = false @Output(doc = "Output JSON", shortName = "output", required = true) - var output: File = null + var output: File = _ override def defaultCoreMemory = 1.0 @@ -37,9 +37,7 @@ class KrakenReportToJson(val root: Configurable) extends ToolCommandFuntion with conditional(skipNames, "--skipnames") def summaryStats: Map[String, Any] = { - val map = ConfigUtils.fileToConfigMap(output) - - ConfigUtils.any2map(map.getOrElse("stats", Map())) + ConfigUtils.fileToConfigMap(output) } def summaryFiles: Map[String, File] = Map() diff --git a/public/biopet-tools/src/main/scala/nl/lumc/sasc/biopet/tools/KrakenReportToJson.scala b/public/biopet-tools/src/main/scala/nl/lumc/sasc/biopet/tools/KrakenReportToJson.scala index 4d95619438dbc18d2597417e79d0a944fac1b02e..efc3ed383142ffc63b42960a02fe84e5ac371e1a 100644 --- a/public/biopet-tools/src/main/scala/nl/lumc/sasc/biopet/tools/KrakenReportToJson.scala +++ b/public/biopet-tools/src/main/scala/nl/lumc/sasc/biopet/tools/KrakenReportToJson.scala @@ -24,7 +24,7 @@ import java.io.{ PrintWriter, File } import nl.lumc.sasc.biopet.utils.ConfigUtils._ import nl.lumc.sasc.biopet.utils.ToolCommand import scala.collection.mutable.ListBuffer -import scala.collection.{ immutable, mutable } +import scala.collection.mutable import scala.io.Source @@ -36,8 +36,8 @@ case class KrakenHit(taxonomyID: Long, cladeLevel: Int, parentTaxonomyID: Long, children: ListBuffer[KrakenHit]) { - def toJSON(): Map[String, Any] = { - val childJSON = children.toList.map(entry => entry.toJSON()) + def toJSON(withChildren: Boolean = false): Map[String, Any] = { + val childJSON = if (withChildren) children.toList.map(entry => entry.toJSON(withChildren)) else List() Map( "name" -> taxonomyName, "taxid" -> taxonomyID, @@ -55,6 +55,7 @@ object KrakenReportToJson extends ToolCommand { var cladeIDs: mutable.ArrayBuffer[Long] = mutable.ArrayBuffer.fill(32)(0) val spacePattern = "^( +)".r + private var lines: Map[Long, KrakenHit] = Map.empty case class Args(krakenreport: File = null, outputJson: Option[File] = None, skipNames: Boolean = false) extends AbstractArgs @@ -132,7 +133,7 @@ object KrakenReportToJson extends ToolCommand { * 6. indented scientific name * */ - val lines = reader.getLines() + lines = reader.getLines() .map(line => parseLine(line, skipNames)) .filter(p => p.head._2.cladeSize > 0) .foldLeft(Map.empty[Long, KrakenHit])((a, b) => { @@ -141,11 +142,22 @@ object KrakenReportToJson extends ToolCommand { lines.keys.foreach(k => { // append itself to the children attribute of the parent - lines(lines(k).parentTaxonomyID).children += lines(k) + if (lines(k).parentTaxonomyID > 0L) { + // avoid the root and unclassified appending to the unclassified node + lines(lines(k).parentTaxonomyID).children += lines(k) + } }) - mapToJson(lines(1).toJSON()).spaces2 + val result = Map("unclasified" -> lines(0).toJSON(withChildren = false), + "classified" -> lines(1).toJSON(withChildren = true)) + mapToJson(result).spaces2 + + } + def summary: String = { + val result = Map("unclasified" -> lines(0).toJSON(withChildren = false), + "classified" -> lines(1).toJSON(withChildren = true)) + mapToJson(result).spaces2 } def main(args: Array[String]): Unit = { @@ -153,11 +165,10 @@ object KrakenReportToJson extends ToolCommand { val jsonString: String = reportToJson(commandArgs.krakenreport, skipNames = commandArgs.skipNames) commandArgs.outputJson match { - case Some(file) => { + case Some(file) => val writer = new PrintWriter(file) writer.println(jsonString) writer.close() - } case _ => println(jsonString) } diff --git a/public/gears/src/main/resources/nl/lumc/sasc/biopet/pipelines/gears/gearsSunburst.ssp b/public/gears/src/main/resources/nl/lumc/sasc/biopet/pipelines/gears/gearsSunburst.ssp index 8e9761cdd27d1354c45d11082aff6fc86f298efa..56aab2ebaf9f886cac261d4b181c2861e48b593a 100644 --- a/public/gears/src/main/resources/nl/lumc/sasc/biopet/pipelines/gears/gearsSunburst.ssp +++ b/public/gears/src/main/resources/nl/lumc/sasc/biopet/pipelines/gears/gearsSunburst.ssp @@ -1,4 +1,5 @@ #import(nl.lumc.sasc.biopet.utils.summary.Summary) +#import(nl.lumc.sasc.biopet.utils.ConfigUtils) #import(java.io.File) <%@ var summary: Summary %> <%@ var sampleId: Option[String] = None %> @@ -32,27 +33,34 @@ #if (showPlot) <div class="row"> - <!-- - Javascript required for showing the sunburst plot - //--> - - <script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.5/d3.min.js" charset="utf-8"></script> - <!-- Gears specific javascript --> - <script src="${rootPath}ext/js/gears.js"></script> - - <h3 id='currentlevel'>Root</h3> - <div> - <span id="selection_name"></span> - - <span id="selection_size"></span> - - <span id="selection_value"></span> - </div> + <script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.5/d3.min.js" charset="utf-8"></script> + <script src="${rootPath}ext/js/gears.js"></script> + + <h3 id='currentlevel'>Root</h3> + <div> + <span id="selection_name"></span> - + <span id="selection_size"></span> - + <span id="selection_value"></span> + </div> + + <form> + <label><input type="radio" name="mode" value="size"> Size</label> + <label><input type="radio" name="mode" value="count" checked> Count</label> + </form> + <div id="sequence"></div> - <form> - <label><input type="radio" name="mode" value="size"> Size</label> - <label><input type="radio" name="mode" value="count" checked> Count</label> - </form> - <div id="sequence"></div> + <div id="datatable"> + <script type="application/ecmascript"> - <div id="datatable"></div> + #{ + val rawreport = Map("kraken" -> summary.getValue("gears", "stats", "krakenreport")) + val bla = ConfigUtils.mapToJson(rawreport) + }# + + var krakenresult = JSON.parse('<%= unescape(bla) %>'); + + + </script> + </div> </div> #end diff --git a/public/gears/src/main/scala/nl/lumc/sasc/biopet/pipelines/gears/Gears.scala b/public/gears/src/main/scala/nl/lumc/sasc/biopet/pipelines/gears/Gears.scala index 9362fde726824639ac2c16119759498071bd1b25..ac92bf4743a4f336194a3555146597e19b234847 100644 --- a/public/gears/src/main/scala/nl/lumc/sasc/biopet/pipelines/gears/Gears.scala +++ b/public/gears/src/main/scala/nl/lumc/sasc/biopet/pipelines/gears/Gears.scala @@ -28,7 +28,6 @@ import org.broadinstitute.gatk.queue.QScript * Created by wyleung */ class Gears(val root: Configurable) extends QScript with SummaryQScript { - qscript => def this() = this(null) @Input(shortName = "R1", required = false) @@ -72,7 +71,7 @@ class Gears(val root: Configurable) extends QScript with SummaryQScript { val fastqFiles: List[File] = bamFile.map { bamfile => // sambamba view -f bam -F "unmapped or mate_is_unmapped" <alnFile> > <extracted.bam> - val samFilterUnmapped = new SambambaView(qscript) + val samFilterUnmapped = new SambambaView(this) samFilterUnmapped.input = bamfile samFilterUnmapped.filter = Some("(unmapped or mate_is_unmapped) and not (secondary_alignment) and [XH] == null") samFilterUnmapped.output = new File(outputDir, s"$outputName.unmapped.bam") @@ -80,7 +79,7 @@ class Gears(val root: Configurable) extends QScript with SummaryQScript { add(samFilterUnmapped) // start bam to fastq (only on unaligned reads) also extract the matesam - val samToFastq = new SamToFastq(qscript) + val samToFastq = new SamToFastq(this) samToFastq.input = samFilterUnmapped.output samToFastq.stringency = Some("LENIENT") samToFastq.fastqR1 = new File(outputDir, s"$outputName.unmapped.R1.fq.gz") @@ -90,7 +89,7 @@ class Gears(val root: Configurable) extends QScript with SummaryQScript { add(samToFastq) // sync the fastq records - val fastqSync = new FastqSync(qscript) + val fastqSync = new FastqSync(this) fastqSync.refFastq = samToFastq.fastqR1 fastqSync.inputFastq1 = samToFastq.fastqR1 fastqSync.inputFastq2 = samToFastq.fastqR2 @@ -109,7 +108,7 @@ class Gears(val root: Configurable) extends QScript with SummaryQScript { }.getOrElse(List(fastqFileR1, fastqFileR2).flatten) // start kraken - val krakenAnalysis = new Kraken(qscript) + val krakenAnalysis = new Kraken(this) krakenAnalysis.input = fastqFiles krakenAnalysis.output = new File(outputDir, s"$outputName.krkn.raw") @@ -125,7 +124,7 @@ class Gears(val root: Configurable) extends QScript with SummaryQScript { // create kraken summary file - val krakenReport = new KrakenReport(qscript) + val krakenReport = new KrakenReport(this) krakenReport.input = krakenAnalysis.output krakenReport.show_zeros = true krakenReport.output = new File(outputDir, s"$outputName.krkn.full") @@ -134,11 +133,12 @@ class Gears(val root: Configurable) extends QScript with SummaryQScript { GearsOutputFiles += ("kraken_report_input" -> krakenReport.input) GearsOutputFiles += ("kraken_report_output" -> krakenReport.output) - val krakenReportJSON = new KrakenReportToJson(qscript) + val krakenReportJSON = new KrakenReportToJson(this) krakenReportJSON.inputReport = krakenReport.output krakenReportJSON.output = new File(outputDir, s"$outputName.krkn.json") krakenReportJSON.skipNames = config("skipNames", default = false) add(krakenReportJSON) + addSummarizable(krakenReportJSON, "krakenreport") GearsOutputFiles += ("kraken_report_json_input" -> krakenReportJSON.inputReport) GearsOutputFiles += ("kraken_report_json_output" -> krakenReportJSON.output) diff --git a/public/gears/src/main/scala/nl/lumc/sasc/biopet/pipelines/gears/GearsReport.scala b/public/gears/src/main/scala/nl/lumc/sasc/biopet/pipelines/gears/GearsReport.scala index 02a2684c368be7cd63ddeb26f334f1a73767a86e..002dce92d237c6dacb84c83f49fb72915401b6a5 100644 --- a/public/gears/src/main/scala/nl/lumc/sasc/biopet/pipelines/gears/GearsReport.scala +++ b/public/gears/src/main/scala/nl/lumc/sasc/biopet/pipelines/gears/GearsReport.scala @@ -39,16 +39,13 @@ object GearsReport extends MultisampleReportBuilder { } def samplePage(sampleId: String, args: Map[String, Any]) = { - ReportPage(List( - ), List( + ReportPage(List(), List( "Sunburst analysis" -> ReportSection("/nl/lumc/sasc/biopet/pipelines/gears/gearsSunburst.ssp") ), args) } def libraryPage(sampleId: String, libId: String, args: Map[String, Any]) = { - ReportPage(List( - ), List( - ), args) + ReportPage(List(), List(), args) } def reportName = "Gears :: Metagenomics Report"