flexiprepReadSummary.ssp 8.68 KB
Newer Older
1
#import(nl.lumc.sasc.biopet.utils.summary.Summary)
2
#import(nl.lumc.sasc.biopet.core.report.ReportPage)
3 4
#import(nl.lumc.sasc.biopet.pipelines.flexiprep.FlexiprepReport)
#import(java.io.File)
5 6 7
<%@ var summary: Summary %>
<%@ var sampleId: Option[String] = None %>
<%@ var libId: Option[String] = None %>
8
<%@ var rootPath: String %>
9 10 11
<%@ var outputDir: File %>
<%@ var showPlot: Boolean = false %>
<%@ var showTable: Boolean = true %>
Peter van 't Hof's avatar
Peter van 't Hof committed
12
<%@ var showIntro: Boolean = true %>
Peter van 't Hof's avatar
Peter van 't Hof committed
13
<%@ var multisample: Boolean = true %>
14 15 16 17 18
#{
    val samples = sampleId match {
        case Some(sample) => List(sample.toString)
        case _ => summary.samples.toList
    }
Peter van 't Hof's avatar
Peter van 't Hof committed
19 20 21
    val trimCount = summary.getLibraryValues("flexiprep", "settings", "skip_trim").count(_._2 == Some(false))
    val clipCount = summary.getLibraryValues("flexiprep", "settings", "skip_clip").count(_._2 == Some(false))
    val librariesCount = summary.samples.foldLeft(0)(_ + summary.libraries(_).size)
22
}#
Sander Bollen's avatar
Sander Bollen committed
23

Peter van 't Hof's avatar
Peter van 't Hof committed
24 25 26 27 28 29
#if (showIntro)
    <br/>
    <div class="row">
    <div class="col-md-1"></div>
    <div class="col-md-6">
        <p>
Peter van 't Hof's avatar
Peter van 't Hof committed
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
            #if (trimCount == librariesCount && clipCount == librariesCount)
                You have selected both <a href="https://en.wikibooks.org/wiki/Next_Generation_Sequencing_%28NGS%29/Pre-processing#Alternative_clipping_strategies_.28Adaptor_clipping.29">adaptor clipping</a> and <a href="https://en.wikibooks.org/wiki/Next_Generation_Sequencing_%28NGS%29/Pre-processing#Sequence_Quality_Trimming">read trimming</a> as pre-processing steps
            #elseif (trimCount == librariesCount && clipCount == 0)
                You have selected only <a href="https://en.wikibooks.org/wiki/Next_Generation_Sequencing_%28NGS%29/Pre-processing#Sequence_Quality_Trimming">read trimming</a> as pre-processing step
            #elseif (trimCount == 0 && clipCount == librariesCount)
                You have selected only <a href="https://en.wikibooks.org/wiki/Next_Generation_Sequencing_%28NGS%29/Pre-processing#Alternative_clipping_strategies_.28Adaptor_clipping.29">adaptor clipping</a> as pre-processing step
            #elseif (trimCount == 0 && clipCount == 0)
                You have selected no pre-processing step to be performed
            #elseif (trimCount > 0 && clipCount == 0)
                You have selected <a href="https://en.wikibooks.org/wiki/Next_Generation_Sequencing_%28NGS%29/Pre-processing#Alternative_clipping_strategies_.28Adaptor_clipping.29">adaptor clipping</a> as pre-processing steps
            #elseif (trimCount == 0 && clipCount > 0)
                You have chosen to turn <a href="https://en.wikibooks.org/wiki/Next_Generation_Sequencing_%28NGS%29/Pre-processing#Alternative_clipping_strategies_.28Adaptor_clipping.29">adaptor clipping</a> for some libraries, but not all.
            #else
                You have chosen to turn <a href="https://en.wikibooks.org/wiki/Next_Generation_Sequencing_%28NGS%29/Pre-processing#Alternative_clipping_strategies_.28Adaptor_clipping.29">adaptor clipping</a> and <a href="https://en.wikibooks.org/wiki/Next_Generation_Sequencing_%28NGS%29/Pre-processing#Sequence_Quality_Trimming">read trimming</a> off for some libraries, but not all.
            #end
Sander Bollen's avatar
Sander Bollen committed
45 46 47 48 49 50 51
        </p>
        <p>
        #if(sampleId.isDefined && libId.isDefined)
            Here we show aggregated quality statistics for sequencing library ${libId} for sample ${sampleId}. It shows the total number of reads used after quality control, and the total number of reads discarded during quality control. This is done for both forward and reverse reads.
        #elseif(sampleId.isDefined)
            Here we show aggregated quality statistics for every sequencing library for sample ${sampleId}. It shows the total number of reads used after quality control, and the total number of reads discarded during quality control. This is done for both forward and reverse reads.
        #else
Sander Bollen's avatar
Sander Bollen committed
52
            Here we show aggregated quality statistics for every sequencing library. It shows the total number of reads used after quality control, and the total number of reads discarded during quality control. This is done for both forward and reverse reads.
Sander Bollen's avatar
Sander Bollen committed
53 54 55 56 57
            We show two plots; one for the forward read in the pair, and another one of the reverse read in the pair.
            Red denotes number of reads left after QC. Green denotes reads filtered by adaptor clipping.
            Blue denotes number of reads filtered by read trimming.
            Purple denotes the amount of <em>synced</em> reads. That is, reads removed in one orientation should be removed in the other as well to ensure correctness.
        #end
Peter van 't Hof's avatar
Peter van 't Hof committed
58 59 60 61
        </p>
    </div>
    </div>
