diff --git a/biopet-core/src/main/resources/nl/lumc/sasc/biopet/core/report/fileModules.ssp b/biopet-core/src/main/resources/nl/lumc/sasc/biopet/core/report/fileModules.ssp new file mode 100644 index 0000000000000000000000000000000000000000..79b49c238ba6b2ab2a1d7855b2c883bcc8a1b8ec --- /dev/null +++ b/biopet-core/src/main/resources/nl/lumc/sasc/biopet/core/report/fileModules.ssp @@ -0,0 +1,22 @@ +#import(nl.lumc.sasc.biopet.utils.summary.db.Schema.File) +#import(nl.lumc.sasc.biopet.utils.summary.db.SummaryDb) +#import(nl.lumc.sasc.biopet.utils.summary.db.SummaryDb._) +#import(nl.lumc.sasc.biopet.utils.summary.db.SummaryDb.Implicts._) +#import(nl.lumc.sasc.biopet.core.report.ReportPage) +#import(scala.concurrent.Await) +#import(scala.concurrent.duration.Duration) +<%@ var summary: SummaryDb %> +<%@ var sampleId: Option[Int] = None %> +<%@ var libId: Option[Int] = None %> +<%@ var runId: Int %> +<%@ var pipelineNames: List[Option[String]] %> + + + + + + #for (pipelineName <- pipelineNames) + + #end + +
Pipeline
${pipelineName}
diff --git a/biopet-core/src/main/resources/nl/lumc/sasc/biopet/core/report/files.ssp b/biopet-core/src/main/resources/nl/lumc/sasc/biopet/core/report/files.ssp index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..57911cf797e909aba904cbabfe5d413473aeab2a 100644 --- a/biopet-core/src/main/resources/nl/lumc/sasc/biopet/core/report/files.ssp +++ b/biopet-core/src/main/resources/nl/lumc/sasc/biopet/core/report/files.ssp @@ -0,0 +1,23 @@ +#import(nl.lumc.sasc.biopet.utils.summary.db.Schema.File) +#import(nl.lumc.sasc.biopet.utils.summary.db.SummaryDb) +#import(nl.lumc.sasc.biopet.utils.summary.db.SummaryDb._) +#import(nl.lumc.sasc.biopet.utils.summary.db.SummaryDb.Implicts._) +#import(nl.lumc.sasc.biopet.core.report.ReportPage) +#import(scala.concurrent.Await) +#import(scala.concurrent.duration.Duration) +<%@ var summary: SummaryDb %> +<%@ var sampleId: Option[Int] = None %> +<%@ var libId: Option[Int] = None %> +<%@ var runId: Int %> +<%@ var files: Seq[File]%> + + + + + + +#for (file <- files) + +#end + +
Keypathmd5
${file.key}${file.path}${file.md5}
diff --git a/biopet-utils/src/main/scala/nl/lumc/sasc/biopet/utils/summary/db/SummaryDb.scala b/biopet-utils/src/main/scala/nl/lumc/sasc/biopet/utils/summary/db/SummaryDb.scala index 9822cac16862c9e693e666f88b74252bfd3e2994..802818bd3217a8be296bf86a14018074b43c2326 100644 --- a/biopet-utils/src/main/scala/nl/lumc/sasc/biopet/utils/summary/db/SummaryDb.scala +++ b/biopet-utils/src/main/scala/nl/lumc/sasc/biopet/utils/summary/db/SummaryDb.scala @@ -177,6 +177,11 @@ class SummaryDb(val db: Database) extends Closeable { getPipelines(runId = Some(runId), name = Some(pipelineName)).map(_.headOption.map(_.id)) } + /** Return name of a pipeline */ + def getPipelineName(pipelineId: Int): Future[Option[String]] = { + getPipelines(pipelineId = Some(pipelineId)).map(_.headOption.map(_.name)) + } + /** Creates a new module, even if it already exist. This may give a database exeption */ def forceCreateModule(name: String, runId: Int, pipelineId: Int): Future[Int] = { val id = Await.result(db.run(modules.size.result), Duration.Inf) @@ -211,6 +216,11 @@ class SummaryDb(val db: Database) extends Closeable { getModules(runId = Some(runId), name = Some(moduleName), pipelineId = Some(pipelineId)).map(_.headOption.map(_.id)) } + /** Returns name of a module */ + def getModuleName(pipelineId: Int, moduleId: Int): Future[Option[String]] = { + getModules(pipelineId = Some(pipelineId), moduleId = Some(moduleId)).map(_.headOption.map(_.name)) + } + /** Create a new stat in the database, This method is need checking before */ def createStat(runId: Int, pipelineId: Int, moduleId: Option[Int] = None, sampleId: Option[Int] = None, libId: Option[Int] = None, content: String): Future[Int] = { diff --git a/biopet-utils/src/test/scala/nl/lumc/sasc/biopet/utils/summary/db/SummaryDbTest.scala b/biopet-utils/src/test/scala/nl/lumc/sasc/biopet/utils/summary/db/SummaryDbTest.scala index a7ff95f453d13964b6ef053a6df1ff04810ff307..e819bded22fc34833de8b812af7cca19ce17136f 100644 --- a/biopet-utils/src/test/scala/nl/lumc/sasc/biopet/utils/summary/db/SummaryDbTest.scala +++ b/biopet-utils/src/test/scala/nl/lumc/sasc/biopet/utils/summary/db/SummaryDbTest.scala @@ -101,7 +101,9 @@ class SummaryDbTest extends TestNGSuite with Matchers { val runId = Await.result(db.createRun("name", "dir", "version", "hash", date), Duration.Inf) Await.result(db.getPipelines(), Duration.Inf) shouldBe empty + Await.result(db.getPipelineName(0), Duration.Inf) shouldBe None val pipelineId = Await.result(db.createPipeline("test", runId), Duration.Inf) + Await.result(db.getPipelineName(pipelineId), Duration.Inf) shouldBe Some("test") Await.result(db.getPipelines(), Duration.Inf) shouldBe Seq(Schema.Pipeline(pipelineId, "test", runId)) Await.result(db.getPipelineId(runId, "test"), Duration.Inf) shouldBe Some(pipelineId) Await.result(db.createPipeline("test", runId), Duration.Inf) shouldBe pipelineId @@ -122,8 +124,10 @@ class SummaryDbTest extends TestNGSuite with Matchers { val runId = Await.result(db.createRun("name", "dir", "version", "hash", date), Duration.Inf) val pipelineId = Await.result(db.createPipeline("test", runId), Duration.Inf) Await.result(db.getModules(), Duration.Inf) shouldBe empty + Await.result(db.getModuleName(pipelineId, 0), Duration.Inf) shouldBe None val moduleId = Await.result(db.createModule("test", runId, pipelineId), Duration.Inf) Await.result(db.getmoduleId(runId, "test", pipelineId), Duration.Inf) shouldBe Some(moduleId) + Await.result(db.getModuleName(pipelineId, moduleId), Duration.Inf) shouldBe Some("test") Await.result(db.getModules(), Duration.Inf) shouldBe Seq(Schema.Module(pipelineId, "test", runId, pipelineId)) Await.result(db.createModule("test", runId, pipelineId), Duration.Inf) shouldBe pipelineId Await.result(db.getModules(), Duration.Inf) shouldBe Seq(Schema.Module(pipelineId, "test", runId, pipelineId)) diff --git a/mapping/src/main/scala/nl/lumc/sasc/biopet/pipelines/mapping/MultisampleMappingReport.scala b/mapping/src/main/scala/nl/lumc/sasc/biopet/pipelines/mapping/MultisampleMappingReport.scala index 0f7d621ad3f8866f23fe9a4713f58fa0cf97445d..1d0e39a45ea31749f68ca31a32d189f7982bae2a 100644 --- a/mapping/src/main/scala/nl/lumc/sasc/biopet/pipelines/mapping/MultisampleMappingReport.scala +++ b/mapping/src/main/scala/nl/lumc/sasc/biopet/pipelines/mapping/MultisampleMappingReport.scala @@ -14,14 +14,14 @@ */ package nl.lumc.sasc.biopet.pipelines.mapping -import nl.lumc.sasc.biopet.core.report.{MultisampleReportBuilder, ReportBuilderExtension, ReportPage, ReportSection} +import nl.lumc.sasc.biopet.core.report.{ MultisampleReportBuilder, ReportBuilderExtension, ReportPage, ReportSection } import nl.lumc.sasc.biopet.pipelines.bammetrics.BammetricsReport import nl.lumc.sasc.biopet.pipelines.flexiprep.FlexiprepReport import nl.lumc.sasc.biopet.utils.config.Configurable import nl.lumc.sasc.biopet.utils.summary.db.SummaryDb.Implicts._ import nl.lumc.sasc.biopet.utils.summary.db.SummaryDb._ -import scala.concurrent.{Await, Future} +import scala.concurrent.{ Await, Future } import scala.concurrent.duration.Duration import scala.concurrent.ExecutionContext.Implicits.global @@ -119,15 +119,22 @@ trait MultisampleMappingReportTrait extends MultisampleReportBuilder { val dbFiles = summary.getFiles(runId, sample = Some(sampleId.map(SampleId).getOrElse(NoSample)), library = Some(libraryId.map(LibraryId).getOrElse(NoLibrary))) .map(_.groupBy(_.pipelineId)) - .map(_.map { case (pipelineId, files) => - val moduleSections = files.groupBy(_.moduleId).map { case (moduleId, files) => - summary.getModules(moduleId = moduleId, pipelineId = pipelineId) - .map(_.headOption.map(_.name).getOrElse("Pipeline") -> ReportSection("/nl/lumc/sasc/biopet/core/report/files.ssp")) - } - summary.getPipelines(pipelineId = pipelineId).map(_.head.name -> ReportPage(Nil, Await.result(Future.sequence(moduleSections), Duration.Inf).toList, Map())) + val modulePages = dbFiles.map(_.map { + case (pipelineId, files) => + val moduleSections = files.groupBy(_.moduleId).map { + case (moduleId, files) => + val moduleName: Future[String] = moduleId match { + case Some(id) => summary.getModuleName(pipelineId, id).map(_.getOrElse("Pipeline")) + case _ => Future("Pipeline") + } + moduleName.map(_ -> ReportSection("/nl/lumc/sasc/biopet/core/report/files.ssp", Map("files" -> files))) + } + summary.getPipelineName(pipelineId = pipelineId).map(_.get -> ReportPage(Nil, Await.result(Future.sequence(moduleSections), Duration.Inf).toList, Map())) }) - dbFiles.flatMap(Future.sequence(_)).map(x => ReportPage(x.toList, Nil, Map())) + val pipelineNames = dbFiles.flatMap(x => Future.sequence(x.map(y => summary.getPipelineName(y._1)))) + + modulePages.flatMap(Future.sequence(_)).map(x => ReportPage(x.toList, "Pipelines" -> ReportSection("/nl/lumc/sasc/biopet/core/report/fileModules.ssp", Map("pipelineNames" -> Await.result(pipelineNames, Duration.Inf).toList)) ::Nil, Map())) } /** Single sample page */ @@ -184,7 +191,7 @@ trait MultisampleMappingReportTrait extends MultisampleReportBuilder { else Nil) ::: (if (krakenExecuted) List("Dustbin analysis" -> ReportPage(List(), List( "Krona Plot" -> ReportSection("/nl/lumc/sasc/biopet/pipelines/gears/krakenKrona.ssp" )), Map())) - else Nil), + else Nil) ::: List("Files" -> Await.result(filesPage(sampleId = sampleId, libraryId = libId), Duration.Inf)), "Alignment" -> ReportSection("/nl/lumc/sasc/biopet/pipelines/bammetrics/alignmentSummary.ssp") :: (if (flexiprepExecuted) List("QC reads" -> ReportSection("/nl/lumc/sasc/biopet/pipelines/flexiprep/flexiprepReadSummary.ssp"), "QC bases" -> ReportSection("/nl/lumc/sasc/biopet/pipelines/flexiprep/flexiprepBaseSummary.ssp"))