diff --git a/public/biopet-core/src/main/scala/nl/lumc/sasc/biopet/core/annotations/Annotations.scala b/public/biopet-core/src/main/scala/nl/lumc/sasc/biopet/core/annotations/Annotations.scala index ceed849ff8a1a09554b861bdb0f12808440ec66c..8ecc014340471ac29383e4bf8ea050145541c672 100644 --- a/public/biopet-core/src/main/scala/nl/lumc/sasc/biopet/core/annotations/Annotations.scala +++ b/public/biopet-core/src/main/scala/nl/lumc/sasc/biopet/core/annotations/Annotations.scala @@ -2,6 +2,7 @@ package nl.lumc.sasc.biopet.core.annotations import nl.lumc.sasc.biopet.core.BiopetQScript import nl.lumc.sasc.biopet.core.BiopetQScript.InputFile +import nl.lumc.sasc.biopet.utils.LazyCheck import org.broadinstitute.gatk.queue.QScript /** @@ -27,21 +28,21 @@ trait AnnotationBed extends BiopetQScript { qscript: QScript => trait AnnotationRefFlat extends BiopetQScript { qscript: QScript => /** GTF reference file */ - lazy val annotationRefFlat: File = { + lazy val annotationRefFlat = new LazyCheck({ val file: File = config("annotation_refflat", freeVar = true) inputFiles :+ InputFile(file, config("annotation_refflat_md5", freeVar = true)) file - } + }) } trait RibosomalRefFlat extends BiopetQScript { qscript: QScript => /** GTF reference file */ - lazy val ribosomalRefFlat: Option[File] = { + lazy val ribosomalRefFlat = new LazyCheck({ val file: Option[File] = config("ribosome_refflat", freeVar = true) file match { case Some(f) => inputFiles :+ InputFile(f, config("ribosome_refflat_md5", freeVar = true)) - case _ => + case _ => } file - } + }) } diff --git a/public/biopet-utils/src/main/scala/nl/lumc/sasc/biopet/utils/LazyCheck.scala b/public/biopet-utils/src/main/scala/nl/lumc/sasc/biopet/utils/LazyCheck.scala new file mode 100644 index 0000000000000000000000000000000000000000..4fdb70712175e9501cead1b54068120afa7787bd --- /dev/null +++ b/public/biopet-utils/src/main/scala/nl/lumc/sasc/biopet/utils/LazyCheck.scala @@ -0,0 +1,16 @@ +package nl.lumc.sasc.biopet.utils + +/** + * Created by pjvan_thof on 1/25/16. + */ +class LazyCheck[T](function: => T) { + private var _isSet = false + def isSet = _isSet + lazy val value = { + val chache = function + _isSet = true + chache + } + def apply() = value + def get = value +} diff --git a/public/gentrap/src/main/scala/nl/lumc/sasc/biopet/pipelines/gentrap/Gentrap.scala b/public/gentrap/src/main/scala/nl/lumc/sasc/biopet/pipelines/gentrap/Gentrap.scala index 6b4f93b4d9dad3f59e97145ed05d41b835c4442c..0e7088e6ea660cd2287f496ecee3695113972535 100644 --- a/public/gentrap/src/main/scala/nl/lumc/sasc/biopet/pipelines/gentrap/Gentrap.scala +++ b/public/gentrap/src/main/scala/nl/lumc/sasc/biopet/pipelines/gentrap/Gentrap.scala @@ -23,7 +23,7 @@ import nl.lumc.sasc.biopet.pipelines.gentrap.Gentrap.{ StrandProtocol, ExpMeasur import nl.lumc.sasc.biopet.pipelines.gentrap.measures._ import nl.lumc.sasc.biopet.pipelines.mapping.MultisampleMappingTrait import nl.lumc.sasc.biopet.pipelines.shiva.ShivaVariantcalling -import nl.lumc.sasc.biopet.utils.Logging +import nl.lumc.sasc.biopet.utils.{ LazyCheck, Logging } import nl.lumc.sasc.biopet.utils.config._ import org.broadinstitute.gatk.queue.QScript import picard.analysis.directed.RnaSeqMetricsCollector.StrandSpecificity @@ -53,15 +53,17 @@ class Gentrap(val root: Configurable) extends QScript /** Expression measurement modes */ // see the enumeration below for valid modes - lazy val expMeasures = config("expression_measures", default = Nil).asStringList.map(value => - ExpMeasures.values.find(_.toString == Gentrap.camelize(value)) match { - case Some(v) => v - case _ => throw new IllegalArgumentException(s"'$value' is not a valid Expression measurement") - } - ).toSet + lazy val expMeasures = new LazyCheck({ + config("expression_measures", default = Nil).asStringList.map(value => + ExpMeasures.values.find(_.toString == Gentrap.camelize(value)) match { + case Some(v) => v + case _ => throw new IllegalArgumentException(s"'$value' is not a valid Expression measurement") + } + ).toSet + }) /** Strandedness modes */ - val strandProtocol: StrandProtocol.Value = { + lazy val strandProtocol = new LazyCheck({ val value: String = config("strand_protocol") StrandProtocol.values.find(_.toString == Gentrap.camelize(value)) match { case Some(v) => v @@ -69,23 +71,25 @@ class Gentrap(val root: Configurable) extends QScript Logging.addError(s"'$other' is no strand_protocol or strand_protocol is not given") StrandProtocol.NonSpecific } - } + }) /** Whether to remove rRNA regions or not */ lazy val removeRibosomalReads: Boolean = config("remove_ribosomal_reads", default = false) /** Default pipeline config */ override def defaults = Map( - "htseqcount" -> Map("stranded" -> (strandProtocol match { + "htseqcount" -> (if (strandProtocol.isSet) Map("stranded" -> (strandProtocol() match { case StrandProtocol.NonSpecific => "no" case StrandProtocol.Dutp => "reverse" case otherwise => throw new IllegalStateException(otherwise.toString) - })), - "cufflinks" -> Map("library_type" -> (strandProtocol match { + })) + else Map()), + "cufflinks" -> (if (strandProtocol.isSet) Map("library_type" -> (strandProtocol() match { case StrandProtocol.NonSpecific => "fr-unstranded" case StrandProtocol.Dutp => "fr-firststrand" case otherwise => throw new IllegalStateException(otherwise.toString) - })), + })) + else Map()), "merge_strategy" -> "preprocessmergesam", "gsnap" -> Map( "novelsplicing" -> 1, @@ -95,14 +99,14 @@ class Gentrap(val root: Configurable) extends QScript "shivavariantcalling" -> Map("variantcallers" -> List("varscan_cns_singlesample")), "bammetrics" -> Map( "transcript_refflat" -> annotationRefFlat, - "collectrnaseqmetrics" -> ((if (strandProtocol != null) Map( - "strand_specificity" -> (strandProtocol match { + "collectrnaseqmetrics" -> ((if (strandProtocol.isSet) Map( + "strand_specificity" -> (strandProtocol() match { case StrandProtocol.NonSpecific => StrandSpecificity.NONE.toString case StrandProtocol.Dutp => StrandSpecificity.SECOND_READ_TRANSCRIPTION_STRAND.toString case otherwise => throw new IllegalStateException(otherwise.toString) }) ) - else Map()) ++ (if (ribosomalRefFlat != null) ribosomalRefFlat.map("ribosomal_intervals" -> _.getAbsolutePath).toList else Nil)) + else Map()) ++ (if (ribosomalRefFlat.isSet) ribosomalRefFlat().map("ribosomal_intervals" -> _.getAbsolutePath).toList else Nil)) ), "cutadapt" -> Map("minimum_length" -> 20), // avoid conflicts when merging since the MarkDuplicate tags often cause merges to fail @@ -115,22 +119,22 @@ class Gentrap(val root: Configurable) extends QScript ) ) - lazy val fragmentsPerGene = if (expMeasures.contains(ExpMeasures.FragmentsPerGene)) + lazy val fragmentsPerGene = if (expMeasures().contains(ExpMeasures.FragmentsPerGene)) Some(new FragmentsPerGene(this)) else None - lazy val fragmentsPerExon = if (expMeasures.contains(ExpMeasures.FragmentsPerExon)) + lazy val fragmentsPerExon = if (expMeasures().contains(ExpMeasures.FragmentsPerExon)) Some(new FragmentsPerExon(this)) else None - lazy val baseCounts = if (expMeasures.contains(ExpMeasures.BaseCounts)) + lazy val baseCounts = if (expMeasures().contains(ExpMeasures.BaseCounts)) Some(new BaseCounts(this)) else None - lazy val cufflinksBlind = if (expMeasures.contains(ExpMeasures.CufflinksBlind)) + lazy val cufflinksBlind = if (expMeasures().contains(ExpMeasures.CufflinksBlind)) Some(new CufflinksBlind(this)) else None - lazy val cufflinksGuided = if (expMeasures.contains(ExpMeasures.CufflinksGuided)) + lazy val cufflinksGuided = if (expMeasures().contains(ExpMeasures.CufflinksGuided)) Some(new CufflinksGuided(this)) else None - lazy val cufflinksStrict = if (expMeasures.contains(ExpMeasures.CufflinksStrict)) + lazy val cufflinksStrict = if (expMeasures().contains(ExpMeasures.CufflinksStrict)) Some(new CufflinksStrict(this)) else None def executedMeasures = (fragmentsPerGene :: fragmentsPerExon :: baseCounts :: cufflinksBlind :: @@ -148,14 +152,14 @@ class Gentrap(val root: Configurable) extends QScript /** Files that will be listed in the summary file */ override def summaryFiles: Map[String, File] = super.summaryFiles ++ Map( - "annotation_refflat" -> annotationRefFlat + "annotation_refflat" -> annotationRefFlat() ) ++ Map( - "ribosome_refflat" -> ribosomalRefFlat + "ribosome_refflat" -> ribosomalRefFlat() ).collect { case (key, Some(value)) => key -> value } /** Pipeline settings shown in the summary file */ override def summarySettings: Map[String, Any] = super.summarySettings ++ Map( - "expression_measures" -> expMeasures.toList.map(_.toString), + "expression_measures" -> expMeasures().toList.map(_.toString), "strand_protocol" -> strandProtocol.toString, "call_variants" -> shivaVariantcalling.isDefined, "remove_ribosomal_reads" -> removeRibosomalReads @@ -165,7 +169,7 @@ class Gentrap(val root: Configurable) extends QScript override def init(): Unit = { super.init() - if (expMeasures.isEmpty) Logging.addError("'expression_measures' is missing in the config") + if (expMeasures().isEmpty) Logging.addError("'expression_measures' is missing in the config") executedMeasures.foreach(x => x.outputDir = new File(outputDir, "expresion_measures" + File.separator + x.name)) } @@ -197,7 +201,7 @@ class Gentrap(val root: Configurable) extends QScript override lazy val preProcessBam = if (removeRibosomalReads) { val job = new WipeReads(qscript) job.inputBam = bamFile.get - ribosomalRefFlat.foreach(job.intervalFile = _) + ribosomalRefFlat().foreach(job.intervalFile = _) job.outputBam = createFile(".cleaned.bam") job.discardedBam = createFile(".rrna.bam") add(job) diff --git a/public/gentrap/src/main/scala/nl/lumc/sasc/biopet/pipelines/gentrap/measures/BaseCounts.scala b/public/gentrap/src/main/scala/nl/lumc/sasc/biopet/pipelines/gentrap/measures/BaseCounts.scala index 25ed2719b22088d8469922e6c50a91746ea80bfe..3ad9146b62648aa438f407f4c6e47b0bcaf00f73 100644 --- a/public/gentrap/src/main/scala/nl/lumc/sasc/biopet/pipelines/gentrap/measures/BaseCounts.scala +++ b/public/gentrap/src/main/scala/nl/lumc/sasc/biopet/pipelines/gentrap/measures/BaseCounts.scala @@ -21,7 +21,7 @@ class BaseCounts(val root: Configurable) extends QScript with Measurement with A baseCounter.bamFile = file baseCounter.outputDir = new File(outputDir, id) baseCounter.prefix = id - baseCounter.refFlat = annotationRefFlat + baseCounter.refFlat = annotationRefFlat() add(baseCounter) id -> baseCounter }