#end
62 63 64 65 66 67

#if (showPlot)
    #{
        FlexiprepReport.readSummaryPlot(outputDir, "QC_Reads_R1","R1", summary, sampleId = sampleId)
        FlexiprepReport.readSummaryPlot(outputDir, "QC_Reads_R2","R2", summary, sampleId = sampleId)
    }#
68 69 70 71 72 73 74 75 76 77 78 79
    <div class="panel-body">
        <div class="row">
            <div class="col-sm-6 col-md-6">
                <img src="QC_Reads_R1.png" class="img-responsive">
            </div>
            <div class="col-sm-6 col-md-6">
                <img src="QC_Reads_R2.png" class="img-responsive">
            </div>
        </div>

    </div>
    <div class="panel-footer">
Peter van 't Hof's avatar
Peter van 't Hof committed
80
        #if (showTable)
Peter van 't Hof's avatar
Peter van 't Hof committed
81 82
            <button type="button" class="btn btn-info" data-toggle="collapse" data-target="#QC_ReadsTable">Hide table</button>
        #else
Peter van 't Hof's avatar
Peter van 't Hof committed
83 84
            <button type="button" class="btn btn-info" data-toggle="collapse" data-target="#QC_ReadsTable">Show table</button>
        #end
85 86 87
        <i class="glyphicon glyphicon-file"></i> <a href="QC_Reads_R1.tsv">R1 reads stats</a> -
        <i class="glyphicon glyphicon-file"></i> <a href="QC_Reads_R2.tsv">R2 reads stats</a>
    </div>
88
#end
89

Peter van 't Hof's avatar
Peter van 't Hof committed
90
<div class="panel-body collapse #if (showTable)in#end" id="QC_ReadsTable">
91

Peter van 't Hof's avatar
Peter van 't Hof committed
92
<!-- Table -->
Peter van 't Hof's avatar
Peter van 't Hof committed
93
<table class="table sortable-theme-bootstrap">
Peter van 't Hof's avatar
Peter van 't Hof committed
94
    <thead><tr>
Peter van 't Hof's avatar
Peter van 't Hof committed
95
        <th>Sample</th>
Peter van 't Hof's avatar
Peter van 't Hof committed
96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113
        <th colspan="2">Library</th>
        <th>Before QC</th>
        <th>Clipping</th>
        <th>Trimming</th>
        <th>After QC</th>
    </tr></thead>
    <tbody>
        #for (sample <- samples.toList.sorted)
            #{
                val libs = libId match {
                case Some(libId) => List(libId.toString)
                case _ => summary.libraries(sample).toList
                }
                val sampleRowspan = {
                libs.size +
                libs.count(summary.getLibraryValue(sample, _, "flexiprep", "settings", "paired").getOrElse(false) == true)
                }
            }#
Peter van 't Hof's avatar
Peter van 't Hof committed
114 115 116 117 118 119 120
            <tr><td rowspan="${sampleRowspan}">
            #if (multisample)
                <a href="${rootPath}Samples/${sample}/index.html">${sample}</a>
            #else
                ${sample}
            #end
            </td>
Peter van 't Hof's avatar
Peter van 't Hof committed
121 122 123
            #for (libId <- libs)
                #if (libs.head != libId) <tr> #end
                    #{ val paired = summary.getLibraryValue(sample, libId, "flexiprep", "settings", "paired").getOrElse(false) }#
Peter van 't Hof's avatar
Peter van 't Hof committed
124 125 126 127 128 129 130
                    <td #if (paired == true) rowspan="2" #end>
                    #if (multisample)
                        <a href="${rootPath}Samples/${sample}/Libraries/${libId}/index.html">${libId}</a>
                    #else
                        ${libId}
                    #end
                    </td>
Peter van 't Hof's avatar
Peter van 't Hof committed
131 132 133 134 135
                    #{ val reads = if (paired == true) List("R1", "R2") else List("R1") }#
                    #for (read <- reads)
                        #if (read == "R2") </tr><tr> #end
                        #{
                            val beforeTotal = summary.getLibraryValue(sample, libId, "flexiprep", "stats", "seqstat_" + read, "reads", "num_total")
Peter van 't Hof's avatar
Peter van 't Hof committed
136
                            val afterTotal = summary.getLibraryValue(sample, libId, "flexiprep", "stats", "seqstat_" + read + "_qc", "reads", "num_total")
Peter van 't Hof's avatar
Peter van 't Hof committed
137 138 139
                            val clippingDiscardedToShort = summary.getLibraryValue(sample, libId, "flexiprep", "stats", "clipping_" + read, "num_reads_discarded_too_short").getOrElse(0).toString.toLong
                            val clippingDiscardedToLong = summary.getLibraryValue(sample, libId, "flexiprep", "stats", "clipping_" + read, "num_reads_discarded_too_long").getOrElse(0).toString.toLong
                            val trimmingDiscarded = summary.getLibraryValue(sample, libId, "flexiprep", "stats", "trimming", "num_reads_discarded_" + read).getOrElse(0).toString.toLong
Peter van 't Hof's avatar
Peter van 't Hof committed
140 141 142 143 144 145 146 147 148 149 150
                        }#
                        <td>${read}</td>
                        <td>${beforeTotal}</td>
                        <td>${clippingDiscardedToShort + clippingDiscardedToLong}</td>
                        <td>${trimmingDiscarded}</td>
                        <td>${afterTotal}</td>
                    #end
                </tr>
            #end
        #end
    </tbody>
151

Peter van 't Hof's avatar
Peter van 't Hof committed
152 153
</table>
</div>